You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/11/18 07:23:00 UTC
[2/2] tajo git commit: TAJO-1946: Change Projectable::setTargets and
getTargets to set and get List.
TAJO-1946: Change Projectable::setTargets and getTargets to set and get List<Target>.
Closes #839
Signed-off-by: Jihoon Son <ji...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/a2a5c14e
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/a2a5c14e
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/a2a5c14e
Branch: refs/heads/master
Commit: a2a5c14e412cfab316c87bfeadcddf11e6391e08
Parents: 4fd1739
Author: Dongkyu Hwangbo <hw...@gmail.com>
Authored: Wed Nov 18 15:23:13 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed Nov 18 15:23:13 2015 +0900
----------------------------------------------------------------------
CHANGES | 3 +
.../java/org/apache/tajo/util/StringUtils.java | 80 +++++++++++++++++--
.../org/apache/tajo/util/TestStringUtil.java | 16 +++-
.../apache/tajo/engine/eval/ExprTestBase.java | 12 +--
.../tajo/engine/eval/TestEvalTreeUtil.java | 18 ++---
.../tajo/engine/planner/TestLogicalPlanner.java | 55 +++++++------
.../engine/codegen/ExecutorPreCompiler.java | 3 +-
.../engine/planner/PhysicalPlannerImpl.java | 4 +-
.../apache/tajo/engine/planner/Projector.java | 18 +++--
.../engine/planner/global/GlobalPlanner.java | 50 ++++++------
.../global/builder/DistinctGroupbyBuilder.java | 81 ++++++++------------
.../planner/physical/BSTIndexScanExec.java | 3 +-
.../engine/planner/physical/EvalExprExec.java | 9 ++-
.../engine/planner/physical/SeqScanExec.java | 12 +--
.../engine/planner/physical/WindowAggExec.java | 6 +-
.../exec/ExplainPlanPreprocessorForTest.java | 6 +-
.../apache/tajo/master/exec/QueryExecutor.java | 14 ++--
.../org/apache/tajo/plan/LogicalOptimizer.java | 2 +-
.../java/org/apache/tajo/plan/LogicalPlan.java | 6 +-
.../org/apache/tajo/plan/LogicalPlanner.java | 72 +++++++++--------
.../org/apache/tajo/plan/expr/EvalTreeUtil.java | 2 +-
.../tajo/plan/logical/DistinctGroupbyNode.java | 27 +++----
.../apache/tajo/plan/logical/EvalExprNode.java | 18 ++---
.../apache/tajo/plan/logical/GroupbyNode.java | 36 +++++----
.../org/apache/tajo/plan/logical/JoinNode.java | 18 +++--
.../plan/logical/PartitionedTableScanNode.java | 68 ++++++++--------
.../apache/tajo/plan/logical/Projectable.java | 6 +-
.../tajo/plan/logical/ProjectionNode.java | 30 ++++----
.../org/apache/tajo/plan/logical/ScanNode.java | 27 ++++---
.../tajo/plan/logical/TableSubQueryNode.java | 32 +++++---
.../apache/tajo/plan/logical/WindowAggNode.java | 23 +++---
.../tajo/plan/rewrite/BaseSchemaBuildPhase.java | 19 +++--
.../rewrite/rules/InSubqueryRewriteRule.java | 2 +-
.../rewrite/rules/ProjectionPushDownRule.java | 55 +++++++------
.../plan/serder/LogicalNodeDeserializer.java | 13 ++--
.../tajo/plan/serder/LogicalNodeSerializer.java | 17 ++--
.../org/apache/tajo/plan/util/PlannerUtil.java | 22 +++---
.../tajo/plan/verifier/LogicalPlanVerifier.java | 2 +-
.../apache/tajo/storage/jdbc/SQLBuilder.java | 5 +-
39 files changed, 495 insertions(+), 397 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 12b11be..8858adb 100644
--- a/CHANGES
+++ b/CHANGES
@@ -101,6 +101,9 @@ Release 0.12.0 - unreleased
SUB TASKS
+ TAJO-1946: Change Projectable::setTargets and getTargets to set and get
+ List<Target>. (Contributed by Dongkyu Hwangbo, Committed by jihoon)
+
TAJO-1877: Adopt try-resource statement to AbstractDBStore.
(Contributed by Dongkyu Hwangbo, Committed by jihoon)
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-common/src/main/java/org/apache/tajo/util/StringUtils.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/StringUtils.java b/tajo-common/src/main/java/org/apache/tajo/util/StringUtils.java
index 2d57c0a..1cb25ca 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/StringUtils.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/StringUtils.java
@@ -19,6 +19,7 @@
package org.apache.tajo.util;
import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
import io.netty.util.CharsetUtil;
import org.apache.commons.lang.CharUtils;
import org.apache.commons.lang.StringEscapeUtils;
@@ -36,6 +37,7 @@ import java.nio.charset.CoderResult;
import java.nio.charset.CodingErrorAction;
import java.util.Arrays;
import java.util.BitSet;
+import java.util.Iterator;
public class StringUtils {
@@ -377,23 +379,87 @@ public class StringUtils {
}
/**
+ * Concatenate all objects' string with the delimiter ", "
+ *
+ * @param objects Iterable objects
+ * @return A joined string
+ */
+ public static String join(Iterable objects) {
+ return join(objects, ", ");
+ }
+
+ /**
* Concatenate all objects' string with a delimiter string
*
* @param objects Iterable objects
* @param delimiter Delimiter string
* @return A joined string
*/
- public static String join(Iterable objects, String delimiter) {
+ public static String join(Iterable objects, String delimiter) {
+ return join(objects, delimiter, 0, Iterables.size(objects));
+ }
+
+ /**
+ * Concatenate all objects' string with a delimiter string
+ *
+ * @param objects object Iterable
+ * @param delimiter Delimiter string
+ * @param startIndex the begin index to join
+ * @return A joined string
+ */
+ public static String join(Iterable objects, String delimiter, int startIndex) {
+ return join(objects, delimiter, startIndex, Iterables.size(objects));
+ }
+
+ /**
+ * Concatenate all objects' string with a delimiter string
+ *
+ * @param objects object Iterable
+ * @param delimiter Delimiter string
+ * @param startIndex the begin index to join
+ * @param length the number of columns to be joined
+ * @return A joined string
+ */
+ public static String join(Iterable objects, String delimiter, int startIndex, int length) {
+ return join(objects, delimiter, startIndex, length, new Function<Object, String>() {
+ @Override
+ public String apply(Object input) {
+ return input.toString();
+ }
+ });
+ }
+
+ /**
+ * Concatenate all objects' string with a delimiter string
+ *
+ * @param objects object Iterable
+ * @param delimiter Delimiter string
+ * @param f convert from a type to string
+ * @return A joined string
+ */
+ public static <T> String join(Iterable<T> objects, String delimiter, Function<T, String> f) {
+ return join(objects, delimiter, 0, Iterables.size(objects), f);
+ }
+
+ public static <T> String join(Iterable<T> objects, String delimiter, int startIndex, int length, Function<T, String> f) {
boolean first = true;
StringBuilder sb = new StringBuilder();
- for(Object object : objects) {
- if (first) {
- first = false;
- } else {
- sb.append(delimiter);
+ int endIndex = startIndex + length;
+ Iterator itr = objects.iterator();
+
+ for(int i = 0; i < endIndex; i++) {
+ if(i < startIndex) {
+ itr.next();
}
+ else {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(delimiter);
+ }
- sb.append(object.toString());
+ sb.append(f.apply((T) itr.next()));
+ }
}
return sb.toString();
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-common/src/test/java/org/apache/tajo/util/TestStringUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/util/TestStringUtil.java b/tajo-common/src/test/java/org/apache/tajo/util/TestStringUtil.java
index c4329a1..f32309b 100644
--- a/tajo-common/src/test/java/org/apache/tajo/util/TestStringUtil.java
+++ b/tajo-common/src/test/java/org/apache/tajo/util/TestStringUtil.java
@@ -18,12 +18,14 @@
package org.apache.tajo.util;
-import java.nio.charset.Charset;
-
import org.apache.commons.lang.CharUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.junit.Test;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
import static org.junit.Assert.*;
public class TestStringUtil {
@@ -149,4 +151,14 @@ public class TestStringUtil {
assertArrayEquals(new byte[] { (byte) 0xED, (byte) 0x83, (byte) 0x80, (byte) 0xEC, (byte) 0xA1, (byte) 0xB0 },
StringUtils.convertCharsToBytes(testStringArray, Charset.forName("UTF-8")));
}
+
+ @Test
+ public void testJoinIterable() {
+ List<String> testList = new ArrayList<>();
+ testList.add("t");
+ testList.add("a");
+ testList.add("j");
+ testList.add("o");
+ assertTrue(StringUtils.join(testList).equals("t, a, j, o"));
+ }
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
----------------------------------------------------------------------
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 7c79724..69f92f4 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 class ExprTestBase {
* @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<Target> getRawTargets(QueryContext context, String query, boolean condition)
throws TajoException, InvalidStatementException {
List<ParsedResult> parsedResults = SimpleParser.parseScript(query);
@@ -154,7 +154,7 @@ public class ExprTestBase {
assertFalse(state.getErrors().get(0).getMessage(), true);
}
- Target [] targets = plan.getRootBlock().getRawTargets();
+ List<Target> 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 class ExprTestBase {
}
}
- Target [] targets;
+ List<Target> targets;
TajoClassLoader classLoader = new TajoClassLoader();
EvalContext evalContext = new EvalContext();
@@ -284,9 +284,9 @@ public class ExprTestBase {
}
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);
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
----------------------------------------------------------------------
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 7bba76b..3c92842 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 class TestEvalTreeUtil {
util.shutdownCatalogCluster();
}
- public static Target [] getRawTargets(String query) {
+ public static List<Target> getRawTargets(String query) {
LogicalPlan plan = null;
try {
Expr expr = analyzer.parse(query);
@@ -212,7 +212,7 @@ public class TestEvalTreeUtil {
@Test
public final void testGetSchemaFromTargets() {
- Target [] targets = getRawTargets(QUERIES[0]);
+ List<Target> 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 class TestEvalTreeUtil {
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<Target> targets = plan.getRootBlock().getRawTargets();
Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
Collection<EvalNode> 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 class TestEvalTreeUtil {
@Test
public final void testSimplify() throws TajoException {
- Target [] targets = getRawTargets(QUERIES[0]);
- EvalNode node = AlgebraicUtil.eliminateConstantExprs(targets[0].getEvalTree());
+ List<Target> 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 class TestEvalTreeUtil {
targets = plan.getRootBlock().getRawTargets();
Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
Collection<EvalNode> exprs =
- EvalTreeUtil.getContainExpr(targets[0].getEvalTree(), col1);
+ EvalTreeUtil.getContainExpr(targets.get(0).getEvalTree(), col1);
node = exprs.iterator().next();
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
----------------------------------------------------------------------
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 a11d9be..d291c09 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
@@ -54,7 +54,6 @@ import org.apache.tajo.storage.TablespaceManager;
import org.apache.tajo.util.CommonTestingUtil;
import org.apache.tajo.util.FileUtil;
import org.apache.tajo.util.KeyValueSet;
-import org.apache.tajo.util.TUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -1247,12 +1246,12 @@ public class TestLogicalPlanner {
InsertNode insertNode = getInsertNode(plan);
ProjectionNode subquery = insertNode.getChild();
- Target[] targets = subquery.getTargets();
+ List<Target> 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 +1407,32 @@ public class TestLogicalPlanner {
testCloneLogicalNode(projectionNode);
// projection column test
- Target[] targets = projectionNode.getTargets();
- Arrays.sort(targets, new Comparator<Target>() {
+ List<Target> targets = projectionNode.getTargets();
+ Collections.sort(targets, new Comparator<Target>() {
@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<Target>() {
+ Collections.sort(targets, new Comparator<Target>() {
@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 +1462,16 @@ public class TestLogicalPlanner {
testCloneLogicalNode(projectionNode);
// projection column test
- Target[] targets = projectionNode.getTargets();
- Arrays.sort(targets, new Comparator<Target>() {
+ List<Target> targets = projectionNode.getTargets();
+ Collections.sort(targets, new Comparator<Target>() {
@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 +1482,17 @@ public class TestLogicalPlanner {
assertEquals(NodeType.SCAN, selectionNode.getChild().getType());
ScanNode scanNode = selectionNode.getChild();
targets = scanNode.getTargets();
- Arrays.sort(targets, new Comparator<Target>() {
+ Collections.sort(targets, new Comparator<Target>() {
@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");
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
----------------------------------------------------------------------
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 f63e46f..15df76a 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.plan.visitor.BasicLogicalPlanVisitor;
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 @@ public class ExecutorPreCompiler extends BasicLogicalPlanVisitor<ExecutorPreComp
}
private static void compileProjectableNode(CompilationContext context, Schema schema, Projectable node) {
- Target[] targets;
+ List<Target> targets;
if (node.hasTargets()) {
targets = node.getTargets();
} else {
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
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 e0da9e6..c489bbb 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
@@ -1095,13 +1095,13 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
//3 phase: groupby columns, seq, distinct1 keys, distinct2 keys,
List<SortSpec> 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()) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/Projector.java
----------------------------------------------------------------------
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 ba8ec32..dfe823b 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.Tuple;
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<Target> targets) {
this.context = context;
this.inSchema = inSchema;
- Target[] realTargets;
+ List<Target> 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();
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
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 5f8bd11..0b42a41 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 @@ public class GlobalPlanner {
*/
private static class RewrittenFunctions {
AggregationFunctionCallEval [] firstStageEvals;
- Target[] firstStageTargets;
+ List<Target> firstStageTargets;
AggregationFunctionCallEval secondStageEvals;
public RewrittenFunctions(int firstStageEvalNum) {
firstStageEvals = new AggregationFunctionCallEval[firstStageEvalNum];
- firstStageTargets = new Target[firstStageEvalNum];
+ firstStageTargets = new ArrayList<>();
}
}
@@ -444,7 +444,7 @@ public class GlobalPlanner {
}
String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]);
FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType());
- rewritten.firstStageTargets[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 @@ public class GlobalPlanner {
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.add(0, new Target(fieldEval));
rewritten.secondStageEvals = createSumFunction(new EvalNode[]{fieldEval});
} else if (function.getName().equals("max")) {
@@ -461,7 +461,7 @@ public class GlobalPlanner {
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.add(0, new Target(fieldEval));
rewritten.secondStageEvals = createMaxFunction(new EvalNode[]{fieldEval});
} else if (function.getName().equals("min")) {
@@ -471,7 +471,7 @@ public class GlobalPlanner {
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.add(0, new Target(fieldEval));
rewritten.secondStageEvals = createMinFunction(new EvalNode[]{fieldEval});
} else {
@@ -547,17 +547,12 @@ public class GlobalPlanner {
}
}
- int firstStageAggFunctionNum = firstStageAggFunctions.size();
- int firstStageGroupingKeyNum = firstStageGroupingColumns.size();
-
- int i = 0;
- Target [] firstStageTargets = new Target[firstStageGroupingKeyNum + firstStageAggFunctionNum];
+ List<Target> firstStageTargets = new ArrayList<>();
for (Column column : firstStageGroupingColumns) {
- Target target = new Target(new FieldEval(column));
- firstStageTargets[i++] = target;
+ firstStageTargets.add(new Target(new FieldEval(column)));
}
for (Target target : firstPhaseEvalNodeTargets) {
- firstStageTargets[i++] = target;
+ firstStageTargets.add(target);
}
// Create the groupby node for the first stage and set all necessary descriptions
@@ -777,7 +772,7 @@ public class GlobalPlanner {
secondPhaseGroupBy.setAggFunctions(secondPhaseEvals);
firstPhaseGroupBy.setAggFunctions(firstPhaseEvals);
- Target [] firstPhaseTargets = ProjectionPushDownRule.buildGroupByTarget(firstPhaseGroupBy, null,
+ List<Target> firstPhaseTargets = ProjectionPushDownRule.buildGroupByTarget(firstPhaseGroupBy, null,
firstPhaseEvalNames);
firstPhaseGroupBy.setTargets(firstPhaseTargets);
secondPhaseGroupBy.setInSchema(PlannerUtil.targetToSchema(firstPhaseTargets));
@@ -1298,21 +1293,21 @@ public class GlobalPlanner {
}
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<Target> 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<Column> columns = EvalTreeUtil.findUniqueColumns(targets[i].getEvalTree());
+ Set<Column> 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 +1317,15 @@ public class GlobalPlanner {
if (eachNode.getPID() == leftMostSubQueryNode.getPID()) {
continue;
}
- Target[] eachNodeTargets = eachNode.getTargets();
- if (eachNodeTargets.length != targetMappings.length) {
+ List<Target> 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();
+ Target t = eachNodeTargets.get(i);
+ t.setAlias(t.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.");
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
----------------------------------------------------------------------
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 058a11b..e02e06f 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 class DistinctGroupbyBuilder {
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 class DistinctGroupbyBuilder {
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 @@ public class DistinctGroupbyBuilder {
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,17 +250,15 @@ public class DistinctGroupbyBuilder {
GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode();
List<AggregationFunctionCallEval> groupbyAggFunctions = buildInfo.getAggFunctions();
- Target[] targets = new Target[eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()];
- int targetIdx = 0;
+ List<Target> targets = new ArrayList<>();
for (Column column : eachGroupbyNode.getGroupingColumns()) {
Target target = new Target(new FieldEval(column));
- targets[targetIdx++] = target;
+ targets.add(target);
baseGroupByTargets.add(target);
}
- for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) {
- targets[targetIdx++] = eachAggFunctionTarget;
- }
+ targets.addAll(buildInfo.getAggFunctionTargets());
+
eachGroupbyNode.setTargets(targets);
eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[groupbyAggFunctions.size()]));
eachGroupbyNode.setDistinct(true);
@@ -274,12 +272,9 @@ public class DistinctGroupbyBuilder {
// 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()];
- int targetIdx = 0;
- for (Target eachTarget : otherAggregationFunctionTargets) {
- targets[targetIdx++] = eachTarget;
- baseGroupByTargets.add(eachTarget);
- }
+ List<Target> targets = new ArrayList<>();
+ targets.addAll(otherAggregationFunctionTargets);
+ baseGroupByTargets.addAll(otherAggregationFunctionTargets);
otherGroupbyNode.setTargets(targets);
otherGroupbyNode.setGroupingColumns(new Column[]{});
@@ -290,7 +285,7 @@ public class DistinctGroupbyBuilder {
}
DistinctGroupbyNode baseDistinctNode = new DistinctGroupbyNode(context.getPlan().getLogicalPlan().newPID());
- baseDistinctNode.setTargets(baseGroupByTargets.toArray(new Target[baseGroupByTargets.size()]));
+ baseDistinctNode.setTargets(baseGroupByTargets);
baseDistinctNode.setGroupingColumns(groupbyNode.getGroupingColumns());
baseDistinctNode.setInSchema(groupbyNode.getInSchema());
baseDistinctNode.setChild(groupbyNode.getChild());
@@ -380,7 +375,7 @@ public class DistinctGroupbyBuilder {
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,16 +409,13 @@ public class DistinctGroupbyBuilder {
for (DistinctGroupbyNodeBuildInfo buildInfo: distinctNodeBuildInfos.values()) {
GroupbyNode eachGroupbyNode = buildInfo.getGroupbyNode();
List<AggregationFunctionCallEval> groupbyAggFunctions = buildInfo.getAggFunctions();
- Target[] targets = new Target[eachGroupbyNode.getGroupingColumns().length + groupbyAggFunctions.size()];
- int targetIdx = 0;
+ List<Target> targets = new ArrayList<>();
for (Column column : eachGroupbyNode.getGroupingColumns()) {
- Target target = new Target(new FieldEval(column));
- targets[targetIdx++] = target;
- }
- for (Target eachAggFunctionTarget: buildInfo.getAggFunctionTargets()) {
- targets[targetIdx++] = eachAggFunctionTarget;
+ targets.add(new Target(new FieldEval(column)));
}
+ targets.addAll(buildInfo.getAggFunctionTargets());
+
eachGroupbyNode.setTargets(targets);
eachGroupbyNode.setAggFunctions(groupbyAggFunctions.toArray(new AggregationFunctionCallEval[groupbyAggFunctions.size()]));
eachGroupbyNode.setDistinct(true);
@@ -437,15 +429,11 @@ public class DistinctGroupbyBuilder {
// 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()];
- int targetIdx = 0;
+ List<Target> targets = new ArrayList<>();
for (Column column : originalGroupingColumns) {
- Target target = new Target(new FieldEval(column));
- targets[targetIdx++] = target;
- }
- for (Target eachTarget : otherAggregationFunctionTargets) {
- targets[targetIdx++] = eachTarget;
+ targets.add(new Target(new FieldEval(column)));
}
+ targets.addAll(otherAggregationFunctionTargets);
otherGroupbyNode.setTargets(targets);
otherGroupbyNode.setGroupingColumns(originalGroupingColumns.toArray(new Column[originalGroupingColumns.size()]));
@@ -530,14 +518,14 @@ public class DistinctGroupbyBuilder {
Target target = new Target(new FieldEval(column));
firstGroupbyTargets.add(target);
}
- firstStageGroupbyNode.setTargets(firstGroupbyTargets.toArray(new Target[firstGroupbyTargets.size()]));
+ firstStageGroupbyNode.setTargets(firstGroupbyTargets);
// SecondStage:
// Set grouping column with origin groupby's columns
// Remove distinct group column from targets
secondStageGroupbyNode.setGroupingColumns(originGroupColumns.toArray(new Column[originGroupColumns.size()]));
- Target[] oldTargets = secondStageGroupbyNode.getTargets();
+ List<Target> oldTargets = secondStageGroupbyNode.getTargets();
List<Target> secondGroupbyTargets = new ArrayList<>();
LinkedHashSet<Column> distinctColumns = EvalTreeUtil.findUniqueColumns(secondStageGroupbyNode.getAggFunctions()[0]);
List<Column> uniqueDistinctColumn = new ArrayList<>();
@@ -548,7 +536,7 @@ public class DistinctGroupbyBuilder {
}
}
for (int i = 0; i < originGroupColumns.size(); i++) {
- secondGroupbyTargets.add(oldTargets[i]);
+ secondGroupbyTargets.add(oldTargets.get(i));
if (grpIdx > 0) {
columnIdIndex++;
}
@@ -557,7 +545,7 @@ public class DistinctGroupbyBuilder {
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 +555,7 @@ public class DistinctGroupbyBuilder {
}
columnIdIndex++;
}
- secondStageGroupbyNode.setTargets(secondGroupbyTargets.toArray(new Target[secondGroupbyTargets.size()]));
+ secondStageGroupbyNode.setTargets(secondGroupbyTargets);
} else {
// FirstStage: Change target of aggFunction to function name expr
List<Target> firstGroupbyTargets = new ArrayList<>();
@@ -587,7 +575,7 @@ public class DistinctGroupbyBuilder {
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 +585,7 @@ public class DistinctGroupbyBuilder {
columnIdIndex++;
aggFuncIdx++;
}
- firstStageGroupbyNode.setTargets(firstGroupbyTargets.toArray(new Target[firstGroupbyTargets.size()]));
+ firstStageGroupbyNode.setTargets(firstGroupbyTargets);
secondStageGroupbyNode.setInSchema(firstStageGroupbyNode.getOutSchema());
}
grpIdx++;
@@ -612,12 +600,9 @@ public class DistinctGroupbyBuilder {
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<Target> targets = new ArrayList<>();
+ targets.addAll(lastSecondStageGroupbyNode.getTargets());
+ targets.addAll(otherGroupbyNode.getTargets());
lastSecondStageGroupbyNode.setTargets(targets);
@@ -648,15 +633,15 @@ public class DistinctGroupbyBuilder {
} else {
//add aggr function target
columnIdIndex += firstStageGroupbyNode.getGroupingColumns().length;
- Target[] baseGroupbyTargets = firstStageGroupbyNode.getTargets();
+ List<Target> 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[firstTargets.size()]));
+ firstStageDistinctNode.setTargets(firstTargets);
firstStageDistinctNode.setResultColumnIds(TUtil.toArray(firstStageColumnIds));
//Set SecondStage ColumnId and Input schema
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
----------------------------------------------------------------------
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 2014274..ee3762f 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 org.apache.tajo.worker.TaskAttemptContext;
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 class BSTIndexScanExec extends ScanExec {
this.reader.open();
}
- private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, Target[] targets, EvalNode qual) {
+ private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, List<Target> targets, EvalNode qual) {
Schema mergedSchema = new Schema();
Set<Column> qualAndTargets = new HashSet<>();
qualAndTargets.addAll(EvalTreeUtil.findUniqueColumns(qual));
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/EvalExprExec.java
----------------------------------------------------------------------
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 4581b4a..72ab608 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.storage.VTuple;
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 class EvalExprExec extends PhysicalExec {
@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<Target> 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;
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
----------------------------------------------------------------------
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 2572e1d..3ddad1e 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 @@ public class SeqScanExec extends ScanExec {
}
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 class SeqScanExec extends ScanExec {
}
protected void initializeProjector(Schema actualInSchema){
- Target[] realTargets;
+ List<Target> realTargets;
if (plan.getTargets() == null) {
realTargets = PlannerUtil.schemaToTargets(outSchema);
} else {
@@ -219,10 +219,10 @@ public class SeqScanExec extends ScanExec {
}
//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;
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java
----------------------------------------------------------------------
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 c09e85e..ab13b59 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 class WindowAggExec extends UnaryPhysicalExec {
}
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;
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java
----------------------------------------------------------------------
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 b747849..2740728 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
@@ -32,6 +32,8 @@ import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Stack;
+import java.util.List;
+import java.util.Collections;
/**
* Tajo's logical planner can generate different shapes of logical plans for the same query,
@@ -169,8 +171,8 @@ public class ExplainPlanPreprocessorForTest {
return AlgebraicUtil.createSingletonExprFromCNF(cnf);
}
- private Target[] sortTargets(Target[] targets) {
- Arrays.sort(targets, targetComparator);
+ private List<Target> sortTargets(List<Target> targets) {
+ Collections.sort(targets, targetComparator);
return targets;
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
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 e260c00..9a35ee6 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 class QueryExecutor {
LogicalRootNode rootNode = plan.getRootBlock().getRoot();
EvalContext evalContext = new EvalContext();
- Target[] targets = plan.getRootBlock().getRawTargets();
+ List<Target> 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 class QueryExecutor {
}
}
- public static void startScriptExecutors(QueryContext queryContext, EvalContext evalContext, Target[] targets)
+ public static void startScriptExecutors(QueryContext queryContext, EvalContext evalContext, List<Target> 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()) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalOptimizer.java
----------------------------------------------------------------------
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 117de39..404e971 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 @@ public class LogicalOptimizer {
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
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
----------------------------------------------------------------------
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 87426b1..8610194 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 LogicalPlan {
/** It contains a planning log for this block */
private final List<String> planingHistory = Lists.newArrayList();
/** It is for debugging or unit tests */
- private Target[] rawTargets;
+ private List<Target> rawTargets;
public QueryBlock(String blockName) {
this.blockName = blockName;
@@ -487,11 +487,11 @@ public class LogicalPlan {
return rootType;
}
- public Target [] getRawTargets() {
+ public List<Target> getRawTargets() {
return rawTargets;
}
- public void setRawTargets(Target[] rawTargets) {
+ public void setRawTargets(List<Target> rawTargets) {
this.rawTargets = rawTargets;
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
index 78fa737..4f4d13e 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
@@ -274,7 +274,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
////////////////////////////////////////////////////////
ProjectionNode projectionNode;
- Target[] targets;
+ List<Target> targets;
targets = buildTargets(context, referenceNames);
// Set ProjectionNode
@@ -302,18 +302,18 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
return projectionNode;
}
- private void setRawTargets(PlanContext context, Target[] targets, String[] referenceNames,
+ private void setRawTargets(PlanContext context, List<Target> 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<Target> 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.add(new Target(evalNode, referenceNames[i]));
}
// it's for debugging or unit testing
block.setRawTargets(rawTargets);
@@ -465,15 +465,15 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
QueryBlock block = context.queryBlock;
int finalTargetNum = projection.getNamedExprs().length;
- Target [] targets = new Target[finalTargetNum];
+ List<Target> 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.add(new Target(evalNode, namedExpr.getAlias()));
} else {
- targets[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);
@@ -484,24 +484,24 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
return evalExprNode;
}
- private Target [] buildTargets(PlanContext context, String[] referenceNames)
+ private List<Target> buildTargets(PlanContext context, String[] referenceNames)
throws TajoException {
QueryBlock block = context.queryBlock;
- Target [] targets = new Target[referenceNames.length];
+ List<Target> 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.add(new Target(block.getConstByReference(refName), refName));
} else if (block.namedExprsMgr.isEvaluated(refName)) {
- targets[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[i] = new Target(evalNode, refName);
+ targets.add(new Target(evalNode, refName));
}
}
return targets;
@@ -523,8 +523,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
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 +554,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
}
// 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<Column> columns = EvalTreeUtil.findUniqueColumns(target.getEvalTree());
for (Column c : columns) {
if (!windowAggNode.getInSchema().contains(c)) {
@@ -717,7 +717,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
}
}
- Target [] targets = new Target[referenceNames.length];
+ List<Target> targets = new ArrayList<>();
List<Integer> windowFuncIndices = Lists.newArrayList();
Projection projection = (Projection) stack.peek();
int windowFuncIdx = 0;
@@ -729,18 +729,17 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
}
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[targetIdx++] = new Target(block.getConstByReference(referenceNames[i]), referenceNames[i]);
+ targets.add(new Target(block.getConstByReference(referenceNames[i]), referenceNames[i]));
} else {
- targets[targetIdx++] = block.namedExprsMgr.getTarget(referenceNames[i]);
+ targets.add(block.namedExprsMgr.getTarget(referenceNames[i]));
}
}
}
for (int i = 0; i < winFuncRefs.size(); i++) {
- targets[targetIdx++] = block.namedExprsMgr.getTarget(winFuncRefs.get(i));
+ targets.add(block.namedExprsMgr.getTarget(winFuncRefs.get(i)));
}
windowAggNode.setTargets(targets);
verifyProjectedFields(block, windowAggNode);
@@ -806,7 +805,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
groupbyNode.setDistinct(includeDistinctFunction);
groupbyNode.setAggFunctions(aggEvals.toArray(new AggregationFunctionCallEval[aggEvals.size()]));
- Target [] targets = ProjectionPushDownRule.buildGroupByTarget(groupbyNode, null,
+ List<Target> targets = ProjectionPushDownRule.buildGroupByTarget(groupbyNode, null,
aggEvalNames.toArray(new String[aggEvalNames.size()]));
groupbyNode.setTargets(targets);
@@ -1052,7 +1051,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
groupingNode.setDistinct(includeDistinctFunction);
groupingNode.setAggFunctions(aggEvalNodes.toArray(new AggregationFunctionCallEval[aggEvalNodes.size()]));
- Target [] targets = new Target[effectiveGroupingKeyNum + aggEvalNames.size()];
+ List<Target> targets = new ArrayList<>();
// In target, grouping columns will be followed by aggregation evals.
//
@@ -1062,12 +1061,11 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
// Build grouping keys
for (int i = 0; i < effectiveGroupingKeyNum; i++) {
- Target target = block.namedExprsMgr.getTarget(groupingNode.getGroupingColumns()[i].getQualifiedName());
- targets[i] = target;
+ targets.add(block.namedExprsMgr.getTarget(groupingNode.getGroupingColumns()[i].getQualifiedName()));
}
- for (int i = 0, targetIdx = effectiveGroupingKeyNum; i < aggEvalNodes.size(); i++, targetIdx++) {
- targets[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);
@@ -1198,7 +1196,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
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 +1303,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
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 +1364,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
targets.add(new Target(evalNode, reference));
}
- scanNode.setTargets(targets.toArray(new Target[targets.size()]));
+ scanNode.setTargets(new ArrayList<>(targets));
verifyProjectedFields(block, scanNode);
return scanNode;
@@ -1463,7 +1461,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true));
}
- subQueryNode.setTargets(targets.toArray(new Target[targets.size()]));
+ subQueryNode.setTargets(new ArrayList<>(targets));
}
/*===============================================================================================
@@ -1512,7 +1510,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
currentBlock.addRelation(setOpTableSubQueryNode);
Schema setOpSchema = setOpTableSubQueryNode.getOutSchema();
- Target[] setOpTarget = setOpTableSubQueryNode.getTargets();
+ List<Target> 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 +1604,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
// 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<Target> leftStrippedTargets = PlannerUtil.stripTarget(
PlannerUtil.schemaToTargets(leftBlock.getRoot().getOutSchema()));
setOp.setInSchema(leftChild.getOutSchema());
@@ -1759,13 +1757,13 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
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(targets);
insertNode.setInSchema(projectionNode.getOutSchema());
insertNode.setOutSchema(projectionNode.getOutSchema());
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
----------------------------------------------------------------------
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 02ec615..5169136 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 class EvalTreeUtil {
return finder.getColumnRefs();
}
- public static Schema getSchemaByTargets(Schema inputSchema, Target[] targets) {
+ public static Schema getSchemaByTargets(Schema inputSchema, List<Target> targets) {
Schema schema = new Schema();
for (Target target : targets) {
schema.addColumn(
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java
----------------------------------------------------------------------
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 1af05e7..a36f9a4 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
@@ -21,15 +21,16 @@ package org.apache.tajo.plan.logical;
import com.google.gson.annotations.Expose;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.plan.PlanString;
-import org.apache.tajo.plan.util.PlannerUtil;
import org.apache.tajo.plan.Target;
import org.apache.tajo.plan.expr.AggregationFunctionCallEval;
+import org.apache.tajo.plan.util.PlannerUtil;
import org.apache.tajo.util.StringUtils;
import org.apache.tajo.util.TUtil;
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
@@ -39,7 +40,7 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
private List<GroupbyNode> subGroupbyPlan;
@Expose
- private Target[] targets;
+ private List<Target> targets = null;
@Expose
private Column[] groupingColumns = PlannerUtil.EMPTY_COLUMNS;
@@ -56,21 +57,21 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
@Override
public boolean hasTargets() {
- return targets.length > 0;
+ return (targets != null && !targets.isEmpty());
}
@Override
- public void setTargets(Target[] targets) {
+ public void setTargets(List<Target> targets) {
this.targets = targets;
setOutSchema(PlannerUtil.targetToSchema(targets));
}
@Override
- public Target[] getTargets() {
+ public List<Target> getTargets() {
if (hasTargets()) {
return targets;
} else {
- return new Target[0];
+ return new ArrayList<>();
}
}
@@ -131,9 +132,9 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
}
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<>();
+ for (Target t : targets) {
+ cloneNode.targets.add((Target) t.clone());
}
}
@@ -169,7 +170,7 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
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 + Objects.hashCode(targets);
return result;
}
@@ -223,9 +224,9 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
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(", ");
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java
----------------------------------------------------------------------
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 0632f68..d796443 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,18 +21,18 @@
*/
package org.apache.tajo.plan.logical;
-import java.util.Arrays;
-
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 Target[] exprs;
+ @Expose private List<Target> exprs = null;
public EvalExprNode(int pid) {
super(pid, NodeType.EXPRS);
@@ -54,17 +54,17 @@ public class EvalExprNode extends LogicalNode implements Projectable {
}
@Override
- public void setTargets(Target[] targets) {
+ public void setTargets(List<Target> targets) {
this.exprs = targets;
this.setOutSchema(PlannerUtil.targetToSchema(targets));
}
@Override
- public Target[] getTargets() {
+ public List<Target> getTargets() {
return exprs;
}
- public Target[] getExprs() {
+ public List<Target> getExprs() {
return this.exprs;
}
@@ -77,7 +77,7 @@ public class EvalExprNode extends LogicalNode implements Projectable {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + Arrays.hashCode(exprs);
+ result = prime * result + Objects.hashCode(exprs);
return result;
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java
----------------------------------------------------------------------
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 3966606..4845c1d 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
@@ -22,13 +22,16 @@ import com.google.common.base.Preconditions;
import com.google.gson.annotations.Expose;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.plan.PlanString;
-import org.apache.tajo.plan.util.PlannerUtil;
import org.apache.tajo.plan.Target;
import org.apache.tajo.plan.expr.AggregationFunctionCallEval;
+import org.apache.tajo.plan.util.PlannerUtil;
import org.apache.tajo.util.StringUtils;
import org.apache.tajo.util.TUtil;
+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 */
@@ -39,7 +42,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<Target> targets = null;
@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 +108,13 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
}
@Override
- public void setTargets(Target[] targets) {
+ public void setTargets(List<Target> targets) {
this.targets = targets;
setOutSchema(PlannerUtil.targetToSchema(targets));
}
@Override
- public Target[] getTargets() {
+ public List<Target> getTargets() {
return this.targets;
}
@@ -139,7 +142,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
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 + Objects.hashCode(targets);
return result;
}
@@ -176,9 +179,9 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
}
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<>();
+ for (Target t : targets) {
+ grp.targets.add((Target) t.clone());
}
}
@@ -213,9 +216,9 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
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 +264,9 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
}
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 +283,8 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
* 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 (Target t : targets) {
+ if (simpleName.equals(t.getNamedColumn().getSimpleName()) || simpleName.equals(t.getAlias())) {
return true;
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
----------------------------------------------------------------------
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 8b843a9..4584140 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.expr.EvalNode;
import org.apache.tajo.plan.util.PlannerUtil;
import org.apache.tajo.util.TUtil;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
public class JoinNode extends BinaryNode implements Projectable, Cloneable {
@Expose private JoinSpec joinSpec = new JoinSpec();
- @Expose private Target[] targets;
+ @Expose private List<Target> targets = null;
public JoinNode(int pid) {
super(pid, NodeType.JOIN);
@@ -79,12 +81,12 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
}
@Override
- public Target[] getTargets() {
+ public List<Target> getTargets() {
return this.targets;
}
@Override
- public void setTargets(Target[] targets) {
+ public void setTargets(List<Target> targets) {
this.targets = targets;
this.setOutSchema(PlannerUtil.targetToSchema(targets));
}
@@ -119,7 +121,7 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
final int prime = 31;
int result = 1;
result = prime * result + joinSpec.hashCode();
- result = prime * result + Arrays.hashCode(targets);
+ result = prime * result + Objects.hashCode(targets);
return result;
}
@@ -140,9 +142,9 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
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<>();
+ for (Target t : targets) {
+ join.targets.add((Target) t.clone());
}
}
return join;
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PartitionedTableScanNode.java
----------------------------------------------------------------------
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 a4bb94c..fdad342 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.Target;
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;
@@ -72,44 +74,44 @@ public class PartitionedTableScanNode extends ScanNode {
return Objects.hashCode(this.tableDesc, this.qual, this.targets);
}
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof PartitionedTableScanNode) {
- PartitionedTableScanNode other = (PartitionedTableScanNode) 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.inputPaths, other.inputPaths);
-
- return eq;
- }
-
- return false;
- }
-
- @Override
- public Object clone() throws CloneNotSupportedException {
- PartitionedTableScanNode unionScan = (PartitionedTableScanNode) super.clone();
-
- unionScan.tableDesc = (TableDesc) this.tableDesc.clone();
-
- if (hasQual()) {
- unionScan.qual = (EvalNode) this.qual.clone();
- }
-
- if (hasTargets()) {
- unionScan.targets = new Target[targets.length];
- for (int i = 0; i < targets.length; i++) {
- unionScan.targets[i] = (Target) targets[i].clone();
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof PartitionedTableScanNode) {
+ PartitionedTableScanNode other = (PartitionedTableScanNode) 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.inputPaths, other.inputPaths);
+
+ return eq;
+ }
+
+ return false;
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ PartitionedTableScanNode unionScan = (PartitionedTableScanNode) super.clone();
+
+ unionScan.tableDesc = (TableDesc) this.tableDesc.clone();
+
+ if (hasQual()) {
+ unionScan.qual = (EvalNode) this.qual.clone();
+ }
+
+ if (hasTargets()) {
+ unionScan.targets = new ArrayList<>();
+ for (Target t : targets) {
+ unionScan.targets.add((Target) t.clone());
}
- }
+ }
unionScan.inputPaths = inputPaths;
return unionScan;
- }
+ }
@Override
public void preOrder(LogicalNodeVisitor visitor) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/a2a5c14e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/Projectable.java
----------------------------------------------------------------------
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 68d1861..858a585 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 @@ package org.apache.tajo.plan.logical;
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<Target> targets);
/**
* Get a list of targets
*
* @return The array of targets
*/
- Target [] getTargets();
+ List<Target> getTargets();
/**
* Get an input schema