phoenix-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From comnetwork <...@git.apache.org>
Subject [GitHub] phoenix pull request #417: PHOENIX-4820
Date Sat, 22 Dec 2018 03:11:36 GMT
Github user comnetwork commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/417#discussion_r243724103
  
    --- Diff: phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java ---
    @@ -88,7 +88,8 @@ public static OrderBy compile(StatementContext context,
                                       Integer offset,
                                       RowProjector rowProjector,
                                       TupleProjector tupleProjector,
    -                                  boolean isInRowKeyOrder) throws SQLException {
    +                                  boolean isInRowKeyOrder,
    +                                  Expression whereExpression) throws SQLException {
    --- End diff --
    
    We need the whereExpression because in OrderPreservingTracker.IsConstantVisitor, we need
whereExpression to help us to check the columnExpression is constant or not. Just take the
same sql as example:  
    
    select a.ak3 from
    (select rand() ak1,length(pk2) ak2,length(pk3) ak3,length(v1) av1,length(v2) av2 from
test order by pk2,pk3 limit 10) a
    where a.ak1 = 0.0 and a.av2 = length(substr('abc',1,1))
    group by a.ak3,CASE WHEN coalesce(a.ak1,1) > coalesce(a.av2,2) THEN coalesce(a.ak1,1)
ELSE coalesce(a.av2,2) END,a.av1
    order by a.ak3,a.av1
    
    We need to check if "CASE WHEN coalesce(a.ak1,1) > coalesce(a.av2,2) THEN coalesce(a.ak1,1)
ELSE coalesce(a.av2,2) END,a.av1" is constant in OrderPreservingTracker.hasEqualityConstraints
method, so we move forward to check if the a.ak1 and a.av2 are constant in  OrderPreservingTracker.IsConstantVisitor,
and we must visit the where clause "where a.ak1 = 0.0 and a.av2 = length(substr('abc',1,1))"
to check the a.ak1 and a.av2.
    
    BTW. There is no whereExpression in current code of OrderByCompiler because for PHOENIX-3451
which was completed by James and me before, RowKeyColumnExpression is only supported to check
in OrderPreservingTracker.hasEqualityConstraints, and two FIXME tags were left in this method
at at time:
    
     private boolean hasEqualityConstraints(int startPos, int endPos) {
            ScanRanges ranges = context.getScanRanges();
            // If a GROUP BY is being done, then the rows are ordered according to the GROUP
BY key,
            // not by the original row key order of the table (see PHOENIX-3451).
            // We check each GROUP BY expression to see if it only references columns that
are
            // matched by equality constraints, in which case the expression itself would
be constant.
            // FIXME: this only recognizes row key columns that are held constant, not all
columns.
            // FIXME: we should optimize out any GROUP BY or ORDER BY expression which is
deemed to
            // be held constant based on the WHERE clause.
            if (!groupBy.isEmpty()) {
    
    In this patch, I added whereExpression to try to fix this problem to support non-pk columns
also.


---

Mime
View raw message