From 7623090f1f1d4638c41d8d19b97f2e07c94f714a Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Wed, 28 Oct 2015 17:33:06 +0900 Subject: [PATCH 01/20] initial commit --- .../apache/tajo/engine/eval/ExprTestBase.java | 12 ++-- .../tajo/engine/eval/TestEvalTreeUtil.java | 18 ++--- .../engine/planner/TestLogicalPlanner.java | 54 +++++++-------- .../engine/codegen/ExecutorPreCompiler.java | 3 +- .../engine/planner/PhysicalPlannerImpl.java | 4 +- .../apache/tajo/engine/planner/Projector.java | 18 ++--- .../engine/planner/global/GlobalPlanner.java | 44 ++++++------ .../builder/DistinctGroupbyBuilder.java | 66 +++++++++--------- .../planner/physical/BSTIndexScanExec.java | 3 +- .../engine/planner/physical/EvalExprExec.java | 9 +-- .../engine/planner/physical/SeqScanExec.java | 12 ++-- .../planner/physical/WindowAggExec.java | 6 +- .../exec/ExplainPlanPreprocessorForTest.java | 8 +-- .../tajo/master/exec/QueryExecutor.java | 14 ++-- .../apache/tajo/plan/LogicalOptimizer.java | 2 +- .../org/apache/tajo/plan/LogicalPlan.java | 6 +- .../org/apache/tajo/plan/LogicalPlanner.java | 69 ++++++++++--------- .../apache/tajo/plan/expr/EvalTreeUtil.java | 2 +- .../plan/logical/DistinctGroupbyNode.java | 23 +++---- .../tajo/plan/logical/EvalExprNode.java | 13 ++-- .../apache/tajo/plan/logical/GroupbyNode.java | 33 +++++---- .../apache/tajo/plan/logical/JoinNode.java | 15 ++-- .../logical/PartitionedTableScanNode.java | 7 +- .../apache/tajo/plan/logical/Projectable.java | 6 +- .../tajo/plan/logical/ProjectionNode.java | 22 +++--- .../apache/tajo/plan/logical/ScanNode.java | 14 ++-- .../tajo/plan/logical/TableSubQueryNode.java | 20 +++--- .../tajo/plan/logical/WindowAggNode.java | 20 +++--- .../plan/rewrite/BaseSchemaBuildPhase.java | 10 +-- .../rewrite/rules/InSubqueryRewriteRule.java | 2 +- .../rewrite/rules/ProjectionPushDownRule.java | 57 +++++++-------- .../plan/serder/LogicalNodeDeserializer.java | 10 +-- .../plan/serder/LogicalNodeSerializer.java | 17 ++--- .../apache/tajo/plan/util/PlannerUtil.java | 18 ++--- .../plan/verifier/LogicalPlanVerifier.java | 2 +- .../apache/tajo/storage/jdbc/SQLBuilder.java | 7 +- 36 files changed, 324 insertions(+), 322 deletions(-) diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java index 7c79724802..69f92f42ea 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java @@ -130,7 +130,7 @@ public TajoConf getConf() { * @param condition this parameter means whether it is for success case or is not for failure case. * @return */ - private static Target[] getRawTargets(QueryContext context, String query, boolean condition) + private static List getRawTargets(QueryContext context, String query, boolean condition) throws TajoException, InvalidStatementException { List parsedResults = SimpleParser.parseScript(query); @@ -154,7 +154,7 @@ private static Target[] getRawTargets(QueryContext context, String query, boolea assertFalse(state.getErrors().get(0).getMessage(), true); } - Target [] targets = plan.getRootBlock().getRawTargets(); + List targets = plan.getRootBlock().getRawTargets(); if (targets == null) { throw new RuntimeException("Wrong query statement or query plan: " + parsedResults.get(0).getHistoryStatement()); } @@ -270,7 +270,7 @@ public void testEval(OverridableConf context, Schema schema, String tableName, S } } - Target [] targets; + List targets; TajoClassLoader classLoader = new TajoClassLoader(); EvalContext evalContext = new EvalContext(); @@ -284,9 +284,9 @@ public void testEval(OverridableConf context, Schema schema, String tableName, S } QueryExecutor.startScriptExecutors(queryContext, evalContext, targets); - Tuple outTuple = new VTuple(targets.length); - for (int i = 0; i < targets.length; i++) { - EvalNode eval = targets[i].getEvalTree(); + Tuple outTuple = new VTuple(targets.size()); + for (int i = 0; i < targets.size(); i++) { + EvalNode eval = targets.get(i).getEvalTree(); if (queryContext.getBool(SessionVars.CODEGEN)) { eval = codegen.compile(inputSchema, eval); diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java index 7bba76b626..3c92842ca6 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java @@ -135,7 +135,7 @@ public static void tearDown() throws Exception { util.shutdownCatalogCluster(); } - public static Target [] getRawTargets(String query) { + public static List getRawTargets(String query) { LogicalPlan plan = null; try { Expr expr = analyzer.parse(query); @@ -212,7 +212,7 @@ public final void testFindAllRefColumns() { @Test public final void testGetSchemaFromTargets() { - Target [] targets = getRawTargets(QUERIES[0]); + List targets = getRawTargets(QUERIES[0]); Schema schema = EvalTreeUtil.getSchemaByTargets(null, targets); Column col1 = schema.getColumn(0); Column col2 = schema.getColumn(1); @@ -226,17 +226,17 @@ public final void testGetSchemaFromTargets() { public final void testGetContainExprs() throws CloneNotSupportedException, TajoException { Expr expr = analyzer.parse(QUERIES[1]); LogicalPlan plan = planner.createPlan(defaultContext, expr, true); - Target [] targets = plan.getRootBlock().getRawTargets(); + List targets = plan.getRootBlock().getRawTargets(); Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4); Collection exprs = - EvalTreeUtil.getContainExpr(targets[0].getEvalTree(), col1); + EvalTreeUtil.getContainExpr(targets.get(0).getEvalTree(), col1); BinaryEval node = (BinaryEval) exprs.iterator().next(); assertEquals(EvalType.LTH, node.getType()); assertEquals(EvalType.PLUS, node.getLeftExpr().getType()); assertEquals(new ConstEval(DatumFactory.createInt4(4)), node.getRightExpr()); Column col2 = new Column("default.people.age", TajoDataTypes.Type.INT4); - exprs = EvalTreeUtil.getContainExpr(targets[1].getEvalTree(), col2); + exprs = EvalTreeUtil.getContainExpr(targets.get(1).getEvalTree(), col2); node = (BinaryEval) exprs.iterator().next(); assertEquals(EvalType.GTH, node.getType()); assertEquals("default.people.age", node.getLeftExpr().getName()); @@ -294,11 +294,11 @@ public final void testGetDNF() throws TajoException { @Test public final void testSimplify() throws TajoException { - Target [] targets = getRawTargets(QUERIES[0]); - EvalNode node = AlgebraicUtil.eliminateConstantExprs(targets[0].getEvalTree()); + List targets = getRawTargets(QUERIES[0]); + EvalNode node = AlgebraicUtil.eliminateConstantExprs(targets.get(0).getEvalTree()); assertEquals(EvalType.CONST, node.getType()); assertEquals(7, node.bind(null, null).eval(null).asInt4()); - node = AlgebraicUtil.eliminateConstantExprs(targets[1].getEvalTree()); + node = AlgebraicUtil.eliminateConstantExprs(targets.get(1).getEvalTree()); assertEquals(EvalType.CONST, node.getType()); assertTrue(7.0d == node.bind(null, null).eval(null).asFloat8()); @@ -307,7 +307,7 @@ public final void testSimplify() throws TajoException { targets = plan.getRootBlock().getRawTargets(); Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4); Collection exprs = - EvalTreeUtil.getContainExpr(targets[0].getEvalTree(), col1); + EvalTreeUtil.getContainExpr(targets.get(0).getEvalTree(), col1); node = exprs.iterator().next(); } diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java index df4cfd9972..214ee603a2 100644 --- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java +++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java @@ -1247,12 +1247,12 @@ public final void testInsertInto6() throws TajoException { InsertNode insertNode = getInsertNode(plan); ProjectionNode subquery = insertNode.getChild(); - Target[] targets = subquery.getTargets(); + List targets = subquery.getTargets(); // targets MUST be manager, NULL as empid, deptname - assertEquals(targets[0].getNamedColumn().getQualifiedName(), "default.dept.manager"); - assertEquals(targets[1].getAlias(), "empid"); - assertEquals(targets[1].getEvalTree().getType(), EvalType.CONST); - assertEquals(targets[2].getNamedColumn().getQualifiedName(), "default.dept.deptname"); + assertEquals(targets.get(0).getNamedColumn().getQualifiedName(), "default.dept.manager"); + assertEquals(targets.get(1).getAlias(), "empid"); + assertEquals(targets.get(1).getEvalTree().getType(), EvalType.CONST); + assertEquals(targets.get(2).getNamedColumn().getQualifiedName(), "default.dept.deptname"); } private static InsertNode getInsertNode(LogicalPlan plan) { @@ -1408,32 +1408,32 @@ public void testSelectFromSelfDescTable() throws Exception { testCloneLogicalNode(projectionNode); // projection column test - Target[] targets = projectionNode.getTargets(); - Arrays.sort(targets, new Comparator() { + List targets = projectionNode.getTargets(); + Collections.sort(targets, new Comparator() { @Override public int compare(Target o1, Target o2) { return o1.getCanonicalName().compareTo(o2.getCanonicalName()); } }); - assertEquals(3, targets.length); - assertEquals("default.self_desc_table1.dept", targets[0].getCanonicalName()); - assertEquals("default.self_desc_table1.id", targets[1].getCanonicalName()); - assertEquals("default.self_desc_table1.name", targets[2].getCanonicalName()); + assertEquals(3, targets.size()); + assertEquals("default.self_desc_table1.dept", targets.get(0).getCanonicalName()); + assertEquals("default.self_desc_table1.id", targets.get(1).getCanonicalName()); + assertEquals("default.self_desc_table1.name", targets.get(2).getCanonicalName()); // scan column test assertEquals(NodeType.SCAN, projectionNode.getChild().getType()); ScanNode scanNode = projectionNode.getChild(); targets = scanNode.getTargets(); - Arrays.sort(targets, new Comparator() { + Collections.sort(targets, new Comparator() { @Override public int compare(Target o1, Target o2) { return o1.getCanonicalName().compareTo(o2.getCanonicalName()); } }); - assertEquals(3, targets.length); - assertEquals("default.self_desc_table1.dept", targets[0].getCanonicalName()); - assertEquals("default.self_desc_table1.id", targets[1].getCanonicalName()); - assertEquals("default.self_desc_table1.name", targets[2].getCanonicalName()); + assertEquals(3, targets.size()); + assertEquals("default.self_desc_table1.dept", targets.get(0).getCanonicalName()); + assertEquals("default.self_desc_table1.id", targets.get(1).getCanonicalName()); + assertEquals("default.self_desc_table1.name", targets.get(2).getCanonicalName()); catalog.dropTable("default.self_desc_table1"); } @@ -1463,16 +1463,16 @@ public void testSelectWhereFromSelfDescTable() throws Exception { testCloneLogicalNode(projectionNode); // projection column test - Target[] targets = projectionNode.getTargets(); - Arrays.sort(targets, new Comparator() { + List targets = projectionNode.getTargets(); + Collections.sort(targets, new Comparator() { @Override public int compare(Target o1, Target o2) { return o1.getCanonicalName().compareTo(o2.getCanonicalName()); } }); - assertEquals(2, targets.length); - assertEquals("default.self_desc_table1.dept", targets[0].getCanonicalName()); - assertEquals("default.self_desc_table1.name", targets[1].getCanonicalName()); + assertEquals(2, targets.size()); + assertEquals("default.self_desc_table1.dept", targets.get(0).getCanonicalName()); + assertEquals("default.self_desc_table1.name", targets.get(1).getCanonicalName()); assertEquals(NodeType.SELECTION, projectionNode.getChild().getType()); SelectionNode selectionNode = projectionNode.getChild(); @@ -1483,17 +1483,17 @@ public int compare(Target o1, Target o2) { assertEquals(NodeType.SCAN, selectionNode.getChild().getType()); ScanNode scanNode = selectionNode.getChild(); targets = scanNode.getTargets(); - Arrays.sort(targets, new Comparator() { + Collections.sort(targets, new Comparator() { @Override public int compare(Target o1, Target o2) { return o1.getCanonicalName().compareTo(o2.getCanonicalName()); } }); - assertEquals(4, targets.length); - assertEquals("?greaterthan", targets[0].getCanonicalName()); - assertEquals("default.self_desc_table1.dept", targets[1].getCanonicalName()); - assertEquals("default.self_desc_table1.id", targets[2].getCanonicalName()); - assertEquals("default.self_desc_table1.name", targets[3].getCanonicalName()); + assertEquals(4, targets.size()); + assertEquals("?greaterthan", targets.get(0).getCanonicalName()); + assertEquals("default.self_desc_table1.dept", targets.get(1).getCanonicalName()); + assertEquals("default.self_desc_table1.id", targets.get(2).getCanonicalName()); + assertEquals("default.self_desc_table1.name", targets.get(3).getCanonicalName()); catalog.dropTable("default.self_desc_table1"); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java index f63e46f119..15df76a446 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java @@ -32,6 +32,7 @@ import org.apache.tajo.util.Pair; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Stack; @@ -91,7 +92,7 @@ private static void compileIfAbsent(CompilationContext context, Schema schema, E } private static void compileProjectableNode(CompilationContext context, Schema schema, Projectable node) { - Target[] targets; + List targets; if (node.hasTargets()) { targets = node.getTargets(); } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java index 52e3b89b5f..9bb7c0a396 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java @@ -1097,13 +1097,13 @@ private SortExec createSortExecForDistinctGroupby(TaskAttemptContext context, //3 phase: groupby columns, seq, distinct1 keys, distinct2 keys, List sortSpecs = new ArrayList<>(); if (phase == 2) { - sortSpecs.add(new SortSpec(distinctNode.getTargets()[0].getNamedColumn())); + sortSpecs.add(new SortSpec(distinctNode.getTargets().get(0).getNamedColumn())); } for (Column eachColumn: distinctNode.getGroupingColumns()) { sortSpecs.add(new SortSpec(eachColumn)); } if (phase == 3) { - sortSpecs.add(new SortSpec(distinctNode.getTargets()[0].getNamedColumn())); + sortSpecs.add(new SortSpec(distinctNode.getTargets().get(0).getNamedColumn())); } for (GroupbyNode eachGroupbyNode: distinctNode.getSubPlans()) { for (Column eachColumn: eachGroupbyNode.getGroupingColumns()) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/Projector.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/Projector.java index ba8ec32db9..dfe823b0cd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/Projector.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/Projector.java @@ -27,6 +27,8 @@ import org.apache.tajo.storage.VTuple; import org.apache.tajo.worker.TaskAttemptContext; +import java.util.List; + public class Projector { private final TaskAttemptContext context; private final Schema inSchema; @@ -36,28 +38,28 @@ public class Projector { private final Tuple outTuple; - public Projector(TaskAttemptContext context, Schema inSchema, Schema outSchema, Target [] targets) { + public Projector(TaskAttemptContext context, Schema inSchema, Schema outSchema, List targets) { this.context = context; this.inSchema = inSchema; - Target[] realTargets; + List realTargets; if (targets == null) { realTargets = PlannerUtil.schemaToTargets(outSchema); } else { realTargets = targets; } - outTuple = new VTuple(realTargets.length); - evals = new EvalNode[realTargets.length]; + outTuple = new VTuple(realTargets.size()); + evals = new EvalNode[realTargets.size()]; if (context.getQueryContext().getBool(SessionVars.CODEGEN)) { EvalNode eval; - for (int i = 0; i < realTargets.length; i++) { - eval = realTargets[i].getEvalTree(); + for (int i = 0; i < realTargets.size(); i++) { + eval = realTargets.get(i).getEvalTree(); evals[i] = context.getPrecompiledEval(inSchema, eval); } } else { - for (int i = 0; i < realTargets.length; i++) { - evals[i] = realTargets[i].getEvalTree(); + for (int i = 0; i < realTargets.size(); i++) { + evals[i] = realTargets.get(i).getEvalTree(); } } init(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index 5f8bd11bc9..02baa27997 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -383,12 +383,12 @@ private AggregationFunctionCallEval createMinFunction(EvalNode [] args) throws T */ private static class RewrittenFunctions { AggregationFunctionCallEval [] firstStageEvals; - Target[] firstStageTargets; + List firstStageTargets; AggregationFunctionCallEval secondStageEvals; public RewrittenFunctions(int firstStageEvalNum) { firstStageEvals = new AggregationFunctionCallEval[firstStageEvalNum]; - firstStageTargets = new Target[firstStageEvalNum]; + firstStageTargets = new ArrayList<>(); } } @@ -444,7 +444,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC } String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets[0] = new Target(fieldEval); + rewritten.firstStageTargets.set(0, new Target(fieldEval)); rewritten.secondStageEvals = createSumFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equalsIgnoreCase("sum")) { rewritten = new RewrittenFunctions(1); @@ -452,7 +452,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createSumFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets[0] = new Target(fieldEval); + rewritten.firstStageTargets.set(0, new Target(fieldEval)); rewritten.secondStageEvals = createSumFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equals("max")) { @@ -461,7 +461,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createMaxFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets[0] = new Target(fieldEval); + rewritten.firstStageTargets.set(0, new Target(fieldEval)); rewritten.secondStageEvals = createMaxFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equals("min")) { @@ -471,7 +471,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createMinFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets[0] = new Target(fieldEval); + rewritten.firstStageTargets.set(0, new Target(fieldEval)); rewritten.secondStageEvals = createMinFunction(new EvalNode[]{fieldEval}); } else { @@ -551,13 +551,13 @@ private ExecutionBlock buildGroupByIncludingDistinctFunctionsMultiStage(GlobalPl int firstStageGroupingKeyNum = firstStageGroupingColumns.size(); int i = 0; - Target [] firstStageTargets = new Target[firstStageGroupingKeyNum + firstStageAggFunctionNum]; + List firstStageTargets = new ArrayList<>(); for (Column column : firstStageGroupingColumns) { Target target = new Target(new FieldEval(column)); - firstStageTargets[i++] = target; + firstStageTargets.set(i++, target); } for (Target target : firstPhaseEvalNodeTargets) { - firstStageTargets[i++] = target; + firstStageTargets.set(i++, target); } // Create the groupby node for the first stage and set all necessary descriptions @@ -777,7 +777,7 @@ public static GroupbyNode createFirstPhaseGroupBy(LogicalPlan plan, GroupbyNode secondPhaseGroupBy.setAggFunctions(secondPhaseEvals); firstPhaseGroupBy.setAggFunctions(firstPhaseEvals); - Target [] firstPhaseTargets = ProjectionPushDownRule.buildGroupByTarget(firstPhaseGroupBy, null, + List firstPhaseTargets = ProjectionPushDownRule.buildGroupByTarget(firstPhaseGroupBy, null, firstPhaseEvalNames); firstPhaseGroupBy.setTargets(firstPhaseTargets); secondPhaseGroupBy.setInSchema(PlannerUtil.targetToSchema(firstPhaseTargets)); @@ -1298,21 +1298,21 @@ public LogicalNode visitTableSubQuery(GlobalPlanContext context, LogicalPlan pla } if (leftMostSubQueryNode != null) { // replace target column name - Target[] targets = leftMostSubQueryNode.getTargets(); - int[] targetMappings = new int[targets.length]; - for (int i = 0; i < targets.length; i++) { - if (targets[i].getEvalTree().getType() != EvalType.FIELD) { + List targets = leftMostSubQueryNode.getTargets(); + int[] targetMappings = new int[targets.size()]; + for (int i = 0; i < targets.size(); i++) { + if (targets.get(i).getEvalTree().getType() != EvalType.FIELD) { throw new TajoInternalError("Target of a UnionNode's subquery should be FieldEval."); } - int index = leftMostSubQueryNode.getInSchema().getColumnId(targets[i].getNamedColumn().getQualifiedName()); + int index = leftMostSubQueryNode.getInSchema().getColumnId(targets.get(i).getNamedColumn().getQualifiedName()); if (index < 0) { // If a target has alias, getNamedColumn() only returns alias - Set columns = EvalTreeUtil.findUniqueColumns(targets[i].getEvalTree()); + Set columns = EvalTreeUtil.findUniqueColumns(targets.get(i).getEvalTree()); Column column = columns.iterator().next(); index = leftMostSubQueryNode.getInSchema().getColumnId(column.getQualifiedName()); } if (index < 0) { - throw new TajoInternalError("Can't find matched Target in UnionNode's input schema: " + targets[i] + throw new TajoInternalError("Can't find matched Target in UnionNode's input schema: " + targets.get(i) + "->" + leftMostSubQueryNode.getInSchema()); } targetMappings[i] = index; @@ -1322,14 +1322,14 @@ public LogicalNode visitTableSubQuery(GlobalPlanContext context, LogicalPlan pla if (eachNode.getPID() == leftMostSubQueryNode.getPID()) { continue; } - Target[] eachNodeTargets = eachNode.getTargets(); - if (eachNodeTargets.length != targetMappings.length) { + List eachNodeTargets = eachNode.getTargets(); + if (eachNodeTargets.size() != targetMappings.length) { throw new TajoInternalError("Union query can't have different number of target columns."); } - for (int i = 0; i < eachNodeTargets.length; i++) { + for (int i = 0; i < eachNodeTargets.size(); i++) { Column inColumn = eachNode.getInSchema().getColumn(targetMappings[i]); - eachNodeTargets[i].setAlias(eachNodeTargets[i].getNamedColumn().getQualifiedName()); - EvalNode evalNode = eachNodeTargets[i].getEvalTree(); + eachNodeTargets.get(i).setAlias(eachNodeTargets.get(i).getNamedColumn().getQualifiedName()); + EvalNode evalNode = eachNodeTargets.get(i).getEvalTree(); if (evalNode.getType() != EvalType.FIELD) { throw new TajoInternalError("Target of a UnionNode's subquery should be FieldEval."); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index 075ec15162..1d6a0d8ed2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -104,7 +104,7 @@ public ExecutionBlock buildMultiLevelPlan(GlobalPlanContext context, int index = 0; for (AggregationFunctionCallEval aggrFunction: lastGroupbyNode.getAggFunctions()) { aggrFunction.setIntermediatePhase(); - aggrFunction.setArgs(new EvalNode[]{new FieldEval(lastGroupbyNode.getTargets()[index].getNamedColumn())}); + aggrFunction.setArgs(new EvalNode[]{new FieldEval(lastGroupbyNode.getTargets().get(index).getNamedColumn())}); index++; } } @@ -113,7 +113,7 @@ public ExecutionBlock buildMultiLevelPlan(GlobalPlanContext context, int index = 0; for (AggregationFunctionCallEval aggrFunction: lastGroupbyNode.getAggFunctions()) { aggrFunction.setFirstPhase(); - aggrFunction.setArgs(new EvalNode[]{new FieldEval(lastGroupbyNode.getTargets()[index].getNamedColumn())}); + aggrFunction.setArgs(new EvalNode[]{new FieldEval(lastGroupbyNode.getTargets().get(index).getNamedColumn())}); index++; } } @@ -208,7 +208,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (int aggIdx = 0; aggIdx < aggFunctions.length; aggIdx++) { AggregationFunctionCallEval aggFunction = aggFunctions[aggIdx]; aggFunction.setFirstPhase(); - Target originAggFunctionTarget = groupbyNode.getTargets()[originalGroupingColumns.size() + aggIdx]; + Target originAggFunctionTarget = groupbyNode.getTargets().get(originalGroupingColumns.size() + aggIdx); Target aggFunctionTarget = new Target(new FieldEval(originAggFunctionTarget.getEvalTree().getName(), aggFunction.getValueType())); @@ -250,16 +250,16 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - Target[] targets = new Target[eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()]; + List targets = new ArrayList<>(); int targetIdx = 0; for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets[targetIdx++] = target; + targets.set(targetIdx++, target); baseGroupByTargets.add(target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets[targetIdx++] = eachAggFunctionTarget; + targets.set(targetIdx++, eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -274,10 +274,10 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - Target[] targets = new Target[otherAggregationFunctionTargets.size()]; + List targets = new ArrayList<>(); int targetIdx = 0; for (Target eachTarget : otherAggregationFunctionTargets) { - targets[targetIdx++] = eachTarget; + targets.set(targetIdx++, eachTarget); baseGroupByTargets.add(eachTarget); } @@ -290,7 +290,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } DistinctGroupbyNode baseDistinctNode = new DistinctGroupbyNode(context.getPlan().getLogicalPlan().newPID()); - baseDistinctNode.setTargets(baseGroupByTargets.toArray(new Target[]{})); + baseDistinctNode.setTargets(new ArrayList<>(baseGroupByTargets)); baseDistinctNode.setGroupingColumns(groupbyNode.getGroupingColumns()); baseDistinctNode.setInSchema(groupbyNode.getInSchema()); baseDistinctNode.setChild(groupbyNode.getChild()); @@ -380,7 +380,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou AggregationFunctionCallEval[] aggFunctions = groupbyNode.getAggFunctions(); for (int aggIdx = 0; aggIdx < aggFunctions.length; aggIdx++) { AggregationFunctionCallEval aggFunction = aggFunctions[aggIdx]; - Target aggFunctionTarget = groupbyNode.getTargets()[originalGroupingColumns.size() + aggIdx]; + Target aggFunctionTarget = groupbyNode.getTargets().get(originalGroupingColumns.size() + aggIdx); if (aggFunction.isDistinct()) { // Create or reuse Groupby node for each Distinct expression. @@ -414,15 +414,15 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (DistinctGroupbyNodeBuildInfo buildInfo: distinctNodeBuildInfos.values()) { GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - Target[] targets = new Target[eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()]; + List targets = new ArrayList<>(); int targetIdx = 0; for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets[targetIdx++] = target; + targets.set(targetIdx++, target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets[targetIdx++] = eachAggFunctionTarget; + targets.set(targetIdx++, eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -437,14 +437,14 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - Target[] targets = new Target[originalGroupingColumns.size() + otherAggregationFunctionTargets.size()]; + List targets = new ArrayList<>(); int targetIdx = 0; for (Column column : originalGroupingColumns) { Target target = new Target(new FieldEval(column)); - targets[targetIdx++] = target; + targets.set(targetIdx++, target); } for (Target eachTarget : otherAggregationFunctionTargets) { - targets[targetIdx++] = eachTarget; + targets.set(targetIdx++, eachTarget); } otherGroupbyNode.setTargets(targets); @@ -530,14 +530,14 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou Target target = new Target(new FieldEval(column)); firstGroupbyTargets.add(target); } - firstStageGroupbyNode.setTargets(firstGroupbyTargets.toArray(new Target[]{})); + firstStageGroupbyNode.setTargets(new ArrayList<>(firstGroupbyTargets)); // SecondStage: // Set grouping column with origin groupby's columns // Remove distinct group column from targets secondStageGroupbyNode.setGroupingColumns(originGroupColumns.toArray(new Column[]{})); - Target[] oldTargets = secondStageGroupbyNode.getTargets(); + List oldTargets = secondStageGroupbyNode.getTargets(); List secondGroupbyTargets = new ArrayList<>(); LinkedHashSet distinctColumns = EvalTreeUtil.findUniqueColumns(secondStageGroupbyNode.getAggFunctions()[0]); List uniqueDistinctColumn = new ArrayList<>(); @@ -548,7 +548,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } } for (int i = 0; i < originGroupColumns.size(); i++) { - secondGroupbyTargets.add(oldTargets[i]); + secondGroupbyTargets.add(oldTargets.get(i)); if (grpIdx > 0) { columnIdIndex++; } @@ -557,7 +557,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (int aggFuncIdx = 0; aggFuncIdx < secondStageGroupbyNode.getAggFunctions().length; aggFuncIdx++) { secondStageGroupbyNode.getAggFunctions()[aggFuncIdx].setLastPhase(); int targetIdx = originGroupColumns.size() + uniqueDistinctColumn.size() + aggFuncIdx; - Target aggFuncTarget = oldTargets[targetIdx]; + Target aggFuncTarget = oldTargets.get(targetIdx); secondGroupbyTargets.add(aggFuncTarget); Column column = aggFuncTarget.getNamedColumn(); if (column.hasQualifier()) { @@ -567,7 +567,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } columnIdIndex++; } - secondStageGroupbyNode.setTargets(secondGroupbyTargets.toArray(new Target[]{})); + secondStageGroupbyNode.setTargets(new ArrayList<>(secondGroupbyTargets)); } else { // FirstStage: Change target of aggFunction to function name expr List firstGroupbyTargets = new ArrayList<>(); @@ -587,7 +587,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou secondStageAggFunction.setArgs(new EvalNode[] {firstEval}); secondStageAggFunction.setLastPhase(); - Target secondTarget = secondStageGroupbyNode.getTargets()[secondStageGroupbyNode.getGroupingColumns().length + aggFuncIdx]; + Target secondTarget = secondStageGroupbyNode.getTargets().get(secondStageGroupbyNode.getGroupingColumns().length + aggFuncIdx); Column column = secondTarget.getNamedColumn(); if (column.hasQualifier()) { secondStageColumnIds[originOutputSchema.getColumnId(column.getQualifiedName())] = columnIdIndex; @@ -597,7 +597,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou columnIdIndex++; aggFuncIdx++; } - firstStageGroupbyNode.setTargets(firstGroupbyTargets.toArray(new Target[]{})); + firstStageGroupbyNode.setTargets(new ArrayList<>(firstGroupbyTargets)); secondStageGroupbyNode.setInSchema(firstStageGroupbyNode.getOutSchema()); } grpIdx++; @@ -612,12 +612,8 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou lastSecondStageGroupbyNode = secondStageGroupbyNodes.get(secondStageGroupbyNodes.size() - 2); secondStageGroupbyNodes.remove(secondStageGroupbyNodes.size() - 1); - Target[] targets = - new Target[lastSecondStageGroupbyNode.getTargets().length + otherGroupbyNode.getTargets().length]; - System.arraycopy(lastSecondStageGroupbyNode.getTargets(), 0, - targets, 0, lastSecondStageGroupbyNode.getTargets().length); - System.arraycopy(otherGroupbyNode.getTargets(), 0, targets, - lastSecondStageGroupbyNode.getTargets().length, otherGroupbyNode.getTargets().length); + List targets = new ArrayList<>(lastSecondStageGroupbyNode.getTargets()); + targets.addAll(otherGroupbyNode.getTargets()); lastSecondStageGroupbyNode.setTargets(targets); @@ -648,15 +644,15 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } else { //add aggr function target columnIdIndex += firstStageGroupbyNode.getGroupingColumns().length; - Target[] baseGroupbyTargets = firstStageGroupbyNode.getTargets(); + List baseGroupbyTargets = firstStageGroupbyNode.getTargets(); for (int i = firstStageGroupbyNode.getGroupingColumns().length; - i < baseGroupbyTargets.length; i++) { - firstTargets.add(baseGroupbyTargets[i]); + i < baseGroupbyTargets.size(); i++) { + firstTargets.add(baseGroupbyTargets.get(i)); firstStageColumnIds.add(columnIdIndex++); } } } - firstStageDistinctNode.setTargets(firstTargets.toArray(new Target[]{})); + firstStageDistinctNode.setTargets(new ArrayList<>(firstTargets)); firstStageDistinctNode.setResultColumnIds(TUtil.toArray(firstStageColumnIds)); //Set SecondStage ColumnId and Input schema @@ -724,8 +720,8 @@ private void setMultiStageAggregationEnforcer( .addAllSortSpecs(sortSpecs).build()); } thirdStageBlock.getEnforcer().enforceDistinctAggregation(thirdStageDistinctNode.getPID(), - true, MultipleAggregationStage.THRID_STAGE, - DistinctAggregationAlgorithm.SORT_AGGREGATION, sortSpecArrays); + true, MultipleAggregationStage.THRID_STAGE, + DistinctAggregationAlgorithm.SORT_AGGREGATION, sortSpecArrays); } private ExecutionBlock buildDistinctGroupbyAndUnionPlan(MasterPlan masterPlan, ExecutionBlock lastBlock, diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java index 20142745ea..ee3762fa9a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java @@ -41,6 +41,7 @@ import java.io.IOException; import java.net.URI; import java.util.HashSet; +import java.util.List; import java.util.Set; public class BSTIndexScanExec extends ScanExec { @@ -92,7 +93,7 @@ public BSTIndexScanExec(TaskAttemptContext context, IndexScanNode plan, this.reader.open(); } - private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, Target[] targets, EvalNode qual) { + private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, List targets, EvalNode qual) { Schema mergedSchema = new Schema(); Set qualAndTargets = new HashSet<>(); qualAndTargets.addAll(EvalTreeUtil.findUniqueColumns(qual)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/EvalExprExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/EvalExprExec.java index 4581b4a2fc..72ab608847 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/EvalExprExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/EvalExprExec.java @@ -25,6 +25,7 @@ import org.apache.tajo.worker.TaskAttemptContext; import java.io.IOException; +import java.util.List; public class EvalExprExec extends PhysicalExec { private final EvalExprNode plan; @@ -48,10 +49,10 @@ public void init() throws IOException { @Override public Tuple next() throws IOException { if (!executedOnce) { - Target [] targets = plan.getTargets(); - Tuple t = new VTuple(targets.length); - for (int i = 0; i < targets.length; i++) { - t.put(i, targets[i].getEvalTree().eval(null)); + List targets = plan.getTargets(); + Tuple t = new VTuple(targets.size()); + for (int i = 0; i < targets.size(); i++) { + t.put(i, targets.get(i).getEvalTree().eval(null)); } executedOnce = true; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java index 2572e1db8d..3ddad1e5dc 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java @@ -116,8 +116,8 @@ private void rewriteColumnPartitionedTableSchema() throws IOException { } ConstEval constExpr = new ConstEval(datum); - for (int i = 0; i < plan.getTargets().length; i++) { - Target target = plan.getTargets()[i]; + for (int i = 0; i < plan.getTargets().size(); i++) { + Target target = plan.getTargets().get(i); if (target.getEvalTree().equals(targetExpr)) { if (!target.hasAlias()) { @@ -211,7 +211,7 @@ public void init() throws IOException { } protected void initializeProjector(Schema actualInSchema){ - Target[] realTargets; + List realTargets; if (plan.getTargets() == null) { realTargets = PlannerUtil.schemaToTargets(outSchema); } else { @@ -219,10 +219,10 @@ protected void initializeProjector(Schema actualInSchema){ } //if all column is selected and there is no have expression, projection can be skipped - if (realTargets.length == inSchema.size()) { + if (realTargets.size() == inSchema.size()) { for (int i = 0; i < inSchema.size(); i++) { - if (realTargets[i].getEvalTree() instanceof FieldEval) { - FieldEval f = realTargets[i].getEvalTree(); + if (realTargets.get(i).getEvalTree() instanceof FieldEval) { + FieldEval f = realTargets.get(i).getEvalTree(); if(!f.getColumnRef().equals(inSchema.getColumn(i))) { needProjection = true; break; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java index c09e85ea5d..ab13b595e1 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java @@ -172,10 +172,10 @@ public WindowAggExec(TaskAttemptContext context, WindowAggNode plan, PhysicalExe } evaluatedTuple = new VTuple(schemaForOrderBy.size()); - nonFunctionColumnNum = plan.getTargets().length - functionNum; + nonFunctionColumnNum = plan.getTargets().size() - functionNum; nonFunctionColumns = new int[nonFunctionColumnNum]; - for (int idx = 0; idx < plan.getTargets().length - functionNum; idx++) { - nonFunctionColumns[idx] = inSchema.getColumnId(plan.getTargets()[idx].getCanonicalName()); + for (int idx = 0; idx < plan.getTargets().size() - functionNum; idx++) { + nonFunctionColumns[idx] = inSchema.getColumnId(plan.getTargets().get(idx).getCanonicalName()); } outputColumnNum = nonFunctionColumnNum + functionNum; diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java index b747849681..bc57fcd39c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java @@ -29,9 +29,7 @@ import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Stack; +import java.util.*; /** * Tajo's logical planner can generate different shapes of logical plans for the same query, @@ -169,8 +167,8 @@ private EvalNode sortQual(EvalNode[] cnf) { return AlgebraicUtil.createSingletonExprFromCNF(cnf); } - private Target[] sortTargets(Target[] targets) { - Arrays.sort(targets, targetComparator); + private List sortTargets(List targets) { + Collections.sort(targets, targetComparator); return targets; } } diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java index e260c003fd..9a35ee69ed 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java @@ -319,16 +319,16 @@ public void execNonFromQuery(QueryContext queryContext, Session session, String LogicalRootNode rootNode = plan.getRootBlock().getRoot(); EvalContext evalContext = new EvalContext(); - Target[] targets = plan.getRootBlock().getRawTargets(); + List targets = plan.getRootBlock().getRawTargets(); if (targets == null) { throw new TajoInternalError("no targets"); } try { // start script executor startScriptExecutors(queryContext, evalContext, targets); - final VTuple outTuple = new VTuple(targets.length); - for (int i = 0; i < targets.length; i++) { - EvalNode eval = targets[i].getEvalTree(); + final VTuple outTuple = new VTuple(targets.size()); + for (int i = 0; i < targets.size(); i++) { + EvalNode eval = targets.get(i).getEvalTree(); eval.bind(evalContext, null); outTuple.put(i, eval.eval(null)); } @@ -371,10 +371,10 @@ public void execNonFromQuery(QueryContext queryContext, Session session, String } } - public static void startScriptExecutors(QueryContext queryContext, EvalContext evalContext, Target[] targets) + public static void startScriptExecutors(QueryContext queryContext, EvalContext evalContext, List targets) throws IOException { - for (int i = 0; i < targets.length; i++) { - EvalNode eval = targets[i].getEvalTree(); + for (int i = 0; i < targets.size(); i++) { + EvalNode eval = targets.get(i).getEvalTree(); if (eval instanceof GeneralFunctionEval) { GeneralFunctionEval functionEval = (GeneralFunctionEval) eval; if (functionEval.getFuncDesc().getInvocation().hasPython()) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java index 117de3968b..404e97160d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java @@ -124,7 +124,7 @@ private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoEx if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { - newJoinNode.setTargets(targets.toArray(new Target[targets.size()])); + newJoinNode.setTargets(new ArrayList<>(targets)); } PlannerUtil.replaceNode(plan, block.getRoot(), old, newNode); // End of replacement logic diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java index 87426b1bfb..86101944d4 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java @@ -456,7 +456,7 @@ public class QueryBlock { /** It contains a planning log for this block */ private final List planingHistory = Lists.newArrayList(); /** It is for debugging or unit tests */ - private Target[] rawTargets; + private List rawTargets; public QueryBlock(String blockName) { this.blockName = blockName; @@ -487,11 +487,11 @@ public NodeType getRootType() { return rootType; } - public Target [] getRawTargets() { + public List getRawTargets() { return rawTargets; } - public void setRawTargets(Target[] rawTargets) { + public void setRawTargets(List rawTargets) { this.rawTargets = rawTargets; } 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 78fa73746c..87f9bc0d62 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 @@ -22,6 +22,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import org.apache.avro.generic.GenericData; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; @@ -274,7 +275,7 @@ public LogicalNode visitProjection(PlanContext context, Stack stack, Proje //////////////////////////////////////////////////////// ProjectionNode projectionNode; - Target[] targets; + List targets; targets = buildTargets(context, referenceNames); // Set ProjectionNode @@ -302,18 +303,18 @@ public LogicalNode visitProjection(PlanContext context, Stack stack, Proje return projectionNode; } - private void setRawTargets(PlanContext context, Target[] targets, String[] referenceNames, + private void setRawTargets(PlanContext context, List targets, String[] referenceNames, Projection projection) throws TajoException { LogicalPlan plan = context.plan; QueryBlock block = context.queryBlock; // It's for debugging or unit tests. - Target [] rawTargets = new Target[projection.getNamedExprs().length]; + List rawTargets = new ArrayList<>(); for (int i = 0; i < projection.getNamedExprs().length; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); - rawTargets[i] = new Target(evalNode, referenceNames[i]); + rawTargets.set(i, new Target(evalNode, referenceNames[i])); } // it's for debugging or unit testing block.setRawTargets(rawTargets); @@ -465,15 +466,15 @@ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack targets = new ArrayList<>(); - for (int i = 0; i < targets.length; i++) { + for (int i = 0; i < finalTargetNum; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_ONLY); if (namedExpr.hasAlias()) { - targets[i] = new Target(evalNode, namedExpr.getAlias()); + targets.set(i, new Target(evalNode, namedExpr.getAlias())); } else { - targets[i] = new Target(evalNode, context.plan.generateUniqueColumnName(namedExpr.getExpr())); + targets.set(i, new Target(evalNode, context.plan.generateUniqueColumnName(namedExpr.getExpr()))); } } EvalExprNode evalExprNode = context.queryBlock.getNodeFromExpr(projection); @@ -484,24 +485,24 @@ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack buildTargets(PlanContext context, String[] referenceNames) throws TajoException { QueryBlock block = context.queryBlock; - Target [] targets = new Target[referenceNames.length]; + List targets = new ArrayList<>(); for (int i = 0; i < referenceNames.length; i++) { String refName = referenceNames[i]; if (block.isConstReference(refName)) { - targets[i] = new Target(block.getConstByReference(refName), refName); + targets.set(i, new Target(block.getConstByReference(refName), refName)); } else if (block.namedExprsMgr.isEvaluated(refName)) { - targets[i] = block.namedExprsMgr.getTarget(refName); + targets.set(i, block.namedExprsMgr.getTarget(refName)); } else { NamedExpr namedExpr = block.namedExprsMgr.getNamedExpr(refName); EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); block.namedExprsMgr.markAsEvaluated(refName, evalNode); - targets[i] = new Target(evalNode, refName); + targets.set(i, new Target(evalNode, refName)); } } return targets; @@ -523,8 +524,8 @@ public static void verifyProjectedFields(QueryBlock block, Projectable projectab int groupingKeyNum = groupbyNode.getGroupingColumns().length; for (int i = 0; i < groupingKeyNum; i++) { - Target target = groupbyNode.getTargets()[i]; - if (groupbyNode.getTargets()[i].getEvalTree().getType() == EvalType.FIELD) { + Target target = groupbyNode.getTargets().get(i); + if (groupbyNode.getTargets().get(i).getEvalTree().getType() == EvalType.FIELD) { FieldEval grpKeyEvalNode = target.getEvalTree(); if (!groupbyNode.getInSchema().contains(grpKeyEvalNode.getColumnRef())) { throwCannotEvaluateException(projectable, grpKeyEvalNode.getName()); @@ -554,8 +555,8 @@ public static void verifyProjectedFields(QueryBlock block, Projectable projectab } // verify targets except for function slots - for (int i = 0; i < windowAggNode.getTargets().length - windowAggNode.getWindowFunctions().length; i++) { - Target target = windowAggNode.getTargets()[i]; + for (int i = 0; i < windowAggNode.getTargets().size() - windowAggNode.getWindowFunctions().length; i++) { + Target target = windowAggNode.getTargets().get(i); Set columns = EvalTreeUtil.findUniqueColumns(target.getEvalTree()); for (Column c : columns) { if (!windowAggNode.getInSchema().contains(c)) { @@ -717,7 +718,7 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, } } - Target [] targets = new Target[referenceNames.length]; + List targets = new ArrayList<>(); List windowFuncIndices = Lists.newArrayList(); Projection projection = (Projection) stack.peek(); int windowFuncIdx = 0; @@ -733,14 +734,14 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, for (int i = 0; i < referenceNames.length ; i++) { if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { - targets[targetIdx++] = new Target(block.getConstByReference(referenceNames[i]), referenceNames[i]); + targets.set(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); } else { - targets[targetIdx++] = block.namedExprsMgr.getTarget(referenceNames[i]); + targets.set(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); } } } for (int i = 0; i < winFuncRefs.size(); i++) { - targets[targetIdx++] = block.namedExprsMgr.getTarget(winFuncRefs.get(i)); + targets.set(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); } windowAggNode.setTargets(targets); verifyProjectedFields(block, windowAggNode); @@ -806,7 +807,7 @@ private LogicalNode insertGroupbyNode(PlanContext context, LogicalNode child, St groupbyNode.setDistinct(includeDistinctFunction); groupbyNode.setAggFunctions(aggEvals.toArray(new AggregationFunctionCallEval[aggEvals.size()])); - Target [] targets = ProjectionPushDownRule.buildGroupByTarget(groupbyNode, null, + List targets = ProjectionPushDownRule.buildGroupByTarget(groupbyNode, null, aggEvalNames.toArray(new String[aggEvalNames.size()])); groupbyNode.setTargets(targets); @@ -1052,7 +1053,7 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat groupingNode.setDistinct(includeDistinctFunction); groupingNode.setAggFunctions(aggEvalNodes.toArray(new AggregationFunctionCallEval[aggEvalNodes.size()])); - Target [] targets = new Target[effectiveGroupingKeyNum + aggEvalNames.size()]; + List targets = new ArrayList<>(); // In target, grouping columns will be followed by aggregation evals. // @@ -1063,11 +1064,11 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat // Build grouping keys for (int i = 0; i < effectiveGroupingKeyNum; i++) { Target target = block.namedExprsMgr.getTarget(groupingNode.getGroupingColumns()[i].getQualifiedName()); - targets[i] = target; + targets.set(i, target); } for (int i = 0, targetIdx = effectiveGroupingKeyNum; i < aggEvalNodes.size(); i++, targetIdx++) { - targets[targetIdx] = block.namedExprsMgr.getTarget(aggEvalNames.get(i)); + targets.set(targetIdx, block.namedExprsMgr.getTarget(aggEvalNames.get(i))); } groupingNode.setTargets(targets); @@ -1198,7 +1199,7 @@ public LogicalNode visitJoin(PlanContext context, Stack stack, Join join) for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - joinNode.setTargets(targets.toArray(new Target[targets.size()])); + joinNode.setTargets(targets); // Determine join conditions if (join.isNatural()) { // if natural join, it should have the equi-join conditions by common column names @@ -1305,7 +1306,7 @@ private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - join.setTargets(targets.toArray(new Target[targets.size()])); + join.setTargets(targets); return join; } @@ -1366,7 +1367,7 @@ public ScanNode visitRelation(PlanContext context, Stack stack, Relation e targets.add(new Target(evalNode, reference)); } - scanNode.setTargets(targets.toArray(new Target[targets.size()])); + scanNode.setTargets((List) targets); verifyProjectedFields(block, scanNode); return scanNode; @@ -1463,7 +1464,7 @@ private void setTargetOfTableSubQuery (PlanContext context, QueryBlock block, Ta targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - subQueryNode.setTargets(targets.toArray(new Target[targets.size()])); + subQueryNode.setTargets((List) targets); } /*=============================================================================================== @@ -1512,7 +1513,7 @@ private ProjectionNode insertProjectionGroupbyBeforeSetOperation(PlanContext con currentBlock.addRelation(setOpTableSubQueryNode); Schema setOpSchema = setOpTableSubQueryNode.getOutSchema(); - Target[] setOpTarget = setOpTableSubQueryNode.getTargets(); + List setOpTarget = setOpTableSubQueryNode.getTargets(); // make group by node whose grouping keys are all columns of set operation GroupbyNode setOpGroupbyNode = context.plan.createNode(GroupbyNode.class); @@ -1606,7 +1607,7 @@ private LogicalNode buildSetPlan(PlanContext context, Stack stack, SetOper // An union statement can be derived from two query blocks. // For one union statement between both relations, we can ensure that each corresponding data domain of both // relations are the same. However, if necessary, the schema of left query block will be used as a base schema. - Target [] leftStrippedTargets = PlannerUtil.stripTarget( + List leftStrippedTargets = PlannerUtil.stripTarget( PlannerUtil.schemaToTargets(leftBlock.getRoot().getOutSchema())); setOp.setInSchema(leftChild.getOutSchema()); @@ -1759,13 +1760,13 @@ private void buildProjectedInsert(PlanContext context, InsertNode insertNode) { continue; } - if (idxInProjectionNode >= 0 && idxInProjectionNode < projectionNode.getTargets().length) { - targets.add(projectionNode.getTargets()[idxInProjectionNode]); + if (idxInProjectionNode >= 0 && idxInProjectionNode < projectionNode.getTargets().size()) { + targets.add(projectionNode.getTargets().get(idxInProjectionNode)); } else { targets.add(new Target(new ConstEval(NullDatum.get()), column.getSimpleName())); } } - projectionNode.setTargets(targets.toArray(new Target[targets.size()])); + projectionNode.setTargets(new ArrayList<>(targets)); insertNode.setInSchema(projectionNode.getOutSchema()); insertNode.setOutSchema(projectionNode.getOutSchema()); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java index 02ec615023..5169136132 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java @@ -144,7 +144,7 @@ public static List findAllColumnRefs(EvalNode node) { return finder.getColumnRefs(); } - public static Schema getSchemaByTargets(Schema inputSchema, Target[] targets) { + public static Schema getSchemaByTargets(Schema inputSchema, List targets) { Schema schema = new Schema(); for (Target target : targets) { schema.addColumn( diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index 5ec0f022bf..3d40ae67e3 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -39,7 +39,7 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone private List subGroupbyPlan; @Expose - private Target[] targets; + private List targets; @Expose private Column[] groupingColumns = PlannerUtil.EMPTY_COLUMNS; @@ -56,21 +56,21 @@ public DistinctGroupbyNode(int pid) { @Override public boolean hasTargets() { - return targets.length > 0; + return targets.size() > 0; } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target[] getTargets() { + public List getTargets() { if (hasTargets()) { return targets; } else { - return new Target[0]; + return new ArrayList<>(); } } @@ -131,10 +131,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - cloneNode.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - cloneNode.targets[i] = (Target) targets[i].clone(); - } + cloneNode.targets = new ArrayList<>(targets); } if (groupbyPlan != null) { @@ -169,7 +166,7 @@ public int hashCode() { result = prime * result + Arrays.hashCode(groupingColumns); result = prime * result + Arrays.hashCode(resultColumnIds); result = prime * result + ((subGroupbyPlan == null) ? 0 : subGroupbyPlan.hashCode()); - result = prime * result + Arrays.hashCode(targets); + result = prime * result + Arrays.hashCode(targets.toArray()); return result; } @@ -223,9 +220,9 @@ public PlanString getPlanString() { planStr.appendExplain("exprs: ").appendExplain(sb.toString()); sb = new StringBuilder("target list: "); - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if( i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if( i < targets.size() - 1) { sb.append(", "); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java index 0632f6828a..e19cfb419a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java @@ -22,6 +22,7 @@ package org.apache.tajo.plan.logical; import java.util.Arrays; +import java.util.List; import com.google.gson.annotations.Expose; @@ -32,7 +33,7 @@ import org.apache.tajo.util.TUtil; public class EvalExprNode extends LogicalNode implements Projectable { - @Expose private Target[] exprs; + @Expose private List exprs; public EvalExprNode(int pid) { super(pid, NodeType.EXPRS); @@ -54,30 +55,30 @@ public boolean hasTargets() { } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.exprs = targets; this.setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target[] getTargets() { + public List getTargets() { return exprs; } - public Target[] getExprs() { + public List getExprs() { return this.exprs; } @Override public String toString() { - return "EvalExprNode (" + StringUtils.join(exprs) + ")"; + return "EvalExprNode (" + StringUtils.join(exprs.toArray()) + ")"; } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + Arrays.hashCode(exprs); + result = prime * result + Arrays.hashCode(exprs.toArray()); return result; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index 3966606193..25d73a6a7e 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -28,7 +28,9 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class GroupbyNode extends UnaryNode implements Projectable, Cloneable { /** Grouping key sets */ @@ -39,7 +41,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable { * It's a list of targets. The grouping columns should be followed by aggregation functions. * aggrFunctions keep actual aggregation functions, but it only contains field references. * */ - @Expose private Target [] targets; + @Expose private List targets; @Expose private boolean hasDistinct = false; /** * A flag to indicate if this groupby is for distinct block (i.e., SELECT DISTINCT x,y,z, ...) @@ -105,13 +107,13 @@ public boolean hasTargets() { } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target[] getTargets() { + public List getTargets() { return this.targets; } @@ -139,7 +141,7 @@ public int hashCode() { result = prime * result + Arrays.hashCode(aggrFunctions); result = prime * result + Arrays.hashCode(groupingKeys); result = prime * result + (hasDistinct ? 1231 : 1237); - result = prime * result + Arrays.hashCode(targets); + result = prime * result + Arrays.hashCode(targets.toArray()); return result; } @@ -176,10 +178,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - grp.targets[i] = (Target) targets[i].clone(); - } + grp.targets = new ArrayList<>(targets); } return grp; @@ -213,9 +212,9 @@ public String getShortPlanString() { if (targets != null) { sb.append(", target list:{"); - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if (i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if (i < targets.size() - 1) { sb.append(", "); } } @@ -261,9 +260,9 @@ public PlanString getPlanString() { } sb = new StringBuilder("target list: "); - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if( i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if( i < targets.size() - 1) { sb.append(", "); } } @@ -280,9 +279,9 @@ public PlanString getPlanString() { * If so, it returns TRUE. Otherwise, it returns FALSE. */ public boolean isAggregationColumn(String simpleName) { - for (int i = groupingKeys.length; i < targets.length; i++) { - if (simpleName.equals(targets[i].getNamedColumn().getSimpleName()) || - simpleName.equals(targets[i].getAlias())) { + for (int i = groupingKeys.length; i < targets.size(); i++) { + if (simpleName.equals(targets.get(i).getNamedColumn().getSimpleName()) || + simpleName.equals(targets.get(i).getAlias())) { return true; } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 8b843a92d1..2ee8c38a51 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -29,11 +29,13 @@ import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class JoinNode extends BinaryNode implements Projectable, Cloneable { @Expose private JoinSpec joinSpec = new JoinSpec(); - @Expose private Target[] targets; + @Expose private List targets; public JoinNode(int pid) { super(pid, NodeType.JOIN); @@ -79,12 +81,12 @@ public boolean hasTargets() { } @Override - public Target[] getTargets() { + public List getTargets() { return this.targets; } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; this.setOutSchema(PlannerUtil.targetToSchema(targets)); } @@ -119,7 +121,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + joinSpec.hashCode(); - result = prime * result + Arrays.hashCode(targets); + result = prime * result + Arrays.hashCode(targets.toArray()); return result; } @@ -140,10 +142,7 @@ public Object clone() throws CloneNotSupportedException { JoinNode join = (JoinNode) super.clone(); join.joinSpec = (JoinSpec) this.joinSpec.clone(); if (hasTargets()) { - join.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - join.targets[i] = (Target) targets[i].clone(); - } + join.targets = new ArrayList<>(targets); } return join; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java index a4bb94ced9..3e7ea93d82 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java @@ -27,6 +27,8 @@ import org.apache.tajo.plan.expr.EvalNode; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; + public class PartitionedTableScanNode extends ScanNode { @Expose Path [] inputPaths; @@ -100,10 +102,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - unionScan.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - unionScan.targets[i] = (Target) targets[i].clone(); - } + unionScan.targets = new ArrayList<>(targets); } unionScan.inputPaths = inputPaths; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/Projectable.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/Projectable.java index 68d18610e5..858a585f0c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/Projectable.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/Projectable.java @@ -21,6 +21,8 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.plan.Target; +import java.util.List; + /** * Projectable is an interface for a LogicalNode which has a list of targets. * What a logical node has a list of targets means that the node evaluated a list of expressions. @@ -49,14 +51,14 @@ public interface Projectable { * * @param targets The array of targets */ - void setTargets(Target[] targets); + void setTargets(List targets); /** * Get a list of targets * * @return The array of targets */ - Target [] getTargets(); + List getTargets(); /** * Get an input schema diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index ef6734e574..b2c6127f93 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,7 +18,9 @@ package org.apache.tajo.plan.logical; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import com.google.gson.annotations.Expose; @@ -34,13 +36,13 @@ public class ProjectionNode extends UnaryNode implements Projectable { /** * the targets are always filled even if the query is 'select *' */ - @Expose private Target [] targets; + @Expose private List targets; public ProjectionNode(int pid) { super(pid, NodeType.PROJECTION); } - public void init(boolean distinct, Target [] targets) { + public void init(boolean distinct, List targets) { this.distinct = distinct; this.targets = targets; } @@ -54,13 +56,13 @@ public boolean hasTargets() { } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; this.setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target [] getTargets() { + public List getTargets() { return this.targets; } @@ -71,7 +73,7 @@ public void setChild(LogicalNode subNode) { public String toString() { StringBuilder sb = new StringBuilder("Projection (distinct=").append(distinct); if (targets != null) { - sb.append(", exprs=").append(StringUtils.join(targets)).append(")"); + sb.append(", exprs=").append(StringUtils.join(targets.toArray())).append(")"); } return sb.toString(); } @@ -81,7 +83,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (distinct ? 1231 : 1237); - result = prime * result + Arrays.hashCode(targets); + result = prime * result + Arrays.hashCode(targets.toArray()); return result; } @@ -101,7 +103,7 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { ProjectionNode projNode = (ProjectionNode) super.clone(); - projNode.targets = targets.clone(); + projNode.targets = new ArrayList<>(targets); return projNode; } @@ -117,9 +119,9 @@ public PlanString getPlanString() { StringBuilder sb = new StringBuilder("Targets: "); if (targets != null) { - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if (i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if (i < targets.size() - 1) { sb.append(", "); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 4b8a9e9d77..46211e6431 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -31,12 +31,15 @@ import org.apache.tajo.plan.expr.EvalNode; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; +import java.util.List; + public class ScanNode extends RelationNode implements Projectable, SelectableNode, Cloneable { @Expose protected TableDesc tableDesc; @Expose protected String alias; @Expose protected Schema logicalSchema; @Expose protected EvalNode qual; - @Expose protected Target[] targets; + @Expose protected List targets; @Expose protected boolean broadcastTable; @Expose protected long limit = -1; // -1 means no set @@ -142,13 +145,13 @@ public boolean hasTargets() { } @Override - public void setTargets(Target [] targets) { + public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target [] getTargets() { + public List getTargets() { return this.targets; } @@ -224,10 +227,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - scanNode.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - scanNode.targets[i] = (Target) targets[i].clone(); - } + scanNode.targets = new ArrayList<>(targets); } if (hasAlias()) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java index 4e9bd5c4e9..76d5d51207 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java @@ -26,10 +26,13 @@ import org.apache.tajo.catalog.SchemaUtil; import org.apache.tajo.plan.Target; +import java.util.ArrayList; +import java.util.List; + public class TableSubQueryNode extends RelationNode implements Projectable { @Expose private String tableName; @Expose private LogicalNode subQuery; - @Expose private Target [] targets; // unused + @Expose private List targets; // unused public TableSubQueryNode(int pid) { super(pid, NodeType.TABLE_SUBQUERY); @@ -108,13 +111,13 @@ public boolean hasTargets() { } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target[] getTargets() { + public List getTargets() { return targets; } @@ -125,9 +128,9 @@ public PlanString getPlanString() { if (hasTargets()) { StringBuilder sb = new StringBuilder("Targets: "); - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if( i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if( i < targets.size() - 1) { sb.append(", "); } } @@ -164,10 +167,7 @@ public Object clone() throws CloneNotSupportedException { newTableSubQueryNode.tableName = tableName; newTableSubQueryNode.subQuery = (LogicalNode) subQuery.clone(); if (hasTargets()) { - newTableSubQueryNode.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - newTableSubQueryNode.targets[i] = (Target) targets[i].clone(); - } + newTableSubQueryNode.targets = new ArrayList<>(targets); } return newTableSubQueryNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java index 1bee34c3b7..e8586e27ef 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java @@ -29,6 +29,9 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; +import java.util.List; + public class WindowAggNode extends UnaryNode implements Projectable, Cloneable { /** partition key sets */ @Expose private Column [] partitionKeys; @@ -41,7 +44,7 @@ public class WindowAggNode extends UnaryNode implements Projectable, Cloneable { * It's a list of targets. The partition key columns should be followed by window functions. * aggrFunctions keep actual aggregation functions, but it only contains field references. * */ - @Expose private Target [] targets; + @Expose private List targets; @Expose private boolean hasDistinct = false; public WindowAggNode(int pid) { @@ -98,13 +101,13 @@ public boolean hasTargets() { } @Override - public void setTargets(Target[] targets) { + public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @Override - public Target[] getTargets() { + public List getTargets() { return this.targets; } @@ -167,10 +170,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new Target[targets.length]; - for (int i = 0; i < targets.length; i++) { - grp.targets[i] = (Target) targets[i].clone(); - } + grp.targets = new ArrayList<>(targets); } return grp; @@ -224,9 +224,9 @@ public PlanString getPlanString() { } sb = new StringBuilder("target list: "); - for (int i = 0; i < targets.length; i++) { - sb.append(targets[i]); - if( i < targets.length - 1) { + for (int i = 0; i < targets.size(); i++) { + sb.append(targets.get(i)); + if( i < targets.size() - 1) { sb.append(", "); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java index b30cee4d5c..55ce963618 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java @@ -242,7 +242,7 @@ public LogicalNode visitProjection(LogicalPlanner.PlanContext ctx, Stack s } } - Target[] targets = buildTargets(ctx, expr.getNamedExprs()); + List targets = buildTargets(ctx, expr.getNamedExprs()); stack.pop(); // <--- Pop @@ -254,17 +254,17 @@ public LogicalNode visitProjection(LogicalPlanner.PlanContext ctx, Stack s return projectionNode; } - private Target [] buildTargets(LogicalPlanner.PlanContext context, NamedExpr [] exprs) throws TajoException { - Target [] targets = new Target[exprs.length]; + private List buildTargets(LogicalPlanner.PlanContext context, NamedExpr [] exprs) throws TajoException { + List targets = new ArrayList<>(); for (int i = 0; i < exprs.length; i++) { NamedExpr namedExpr = exprs[i]; TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); if (namedExpr.hasAlias()) { - targets[i] = new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType))); + targets.set(i, new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); } else { String generatedName = context.getPlan().generateUniqueColumnName(namedExpr.getExpr()); - targets[i] = new Target(new FieldEval(new Column(generatedName, dataType))); + targets.set(i, new Target(new FieldEval(new Column(generatedName, dataType)))); } } return targets; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java index a0d0242916..902ad2c639 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java @@ -128,7 +128,7 @@ public Object visitFilter(Object context, LogicalPlan plan, LogicalPlan.QueryBlo joinNode.setOutSchema(node.getOutSchema()); List targets = TUtil.newList(PlannerUtil.schemaToTargets(inSchema)); - joinNode.setTargets(targets.toArray(new Target[targets.size()])); + joinNode.setTargets(new ArrayList<>(targets)); block.addJoinType(joinType); block.registerNode(joinNode); 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 1d32376583..148d6e1484 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 @@ -457,11 +457,11 @@ public LogicalNode visitRoot(Context context, LogicalPlan plan, LogicalPlan.Quer public LogicalNode visitProjection(Context context, LogicalPlan plan, LogicalPlan.QueryBlock block, ProjectionNode node, Stack stack) throws TajoException { Context newContext = new Context(context); - Target [] targets = node.getTargets(); - int targetNum = targets.length; + List targets = node.getTargets(); + int targetNum = targets.size(); String [] referenceNames = new String[targetNum]; for (int i = 0; i < targetNum; i++) { - referenceNames[i] = newContext.addExpr(targets[i]); + referenceNames[i] = newContext.addExpr(targets.get(i)); } LogicalNode child = super.visitProjection(newContext, plan, block, node, stack); @@ -489,7 +489,7 @@ public LogicalNode visitProjection(Context context, LogicalPlan plan, LogicalPla } } - node.setTargets(finalTargets.toArray(new Target[finalTargets.size()])); + node.setTargets(finalTargets); LogicalPlanner.verifyProjectedFields(block, node); // Removing ProjectionNode @@ -642,10 +642,10 @@ public LogicalNode visitWindowAgg(Context context, LogicalPlan plan, LogicalPlan } - int nonFunctionColumnNum = node.getTargets().length - node.getWindowFunctions().length; + int nonFunctionColumnNum = node.getTargets().size() - node.getWindowFunctions().length; LinkedHashSet nonFunctionColumns = Sets.newLinkedHashSet(); for (int i = 0; i < nonFunctionColumnNum; i++) { - FieldEval fieldEval = (new FieldEval(node.getTargets()[i].getNamedColumn())); + FieldEval fieldEval = (new FieldEval(node.getTargets().get(i).getNamedColumn())); nonFunctionColumns.add(newContext.addExpr(fieldEval)); } @@ -653,9 +653,9 @@ public LogicalNode visitWindowAgg(Context context, LogicalPlan plan, LogicalPlan if (node.hasAggFunctions()) { final int evalNum = node.getWindowFunctions().length; aggEvalNames = new String[evalNum]; - for (int evalIdx = 0, targetIdx = nonFunctionColumnNum; targetIdx < node.getTargets().length; evalIdx++, + for (int evalIdx = 0, targetIdx = nonFunctionColumnNum; targetIdx < node.getTargets().size(); evalIdx++, targetIdx++) { - Target target = node.getTargets()[targetIdx]; + Target target = node.getTargets().get(targetIdx); WindowFunctionEval winFunc = node.getWindowFunctions()[evalIdx]; aggEvalNames[evalIdx] = newContext.addExpr(new Target(winFunc, target.getCanonicalName())); } @@ -706,7 +706,7 @@ public LogicalNode visitWindowAgg(Context context, LogicalPlan plan, LogicalPlan } } - node.setTargets(targets.toArray(new Target[targets.size()])); + node.setTargets(targets); return node; } @@ -734,9 +734,9 @@ public LogicalNode visitGroupBy(Context context, LogicalPlan plan, LogicalPlan.Q if (node.hasAggFunctions()) { final int evalNum = node.getAggFunctions().length; aggEvalNames = new String[evalNum]; - for (int evalIdx = 0, targetIdx = node.getGroupingColumns().length; targetIdx < node.getTargets().length; + for (int evalIdx = 0, targetIdx = node.getGroupingColumns().length; targetIdx < node.getTargets().size(); evalIdx++, targetIdx++) { - Target target = node.getTargets()[targetIdx]; + Target target = node.getTargets().get(targetIdx); EvalNode evalNode = node.getAggFunctions()[evalIdx]; aggEvalNames[evalIdx] = newContext.addExpr(new Target(evalNode, target.getCanonicalName())); } @@ -810,7 +810,7 @@ public LogicalNode visitGroupBy(Context context, LogicalPlan plan, LogicalPlan.Q node.setAggFunctions(aggEvals); } } - Target [] finalTargets = buildGroupByTarget(node, targets, aggEvalNames); + List finalTargets = buildGroupByTarget(node, targets, aggEvalNames); node.setTargets(finalTargets); LogicalPlanner.verifyProjectedFields(block, node); @@ -818,28 +818,29 @@ public LogicalNode visitGroupBy(Context context, LogicalPlan plan, LogicalPlan.Q return node; } - public static Target [] buildGroupByTarget(GroupbyNode groupbyNode, @Nullable List groupingKeyTargets, + public static List buildGroupByTarget(GroupbyNode groupbyNode, @Nullable List groupingKeyTargets, String [] aggEvalNames) { final int groupingKeyNum = groupingKeyTargets == null ? groupbyNode.getGroupingColumns().length : groupingKeyTargets.size(); final int aggrFuncNum = aggEvalNames != null ? aggEvalNames.length : 0; EvalNode [] aggEvalNodes = groupbyNode.getAggFunctions(); - Target [] targets = new Target[groupingKeyNum + aggrFuncNum]; + List targets = new ArrayList<>(); +// targets = new Target[groupingKeyNum + aggrFuncNum]; if (groupingKeyTargets != null) { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets[groupingKeyIdx] = groupingKeyTargets.get(groupingKeyIdx); + targets.set(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); } } else { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets[groupingKeyIdx] = new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx])); + targets.set(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); } } if (aggEvalNames != null) { for (int aggrFuncIdx = 0, targetIdx = groupingKeyNum; aggrFuncIdx < aggrFuncNum; aggrFuncIdx++, targetIdx++) { - targets[targetIdx] = - new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType())); + targets.set(targetIdx, + new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType()))); } } @@ -906,7 +907,7 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer String [] referenceNames = null; if (node.hasTargets()) { - referenceNames = new String[node.getTargets().length]; + referenceNames = new String[node.getTargets().size()]; int i = 0; for (Iterator it = getFilteredTarget(node.getTargets(), context.requiredSet); it.hasNext();) { Target target = it.next(); @@ -954,7 +955,7 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets(projectedTargets.toArray(new Target[projectedTargets.size()])); + node.setTargets((List) projectedTargets); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1000,14 +1001,14 @@ public void remove() { } } - static Iterator getFilteredTarget(Target[] targets, Set required) { + static Iterator getFilteredTarget(List targets, Set required) { return new FilteredIterator(targets, required); } static class FilteredIterator implements Iterator { Iterator iterator; - FilteredIterator(Target [] targets, Set requiredReferences) { + FilteredIterator(List targets, Set requiredReferences) { List filtered = TUtil.newList(); Map targetSet = new HashMap<>(); for (Target t : targets) { @@ -1070,7 +1071,7 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer Context newContext = new Context(context); - Target [] targets; + List targets; if (node.hasTargets()) { targets = node.getTargets(); } else { @@ -1092,7 +1093,7 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets(projectedTargets.toArray(new Target[projectedTargets.size()])); + node.setTargets((List) projectedTargets); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1104,7 +1105,7 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, Context newContext = new Context(context); - Target [] targets; + List targets; if (node.hasTargets()) { targets = node.getTargets(); } else { @@ -1126,7 +1127,7 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, } } - node.setTargets(projectedTargets.toArray(new Target[projectedTargets.size()])); + node.setTargets((List) projectedTargets); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1146,7 +1147,7 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo node.setSubQuery(child); stack.pop(); - Target [] targets; + List targets; if (node.hasTargets()) { targets = node.getTargets(); } else { @@ -1168,7 +1169,7 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo } } - node.setTargets(projectedTargets.toArray(new Target[projectedTargets.size()])); + node.setTargets((List) projectedTargets); LogicalPlanner.verifyProjectedFields(block, node); return node; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java index 2051dfb0de..d4f339aab0 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java @@ -741,16 +741,16 @@ public static Column[] convertColumns(List columnProt return columns; } - public static Target[] convertTargets(OverridableConf context, EvalContext evalContext, + public static List convertTargets(OverridableConf context, EvalContext evalContext, List targetsProto) { - Target [] targets = new Target[targetsProto.size()]; - for (int i = 0; i < targets.length; i++) { + List targets = new ArrayList<>(); + for (int i = 0; i < targetsProto.size(); i++) { PlanProto.Target targetProto = targetsProto.get(i); EvalNode evalNode = EvalNodeDeserializer.deserialize(context, evalContext, targetProto.getExpr()); if (targetProto.hasAlias()) { - targets[i] = new Target(evalNode, targetProto.getAlias()); + targets.set(i, new Target(evalNode, targetProto.getAlias())); } else { - targets[i] = new Target((FieldEval) evalNode); + targets.set(i, targets.set(i, new Target((FieldEval) evalNode))); } } return targets; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java index 7907668ef4..6b082f7159 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java @@ -23,6 +23,7 @@ import org.apache.tajo.algebra.JoinType; import org.apache.tajo.catalog.SortSpec; import org.apache.tajo.catalog.proto.CatalogProtos; +import org.apache.tajo.common.ProtoObject; import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.exception.NotImplementedException; @@ -148,7 +149,7 @@ public LogicalNode visitEvalExpr(SerializeContext context, LogicalPlan plan, Log EvalExprNode exprEval, Stack stack) throws TajoException { PlanProto.EvalExprNode.Builder exprEvalBuilder = PlanProto.EvalExprNode.newBuilder(); exprEvalBuilder.addAllTargets( - ProtoUtil.toProtoObjects(exprEval.getTargets())); + ProtoUtil.toProtoObjects(exprEval.getTargets().toArray(new ProtoObject[exprEval.getTargets().size()]))); PlanProto.LogicalNode.Builder nodeBuilder = createNodeBuilder(context, exprEval); nodeBuilder.setExprEval(exprEvalBuilder); @@ -167,7 +168,7 @@ public LogicalNode visitProjection(SerializeContext context, LogicalPlan plan, L PlanProto.ProjectionNode.Builder projectionBuilder = PlanProto.ProjectionNode.newBuilder(); projectionBuilder.setChildSeq(childIds[0]); projectionBuilder.addAllTargets( - ProtoUtil.toProtoObjects(projection.getTargets())); + ProtoUtil.toProtoObjects(projection.getTargets().toArray(new ProtoObject[projection.getTargets().size()]))); projectionBuilder.setDistinct(projection.isDistinct()); PlanProto.LogicalNode.Builder nodeBuilder = createNodeBuilder(context, projection); @@ -222,7 +223,7 @@ public LogicalNode visitWindowAgg(SerializeContext context, LogicalPlan plan, Lo } if (windowAgg.hasTargets()) { windowAggBuilder.addAllTargets( - ProtoUtil.toProtoObjects(windowAgg.getTargets())); + ProtoUtil.toProtoObjects(windowAgg.getTargets().toArray(new ProtoObject[windowAgg.getTargets().size()]))); } PlanProto.LogicalNode.Builder nodeBuilder = createNodeBuilder(context, windowAgg); @@ -297,7 +298,7 @@ private PlanProto.LogicalNode.Builder buildGroupby(SerializeContext context, Gro ProtoUtil.toProtoObjects(node.getAggFunctions())); } if (node.hasTargets()) { - groupbyBuilder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets())); + groupbyBuilder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets().toArray(new ProtoObject[node.getTargets().size()]))); } PlanProto.LogicalNode.Builder nodeBuilder = createNodeBuilder(context, node); @@ -332,7 +333,7 @@ public LogicalNode visitDistinctGroupby(SerializeContext context, LogicalPlan pl ProtoUtil.toProtoObjects(node.getAggFunctions())); } if (node.hasTargets()) { - distGroupbyBuilder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets())); + distGroupbyBuilder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets().toArray(new ProtoObject[node.getTargets().size()]))); } for (int cid : node.getResultColumnIds()) { distGroupbyBuilder.addResultId(cid); @@ -381,7 +382,7 @@ public LogicalNode visitJoin(SerializeContext context, LogicalPlan plan, Logical if (join.hasTargets()) { joinBuilder.setExistsTargets(true); - joinBuilder.addAllTargets(ProtoUtil.toProtoObjects(join.getTargets())); + joinBuilder.addAllTargets(ProtoUtil.toProtoObjects(join.getTargets().toArray(new ProtoObject[join.getTargets().size()]))); } else { joinBuilder.setExistsTargets(false); } @@ -434,7 +435,7 @@ public PlanProto.ScanNode.Builder buildScanNode(ScanNode scan) { if (scan.hasTargets()) { scanBuilder.setExistTargets(true); - scanBuilder.addAllTargets(ProtoUtil.toProtoObjects(scan.getTargets())); + scanBuilder.addAllTargets(ProtoUtil.toProtoObjects(scan.getTargets().toArray(new ProtoObject[scan.getTargets().size()]))); } else { scanBuilder.setExistTargets(false); } @@ -505,7 +506,7 @@ public LogicalNode visitTableSubQuery(SerializeContext context, LogicalPlan plan builder.setTableName(node.getTableName()); if (node.hasTargets()) { - builder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets())); + builder.addAllTargets(ProtoUtil.toProtoObjects(node.getTargets().toArray(new ProtoObject[node.getTargets().size()]))); } builder.setNameResolveBase(node.isNameResolveBase()); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index 507ae8be71..c1be771732 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -536,13 +536,13 @@ public List getFoundNodes() { } } - public static Target[] schemaToTargets(Schema schema) { - Target[] targets = new Target[schema.size()]; + public static List schemaToTargets(Schema schema) { + List targets = new ArrayList<>(); FieldEval eval; for (int i = 0; i < schema.size(); i++) { eval = new FieldEval(schema.getColumn(i)); - targets[i] = new Target(eval); + targets.set(i, new Target(eval)); } return targets; } @@ -680,16 +680,16 @@ public static Schema targetToSchema(Target[] targets) { * @param sourceTargets The targets to be stripped * @return The stripped targets */ - public static Target[] stripTarget(Target[] sourceTargets) { - Target[] copy = new Target[sourceTargets.length]; - for (int i = 0; i < sourceTargets.length; i++) { + public static List stripTarget(List sourceTargets) { + List copy = new ArrayList<>(); + for (int i = 0; i < sourceTargets.size(); i++) { try { - copy[i] = (Target) sourceTargets[i].clone(); + copy.set(i, (Target) sourceTargets.get(i).clone()); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } - if (copy[i].getEvalTree().getType() == EvalType.FIELD) { - FieldEval fieldEval = copy[i].getEvalTree(); + if (copy.get(i).getEvalTree().getType() == EvalType.FIELD) { + FieldEval fieldEval = copy.get(i).getEvalTree(); if (fieldEval.getColumnRef().hasQualifier()) { fieldEval.replaceColumnRef(fieldEval.getColumnName()); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java index c87ceb3379..aff95df3e3 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java @@ -65,7 +65,7 @@ private static void verifyProjectableOutputSchema(Context context, Projectable n Schema outputSchema = node.getOutSchema(); Schema targetSchema = PlannerUtil.targetToSchema(node.getTargets()); - if (outputSchema.size() != node.getTargets().length) { + if (outputSchema.size() != node.getTargets().size()) { throw new TajoInternalError(String.format("Output schema and Target's schema are mismatched at Node (%d)", + node.getPID())); } diff --git a/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/SQLBuilder.java b/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/SQLBuilder.java index ca1c128d08..e7dbc9b889 100644 --- a/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/SQLBuilder.java +++ b/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/SQLBuilder.java @@ -29,6 +29,7 @@ import javax.annotation.Nullable; import java.sql.DatabaseMetaData; +import java.util.List; import java.util.Stack; /** @@ -153,7 +154,7 @@ public void visitFilter(SQLBuilderContext ctx, SelectionNode filter, Stack stack) { StringBuilder selectClause = new StringBuilder("SELECT "); - if (scan.getTargets().length > 0) { + if (scan.getTargets().size() > 0) { selectClause.append(generateTargetList(scan.getTargets())); } else { selectClause.append("1"); @@ -172,8 +173,8 @@ public void visitScan(SQLBuilderContext ctx, ScanNode scan, Stack s } } - public String generateTargetList(Target [] targets) { - return StringUtils.join(targets, ",", new Function() { + public String generateTargetList(List targets) { + return StringUtils.join(targets.toArray(new Target[targets.size()]), ",", new Function() { @Override public String apply(@Nullable Target t) { StringBuilder sb = new StringBuilder(sqlExprGen.generate(t.getEvalTree())); From a69c7a84b2cb30ae6c0eddfb4405868025d70a09 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Wed, 28 Oct 2015 17:43:47 +0900 Subject: [PATCH 02/20] remove unnecessarily imported --- .../main/java/org/apache/tajo/plan/LogicalPlanner.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 87f9bc0d62..7f17bee983 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 @@ -1199,7 +1199,7 @@ public LogicalNode visitJoin(PlanContext context, Stack stack, Join join) for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - joinNode.setTargets(targets); + joinNode.setTargets(new ArrayList<>(targets)); // Determine join conditions if (join.isNatural()) { // if natural join, it should have the equi-join conditions by common column names @@ -1306,7 +1306,7 @@ private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - join.setTargets(targets); + join.setTargets(new ArrayList<>(targets)); return join; } @@ -1367,7 +1367,7 @@ public ScanNode visitRelation(PlanContext context, Stack stack, Relation e targets.add(new Target(evalNode, reference)); } - scanNode.setTargets((List) targets); + scanNode.setTargets(new ArrayList<>(targets)); verifyProjectedFields(block, scanNode); return scanNode; @@ -1464,7 +1464,7 @@ private void setTargetOfTableSubQuery (PlanContext context, QueryBlock block, Ta targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - subQueryNode.setTargets((List) targets); + subQueryNode.setTargets(new ArrayList<>(targets)); } /*=============================================================================================== From d1b5115318b9df94e5fd606f094c4e17e39c8d38 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Wed, 28 Oct 2015 17:50:55 +0900 Subject: [PATCH 03/20] remove forced-casting operation --- .../main/java/org/apache/tajo/plan/LogicalPlanner.java | 1 - .../tajo/plan/rewrite/rules/ProjectionPushDownRule.java | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) 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 7f17bee983..c0fc88116b 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 @@ -22,7 +22,6 @@ import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import org.apache.avro.generic.GenericData; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; 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 148d6e1484..75e08cadff 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 @@ -955,7 +955,7 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets((List) projectedTargets); + node.setTargets(new ArrayList<>(projectedTargets)); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1093,7 +1093,7 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets((List) projectedTargets); + node.setTargets(new ArrayList<>(projectedTargets)); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1127,7 +1127,7 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, } } - node.setTargets((List) projectedTargets); + node.setTargets(new ArrayList<>(projectedTargets)); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1169,7 +1169,7 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo } } - node.setTargets((List) projectedTargets); + node.setTargets(new ArrayList<>(projectedTargets)); LogicalPlanner.verifyProjectedFields(block, node); return node; } From 39e5e6d02d230c2b2d0821fe68df5dd2918967e5 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 14:20:07 +0900 Subject: [PATCH 04/20] bugfix --- .../java/org/apache/tajo/plan/LogicalPlanner.java | 14 +++++++------- .../tajo/plan/rewrite/BaseSchemaBuildPhase.java | 4 ++-- .../plan/rewrite/rules/ProjectionPushDownRule.java | 6 +++--- .../tajo/plan/serder/LogicalNodeDeserializer.java | 4 ++-- .../org/apache/tajo/plan/util/PlannerUtil.java | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) 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 c0fc88116b..b57988a3b1 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 @@ -471,9 +471,9 @@ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack buildTargets(PlanContext context, String[] referenceNames) for (int i = 0; i < referenceNames.length; i++) { String refName = referenceNames[i]; if (block.isConstReference(refName)) { - targets.set(i, new Target(block.getConstByReference(refName), refName)); + targets.add(i, new Target(block.getConstByReference(refName), refName)); } else if (block.namedExprsMgr.isEvaluated(refName)) { - targets.set(i, block.namedExprsMgr.getTarget(refName)); + targets.add(i, block.namedExprsMgr.getTarget(refName)); } else { NamedExpr namedExpr = block.namedExprsMgr.getNamedExpr(refName); EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); block.namedExprsMgr.markAsEvaluated(refName, evalNode); - targets.set(i, new Target(evalNode, refName)); + targets.add(i, new Target(evalNode, refName)); } } return targets; @@ -1063,11 +1063,11 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat // Build grouping keys for (int i = 0; i < effectiveGroupingKeyNum; i++) { Target target = block.namedExprsMgr.getTarget(groupingNode.getGroupingColumns()[i].getQualifiedName()); - targets.set(i, target); + targets.add(i, target); } for (int i = 0, targetIdx = effectiveGroupingKeyNum; i < aggEvalNodes.size(); i++, targetIdx++) { - targets.set(targetIdx, block.namedExprsMgr.getTarget(aggEvalNames.get(i))); + targets.add(targetIdx, block.namedExprsMgr.getTarget(aggEvalNames.get(i))); } groupingNode.setTargets(targets); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java index 55ce963618..c6155eac93 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java @@ -261,10 +261,10 @@ private List buildTargets(LogicalPlanner.PlanContext context, NamedExpr TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); if (namedExpr.hasAlias()) { - targets.set(i, new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); + targets.add(i, new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); } else { String generatedName = context.getPlan().generateUniqueColumnName(namedExpr.getExpr()); - targets.set(i, new Target(new FieldEval(new Column(generatedName, dataType)))); + targets.add(i, new Target(new FieldEval(new Column(generatedName, dataType)))); } } return targets; 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 75e08cadff..5c163cdc89 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 @@ -829,17 +829,17 @@ public static List buildGroupByTarget(GroupbyNode groupbyNode, @Nullable if (groupingKeyTargets != null) { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.set(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); + targets.add(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); } } else { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.set(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); + targets.add(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); } } if (aggEvalNames != null) { for (int aggrFuncIdx = 0, targetIdx = groupingKeyNum; aggrFuncIdx < aggrFuncNum; aggrFuncIdx++, targetIdx++) { - targets.set(targetIdx, + targets.add(targetIdx, new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType()))); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java index d4f339aab0..d37b407c1d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java @@ -748,9 +748,9 @@ public static List convertTargets(OverridableConf context, EvalContext e PlanProto.Target targetProto = targetsProto.get(i); EvalNode evalNode = EvalNodeDeserializer.deserialize(context, evalContext, targetProto.getExpr()); if (targetProto.hasAlias()) { - targets.set(i, new Target(evalNode, targetProto.getAlias())); + targets.add(i, new Target(evalNode, targetProto.getAlias())); } else { - targets.set(i, targets.set(i, new Target((FieldEval) evalNode))); + targets.add(i, new Target((FieldEval) evalNode)); } } return targets; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index c1be771732..f4668ff564 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -542,7 +542,7 @@ public static List schemaToTargets(Schema schema) { FieldEval eval; for (int i = 0; i < schema.size(); i++) { eval = new FieldEval(schema.getColumn(i)); - targets.set(i, new Target(eval)); + targets.add(i, new Target(eval)); } return targets; } From 9c847b348e35bc70d40fa7bbfe3796a95a4d43d5 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 14:30:44 +0900 Subject: [PATCH 05/20] bugfix --- .../global/builder/DistinctGroupbyBuilder.java | 14 +++++++------- .../java/org/apache/tajo/plan/LogicalPlanner.java | 8 ++++---- .../org/apache/tajo/plan/util/PlannerUtil.java | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index 1d6a0d8ed2..93d9284640 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -255,11 +255,11 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets.set(targetIdx++, target); + targets.add(targetIdx++, target); baseGroupByTargets.add(target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets.set(targetIdx++, eachAggFunctionTarget); + targets.add(targetIdx++, eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -277,7 +277,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou List targets = new ArrayList<>(); int targetIdx = 0; for (Target eachTarget : otherAggregationFunctionTargets) { - targets.set(targetIdx++, eachTarget); + targets.add(targetIdx++, eachTarget); baseGroupByTargets.add(eachTarget); } @@ -419,10 +419,10 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets.set(targetIdx++, target); + targets.add(targetIdx++, target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets.set(targetIdx++, eachAggFunctionTarget); + targets.add(targetIdx++, eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -441,10 +441,10 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou int targetIdx = 0; for (Column column : originalGroupingColumns) { Target target = new Target(new FieldEval(column)); - targets.set(targetIdx++, target); + targets.add(targetIdx++, target); } for (Target eachTarget : otherAggregationFunctionTargets) { - targets.set(targetIdx++, eachTarget); + targets.add(targetIdx++, eachTarget); } otherGroupbyNode.setTargets(targets); 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 b57988a3b1..f3fe7b9479 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 @@ -313,7 +313,7 @@ private void setRawTargets(PlanContext context, List targets, String[] r NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); - rawTargets.set(i, new Target(evalNode, referenceNames[i])); + rawTargets.add(i, new Target(evalNode, referenceNames[i])); } // it's for debugging or unit testing block.setRawTargets(rawTargets); @@ -733,14 +733,14 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, for (int i = 0; i < referenceNames.length ; i++) { if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { - targets.set(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); + targets.add(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); } else { - targets.set(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); + targets.add(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); } } } for (int i = 0; i < winFuncRefs.size(); i++) { - targets.set(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); + targets.add(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); } windowAggNode.setTargets(targets); verifyProjectedFields(block, windowAggNode); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index f4668ff564..10ec895cd7 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -684,7 +684,7 @@ public static List stripTarget(List sourceTargets) { List copy = new ArrayList<>(); for (int i = 0; i < sourceTargets.size(); i++) { try { - copy.set(i, (Target) sourceTargets.get(i).clone()); + copy.add(i, (Target) sourceTargets.get(i).clone()); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } From d28259f6b232fa1e6a703312e36fc1d18a18d718 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 15:19:49 +0900 Subject: [PATCH 06/20] bugfix --- .../java/org/apache/tajo/plan/logical/ProjectionNode.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index b2c6127f93..ef6a107a1b 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,9 +18,7 @@ package org.apache.tajo.plan.logical; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import com.google.gson.annotations.Expose; From 782510e6022f4f45cbbdb88cb743e1f8e45396ba Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 15:25:58 +0900 Subject: [PATCH 07/20] rollback --- .../java/org/apache/tajo/plan/logical/ProjectionNode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index ef6a107a1b..b2c6127f93 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,7 +18,9 @@ package org.apache.tajo.plan.logical; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import com.google.gson.annotations.Expose; From c850f9dc8b4346d6e81f1fc5cef45a446885c461 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 16:55:29 +0900 Subject: [PATCH 08/20] replace Arrays.hashcode() with Objects.hashcode() --- .../java/org/apache/tajo/plan/logical/ProjectionNode.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index b2c6127f93..80e9e6f110 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,9 +18,7 @@ package org.apache.tajo.plan.logical; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import com.google.gson.annotations.Expose; @@ -83,7 +81,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (distinct ? 1231 : 1237); - result = prime * result + Arrays.hashCode(targets.toArray()); + result = prime * result + Objects.hashCode(targets); return result; } From 1c40323e252c9826410c43f6b44295097cae0771 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 17:00:29 +0900 Subject: [PATCH 09/20] replace Arrays.hashcode() with Objects.hashcode() --- .../java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java | 3 ++- .../main/java/org/apache/tajo/plan/logical/EvalExprNode.java | 3 ++- .../main/java/org/apache/tajo/plan/logical/GroupbyNode.java | 3 ++- .../src/main/java/org/apache/tajo/plan/logical/JoinNode.java | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index 3d40ae67e3..93468a2680 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; public class DistinctGroupbyNode extends UnaryNode implements Projectable, Cloneable { @Expose @@ -166,7 +167,7 @@ public int hashCode() { result = prime * result + Arrays.hashCode(groupingColumns); result = prime * result + Arrays.hashCode(resultColumnIds); result = prime * result + ((subGroupbyPlan == null) ? 0 : subGroupbyPlan.hashCode()); - result = prime * result + Arrays.hashCode(targets.toArray()); + result = prime * result + Objects.hashCode(targets); return result; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java index e19cfb419a..320d10a123 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Objects; import com.google.gson.annotations.Expose; @@ -78,7 +79,7 @@ public String toString() { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + Arrays.hashCode(exprs.toArray()); + result = prime * result + Objects.hashCode(exprs); return result; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index 25d73a6a7e..4681129c18 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; public class GroupbyNode extends UnaryNode implements Projectable, Cloneable { /** Grouping key sets */ @@ -141,7 +142,7 @@ public int hashCode() { result = prime * result + Arrays.hashCode(aggrFunctions); result = prime * result + Arrays.hashCode(groupingKeys); result = prime * result + (hasDistinct ? 1231 : 1237); - result = prime * result + Arrays.hashCode(targets.toArray()); + result = prime * result + Objects.hashCode(targets); return result; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 2ee8c38a51..c6e2554f47 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; public class JoinNode extends BinaryNode implements Projectable, Cloneable { @Expose private JoinSpec joinSpec = new JoinSpec(); @@ -121,7 +122,7 @@ public int hashCode() { final int prime = 31; int result = 1; result = prime * result + joinSpec.hashCode(); - result = prime * result + Arrays.hashCode(targets.toArray()); + result = prime * result + Objects.hashCode(targets); return result; } From c01e182e6e7026c79d1090d5ea02b03cc8033754 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 17:03:43 +0900 Subject: [PATCH 10/20] remove unused import --- .../main/java/org/apache/tajo/plan/logical/EvalExprNode.java | 1 - .../src/main/java/org/apache/tajo/plan/logical/JoinNode.java | 1 - .../java/org/apache/tajo/plan/logical/ProjectionNode.java | 4 +++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java index 320d10a123..48ec1b0def 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java @@ -21,7 +21,6 @@ */ package org.apache.tajo.plan.logical; -import java.util.Arrays; import java.util.List; import java.util.Objects; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index c6e2554f47..47e92910b6 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -30,7 +30,6 @@ import org.apache.tajo.util.TUtil; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index 80e9e6f110..7460a9d698 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,7 +18,9 @@ package org.apache.tajo.plan.logical; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import com.google.gson.annotations.Expose; From b84d7815950bce400fb4f28455bfa2374f319253 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Thu, 29 Oct 2015 17:53:26 +0900 Subject: [PATCH 11/20] travis trigger From c9b2ff10775f3c8959db67b6d884960bb3a629bf Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Sun, 1 Nov 2015 21:28:08 +0900 Subject: [PATCH 12/20] travis trigger From 1726801bc780450923bd09bef00e6f4c4016aeb1 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 11:45:29 +0900 Subject: [PATCH 13/20] to see the diff --- .../builder/DistinctGroupbyBuilder.java | 4 +- .../apache/tajo/plan/LogicalOptimizer.java | 4 +- .../org/apache/tajo/plan/LogicalPlanner.java | 14 ++++--- .../plan/logical/DistinctGroupbyNode.java | 3 +- .../apache/tajo/plan/logical/GroupbyNode.java | 3 +- .../apache/tajo/plan/logical/JoinNode.java | 3 +- .../logical/PartitionedTableScanNode.java | 3 +- .../tajo/plan/logical/ProjectionNode.java | 40 +++++++++---------- .../apache/tajo/plan/logical/ScanNode.java | 3 +- .../tajo/plan/logical/TableSubQueryNode.java | 3 +- .../tajo/plan/logical/WindowAggNode.java | 3 +- .../rewrite/rules/InSubqueryRewriteRule.java | 2 +- 12 files changed, 48 insertions(+), 37 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index 93d9284640..0aad8d752a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -720,8 +720,8 @@ private void setMultiStageAggregationEnforcer( .addAllSortSpecs(sortSpecs).build()); } thirdStageBlock.getEnforcer().enforceDistinctAggregation(thirdStageDistinctNode.getPID(), - true, MultipleAggregationStage.THRID_STAGE, - DistinctAggregationAlgorithm.SORT_AGGREGATION, sortSpecArrays); + true, MultipleAggregationStage.THRID_STAGE, + DistinctAggregationAlgorithm.SORT_AGGREGATION, sortSpecArrays); } private ExecutionBlock buildDistinctGroupbyAndUnionPlan(MasterPlan masterPlan, ExecutionBlock lastBlock, diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java index 404e97160d..245490e813 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java @@ -124,7 +124,9 @@ private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoEx if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { - newJoinNode.setTargets(new ArrayList<>(targets)); + List input = new ArrayList<>(); + input.addAll(targets); + newJoinNode.setTargets(input); } PlannerUtil.replaceNode(plan, block.getRoot(), old, newNode); // End of replacement logic 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 f3fe7b9479..74ff950fe1 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 @@ -1198,7 +1198,7 @@ public LogicalNode visitJoin(PlanContext context, Stack stack, Join join) for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - joinNode.setTargets(new ArrayList<>(targets)); + joinNode.setTargets(targets); // Determine join conditions if (join.isNatural()) { // if natural join, it should have the equi-join conditions by common column names @@ -1305,7 +1305,7 @@ private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - join.setTargets(new ArrayList<>(targets)); + join.setTargets(targets); return join; } @@ -1366,7 +1366,9 @@ public ScanNode visitRelation(PlanContext context, Stack stack, Relation e targets.add(new Target(evalNode, reference)); } - scanNode.setTargets(new ArrayList<>(targets)); + List input = new ArrayList<>(); + input.addAll(targets); + scanNode.setTargets(input); verifyProjectedFields(block, scanNode); return scanNode; @@ -1463,7 +1465,9 @@ private void setTargetOfTableSubQuery (PlanContext context, QueryBlock block, Ta targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - subQueryNode.setTargets(new ArrayList<>(targets)); + List input = new ArrayList<>(); + input.addAll(targets); + subQueryNode.setTargets(input); } /*=============================================================================================== @@ -1765,7 +1769,7 @@ private void buildProjectedInsert(PlanContext context, InsertNode insertNode) { targets.add(new Target(new ConstEval(NullDatum.get()), column.getSimpleName())); } } - projectionNode.setTargets(new ArrayList<>(targets)); + projectionNode.setTargets(targets); insertNode.setInSchema(projectionNode.getOutSchema()); insertNode.setOutSchema(projectionNode.getOutSchema()); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index 93468a2680..bde8fcc2f3 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -132,7 +132,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - cloneNode.targets = new ArrayList<>(targets); + cloneNode.targets = new ArrayList<>(); + cloneNode.targets.addAll(targets); } if (groupbyPlan != null) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index 4681129c18..bb4f3e70e5 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -179,7 +179,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets); + grp.targets = new ArrayList<>(); + grp.targets.addAll(targets); } return grp; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 47e92910b6..35071e432e 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -142,7 +142,8 @@ public Object clone() throws CloneNotSupportedException { JoinNode join = (JoinNode) super.clone(); join.joinSpec = (JoinSpec) this.joinSpec.clone(); if (hasTargets()) { - join.targets = new ArrayList<>(targets); + join.targets = new ArrayList<>(); + join.targets.addAll(targets); } return join; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java index 3e7ea93d82..89d8ae636c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java @@ -102,7 +102,8 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - unionScan.targets = new ArrayList<>(targets); + unionScan.targets = new ArrayList<>(); + unionScan.targets.addAll(targets); } unionScan.inputPaths = inputPaths; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index 7460a9d698..1ad4ec8d73 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -18,18 +18,16 @@ package org.apache.tajo.plan.logical; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - import com.google.gson.annotations.Expose; - import org.apache.tajo.plan.PlanString; -import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.plan.Target; +import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; +import java.util.List; +import java.util.Objects; + public class ProjectionNode extends UnaryNode implements Projectable { @Expose private boolean distinct = false; @@ -66,19 +64,19 @@ public List getTargets() { return this.targets; } - public void setChild(LogicalNode subNode) { - super.setChild(subNode); - } - - public String toString() { - StringBuilder sb = new StringBuilder("Projection (distinct=").append(distinct); + public void setChild(LogicalNode subNode) { + super.setChild(subNode); + } + + public String toString() { + StringBuilder sb = new StringBuilder("Projection (distinct=").append(distinct); if (targets != null) { sb.append(", exprs=").append(StringUtils.join(targets.toArray())).append(")"); } - return sb.toString(); - } + return sb.toString(); + } - @Override + @Override public int hashCode() { final int prime = 31; int result = 1; @@ -100,13 +98,13 @@ public boolean equals(Object obj) { } } - @Override + @Override public Object clone() throws CloneNotSupportedException { - ProjectionNode projNode = (ProjectionNode) super.clone(); - projNode.targets = new ArrayList<>(targets); - - return projNode; - } + ProjectionNode projNode = (ProjectionNode) super.clone(); + projNode.targets = targets; + + return projNode; + } @Override public PlanString getPlanString() { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 46211e6431..7c6124297f 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -227,7 +227,8 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - scanNode.targets = new ArrayList<>(targets); + scanNode.targets = new ArrayList<>(); + scanNode.targets.addAll(targets); } if (hasAlias()) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java index 76d5d51207..441a684dc8 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java @@ -167,7 +167,8 @@ public Object clone() throws CloneNotSupportedException { newTableSubQueryNode.tableName = tableName; newTableSubQueryNode.subQuery = (LogicalNode) subQuery.clone(); if (hasTargets()) { - newTableSubQueryNode.targets = new ArrayList<>(targets); + newTableSubQueryNode.targets = new ArrayList<>(); + newTableSubQueryNode.targets.addAll(targets); } return newTableSubQueryNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java index e8586e27ef..c0e77ff73d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java @@ -170,7 +170,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets); + grp.targets = new ArrayList<>(); + grp.targets.addAll(targets); } return grp; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java index 902ad2c639..6265e38fa4 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/InSubqueryRewriteRule.java @@ -128,7 +128,7 @@ public Object visitFilter(Object context, LogicalPlan plan, LogicalPlan.QueryBlo joinNode.setOutSchema(node.getOutSchema()); List targets = TUtil.newList(PlannerUtil.schemaToTargets(inSchema)); - joinNode.setTargets(new ArrayList<>(targets)); + joinNode.setTargets(targets); block.addJoinType(joinType); block.registerNode(joinNode); From 8e6f75b4a1295410f18cc436c4eba25d0342d2bf Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 12:09:20 +0900 Subject: [PATCH 14/20] fix some bugs --- .../engine/planner/global/GlobalPlanner.java | 12 ++++++------ .../global/builder/DistinctGroupbyBuilder.java | 9 +++++---- .../rewrite/rules/ProjectionPushDownRule.java | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index 02baa27997..12b1d3fdf3 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -444,7 +444,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC } String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets.set(0, new Target(fieldEval)); + rewritten.firstStageTargets.add(0, new Target(fieldEval)); rewritten.secondStageEvals = createSumFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equalsIgnoreCase("sum")) { rewritten = new RewrittenFunctions(1); @@ -452,7 +452,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createSumFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets.set(0, new Target(fieldEval)); + rewritten.firstStageTargets.add(0, new Target(fieldEval)); rewritten.secondStageEvals = createSumFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equals("max")) { @@ -461,7 +461,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createMaxFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets.set(0, new Target(fieldEval)); + rewritten.firstStageTargets.add(0, new Target(fieldEval)); rewritten.secondStageEvals = createMaxFunction(new EvalNode[]{fieldEval}); } else if (function.getName().equals("min")) { @@ -471,7 +471,7 @@ private RewrittenFunctions rewriteAggFunctionsForDistinctAggregation(GlobalPlanC rewritten.firstStageEvals[0] = createMinFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); - rewritten.firstStageTargets.set(0, new Target(fieldEval)); + rewritten.firstStageTargets.add(0, new Target(fieldEval)); rewritten.secondStageEvals = createMinFunction(new EvalNode[]{fieldEval}); } else { @@ -554,10 +554,10 @@ private ExecutionBlock buildGroupByIncludingDistinctFunctionsMultiStage(GlobalPl List firstStageTargets = new ArrayList<>(); for (Column column : firstStageGroupingColumns) { Target target = new Target(new FieldEval(column)); - firstStageTargets.set(i++, target); + firstStageTargets.add(i++, target); } for (Target target : firstPhaseEvalNodeTargets) { - firstStageTargets.set(i++, target); + firstStageTargets.add(i++, target); } // Create the groupby node for the first stage and set all necessary descriptions diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index 0aad8d752a..fcc3a0d429 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -530,7 +530,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou Target target = new Target(new FieldEval(column)); firstGroupbyTargets.add(target); } - firstStageGroupbyNode.setTargets(new ArrayList<>(firstGroupbyTargets)); + firstStageGroupbyNode.setTargets(firstGroupbyTargets); // SecondStage: // Set grouping column with origin groupby's columns @@ -567,7 +567,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } columnIdIndex++; } - secondStageGroupbyNode.setTargets(new ArrayList<>(secondGroupbyTargets)); + secondStageGroupbyNode.setTargets(secondGroupbyTargets); } else { // FirstStage: Change target of aggFunction to function name expr List firstGroupbyTargets = new ArrayList<>(); @@ -597,7 +597,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou columnIdIndex++; aggFuncIdx++; } - firstStageGroupbyNode.setTargets(new ArrayList<>(firstGroupbyTargets)); + firstStageGroupbyNode.setTargets(firstGroupbyTargets); secondStageGroupbyNode.setInSchema(firstStageGroupbyNode.getOutSchema()); } grpIdx++; @@ -612,7 +612,8 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou lastSecondStageGroupbyNode = secondStageGroupbyNodes.get(secondStageGroupbyNodes.size() - 2); secondStageGroupbyNodes.remove(secondStageGroupbyNodes.size() - 1); - List targets = new ArrayList<>(lastSecondStageGroupbyNode.getTargets()); + List targets = new ArrayList<>(); + targets.addAll(lastSecondStageGroupbyNode.getTargets()); targets.addAll(otherGroupbyNode.getTargets()); lastSecondStageGroupbyNode.setTargets(targets); 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 5c163cdc89..c792abb86e 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 @@ -955,7 +955,9 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets(new ArrayList<>(projectedTargets)); + List input = new ArrayList<>(); + input.addAll(projectedTargets); + node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1093,7 +1095,9 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets(new ArrayList<>(projectedTargets)); + List input = new ArrayList<>(); + input.addAll(projectedTargets); + node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1127,7 +1131,9 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, } } - node.setTargets(new ArrayList<>(projectedTargets)); + List input = new ArrayList<>(); + input.addAll(projectedTargets); + node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1169,7 +1175,9 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo } } - node.setTargets(new ArrayList<>(projectedTargets)); + List input = new ArrayList<>(); + input.addAll(projectedTargets); + node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); return node; } From a18996d513502853a1706299c2d54467a2a1004d Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 12:38:48 +0900 Subject: [PATCH 15/20] modify some code --- .../engine/planner/global/builder/DistinctGroupbyBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index fcc3a0d429..a06eaf2f3b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -290,7 +290,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } DistinctGroupbyNode baseDistinctNode = new DistinctGroupbyNode(context.getPlan().getLogicalPlan().newPID()); - baseDistinctNode.setTargets(new ArrayList<>(baseGroupByTargets)); + baseDistinctNode.setTargets(baseGroupByTargets); baseDistinctNode.setGroupingColumns(groupbyNode.getGroupingColumns()); baseDistinctNode.setInSchema(groupbyNode.getInSchema()); baseDistinctNode.setChild(groupbyNode.getChild()); From 61e6887fe9fde3fafc4be0700b635814c7390624 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 15:13:00 +0900 Subject: [PATCH 16/20] fix --- .../org/apache/tajo/engine/planner/global/GlobalPlanner.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index 12b1d3fdf3..fcd6f704a4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -1326,9 +1326,12 @@ public LogicalNode visitTableSubQuery(GlobalPlanContext context, LogicalPlan pla if (eachNodeTargets.size() != targetMappings.length) { throw new TajoInternalError("Union query can't have different number of target columns."); } + for (int i = 0; i < eachNodeTargets.size(); i++) { Column inColumn = eachNode.getInSchema().getColumn(targetMappings[i]); - eachNodeTargets.get(i).setAlias(eachNodeTargets.get(i).getNamedColumn().getQualifiedName()); + Target t = eachNodeTargets.get(i); + t.setAlias(eachNodeTargets.get(i).getNamedColumn().getQualifiedName()); + eachNodeTargets.set(i, t); EvalNode evalNode = eachNodeTargets.get(i).getEvalTree(); if (evalNode.getType() != EvalType.FIELD) { throw new TajoInternalError("Target of a UnionNode's subquery should be FieldEval."); From 83c0a06ced1b60b13bf00e2c169feb99e3c6c724 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 15:45:20 +0900 Subject: [PATCH 17/20] fix some bugs --- .../engine/planner/global/GlobalPlanner.java | 2 +- .../plan/logical/DistinctGroupbyNode.java | 3 +- .../tajo/plan/logical/EvalExprNode.java | 9 +- .../apache/tajo/plan/logical/ScanNode.java | 90 +++++++++---------- .../apache/tajo/plan/util/PlannerUtil.java | 4 +- 5 files changed, 53 insertions(+), 55 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index fcd6f704a4..ee732c8190 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -1330,7 +1330,7 @@ public LogicalNode visitTableSubQuery(GlobalPlanContext context, LogicalPlan pla for (int i = 0; i < eachNodeTargets.size(); i++) { Column inColumn = eachNode.getInSchema().getColumn(targetMappings[i]); Target t = eachNodeTargets.get(i); - t.setAlias(eachNodeTargets.get(i).getNamedColumn().getQualifiedName()); + t.setAlias(t.getNamedColumn().getQualifiedName()); eachNodeTargets.set(i, t); EvalNode evalNode = eachNodeTargets.get(i).getEvalTree(); if (evalNode.getType() != EvalType.FIELD) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index bde8fcc2f3..93468a2680 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -132,8 +132,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - cloneNode.targets = new ArrayList<>(); - cloneNode.targets.addAll(targets); + cloneNode.targets = new ArrayList<>(targets); } if (groupbyPlan != null) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java index 48ec1b0def..640f92b1b2 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java @@ -21,17 +21,16 @@ */ package org.apache.tajo.plan.logical; -import java.util.List; -import java.util.Objects; - import com.google.gson.annotations.Expose; - import org.apache.tajo.plan.PlanString; -import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.plan.Target; +import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; +import java.util.List; +import java.util.Objects; + public class EvalExprNode extends LogicalNode implements Projectable { @Expose private List exprs; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 7c6124297f..17f0e889cf 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -148,7 +148,7 @@ public boolean hasTargets() { public void setTargets(List targets) { this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); - } + } @Override public List getTargets() { @@ -182,68 +182,68 @@ public TableDesc getTableDesc() { return tableDesc; } - public String toString() { - StringBuilder sb = new StringBuilder("Scan (table=").append(getTableName()); - if (hasAlias()) { - sb.append(", alias=").append(alias); - } - if (hasQual()) { - sb.append(", filter=").append(qual); - } - sb.append(", path=").append(getTableDesc().getUri()).append(")"); - return sb.toString(); - } + public String toString() { + StringBuilder sb = new StringBuilder("Scan (table=").append(getTableName()); + if (hasAlias()) { + sb.append(", alias=").append(alias); + } + if (hasQual()) { + sb.append(", filter=").append(qual); + } + sb.append(", path=").append(getTableDesc().getUri()).append(")"); + return sb.toString(); + } @Override public int hashCode() { return Objects.hashCode(this.tableDesc, this.qual, this.targets); } - @Override - public boolean equals(Object obj) { - if (obj instanceof ScanNode) { - ScanNode other = (ScanNode) obj; - - boolean eq = super.equals(other); - eq = eq && TUtil.checkEquals(this.tableDesc, other.tableDesc); - eq = eq && TUtil.checkEquals(this.qual, other.qual); - eq = eq && TUtil.checkEquals(this.targets, other.targets); - eq = eq && TUtil.checkEquals(this.alias, other.alias); - - return eq; - } - - return false; - } - - @Override - public Object clone() throws CloneNotSupportedException { - ScanNode scanNode = (ScanNode) super.clone(); + @Override + public boolean equals(Object obj) { + if (obj instanceof ScanNode) { + ScanNode other = (ScanNode) obj; - scanNode.tableDesc = (TableDesc) this.tableDesc.clone(); + boolean eq = super.equals(other); + eq = eq && TUtil.checkEquals(this.tableDesc, other.tableDesc); + eq = eq && TUtil.checkEquals(this.qual, other.qual); + eq = eq && TUtil.checkEquals(this.targets, other.targets); + eq = eq && TUtil.checkEquals(this.alias, other.alias); - if (hasQual()) { - scanNode.qual = (EvalNode) this.qual.clone(); + return eq; } - if (hasTargets()) { - scanNode.targets = new ArrayList<>(); - scanNode.targets.addAll(targets); - } + return false; + } - if (hasAlias()) { - scanNode.alias = alias; - } + @Override + public Object clone() throws CloneNotSupportedException { + ScanNode scanNode = (ScanNode) super.clone(); - return scanNode; - } + scanNode.tableDesc = (TableDesc) this.tableDesc.clone(); + + if (hasQual()) { + scanNode.qual = (EvalNode) this.qual.clone(); + } + + if (hasTargets()) { + scanNode.targets = new ArrayList<>(); + scanNode.targets.addAll(targets); + } + + if (hasAlias()) { + scanNode.alias = alias; + } + + return scanNode; + } @Override public void preOrder(LogicalNodeVisitor visitor) { visitor.visit(this); } - public void postOrder(LogicalNodeVisitor visitor) { + public void postOrder(LogicalNodeVisitor visitor) { visitor.visit(this); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index 10ec895cd7..0555a3ff3a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -653,10 +653,10 @@ public List getPairs() { } public static Schema targetToSchema(Collection targets) { - return targetToSchema(targets.toArray(new Target[targets.size()])); + return targetToSchema(targets); } - public static Schema targetToSchema(Target[] targets) { + public static Schema targetToSchema(List targets) { Schema schema = new Schema(); for (Target t : targets) { DataType type = t.getEvalTree().getValueType(); From 124bf75f7e757f9284df43881ec40a0273d2f795 Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 15:52:00 +0900 Subject: [PATCH 18/20] rollback some part --- .../main/java/org/apache/tajo/plan/logical/GroupbyNode.java | 3 +-- .../src/main/java/org/apache/tajo/plan/logical/JoinNode.java | 3 +-- .../main/java/org/apache/tajo/plan/logical/ProjectionNode.java | 3 ++- .../src/main/java/org/apache/tajo/plan/logical/ScanNode.java | 3 +-- .../java/org/apache/tajo/plan/logical/TableSubQueryNode.java | 3 +-- .../main/java/org/apache/tajo/plan/logical/WindowAggNode.java | 3 +-- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index bb4f3e70e5..4681129c18 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -179,8 +179,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(); - grp.targets.addAll(targets); + grp.targets = new ArrayList<>(targets); } return grp; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 35071e432e..47e92910b6 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -142,8 +142,7 @@ public Object clone() throws CloneNotSupportedException { JoinNode join = (JoinNode) super.clone(); join.joinSpec = (JoinSpec) this.joinSpec.clone(); if (hasTargets()) { - join.targets = new ArrayList<>(); - join.targets.addAll(targets); + join.targets = new ArrayList<>(targets); } return join; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index 1ad4ec8d73..3f80a8729c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -25,6 +25,7 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -101,7 +102,7 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { ProjectionNode projNode = (ProjectionNode) super.clone(); - projNode.targets = targets; + projNode.targets = new ArrayList<>(targets); return projNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 17f0e889cf..376f104abd 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -227,8 +227,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - scanNode.targets = new ArrayList<>(); - scanNode.targets.addAll(targets); + scanNode.targets = new ArrayList<>(targets); } if (hasAlias()) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java index 441a684dc8..76d5d51207 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java @@ -167,8 +167,7 @@ public Object clone() throws CloneNotSupportedException { newTableSubQueryNode.tableName = tableName; newTableSubQueryNode.subQuery = (LogicalNode) subQuery.clone(); if (hasTargets()) { - newTableSubQueryNode.targets = new ArrayList<>(); - newTableSubQueryNode.targets.addAll(targets); + newTableSubQueryNode.targets = new ArrayList<>(targets); } return newTableSubQueryNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java index c0e77ff73d..e8586e27ef 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java @@ -170,8 +170,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(); - grp.targets.addAll(targets); + grp.targets = new ArrayList<>(targets); } return grp; From 3ee014e063a88f6183a51abdf03fff0a15abceec Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 17:42:05 +0900 Subject: [PATCH 19/20] to see the diff --- .../engine/planner/global/GlobalPlanner.java | 6 +-- .../builder/DistinctGroupbyBuilder.java | 10 ++-- .../apache/tajo/plan/LogicalOptimizer.java | 2 +- .../org/apache/tajo/plan/LogicalPlanner.java | 20 +++---- .../plan/logical/DistinctGroupbyNode.java | 3 +- .../apache/tajo/plan/logical/GroupbyNode.java | 3 +- .../apache/tajo/plan/logical/JoinNode.java | 3 +- .../logical/PartitionedTableScanNode.java | 2 +- .../tajo/plan/logical/ProjectionNode.java | 3 +- .../apache/tajo/plan/logical/ScanNode.java | 53 ++++++++++--------- .../tajo/plan/logical/TableSubQueryNode.java | 3 +- .../tajo/plan/logical/WindowAggNode.java | 3 +- .../plan/rewrite/BaseSchemaBuildPhase.java | 8 +-- .../rewrite/rules/ProjectionPushDownRule.java | 20 ++++--- .../plan/serder/LogicalNodeDeserializer.java | 4 +- .../apache/tajo/plan/util/PlannerUtil.java | 8 +-- 16 files changed, 76 insertions(+), 75 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index ee732c8190..2aaf98edb9 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -388,7 +388,7 @@ private static class RewrittenFunctions { public RewrittenFunctions(int firstStageEvalNum) { firstStageEvals = new AggregationFunctionCallEval[firstStageEvalNum]; - firstStageTargets = new ArrayList<>(); + firstStageTargets = new ArrayList<>(firstStageEvalNum); } } @@ -551,7 +551,7 @@ private ExecutionBlock buildGroupByIncludingDistinctFunctionsMultiStage(GlobalPl int firstStageGroupingKeyNum = firstStageGroupingColumns.size(); int i = 0; - List firstStageTargets = new ArrayList<>(); + List firstStageTargets = new ArrayList<>(firstStageGroupingKeyNum + firstStageAggFunctionNum); for (Column column : firstStageGroupingColumns) { Target target = new Target(new FieldEval(column)); firstStageTargets.add(i++, target); @@ -1331,7 +1331,7 @@ public LogicalNode visitTableSubQuery(GlobalPlanContext context, LogicalPlan pla Column inColumn = eachNode.getInSchema().getColumn(targetMappings[i]); Target t = eachNodeTargets.get(i); t.setAlias(t.getNamedColumn().getQualifiedName()); - eachNodeTargets.set(i, t); + eachNodeTargets.add(i, t); EvalNode evalNode = eachNodeTargets.get(i).getEvalTree(); if (evalNode.getType() != EvalType.FIELD) { throw new TajoInternalError("Target of a UnionNode's subquery should be FieldEval."); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index a06eaf2f3b..7f29c3e43b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -250,7 +250,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()); int targetIdx = 0; for (Column column : eachGroupbyNode.getGroupingColumns()) { @@ -274,7 +274,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(otherAggregationFunctionTargets.size()); int targetIdx = 0; for (Target eachTarget : otherAggregationFunctionTargets) { targets.add(targetIdx++, eachTarget); @@ -414,7 +414,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (DistinctGroupbyNodeBuildInfo buildInfo: distinctNodeBuildInfos.values()) { GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()); int targetIdx = 0; for (Column column : eachGroupbyNode.getGroupingColumns()) { @@ -437,7 +437,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(originalGroupingColumns.size() + otherAggregationFunctionTargets.size()); int targetIdx = 0; for (Column column : originalGroupingColumns) { Target target = new Target(new FieldEval(column)); @@ -612,7 +612,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou lastSecondStageGroupbyNode = secondStageGroupbyNodes.get(secondStageGroupbyNodes.size() - 2); secondStageGroupbyNodes.remove(secondStageGroupbyNodes.size() - 1); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(lastSecondStageGroupbyNode.getTargets().size() + otherGroupbyNode.getTargets().size()); targets.addAll(lastSecondStageGroupbyNode.getTargets()); targets.addAll(otherGroupbyNode.getTargets()); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java index 245490e813..5a0ecc4724 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java @@ -124,7 +124,7 @@ private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoEx if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { - List input = new ArrayList<>(); + List input = new ArrayList<>(targets.size()); input.addAll(targets); newJoinNode.setTargets(input); } 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 74ff950fe1..9b0dcd858b 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 @@ -308,7 +308,7 @@ private void setRawTargets(PlanContext context, List targets, String[] r QueryBlock block = context.queryBlock; // It's for debugging or unit tests. - List rawTargets = new ArrayList<>(); + List rawTargets = new ArrayList<>(projection.getNamedExprs().length); for (int i = 0; i < projection.getNamedExprs().length; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), @@ -465,7 +465,7 @@ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack targets = new ArrayList<>(); + List targets = new ArrayList<>(finalTargetNum); for (int i = 0; i < finalTargetNum; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; @@ -488,7 +488,7 @@ private List buildTargets(PlanContext context, String[] referenceNames) throws TajoException { QueryBlock block = context.queryBlock; - List targets = new ArrayList<>(); + List targets = new ArrayList<>(referenceNames.length); for (int i = 0; i < referenceNames.length; i++) { String refName = referenceNames[i]; @@ -717,7 +717,7 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, } } - List targets = new ArrayList<>(); + List targets = new ArrayList<>(referenceNames.length); List windowFuncIndices = Lists.newArrayList(); Projection projection = (Projection) stack.peek(); int windowFuncIdx = 0; @@ -733,14 +733,14 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, for (int i = 0; i < referenceNames.length ; i++) { if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { - targets.add(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); + targets.set(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); } else { - targets.add(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); + targets.set(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); } } } for (int i = 0; i < winFuncRefs.size(); i++) { - targets.add(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); + targets.set(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); } windowAggNode.setTargets(targets); verifyProjectedFields(block, windowAggNode); @@ -1052,7 +1052,7 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat groupingNode.setDistinct(includeDistinctFunction); groupingNode.setAggFunctions(aggEvalNodes.toArray(new AggregationFunctionCallEval[aggEvalNodes.size()])); - List targets = new ArrayList<>(); + List targets = new ArrayList<>(effectiveGroupingKeyNum + aggEvalNames.size()); // In target, grouping columns will be followed by aggregation evals. // @@ -1366,7 +1366,7 @@ public ScanNode visitRelation(PlanContext context, Stack stack, Relation e targets.add(new Target(evalNode, reference)); } - List input = new ArrayList<>(); + List input = new ArrayList<>(targets.size()); input.addAll(targets); scanNode.setTargets(input); @@ -1465,7 +1465,7 @@ private void setTargetOfTableSubQuery (PlanContext context, QueryBlock block, Ta targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - List input = new ArrayList<>(); + List input = new ArrayList<>(targets.size()); input.addAll(targets); subQueryNode.setTargets(input); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index 93468a2680..44aca77df1 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -132,7 +132,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - cloneNode.targets = new ArrayList<>(targets); + cloneNode.targets = new ArrayList<>(targets.size()); + cloneNode.targets.addAll(targets); } if (groupbyPlan != null) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index 4681129c18..54d0dd3a83 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -179,7 +179,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets); + grp.targets = new ArrayList<>(targets.size()); + grp.targets.addAll(targets); } return grp; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 47e92910b6..3e13292921 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -142,7 +142,8 @@ public Object clone() throws CloneNotSupportedException { JoinNode join = (JoinNode) super.clone(); join.joinSpec = (JoinSpec) this.joinSpec.clone(); if (hasTargets()) { - join.targets = new ArrayList<>(targets); + join.targets = new ArrayList<>(targets.size()); + join.targets.addAll(targets); } return join; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java index 89d8ae636c..8e63096a5d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java @@ -102,7 +102,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - unionScan.targets = new ArrayList<>(); + unionScan.targets = new ArrayList<>(targets.size()); unionScan.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index 3f80a8729c..ce40a80578 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -102,7 +102,8 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { ProjectionNode projNode = (ProjectionNode) super.clone(); - projNode.targets = new ArrayList<>(targets); + projNode.targets = new ArrayList<>(targets.size()); + projNode.targets.addAll(targets); return projNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 376f104abd..3e6fc21849 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -35,11 +35,11 @@ import java.util.List; public class ScanNode extends RelationNode implements Projectable, SelectableNode, Cloneable { - @Expose protected TableDesc tableDesc; + @Expose protected TableDesc tableDesc; @Expose protected String alias; @Expose protected Schema logicalSchema; - @Expose protected EvalNode qual; - @Expose protected List targets; + @Expose protected EvalNode qual; + @Expose protected List targets; @Expose protected boolean broadcastTable; @Expose protected long limit = -1; // -1 means no set @@ -68,7 +68,7 @@ public void init(TableDesc desc) { logicalSchema = SchemaUtil.getQualifiedLogicalSchema(tableDesc, null); } - public void init(TableDesc desc, String alias) { + public void init(TableDesc desc, String alias) { this.tableDesc = desc; this.alias = alias; @@ -83,14 +83,14 @@ public void init(TableDesc desc, String alias) { this.getInSchema().setQualifier(qualifiedAlias); this.setOutSchema(new Schema(getInSchema())); logicalSchema = SchemaUtil.getQualifiedLogicalSchema(tableDesc, qualifiedAlias); - } + } - public String getTableName() { + public String getTableName() { return tableDesc.getName(); } @Override - public boolean hasAlias() { + public boolean hasAlias() { return alias != null; } @@ -125,28 +125,28 @@ public Schema getPhysicalSchema() { } @Override - public boolean hasQual() { + public boolean hasQual() { return qual != null; } @Override - public EvalNode getQual() { + public EvalNode getQual() { return this.qual; } @Override - public void setQual(EvalNode evalTree) { + public void setQual(EvalNode evalTree) { this.qual = evalTree; } @Override - public boolean hasTargets() { + public boolean hasTargets() { return this.targets != null; } @Override - public void setTargets(List targets) { - this.targets = targets; + public void setTargets(List targets) { + this.targets = targets; setOutSchema(PlannerUtil.targetToSchema(targets)); } @@ -208,7 +208,7 @@ public boolean equals(Object obj) { eq = eq && TUtil.checkEquals(this.tableDesc, other.tableDesc); eq = eq && TUtil.checkEquals(this.qual, other.qual); eq = eq && TUtil.checkEquals(this.targets, other.targets); - eq = eq && TUtil.checkEquals(this.alias, other.alias); + eq = eq && TUtil.checkEquals(this.alias, other.alias); return eq; } @@ -218,23 +218,24 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { - ScanNode scanNode = (ScanNode) super.clone(); + ScanNode scanNode = (ScanNode) super.clone(); - scanNode.tableDesc = (TableDesc) this.tableDesc.clone(); + scanNode.tableDesc = (TableDesc) this.tableDesc.clone(); - if (hasQual()) { - scanNode.qual = (EvalNode) this.qual.clone(); - } + if (hasQual()) { + scanNode.qual = (EvalNode) this.qual.clone(); + } - if (hasTargets()) { - scanNode.targets = new ArrayList<>(targets); - } + if (hasTargets()) { + scanNode.targets = new ArrayList<>(targets.size()); + scanNode.targets.addAll(targets); + } - if (hasAlias()) { - scanNode.alias = alias; - } + if (hasAlias()) { + scanNode.alias = alias; + } - return scanNode; + return scanNode; } @Override diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java index 76d5d51207..56d9c2c8cd 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java @@ -167,7 +167,8 @@ public Object clone() throws CloneNotSupportedException { newTableSubQueryNode.tableName = tableName; newTableSubQueryNode.subQuery = (LogicalNode) subQuery.clone(); if (hasTargets()) { - newTableSubQueryNode.targets = new ArrayList<>(targets); + newTableSubQueryNode.targets = new ArrayList<>(targets.size()); + newTableSubQueryNode.targets.addAll(targets); } return newTableSubQueryNode; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java index e8586e27ef..62117e7f7a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java @@ -170,7 +170,8 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets); + grp.targets = new ArrayList<>(targets.size()); + grp.targets.addAll(targets); } return grp; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java index c6155eac93..8636039add 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java @@ -255,7 +255,7 @@ public LogicalNode visitProjection(LogicalPlanner.PlanContext ctx, Stack s } private List buildTargets(LogicalPlanner.PlanContext context, NamedExpr [] exprs) throws TajoException { - List targets = new ArrayList<>(); + List targets = new ArrayList<>(exprs.length); for (int i = 0; i < exprs.length; i++) { NamedExpr namedExpr = exprs[i]; TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); @@ -316,7 +316,7 @@ public LogicalNode visitGroupBy(LogicalPlanner.PlanContext ctx, Stack stac Projection projection = ctx.getQueryBlock().getSingletonExpr(OpType.Projection); int finalTargetNum = projection.getNamedExprs().length; - Target [] targets = new Target[finalTargetNum]; + List targets = new ArrayList<>(); if (PlannerUtil.hasAsterisk(projection.getNamedExprs())) { projection.setNamedExprs(voidResolveAsteriskNamedExpr(ctx, projection.getNamedExprs())); @@ -327,9 +327,9 @@ public LogicalNode visitGroupBy(LogicalPlanner.PlanContext ctx, Stack stac EvalNode evalNode = annotator.createEvalNode(ctx, namedExpr.getExpr(), NameResolvingMode.SUBEXPRS_AND_RELS, true); if (namedExpr.hasAlias()) { - targets[i] = new Target(evalNode, namedExpr.getAlias()); + targets.add(i, new Target(evalNode, namedExpr.getAlias())); } else { - targets[i] = new Target(evalNode, "?name_" + i); + targets.add(i, new Target(evalNode, "?name_" + i)); } } stack.pop(); 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 c792abb86e..0fb3ce6532 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 @@ -824,22 +824,21 @@ public static List buildGroupByTarget(GroupbyNode groupbyNode, @Nullable groupingKeyTargets == null ? groupbyNode.getGroupingColumns().length : groupingKeyTargets.size(); final int aggrFuncNum = aggEvalNames != null ? aggEvalNames.length : 0; EvalNode [] aggEvalNodes = groupbyNode.getAggFunctions(); - List targets = new ArrayList<>(); -// targets = new Target[groupingKeyNum + aggrFuncNum]; + List targets = new ArrayList<>(groupingKeyNum + aggrFuncNum); if (groupingKeyTargets != null) { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.add(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); + targets.set(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); } } else { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.add(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); + targets.set(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); } } if (aggEvalNames != null) { for (int aggrFuncIdx = 0, targetIdx = groupingKeyNum; aggrFuncIdx < aggrFuncNum; aggrFuncIdx++, targetIdx++) { - targets.add(targetIdx, + targets.set(targetIdx, new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType()))); } } @@ -955,9 +954,7 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer } } - List input = new ArrayList<>(); - input.addAll(projectedTargets); - node.setTargets(input); + node.setTargets(new ArrayList<>(projectedTargets)); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1095,9 +1092,10 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer } } - List input = new ArrayList<>(); + List input = new ArrayList<>(projectedTargets.size()); input.addAll(projectedTargets); node.setTargets(input); + LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1131,7 +1129,7 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, } } - List input = new ArrayList<>(); + List input = new ArrayList<>(projectedTargets.size()); input.addAll(projectedTargets); node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); @@ -1175,7 +1173,7 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo } } - List input = new ArrayList<>(); + List input = new ArrayList<>(projectedTargets.size()); input.addAll(projectedTargets); node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java index d37b407c1d..5518200482 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java @@ -743,8 +743,8 @@ public static Column[] convertColumns(List columnProt public static List convertTargets(OverridableConf context, EvalContext evalContext, List targetsProto) { - List targets = new ArrayList<>(); - for (int i = 0; i < targetsProto.size(); i++) { + List targets = new ArrayList<>(targetsProto.size()); + for (int i = 0; i < targets.size(); i++) { PlanProto.Target targetProto = targetsProto.get(i); EvalNode evalNode = EvalNodeDeserializer.deserialize(context, evalContext, targetProto.getExpr()); if (targetProto.hasAlias()) { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index 0555a3ff3a..71c0580620 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -537,7 +537,7 @@ public List getFoundNodes() { } public static List schemaToTargets(Schema schema) { - List targets = new ArrayList<>(); + List targets = new ArrayList<>(schema.size()); FieldEval eval; for (int i = 0; i < schema.size(); i++) { @@ -652,10 +652,6 @@ public List getPairs() { } } - public static Schema targetToSchema(Collection targets) { - return targetToSchema(targets); - } - public static Schema targetToSchema(List targets) { Schema schema = new Schema(); for (Target t : targets) { @@ -681,7 +677,7 @@ public static Schema targetToSchema(List targets) { * @return The stripped targets */ public static List stripTarget(List sourceTargets) { - List copy = new ArrayList<>(); + List copy = new ArrayList<>(sourceTargets.size()); for (int i = 0; i < sourceTargets.size(); i++) { try { copy.add(i, (Target) sourceTargets.get(i).clone()); From 975319f6815800e5c5bdadc6941c90de6515b34d Mon Sep 17 00:00:00 2001 From: Dongkyu Hwangbo Date: Mon, 2 Nov 2015 18:57:31 +0900 Subject: [PATCH 20/20] to see the diff --- .../engine/planner/global/GlobalPlanner.java | 9 ++--- .../builder/DistinctGroupbyBuilder.java | 30 +++++++------- .../apache/tajo/plan/LogicalOptimizer.java | 2 +- .../org/apache/tajo/plan/LogicalPlanner.java | 39 +++++++++---------- .../plan/logical/DistinctGroupbyNode.java | 2 +- .../apache/tajo/plan/logical/GroupbyNode.java | 2 +- .../apache/tajo/plan/logical/JoinNode.java | 2 +- .../logical/PartitionedTableScanNode.java | 2 +- .../tajo/plan/logical/ProjectionNode.java | 2 +- .../apache/tajo/plan/logical/ScanNode.java | 2 +- .../tajo/plan/logical/TableSubQueryNode.java | 2 +- .../tajo/plan/logical/WindowAggNode.java | 2 +- .../plan/rewrite/BaseSchemaBuildPhase.java | 10 ++--- .../rewrite/rules/ProjectionPushDownRule.java | 22 +++++------ .../plan/serder/LogicalNodeDeserializer.java | 6 +-- .../apache/tajo/plan/util/PlannerUtil.java | 8 ++-- 16 files changed, 68 insertions(+), 74 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java index 2aaf98edb9..aba80ff281 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java @@ -388,7 +388,7 @@ private static class RewrittenFunctions { public RewrittenFunctions(int firstStageEvalNum) { firstStageEvals = new AggregationFunctionCallEval[firstStageEvalNum]; - firstStageTargets = new ArrayList<>(firstStageEvalNum); + firstStageTargets = new ArrayList<>(); } } @@ -550,14 +550,13 @@ private ExecutionBlock buildGroupByIncludingDistinctFunctionsMultiStage(GlobalPl int firstStageAggFunctionNum = firstStageAggFunctions.size(); int firstStageGroupingKeyNum = firstStageGroupingColumns.size(); - int i = 0; - List firstStageTargets = new ArrayList<>(firstStageGroupingKeyNum + firstStageAggFunctionNum); + List firstStageTargets = new ArrayList<>(); for (Column column : firstStageGroupingColumns) { Target target = new Target(new FieldEval(column)); - firstStageTargets.add(i++, target); + firstStageTargets.add(target); } for (Target target : firstPhaseEvalNodeTargets) { - firstStageTargets.add(i++, target); + firstStageTargets.add(target); } // Create the groupby node for the first stage and set all necessary descriptions diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java index 7f29c3e43b..75f2049f0e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java @@ -250,16 +250,15 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - List targets = new ArrayList<>(eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()); - int targetIdx = 0; + List targets = new ArrayList<>(); for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets.add(targetIdx++, target); + targets.add(target); baseGroupByTargets.add(target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets.add(targetIdx++, eachAggFunctionTarget); + targets.add(eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -274,10 +273,9 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - List targets = new ArrayList<>(otherAggregationFunctionTargets.size()); - int targetIdx = 0; + List targets = new ArrayList<>(); for (Target eachTarget : otherAggregationFunctionTargets) { - targets.add(targetIdx++, eachTarget); + targets.add(eachTarget); baseGroupByTargets.add(eachTarget); } @@ -414,15 +412,14 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou for (DistinctGroupbyNodeBuildInfo buildInfo: distinctNodeBuildInfos.values()) { GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode(); List groupbyAggFunctions = buildInfo.getAggFunctions(); - List targets = new ArrayList<>(eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()); - int targetIdx = 0; + List targets = new ArrayList<>(); for (Column column : eachGroupbyNode.getGroupingColumns()) { Target target = new Target(new FieldEval(column)); - targets.add(targetIdx++, target); + targets.add(target); } for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) { - targets.add(targetIdx++, eachAggFunctionTarget); + targets.add(eachAggFunctionTarget); } eachGroupbyNode.setTargets(targets); eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[]{})); @@ -437,14 +434,13 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou // finally this aggregation output tuple's order is GROUP_BY_COL1, COL2, .... + AGG_VALUE, SUM_VALUE, ... GroupbyNode otherGroupbyNode = new GroupbyNode(context.getPlan().getLogicalPlan().newPID()); - List targets = new ArrayList<>(originalGroupingColumns.size() + otherAggregationFunctionTargets.size()); - int targetIdx = 0; + List targets = new ArrayList<>(); for (Column column : originalGroupingColumns) { Target target = new Target(new FieldEval(column)); - targets.add(targetIdx++, target); + targets.add(target); } for (Target eachTarget : otherAggregationFunctionTargets) { - targets.add(targetIdx++, eachTarget); + targets.add(eachTarget); } otherGroupbyNode.setTargets(targets); @@ -612,7 +608,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou lastSecondStageGroupbyNode = secondStageGroupbyNodes.get(secondStageGroupbyNodes.size() - 2); secondStageGroupbyNodes.remove(secondStageGroupbyNodes.size() - 1); - List targets = new ArrayList<>(lastSecondStageGroupbyNode.getTargets().size() + otherGroupbyNode.getTargets().size()); + List targets = new ArrayList<>(); targets.addAll(lastSecondStageGroupbyNode.getTargets()); targets.addAll(otherGroupbyNode.getTargets()); @@ -653,7 +649,7 @@ select col1, count(distinct col2), count(distinct col3), sum(col4) from ... grou } } } - firstStageDistinctNode.setTargets(new ArrayList<>(firstTargets)); + firstStageDistinctNode.setTargets(firstTargets); firstStageDistinctNode.setResultColumnIds(TUtil.toArray(firstStageColumnIds)); //Set SecondStage ColumnId and Input schema diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java index 5a0ecc4724..245490e813 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java @@ -124,7 +124,7 @@ private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoEx if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { - List input = new ArrayList<>(targets.size()); + List input = new ArrayList<>(); input.addAll(targets); newJoinNode.setTargets(input); } 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 9b0dcd858b..024ba8bed0 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 @@ -308,12 +308,12 @@ private void setRawTargets(PlanContext context, List targets, String[] r QueryBlock block = context.queryBlock; // It's for debugging or unit tests. - List rawTargets = new ArrayList<>(projection.getNamedExprs().length); + List rawTargets = new ArrayList<>(); for (int i = 0; i < projection.getNamedExprs().length; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); - rawTargets.add(i, new Target(evalNode, referenceNames[i])); + rawTargets.add(new Target(evalNode, referenceNames[i])); } // it's for debugging or unit testing block.setRawTargets(rawTargets); @@ -465,15 +465,15 @@ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack targets = new ArrayList<>(finalTargetNum); + List targets = new ArrayList<>(); for (int i = 0; i < finalTargetNum; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_ONLY); if (namedExpr.hasAlias()) { - targets.add(i, new Target(evalNode, namedExpr.getAlias())); + targets.add(new Target(evalNode, namedExpr.getAlias())); } else { - targets.add(i, new Target(evalNode, context.plan.generateUniqueColumnName(namedExpr.getExpr()))); + targets.add(new Target(evalNode, context.plan.generateUniqueColumnName(namedExpr.getExpr()))); } } EvalExprNode evalExprNode = context.queryBlock.getNodeFromExpr(projection); @@ -488,20 +488,20 @@ private List buildTargets(PlanContext context, String[] referenceNames) throws TajoException { QueryBlock block = context.queryBlock; - List targets = new ArrayList<>(referenceNames.length); + List targets = new ArrayList<>(); for (int i = 0; i < referenceNames.length; i++) { String refName = referenceNames[i]; if (block.isConstReference(refName)) { - targets.add(i, new Target(block.getConstByReference(refName), refName)); + targets.add(new Target(block.getConstByReference(refName), refName)); } else if (block.namedExprsMgr.isEvaluated(refName)) { - targets.add(i, block.namedExprsMgr.getTarget(refName)); + targets.add(block.namedExprsMgr.getTarget(refName)); } else { NamedExpr namedExpr = block.namedExprsMgr.getNamedExpr(refName); EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); block.namedExprsMgr.markAsEvaluated(refName, evalNode); - targets.add(i, new Target(evalNode, refName)); + targets.add(new Target(evalNode, refName)); } } return targets; @@ -717,7 +717,7 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, } } - List targets = new ArrayList<>(referenceNames.length); + List targets = new ArrayList<>(); List windowFuncIndices = Lists.newArrayList(); Projection projection = (Projection) stack.peek(); int windowFuncIdx = 0; @@ -729,18 +729,17 @@ private LogicalNode insertWindowAggNode(PlanContext context, LogicalNode child, } windowAggNode.setWindowFunctions(winFuncs.toArray(new WindowFunctionEval[winFuncs.size()])); - int targetIdx = 0; for (int i = 0; i < referenceNames.length ; i++) { if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { - targets.set(targetIdx++, new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); + targets.add(new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); } else { - targets.set(targetIdx++, block.namedExprsMgr.getTarget(referenceNames[i])); + targets.add(block.namedExprsMgr.getTarget(referenceNames[i])); } } } for (int i = 0; i < winFuncRefs.size(); i++) { - targets.set(targetIdx++, block.namedExprsMgr.getTarget(winFuncRefs.get(i))); + targets.add(block.namedExprsMgr.getTarget(winFuncRefs.get(i))); } windowAggNode.setTargets(targets); verifyProjectedFields(block, windowAggNode); @@ -1052,7 +1051,7 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat groupingNode.setDistinct(includeDistinctFunction); groupingNode.setAggFunctions(aggEvalNodes.toArray(new AggregationFunctionCallEval[aggEvalNodes.size()])); - List targets = new ArrayList<>(effectiveGroupingKeyNum + aggEvalNames.size()); + List targets = new ArrayList<>(); // In target, grouping columns will be followed by aggregation evals. // @@ -1063,11 +1062,11 @@ public LogicalNode visitGroupBy(PlanContext context, Stack stack, Aggregat // Build grouping keys for (int i = 0; i < effectiveGroupingKeyNum; i++) { Target target = block.namedExprsMgr.getTarget(groupingNode.getGroupingColumns()[i].getQualifiedName()); - targets.add(i, target); + targets.add(target); } - for (int i = 0, targetIdx = effectiveGroupingKeyNum; i < aggEvalNodes.size(); i++, targetIdx++) { - targets.add(targetIdx, block.namedExprsMgr.getTarget(aggEvalNames.get(i))); + for (int i = 0; i < aggEvalNodes.size(); i++) { + targets.add(block.namedExprsMgr.getTarget(aggEvalNames.get(i))); } groupingNode.setTargets(targets); @@ -1366,7 +1365,7 @@ public ScanNode visitRelation(PlanContext context, Stack stack, Relation e targets.add(new Target(evalNode, reference)); } - List input = new ArrayList<>(targets.size()); + List input = new ArrayList<>(); input.addAll(targets); scanNode.setTargets(input); @@ -1465,7 +1464,7 @@ private void setTargetOfTableSubQuery (PlanContext context, QueryBlock block, Ta targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } - List input = new ArrayList<>(targets.size()); + List input = new ArrayList<>(); input.addAll(targets); subQueryNode.setTargets(input); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java index 44aca77df1..bde8fcc2f3 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java @@ -132,7 +132,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - cloneNode.targets = new ArrayList<>(targets.size()); + cloneNode.targets = new ArrayList<>(); cloneNode.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java index 54d0dd3a83..bb4f3e70e5 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java @@ -179,7 +179,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets.size()); + grp.targets = new ArrayList<>(); grp.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 3e13292921..35071e432e 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -142,7 +142,7 @@ public Object clone() throws CloneNotSupportedException { JoinNode join = (JoinNode) super.clone(); join.joinSpec = (JoinSpec) this.joinSpec.clone(); if (hasTargets()) { - join.targets = new ArrayList<>(targets.size()); + join.targets = new ArrayList<>(); join.targets.addAll(targets); } return join; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java index 8e63096a5d..89d8ae636c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java @@ -102,7 +102,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - unionScan.targets = new ArrayList<>(targets.size()); + unionScan.targets = new ArrayList<>(); unionScan.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java index ce40a80578..9bc371bef4 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java @@ -102,7 +102,7 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { ProjectionNode projNode = (ProjectionNode) super.clone(); - projNode.targets = new ArrayList<>(targets.size()); + projNode.targets = new ArrayList<>(); projNode.targets.addAll(targets); return projNode; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java index 3e6fc21849..e2e517df21 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java @@ -227,7 +227,7 @@ public Object clone() throws CloneNotSupportedException { } if (hasTargets()) { - scanNode.targets = new ArrayList<>(targets.size()); + scanNode.targets = new ArrayList<>(); scanNode.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java index 56d9c2c8cd..441a684dc8 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/TableSubQueryNode.java @@ -167,7 +167,7 @@ public Object clone() throws CloneNotSupportedException { newTableSubQueryNode.tableName = tableName; newTableSubQueryNode.subQuery = (LogicalNode) subQuery.clone(); if (hasTargets()) { - newTableSubQueryNode.targets = new ArrayList<>(targets.size()); + newTableSubQueryNode.targets = new ArrayList<>(); newTableSubQueryNode.targets.addAll(targets); } return newTableSubQueryNode; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java index 62117e7f7a..c0e77ff73d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/WindowAggNode.java @@ -170,7 +170,7 @@ public Object clone() throws CloneNotSupportedException { } if (targets != null) { - grp.targets = new ArrayList<>(targets.size()); + grp.targets = new ArrayList<>(); grp.targets.addAll(targets); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java index 8636039add..3a3457c5f3 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/BaseSchemaBuildPhase.java @@ -255,16 +255,16 @@ public LogicalNode visitProjection(LogicalPlanner.PlanContext ctx, Stack s } private List buildTargets(LogicalPlanner.PlanContext context, NamedExpr [] exprs) throws TajoException { - List targets = new ArrayList<>(exprs.length); + List targets = new ArrayList<>(); for (int i = 0; i < exprs.length; i++) { NamedExpr namedExpr = exprs[i]; TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); if (namedExpr.hasAlias()) { - targets.add(i, new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); + targets.add(new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); } else { String generatedName = context.getPlan().generateUniqueColumnName(namedExpr.getExpr()); - targets.add(i, new Target(new FieldEval(new Column(generatedName, dataType)))); + targets.add(new Target(new FieldEval(new Column(generatedName, dataType)))); } } return targets; @@ -327,9 +327,9 @@ public LogicalNode visitGroupBy(LogicalPlanner.PlanContext ctx, Stack stac EvalNode evalNode = annotator.createEvalNode(ctx, namedExpr.getExpr(), NameResolvingMode.SUBEXPRS_AND_RELS, true); if (namedExpr.hasAlias()) { - targets.add(i, new Target(evalNode, namedExpr.getAlias())); + targets.add(new Target(evalNode, namedExpr.getAlias())); } else { - targets.add(i, new Target(evalNode, "?name_" + i)); + targets.add(new Target(evalNode, "?name_" + i)); } } stack.pop(); 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 0fb3ce6532..4d4ada1fee 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 @@ -824,22 +824,21 @@ public static List buildGroupByTarget(GroupbyNode groupbyNode, @Nullable groupingKeyTargets == null ? groupbyNode.getGroupingColumns().length : groupingKeyTargets.size(); final int aggrFuncNum = aggEvalNames != null ? aggEvalNames.length : 0; EvalNode [] aggEvalNodes = groupbyNode.getAggFunctions(); - List targets = new ArrayList<>(groupingKeyNum + aggrFuncNum); + List targets = new ArrayList<>(); if (groupingKeyTargets != null) { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.set(groupingKeyIdx, groupingKeyTargets.get(groupingKeyIdx)); + targets.add(groupingKeyTargets.get(groupingKeyIdx)); } } else { for (int groupingKeyIdx = 0; groupingKeyIdx < groupingKeyNum; groupingKeyIdx++) { - targets.set(groupingKeyIdx, new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); + targets.add(new Target(new FieldEval(groupbyNode.getGroupingColumns()[groupingKeyIdx]))); } } if (aggEvalNames != null) { - for (int aggrFuncIdx = 0, targetIdx = groupingKeyNum; aggrFuncIdx < aggrFuncNum; aggrFuncIdx++, targetIdx++) { - targets.set(targetIdx, - new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType()))); + for (int aggrFuncIdx = 0; aggrFuncIdx < aggrFuncNum; aggrFuncIdx++) { + targets.add(new Target(new FieldEval(aggEvalNames[aggrFuncIdx], aggEvalNodes[aggrFuncIdx].getValueType()))); } } @@ -954,7 +953,9 @@ public LogicalNode visitJoin(Context context, LogicalPlan plan, LogicalPlan.Quer } } - node.setTargets(new ArrayList<>(projectedTargets)); + List input = new ArrayList<>(); + input.addAll(projectedTargets); + node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1092,10 +1093,9 @@ public LogicalNode visitScan(Context context, LogicalPlan plan, LogicalPlan.Quer } } - List input = new ArrayList<>(projectedTargets.size()); + List input = new ArrayList<>(); input.addAll(projectedTargets); node.setTargets(input); - LogicalPlanner.verifyProjectedFields(block, node); return node; } @@ -1129,7 +1129,7 @@ public LogicalNode visitPartitionedTableScan(Context context, LogicalPlan plan, } } - List input = new ArrayList<>(projectedTargets.size()); + List input = new ArrayList<>(); input.addAll(projectedTargets); node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); @@ -1173,7 +1173,7 @@ public LogicalNode visitTableSubQuery(Context upperContext, LogicalPlan plan, Lo } } - List input = new ArrayList<>(projectedTargets.size()); + List input = new ArrayList<>(); input.addAll(projectedTargets); node.setTargets(input); LogicalPlanner.verifyProjectedFields(block, node); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java index 5518200482..dce1d2bc41 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java @@ -743,14 +743,14 @@ public static Column[] convertColumns(List columnProt public static List convertTargets(OverridableConf context, EvalContext evalContext, List targetsProto) { - List targets = new ArrayList<>(targetsProto.size()); + List targets = new ArrayList<>(); for (int i = 0; i < targets.size(); i++) { PlanProto.Target targetProto = targetsProto.get(i); EvalNode evalNode = EvalNodeDeserializer.deserialize(context, evalContext, targetProto.getExpr()); if (targetProto.hasAlias()) { - targets.add(i, new Target(evalNode, targetProto.getAlias())); + targets.add(new Target(evalNode, targetProto.getAlias())); } else { - targets.add(i, new Target((FieldEval) evalNode)); + targets.add(new Target((FieldEval) evalNode)); } } return targets; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index 71c0580620..aacc1bcabb 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -537,12 +537,12 @@ public List getFoundNodes() { } public static List schemaToTargets(Schema schema) { - List targets = new ArrayList<>(schema.size()); + List targets = new ArrayList<>(); FieldEval eval; for (int i = 0; i < schema.size(); i++) { eval = new FieldEval(schema.getColumn(i)); - targets.add(i, new Target(eval)); + targets.add(new Target(eval)); } return targets; } @@ -677,10 +677,10 @@ public static Schema targetToSchema(List targets) { * @return The stripped targets */ public static List stripTarget(List sourceTargets) { - List copy = new ArrayList<>(sourceTargets.size()); + List copy = new ArrayList<>(); for (int i = 0; i < sourceTargets.size(); i++) { try { - copy.add(i, (Target) sourceTargets.get(i).clone()); + copy.add((Target) sourceTargets.get(i).clone()); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); }