Repository: tajo
Updated Branches:
  refs/heads/master a2a5c14e4 -> 090ce1710


http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window7.result
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window7.result 
b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window7.result
index efb3878..fc51578 100644
--- a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window7.result
+++ b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window7.result
@@ -47,7 +47,7 @@
                 "OpType": "Function"
               },
               "IsAsc": true,
-              "IsNullFirst": false
+              "IsNullsFirst": false
             }
           ],
           "windowFrame": {

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window8.result
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window8.result 
b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window8.result
index 05b95a4..0052c33 100644
--- a/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window8.result
+++ b/tajo-core-tests/src/test/resources/results/TestSQLAnalyzer/window8.result
@@ -47,7 +47,7 @@
                 "OpType": "Function"
               },
               "IsAsc": true,
-              "IsNullFirst": false
+              "IsNullsFirst": false
             }
           ],
           "windowFrame": {

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestSelectQuery/testExplainSelectPhysical.2.result
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testExplainSelectPhysical.2.result
 
b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testExplainSelectPhysical.2.result
index 6135220..1c6361f 100644
--- 
a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testExplainSelectPhysical.2.result
+++ 
b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testExplainSelectPhysical.2.result
@@ -54,7 +54,7 @@ Block Id: eb_0000000000000_0000_000003 [INTERMEDIATE]
 [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.n1.n_nationkey 
(INT4), num=32)
 
 SORT(10)
-  => Sort Keys: default.n1.n_nationkey (INT4) (asc)
+  => Sort Keys: default.n1.n_nationkey (INT4) (asc, nulls last)
    JOIN(6)(INNER)
      => Join Cond: default.n1.n_name (TEXT) = ?upper_1 (TEXT)
      => target list: default.n1.n_nationkey (INT4), default.n1.n_name (TEXT), 
default.n2.n_name (TEXT)
@@ -78,7 +78,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT]
  0: sorted input=eb_0000000000000_0000_000003
 
 SORT(3)
-  => Sort Keys: default.n1.n_nationkey (INT4) (asc)
+  => Sort Keys: default.n1.n_nationkey (INT4) (asc, nulls last)
    SCAN(11) on eb_0000000000000_0000_000003
      => out schema: {(3) default.n1.n_nationkey (INT4), default.n1.n_name 
(TEXT), default.n2.n_name (TEXT)}
      => in schema: {(3) default.n1.n_nationkey (INT4), default.n1.n_name 
(TEXT), default.n2.n_name (TEXT)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
 
b/tajo-core-tests/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
index 17a7658..a0cee08 100644
--- 
a/tajo-core-tests/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
+++ 
b/tajo-core-tests/src/test/resources/results/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.plan
@@ -1,7 +1,7 @@
 explain
 -------------------------------
 SORT(6)
-  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc, nulls last)
    TABLE_SUBQUERY(5) as default.l2
      => Targets: default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)
      => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue 
(FLOAT8)}
@@ -65,7 +65,7 @@ Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 [q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, key=default.l2.l_orderkey 
(INT4), num=32)
 
 SORT(12)
-  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc, nulls last)
    TABLE_SUBQUERY(5) as default.l2
      => Targets: default.l2.l_orderkey (INT4), default.l2.revenue (FLOAT8)
      => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue 
(FLOAT8)}
@@ -102,7 +102,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
  0: sorted input=eb_0000000000000_0000_000002
 
 SORT(6)
-  => Sort Keys: default.l2.l_orderkey (INT4) (asc)
+  => Sort Keys: default.l2.l_orderkey (INT4) (asc, nulls last)
    SCAN(13) on eb_0000000000000_0000_000002
      => out schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue 
