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(); } }