(FLOAT8)}
      => in schema: {(2) default.l2.l_orderkey (INT4), default.l2.revenue 
(FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestTPCH/testQ1OrderBy.plan 
b/tajo-core-tests/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
index 4cf1bac..6361d75 100644
--- a/tajo-core-tests/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
+++ b/tajo-core-tests/src/test/resources/results/TestTPCH/testQ1OrderBy.plan
@@ -1,7 +1,7 @@
 explain
 -------------------------------
 SORT(2)
-  => Sort Keys: default.lineitem.l_returnflag (TEXT) 
(asc),default.lineitem.l_linestatus (TEXT) (asc)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc, nulls 
last),default.lineitem.l_linestatus (TEXT) (asc, nulls last)
    GROUP_BY(1)(l_returnflag,l_linestatus)
      => exprs: (count())
      => target list: default.lineitem.l_returnflag (TEXT), 
default.lineitem.l_linestatus (TEXT), count_order (INT8)
@@ -57,7 +57,7 @@ Block Id: eb_0000000000000_0000_000002 [INTERMEDIATE]
 [q_0000000000000_0000] 2 => 3 (type=RANGE_SHUFFLE, 
key=default.lineitem.l_linestatus (TEXT), default.lineitem.l_returnflag (TEXT), 
num=32)
 
 SORT(8)
-  => Sort Keys: default.lineitem.l_returnflag (TEXT) 
(asc),default.lineitem.l_linestatus (TEXT) (asc)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc, nulls 
last),default.lineitem.l_linestatus (TEXT) (asc, nulls last)
    GROUP_BY(1)(l_returnflag,l_linestatus)
      => exprs: (count(?count (INT8)))
      => target list: default.lineitem.l_returnflag (TEXT), 
default.lineitem.l_linestatus (TEXT), count_order (INT8)
@@ -78,7 +78,7 @@ Block Id: eb_0000000000000_0000_000003 [ROOT]
  0: sorted input=eb_0000000000000_0000_000002
 
 SORT(2)
-  => Sort Keys: default.lineitem.l_returnflag (TEXT) 
(asc),default.lineitem.l_linestatus (TEXT) (asc)
+  => Sort Keys: default.lineitem.l_returnflag (TEXT) (asc, nulls 
last),default.lineitem.l_linestatus (TEXT) (asc, nulls last)
    SCAN(9) on eb_0000000000000_0000_000002
      => out schema: {(3) count_order (INT8), default.lineitem.l_linestatus 
(TEXT), default.lineitem.l_returnflag (TEXT)}
      => in schema: {(3) count_order (INT8), default.lineitem.l_linestatus 
(TEXT), default.lineitem.l_returnflag (TEXT)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
----------------------------------------------------------------------
diff --git 
a/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan 
b/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
index 594b540..9c6e523 100644
--- a/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
+++ b/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
@@ -1,7 +1,7 @@
 explain
 -------------------------------
 SORT(8)
-  => Sort Keys: revenue (FLOAT8) (desc)
+  => Sort Keys: revenue (FLOAT8) (desc, nulls first)
    GROUP_BY(7)(n_name)
      => exprs: (sum(?multiply (FLOAT8)))
      => target list: default.nation.n_name (TEXT), revenue (FLOAT8)
@@ -301,7 +301,7 @@ Block Id: eb_0000000000000_0000_000012 [INTERMEDIATE]
 [q_0000000000000_0000] 12 => 13 (type=RANGE_SHUFFLE, key=revenue (FLOAT8), 
num=32)
 
 SORT(34)
-  => Sort Keys: revenue (FLOAT8) (desc)
+  => Sort Keys: revenue (FLOAT8) (desc, nulls first)
    GROUP_BY(7)(n_name)
      => exprs: (sum(?sum_7 (FLOAT8)))
      => target list: default.nation.n_name (TEXT), revenue (FLOAT8)
@@ -322,7 +322,7 @@ Block Id: eb_0000000000000_0000_000013 [ROOT]
  0: sorted input=eb_0000000000000_0000_000012
 
 SORT(8)
-  => Sort Keys: revenue (FLOAT8) (desc)
+  => Sort Keys: revenue (FLOAT8) (desc, nulls first)
    SCAN(35) on eb_0000000000000_0000_000012
      => out schema: {(2) default.nation.n_name (TEXT), revenue (FLOAT8)}
      => in schema: {(2) default.nation.n_name (TEXT), revenue (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java
 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java
index 5a1b70b..d1be572 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java
@@ -53,10 +53,8 @@ public class ComparableVector {
     vectors = new TupleVector[sortKeys.length];
     for (int i = 0; i < vectors.length; i++) {
       TajoDataTypes.Type type = 
sortKeys[i].getSortKey().getDataType().getType();
-      boolean nullFirst = sortKeys[i].isNullFirst();
-      boolean ascending = sortKeys[i].isAscending();
-      boolean nullInvert = nullFirst && ascending || !nullFirst && !ascending;
-      vectors[i] = new TupleVector(vectorType(type), tuples.length, 
nullInvert, ascending);
+      vectors[i] = new TupleVector(vectorType(type), tuples.length,
+          sortKeys[i].isNullsFirst(), sortKeys[i].isAscending());
     }
     this.keyIndex = keyIndex;
   }
@@ -81,7 +79,7 @@ public class ComparableVector {
 
     private final int type;
     private final BitSet nulls;
-    private final boolean nullInvert;
+    private final boolean nullsFirst;
     private final boolean ascending;
 
     private boolean[] booleans;
@@ -95,10 +93,10 @@ public class ComparableVector {
 
     private int index;
 
-    private TupleVector(int type, int length, boolean nullInvert, boolean 
ascending) {
+    private TupleVector(int type, int length, boolean nullsFirst, boolean 
ascending) {
       this.type = type;
       this.nulls = new BitSet(length);
-      this.nullInvert = nullInvert;
+      this.nullsFirst = nullsFirst;
       this.ascending = ascending;
       switch (type) {
         case 0: booleans = new boolean[length]; break;
@@ -148,8 +146,7 @@ public class ComparableVector {
         return 0;
       }
       if (n1 ^ n2) {
-        int compVal = n1 ? 1 : -1;
-        return nullInvert ? -compVal : compVal;
+        return nullsFirst ? (n1 ? -1 : 1) : (n1 ? 1 : -1);
       }
       int compare;
       switch (type) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java 
b/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java
index 0a04213..bae04c8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java
@@ -31,6 +31,7 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.storage.RowStoreUtil;
 import org.apache.tajo.storage.RowStoreUtil.RowStoreEncoder;
+import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.TupleRange;
 import org.apache.tajo.storage.VTuple;
 
@@ -90,13 +91,11 @@ public class TupleUtil {
         continue;
       }
       if (columnStat.hasNullValue()) {
-        if (sortSpecs[i].isNullFirst()) {
-          int rangeIndex = 0;
-          VTuple rangeTuple = (VTuple) ranges[rangeIndex].getStart();
+        if (sortSpecs[i].isNullsFirst()) {
+          Tuple rangeTuple = ranges[0].getStart();
           rangeTuple.put(i, NullDatum.get());
         } else {
-          int rangeIndex = sortSpecs[i].isAscending() ? ranges.length - 1 : 0;
-          VTuple rangeTuple = sortSpecs[i].isAscending() ? (VTuple) 
ranges[rangeIndex].getEnd() : (VTuple) ranges[rangeIndex].getStart();
+          Tuple rangeTuple = ranges[ranges.length - 1].getEnd();
           if (LOG.isDebugEnabled()) {
             LOG.debug("Set null into range: " + col.getQualifiedName() + ", 
previous tuple is " + rangeTuple);
           }

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java 
b/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
index 2745a2f..50a869c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
+++ b/tajo-core/src/main/java/org/apache/tajo/parser/sql/SQLAnalyzer.java
@@ -559,7 +559,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> 
{
 
       if (specContext.null_ordering() != null) {
         if (specContext.null_ordering().FIRST() != null) {
-          specs[i].setNullFirst();
+          specs[i].setNullsFirst();
+        } else if (specContext.null_ordering().LAST() != null) {
+          specs[i].setNullsLast();
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java 
b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
index 4f4d13e..061c433 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
@@ -701,7 +701,7 @@ public class LogicalPlanner extends 
BaseAlgebraVisitor<LogicalPlanner.PlanContex
           } else {
             throw new IllegalStateException("Unexpected State: " + 
StringUtils.join(sortSpecs));
           }
-          annotatedSortSpecs[i] = new SortSpec(column, 
sortSpecs[i].isAscending(), sortSpecs[i].isNullFirst());
+          annotatedSortSpecs[i] = new SortSpec(column, 
sortSpecs[i].isAscending(), sortSpecs[i].isNullsFirst());
         }
 
         sortGroups[winSpecIdx] = annotatedSortSpecs;
@@ -928,7 +928,7 @@ public class LogicalPlanner extends 
BaseAlgebraVisitor<LogicalPlanner.PlanContex
       } else {
         throw new IllegalStateException("Unexpected State: " + 
StringUtils.join(rawSortSpecs));
       }
-      annotatedSortSpecs.add(new SortSpec(column, 
rawSortSpecs[i].isAscending(), rawSortSpecs[i].isNullFirst()));
+      annotatedSortSpecs.add(new SortSpec(column, 
rawSortSpecs[i].isAscending(), rawSortSpecs[i].isNullsFirst()));
     }
     return annotatedSortSpecs.toArray(new SortSpec[annotatedSortSpecs.size()]);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/ProjectionPushDownRule.java
----------------------------------------------------------------------
diff --git 
a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/ProjectionPushDownRule.java
 
b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/ProjectionPushDownRule.java
index 3c30c67..cadf986 100644
--- 
a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/ProjectionPushDownRule.java
+++ 
b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/ProjectionPushDownRule.java
@@ -573,14 +573,14 @@ public class ProjectionPushDownRule extends
       Target target = context.targetListMgr.getTarget(sortKey);
       if (context.targetListMgr.isEvaluated(sortKey)) {
         Column c = target.getNamedColumn();
-        SortSpec sortSpec = new SortSpec(c, 
node.getSortKeys()[i].isAscending(), node.getSortKeys()[i].isNullFirst());
+        SortSpec sortSpec = new SortSpec(c, 
node.getSortKeys()[i].isAscending(), node.getSortKeys()[i].isNullsFirst());
         if (!sortSpecs.contains(sortSpec)) {
           sortSpecs.add(sortSpec);
         }
       } else {
         if (target.getEvalTree().getType() == EvalType.FIELD) {
           Column c = ((FieldEval)target.getEvalTree()).getColumnRef();
-          SortSpec sortSpec = new SortSpec(c, 
node.getSortKeys()[i].isAscending(), node.getSortKeys()[i].isNullFirst());
+          SortSpec sortSpec = new SortSpec(c, 
node.getSortKeys()[i].isAscending(), node.getSortKeys()[i].isNullsFirst());
           if (!sortSpecs.contains(sortSpec)) {
             sortSpecs.add(sortSpec);
           }

http://git-wip-us.apache.org/repos/asf/tajo/blob/090ce171/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
----------------------------------------------------------------------
diff --git 
a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
 
b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
index 6e0d6c2..c8f46a6 100644
--- 
a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
+++ 
b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
@@ -18,7 +18,6 @@
 
 package org.apache.tajo.storage;
 
-import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SortSpec;
@@ -68,7 +67,7 @@ public class BaseTupleComparator extends TupleComparator 
implements ProtoObject<
       }
           
       this.asc[i] = sortKeys[i].isAscending();
-      this.nullFirsts[i]= sortKeys[i].isNullFirst();
+      this.nullFirsts[i]= sortKeys[i].isNullsFirst();
     }
   }
 

Reply via email to