http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java index 0e1b501..4fe150b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java +++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java @@ -38,6 +38,7 @@ import org.apache.tajo.engine.planner.global.DataChannel; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.GlobalPlanner; import org.apache.tajo.engine.planner.global.MasterPlan; +import org.apache.tajo.engine.planner.global.rewriter.rules.GlobalPlanRewriteUtil; import org.apache.tajo.engine.utils.TupleUtil; import org.apache.tajo.exception.InternalException; import org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.MultipleAggregationStage; @@ -107,7 +108,7 @@ public class Repartitioner { fragments[i] = new FileFragment(scans[i].getCanonicalName(), tablePath, 0, 0, new String[]{UNKNOWN_HOST}); } else { try { - stats[i] = GlobalPlanner.computeDescendentVolume(scans[i]); + stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]); } catch (PlanningException e) { throw new IOException(e); } @@ -188,37 +189,7 @@ public class Repartitioner { } // Assigning either fragments or fetch urls to query units - boolean isAllBroadcastTable = true; - for (int i = 0; i < scans.length; i++) { - if (!execBlock.isBroadcastTable(scans[i].getCanonicalName())) { - isAllBroadcastTable = false; - break; - } - } - - - if (isAllBroadcastTable) { // if all relations of this EB are broadcasted - // set largest table to normal mode - long maxStats = Long.MIN_VALUE; - int maxStatsScanIdx = -1; - for (int i = 0; i < scans.length; i++) { - // finding largest table. - // If stats == 0, can't be base table. - if (stats[i] > 0 && stats[i] > maxStats) { - maxStats = stats[i]; - maxStatsScanIdx = i; - } - } - if (maxStatsScanIdx == -1) { - maxStatsScanIdx = 0; - } - int baseScanIdx = maxStatsScanIdx; - scans[baseScanIdx].setBroadcastTable(false); - execBlock.removeBroadcastTable(scans[baseScanIdx].getCanonicalName()); - LOG.info(String.format("[Distributed Join Strategy] : Broadcast Join with all tables, base_table=%s, base_volume=%d", - scans[baseScanIdx].getCanonicalName(), stats[baseScanIdx])); - scheduleLeafTasksWithBroadcastTable(schedulerContext, stage, baseScanIdx, fragments); - } else if (!execBlock.getBroadcastTables().isEmpty()) { // If some relations of this EB are broadcasted + if (execBlock.hasBroadcastRelation()) { // If some relations of this EB are broadcasted boolean hasNonLeafNode = false; List<Integer> largeScanIndexList = new ArrayList<Integer>(); List<Integer> broadcastIndexList = new ArrayList<Integer>(); @@ -235,7 +206,7 @@ public class Repartitioner { nonLeafScanNamesBuilder.append(namePrefix).append(scans[i].getCanonicalName()); namePrefix = ","; } - if (execBlock.isBroadcastTable(scans[i].getCanonicalName())) { + if (execBlock.isBroadcastRelation(scans[i])) { broadcastIndexList.add(i); } else { // finding largest table. @@ -269,31 +240,31 @@ public class Repartitioner { } //select intermediate scan and stats - ScanNode[] intermediateScans = new ScanNode[largeScanIndexList.size()]; long[] intermediateScanStats = new long[largeScanIndexList.size()]; Fragment[] intermediateFragments = new Fragment[largeScanIndexList.size()]; int index = 0; for (Integer eachIdx : largeScanIndexList) { - intermediateScans[index] = scans[eachIdx]; intermediateScanStats[index] = stats[eachIdx]; intermediateFragments[index++] = fragments[eachIdx]; } Fragment[] broadcastFragments = new Fragment[broadcastIndexList.size()]; ScanNode[] broadcastScans = new ScanNode[broadcastIndexList.size()]; + long[] broadcastStats = new long[broadcastIndexList.size()]; index = 0; for (Integer eachIdx : broadcastIndexList) { scans[eachIdx].setBroadcastTable(true); broadcastScans[index] = scans[eachIdx]; + broadcastStats[index] = stats[eachIdx]; broadcastFragments[index] = fragments[eachIdx]; index++; } LOG.info(String.format("[Distributed Join Strategy] : Broadcast Join, join_node=%s", nonLeafScanNames)); scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage, - intermediateScans, intermediateScanStats, intermediateFragments, broadcastScans, broadcastFragments); + intermediateScanStats, intermediateFragments, broadcastScans, broadcastStats, broadcastFragments); } } else { LOG.info("[Distributed Join Strategy] : Symmetric Repartition Join"); - scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage, scans, stats, fragments, null, null); + scheduleSymmetricRepartitionJoin(masterContext, schedulerContext, stage, stats, fragments, null, null, null); } } @@ -302,7 +273,6 @@ public class Repartitioner { * @param masterContext * @param schedulerContext * @param stage - * @param scans * @param stats * @param fragments * @throws IOException @@ -310,10 +280,10 @@ public class Repartitioner { private static void scheduleSymmetricRepartitionJoin(QueryMasterTask.QueryMasterTaskContext masterContext, TaskSchedulerContext schedulerContext, Stage stage, - ScanNode[] scans, long[] stats, Fragment[] fragments, ScanNode[] broadcastScans, + long[] broadcastStats, Fragment[] broadcastFragments) throws IOException { MasterPlan masterPlan = stage.getMasterPlan(); ExecutionBlock execBlock = stage.getBlock(); @@ -375,18 +345,20 @@ public class Repartitioner { // hashEntries can be zero if there are no input data. // In the case, it will cause the zero divided exception. // it avoids this problem. + long leftStats = stats[0]; + long rightStats = stats.length == 2 ? stats[1] : broadcastStats[0]; int[] avgSize = new int[2]; - avgSize[0] = hashEntries.size() == 0 ? 0 : (int) (stats[0] / hashEntries.size()); - avgSize[1] = hashEntries.size() == 0 ? 0 : (int) (stats[1] / hashEntries.size()); + avgSize[0] = hashEntries.size() == 0 ? 0 : (int) (leftStats / hashEntries.size()); + avgSize[1] = hashEntries.size() == 0 ? 0 : (int) (stats.length == 2 ? (rightStats / hashEntries.size()) : rightStats); int bothFetchSize = avgSize[0] + avgSize[1]; // Getting the desire number of join tasks according to the volumn // of a larger table - int largerIdx = stats[0] >= stats[1] ? 0 : 1; + long largerStat = leftStats >= rightStats ? leftStats : rightStats; int desireJoinTaskVolumn = stage.getMasterPlan().getContext().getInt(SessionVars.JOIN_TASK_INPUT_SIZE); // calculate the number of tasks according to the data size - int mb = (int) Math.ceil((double) stats[largerIdx] / 1048576); + int mb = (int) Math.ceil((double) largerStat / 1048576); LOG.info("Larger intermediate data is approximately " + mb + " MB"); // determine the number of task per 64MB int maxTaskNum = (int) Math.ceil((double) mb / desireJoinTaskVolumn); @@ -398,7 +370,9 @@ public class Repartitioner { LOG.info("The determined number of join tasks is " + joinTaskNum); List<Fragment> rightFragments = new ArrayList<Fragment>(); - rightFragments.add(fragments[1]); + if (fragments.length == 2) { + rightFragments.add(fragments[1]); + } if (broadcastFragments != null) { //In this phase a ScanNode has a single fragment.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java index 160bfaa..5a0fc38 100644 --- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java +++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java @@ -712,7 +712,7 @@ public class Stage implements EventHandler<StageEvent> { */ private void finalizeStats() { TableStats[] statsArray; - if (block.hasUnion()) { + if (block.isUnionOnly()) { statsArray = computeStatFromUnionBlock(this); } else { statsArray = computeStatFromTasks(); @@ -784,7 +784,7 @@ public class Stage implements EventHandler<StageEvent> { try { // Union operator does not require actual query processing. It is performed logically. - if (execBlock.hasUnion()) { + if (execBlock.isUnionOnly()) { // Though union operator does not be processed at all, but it should handle the completion event. stage.complete(); state = StageState.SUCCEEDED; @@ -883,7 +883,7 @@ public class Stage implements EventHandler<StageEvent> { } // We assume this execution block the first stage of join if two or more tables are included in this block, - if (parent != null && parent.getScanNodes().length >= 2) { + if (parent != null && (parent.getNonBroadcastRelNum()) >= 2) { List<ExecutionBlock> childs = masterPlan.getChilds(parent); // for outer @@ -990,6 +990,7 @@ public class Stage implements EventHandler<StageEvent> { MasterPlan masterPlan = stage.getMasterPlan(); ExecutionBlock execBlock = stage.getBlock(); if (stage.getMasterPlan().isLeaf(execBlock.getId()) && execBlock.getScanNodes().length == 1) { // Case 1: Just Scan + // Some execution blocks can have broadcast table even though they don't have any join nodes scheduleFragmentsForLeafQuery(stage); } else if (execBlock.getScanNodes().length > 1) { // Case 2: Join Repartitioner.scheduleFragmentsForJoinQuery(stage.schedulerContext, stage); http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java index 4ca9b3e..9b7db2d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java +++ b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java @@ -34,23 +34,30 @@ public class TestTPCH extends QueryTestCaseBase { } @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest public void testQ1OrderBy() throws Exception { - ResultSet res = executeQuery(); - assertResultSet(res); - cleanupQuery(res); + runSimpleTests(); } @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest public void testQ2FourJoins() throws Exception { - ResultSet res = executeQuery(); - assertResultSet(res); - cleanupQuery(res); + runSimpleTests(); } @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest public void testTPCH14Expr() throws Exception { - ResultSet res = executeQuery(); - assertResultSet(res); - cleanupQuery(res); + runSimpleTests(); + } + + @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest + public void testTPCHQ5() throws Exception { + runSimpleTests(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java index 4f90386..3055362 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java @@ -835,7 +835,7 @@ public class TestGroupByQuery extends QueryTestCaseBase { cleanupQuery(res); } - // TODO: this test cannot be executed due to the bug of logical planner + // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588) // @Test public final void testPythonUdafWithHaving() throws Exception { ResultSet res = executeQuery(); @@ -850,7 +850,7 @@ public class TestGroupByQuery extends QueryTestCaseBase { cleanupQuery(res); } - // TODO: this test cannot be executed due to the bug of logical planner + // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588) // @Test public final void testComplexTargetWithPythonUdaf() throws Exception { ResultSet res = executeQuery(); @@ -858,7 +858,7 @@ public class TestGroupByQuery extends QueryTestCaseBase { cleanupQuery(res); } - // TODO: this test cannot be executed due to the bug of logical planner + // TODO: this test cannot be executed due to the bug of logical planner (TAJO-1588) // @Test public final void testDistinctPythonUdafWithUnion1() throws Exception { ResultSet res = executeQuery(); http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java index a8e2a3b..2bcb5d9 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestInnerJoinWithSubQuery.java @@ -122,4 +122,11 @@ public class TestInnerJoinWithSubQuery extends TestJoinQuery { public final void testBroadcastSubquery2() throws Exception { runSimpleTests(); } + + @Test + @Option(withExplain = true, withExplainGlobal = true, parameterized = true) + @SimpleTest() + public final void testThetaJoinKeyPairs() throws Exception { + runSimpleTests(); + } } http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java index 077b7d2..d646202 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestOuterJoinQuery.java @@ -349,7 +349,7 @@ public class TestOuterJoinQuery extends TestJoinQuery { } // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553 -// @Test + @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest(queries = { @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" + @@ -364,7 +364,7 @@ public class TestOuterJoinQuery extends TestJoinQuery { } // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553 -// @Test + @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest(queries = { @QuerySpec("select t1.id, t1.name, t3.id, t4.id\n" + @@ -383,7 +383,7 @@ public class TestOuterJoinQuery extends TestJoinQuery { } // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553 -// @Test + @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest(queries = { @QuerySpec("select t1.id, t1.name, t2.id, t3.id\n" + @@ -398,7 +398,7 @@ public class TestOuterJoinQuery extends TestJoinQuery { } // TODO: this test is disabled due to a bug in broadcast join. It will be enabled after TAJO-1553 -// @Test + @Test @Option(withExplain = true, withExplainGlobal = true, parameterized = true) @SimpleTest(queries = { @QuerySpec("select t1.id, t1.name, t3.id, t4.id\n" + http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java index fa77fda..24b525d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java @@ -370,4 +370,11 @@ public class TestSortQuery extends QueryTestCaseBase { assertResultSet(res); cleanupQuery(res); } + + @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest() + public final void testSubQuerySortAfterGroupMultiBlocks() throws Exception { + runSimpleTests(); + } } http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java index 03a80d1..03c9c24 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java @@ -512,4 +512,17 @@ public class TestUnionQuery extends QueryTestCaseBase { res.close(); } + @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest + public void testComplexUnion1() throws Exception { + runSimpleTests(); + } + + @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest + public void testComplexUnion2() throws Exception { + runSimpleTests(); + } } http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java index 0a473b5..c82637d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java +++ b/tajo-core/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java @@ -110,7 +110,7 @@ public class TestExecutionBlockCursor { optimizer.optimize(logicalPlan); QueryContext queryContext = new QueryContext(conf); MasterPlan plan = new MasterPlan(LocalTajoTestingUtility.newQueryId(), queryContext, logicalPlan); - planner.build(plan); + planner.build(queryContext, plan); ExecutionBlockCursor cursor = new ExecutionBlockCursor(plan); http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java deleted file mode 100644 index 8591f88..0000000 --- a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java +++ /dev/null @@ -1,347 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.tajo.master; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.tajo.LocalTajoTestingUtility; -import org.apache.tajo.TajoTestingCluster; -import org.apache.tajo.algebra.Expr; -import org.apache.tajo.benchmark.TPCH; -import org.apache.tajo.catalog.*; -import org.apache.tajo.catalog.partition.PartitionMethodDesc; -import org.apache.tajo.catalog.proto.CatalogProtos; -import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.engine.function.FunctionLoader; -import org.apache.tajo.engine.parser.SQLAnalyzer; -import org.apache.tajo.engine.planner.global.DataChannel; -import org.apache.tajo.engine.planner.global.ExecutionBlock; -import org.apache.tajo.engine.planner.global.GlobalPlanner; -import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.engine.query.QueryContext; -import org.apache.tajo.plan.*; -import org.apache.tajo.plan.expr.BinaryEval; -import org.apache.tajo.plan.expr.EvalType; -import org.apache.tajo.plan.expr.FieldEval; -import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.util.CommonTestingUtil; -import org.apache.tajo.util.FileUtil; -import org.apache.tajo.util.TUtil; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME; -import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class TestGlobalPlanner { - private static Log LOG = LogFactory.getLog(TestGlobalPlanner.class); - - private static TajoTestingCluster util; - private static CatalogService catalog; - private static SQLAnalyzer sqlAnalyzer; - private static LogicalPlanner planner; - private static LogicalOptimizer optimizer; - private static TPCH tpch; - private static GlobalPlanner globalPlanner; - - @BeforeClass - public static void setUp() throws Exception { - util = new TajoTestingCluster(); - util.startCatalogCluster(); - catalog = util.getMiniCatalogCluster().getCatalog(); - for (FunctionDesc funcDesc : FunctionLoader.findLegacyFunctions()) { - catalog.createFunction(funcDesc); - } - catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse"); - catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME); - - // TPC-H Schema for Complex Queries - String [] tables = { - "part", "supplier", "partsupp", "nation", "region", "lineitem", "orders", "customer", "customer_parts" - }; - int [] volumes = { - 100, 200, 50, 5, 5, 800, 300, 100, 707 - }; - tpch = new TPCH(); - tpch.loadSchemas(); - tpch.loadOutSchema(); - for (int i = 0; i < tables.length; i++) { - TableMeta m = CatalogUtil.newTableMeta("CSV"); - TableStats stats = new TableStats(); - stats.setNumBytes(volumes[i]); - TableDesc d = CatalogUtil.newTableDesc( - CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, tables[i]), tpch.getSchema(tables[i]), m, - CommonTestingUtil.getTestDir()); - d.setStats(stats); - - if (tables[i].equals(TPCH.CUSTOMER_PARTS)) { - Schema expressionSchema = new Schema(); - expressionSchema.addColumn("c_nationkey", TajoDataTypes.Type.INT4); - PartitionMethodDesc partitionMethodDesc = new PartitionMethodDesc( - DEFAULT_DATABASE_NAME, - tables[i], - CatalogProtos.PartitionType.COLUMN, - "c_nationkey", - expressionSchema); - - d.setPartitionMethod(partitionMethodDesc); - } - catalog.createTable(d); - } - - sqlAnalyzer = new SQLAnalyzer(); - planner = new LogicalPlanner(catalog); - optimizer = new LogicalOptimizer(util.getConfiguration()); - globalPlanner = new GlobalPlanner(util.getConfiguration(), catalog); - } - - @AfterClass - public static void tearDown() { - util.shutdownCatalogCluster(); - } - - private MasterPlan buildPlan(String sql) throws PlanningException, IOException { - Expr expr = sqlAnalyzer.parse(sql); - QueryContext context = LocalTajoTestingUtility.createDummyContext(util.getConfiguration()); - LogicalPlan plan = planner.createPlan(context, expr); - optimizer.optimize(context, plan); - MasterPlan masterPlan = new MasterPlan(LocalTajoTestingUtility.newQueryId(), context, plan); - globalPlanner.build(masterPlan); - return masterPlan; - } - - @Test - public void testSelectDistinct() throws Exception { - buildPlan("select distinct l_orderkey from lineitem"); - } - - @Test - public void testSortAfterGroupBy() throws Exception { - buildPlan("select max(l_quantity) as max_quantity, l_orderkey from lineitem group by l_orderkey order by max_quantity"); - } - - @Test - public void testSortLimit() throws Exception { - buildPlan("select max(l_quantity) as max_quantity, l_orderkey from lineitem group by l_orderkey order by max_quantity limit 3"); - } - - @Test - public void testJoin() throws Exception { - buildPlan("select n_name, r_name, n_regionkey, r_regionkey from nation, region"); - } - - @Test - public void testThetaJoinKeyPairs() throws Exception { - StringBuilder sb = new StringBuilder(); - sb.append("select n_nationkey, n_name, n_regionkey, t.cnt"); - sb.append(" from nation n"); - sb.append(" join"); - sb.append(" ("); - sb.append(" select r_regionkey, count(*) as cnt"); - sb.append(" from nation n"); - sb.append(" join region r on (n.n_regionkey = r.r_regionkey)"); - sb.append(" group by r_regionkey"); - sb.append(" ) t on (n.n_regionkey = t.r_regionkey)"); - sb.append(" and n.n_nationkey > t.cnt "); - sb.append(" order by n_nationkey"); - - MasterPlan plan = buildPlan(sb.toString()); - ExecutionBlock root = plan.getRoot(); - - Map<BinaryEval, Boolean> evalMap = TUtil.newHashMap(); - BinaryEval eval1 = new BinaryEval(EvalType.EQUAL - , new FieldEval(new Column("default.n.n_regionkey", TajoDataTypes.Type.INT4)) - , new FieldEval(new Column("default.t.r_regionkey", TajoDataTypes.Type.INT4)) - ); - evalMap.put(eval1, Boolean.FALSE); - - BinaryEval eval2 = new BinaryEval(EvalType.EQUAL - , new FieldEval(new Column("default.n.n_nationkey", TajoDataTypes.Type.INT4)) - , new FieldEval(new Column("default.t.cnt", TajoDataTypes.Type.INT4)) - ); - evalMap.put(eval2, Boolean.FALSE); - - visitChildExecutionBLock(plan, root, evalMap); - - // Find required shuffleKey. - assertTrue(evalMap.get(eval1).booleanValue()); - - // Find that ShuffleKeys only includes equi-join conditions - assertFalse(evalMap.get(eval2).booleanValue()); - } - - private void visitChildExecutionBLock(MasterPlan plan, ExecutionBlock parentBlock, - Map<BinaryEval, Boolean> qualMap) throws Exception { - boolean isExistLeftField, isExistRightField; - - for (Map.Entry<BinaryEval, Boolean> entry : qualMap.entrySet()) { - FieldEval leftField = (FieldEval)entry.getKey().getLeftExpr(); - FieldEval rightField = (FieldEval)entry.getKey().getRightExpr(); - - for (ExecutionBlock block : plan.getChilds(parentBlock)) { - isExistLeftField = false; - isExistRightField = false; - - if (plan.getIncomingChannels(block.getId()) != null) { - for (DataChannel channel :plan.getIncomingChannels(block.getId())) { - if (channel.getShuffleKeys() != null) { - for (Column column : channel.getShuffleKeys()) { - if (column.getQualifiedName().equals(leftField.getColumnRef().getQualifiedName())) { - isExistLeftField = true; - } else if (column.getQualifiedName(). - equals(rightField.getColumnRef().getQualifiedName())) { - isExistRightField = true; - } - } - } - } - - if(isExistLeftField && isExistRightField) { - qualMap.put(entry.getKey(), Boolean.TRUE); - } - } - - visitChildExecutionBLock(plan, block, qualMap); - } - } - } - - @Test - public void testUnion() throws IOException, PlanningException { - buildPlan("select o_custkey as num from orders union select c_custkey as num from customer union select p_partkey as num from part"); - } - - @Test - public void testSubQuery() throws IOException, PlanningException { - buildPlan("select l.l_orderkey from (select * from lineitem) l"); - } - - @Test - public void testSubQueryJoin() throws IOException, PlanningException { - buildPlan("select l.l_orderkey from (select * from lineitem) l join (select * from orders) o on l.l_orderkey = o.o_orderkey"); - } - - @Test - public void testSubQueryGroupBy() throws IOException, PlanningException { - buildPlan("select sum(l_extendedprice*l_discount) as revenue from (select * from lineitem) as l"); - } - - @Test - public void testSubQueryGroupBy2() throws IOException, PlanningException { - buildPlan("select l_orderkey, sum(l_extendedprice*l_discount) as revenue from (select * from lineitem) as l group by l_orderkey"); - } - - @Test - public void testSubQuerySortAfterGroup() throws IOException, PlanningException { - buildPlan("select l_orderkey, sum(l_extendedprice*l_discount) as revenue from (select * from lineitem) as l group by l_orderkey order by l_orderkey"); - } - - @Test - public void testSubQuerySortAfterGroupMultiBlocks() throws IOException, PlanningException { - buildPlan( - "select l_orderkey, revenue from (" + - "select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey" - +") l1" - - ); - } - - @Test - public void testSubQuerySortAfterGroupMultiBlocks2() throws IOException, PlanningException { - buildPlan( - "select l_orderkey, revenue from (" + - "select l_orderkey, revenue from (" + - "select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey" - +") l1" + - ") l2 order by l_orderkey" - - ); - } - - @Test - public void testComplexUnion1() throws Exception { - buildPlan(FileUtil.readTextFile(new File("src/test/resources/queries/default/complex_union_1.sql"))); - } - - @Test - public void testComplexUnion2() throws Exception { - buildPlan(FileUtil.readTextFile(new File("src/test/resources/queries/default/complex_union_2.sql"))); - } - - @Test - public void testUnionGroupBy1() throws Exception { - buildPlan("select l_orderkey, sum(l_extendedprice*l_discount) as revenue from (" + - "select * from lineitem " + - "union " + - "select * from lineitem ) l group by l_orderkey"); - } - - @Test - public void testTPCH_Q5() throws Exception { - buildPlan(FileUtil.readTextFile(new File("benchmark/tpch/q5.sql"))); - } - - @Test - public void testCheckIfSimpleQuery() throws Exception { - MasterPlan plan = buildPlan("select * from customer"); - assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - //partition table - plan = buildPlan("select * from customer_parts"); - assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - plan = buildPlan("select * from customer where c_nationkey = 1"); - assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - // c_nationkey is partition column - plan = buildPlan("select * from customer_parts where c_nationkey = 1"); - assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - // same column order - plan = buildPlan("select c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment" + - " from customer"); - assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - plan = buildPlan("select c_custkey, c_name, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " + - " from customer_parts"); - assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - // different column order - plan = buildPlan("select c_name, c_custkey, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment" + - " from customer"); - assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - plan = buildPlan("select c_name, c_custkey, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " + - " from customer_parts"); - assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - - plan = buildPlan("insert into customer_parts " + - " select c_name, c_custkey, c_address, c_phone, c_acctbal, c_mktsegment, c_comment, c_nationkey " + - " from customer"); - assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan())); - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java b/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java index b1a27fa..eca7f6d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/querymaster/TestKillQuery.java @@ -105,7 +105,7 @@ public class TestKillQuery { QueryContext queryContext = new QueryContext(conf); MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan); GlobalPlanner globalPlanner = new GlobalPlanner(conf, catalog); - globalPlanner.build(masterPlan); + globalPlanner.build(queryContext, masterPlan); CountDownLatch barrier = new CountDownLatch(1); MockAsyncDispatch dispatch = new MockAsyncDispatch(barrier, StageEventType.SQ_INIT); @@ -169,7 +169,7 @@ public class TestKillQuery { QueryContext queryContext = new QueryContext(conf); MasterPlan masterPlan = new MasterPlan(queryId, queryContext, plan); GlobalPlanner globalPlanner = new GlobalPlanner(conf, catalog); - globalPlanner.build(masterPlan); + globalPlanner.build(queryContext, masterPlan); CountDownLatch barrier = new CountDownLatch(1); MockAsyncDispatch dispatch = new MockAsyncDispatch(barrier, TajoProtos.QueryState.QUERY_RUNNING); http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql b/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql index 5cf3eb7..36c53cd 100644 --- a/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql +++ b/tajo-core/src/test/resources/queries/TestInnerJoinQuery/testBroadcastTwoPartJoin.sql @@ -16,4 +16,4 @@ where order by l_orderkey, p_name, - n_name \ No newline at end of file + n_name http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql b/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql new file mode 100644 index 0000000..802e2b0 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestInnerJoinWithSubQuery/testThetaJoinKeyPairs.sql @@ -0,0 +1,20 @@ +select + n_nationkey, n_name, n_regionkey, t.cnt +from + nation n + join + ( + select + r_regionkey, count(*) as cnt + from + nation n + join + region r + on (n.n_regionkey = r.r_regionkey) + group by + r_regionkey + ) t +on + (n.n_regionkey = t.r_regionkey) and n.n_nationkey > t.cnt +order by + n_nationkey \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql b/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql new file mode 100644 index 0000000..3e7eaab --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestSortQuery/testSubQuerySortAfterGroupMultiBlocks.sql @@ -0,0 +1,5 @@ +select l_orderkey, revenue from ( + select l_orderkey, revenue from ( + select l_orderkey, sum(l_extendedprice*l_discount) as revenue from lineitem group by l_orderkey + ) l1 +) l2 order by l_orderkey \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql b/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql new file mode 100644 index 0000000..e7d3d56 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestTPCH/testTPCHQ5.sql @@ -0,0 +1,24 @@ +select + n_name, + sum(l_extendedprice * (1 - l_discount)) as revenue +from + customer, + orders, + lineitem, + supplier, + nation, + region +where + c_custkey = o_custkey and + l_orderkey = o_orderkey and + l_suppkey = s_suppkey and + c_nationkey = s_nationkey and + s_nationkey = n_nationkey and + n_regionkey = r_regionkey and + r_name = 'ASIA' and + o_orderdate >= '1994-01-01' and + o_orderdate < '1995-01-01' +group by + n_name +order by + revenue desc \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql new file mode 100644 index 0000000..0ba2909 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion1.sql @@ -0,0 +1,27 @@ +SELECT + l_orderkey, + l_partkey, + query +FROM + ( + SELECT + l_orderkey, + l_partkey, + 'abc' as query + FROM + lineitem + WHERE + l_orderkey = 1 + + UNION ALL + + SELECT + l_orderkey, + l_partkey, + 'bbc' as query + FROM + lineitem + WHERE + l_orderkey = 1 +) result + http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql new file mode 100644 index 0000000..d54ed27 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestUnionQuery/testComplexUnion2.sql @@ -0,0 +1,35 @@ +SELECT * +FROM +( + SELECT + l_orderkey, + l_partkey, + url + FROM + ( + SELECT + l_orderkey, + l_partkey, + CASE + WHEN + l_partkey IS NOT NULL THEN '' + WHEN l_orderkey = 1 THEN '1' + ELSE + '2' + END AS url + FROM + lineitem + ) res1 + JOIN + ( + SELECT + * + FROM + part + ) res2 + ON l_partkey = p_partkey +) result + + + + http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/default/complex_union_1.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/default/complex_union_1.sql b/tajo-core/src/test/resources/queries/default/complex_union_1.sql deleted file mode 100644 index 9020ad7..0000000 --- a/tajo-core/src/test/resources/queries/default/complex_union_1.sql +++ /dev/null @@ -1,29 +0,0 @@ -create table xdr_url as - -SELECT - l_orderkey, - l_partkey, - query -FROM - ( - SELECT - l_orderkey, - l_partkey, - 'abc' as query - FROM - lineitem - WHERE - l_orderkey = 1 - - UNION ALL - - SELECT - l_orderkey, - l_partkey, - 'bbc' as query - FROM - lineitem - WHERE - l_orderkey = 1 -) result - http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/queries/default/complex_union_2.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/default/complex_union_2.sql b/tajo-core/src/test/resources/queries/default/complex_union_2.sql deleted file mode 100644 index d54ed27..0000000 --- a/tajo-core/src/test/resources/queries/default/complex_union_2.sql +++ /dev/null @@ -1,35 +0,0 @@ -SELECT * -FROM -( - SELECT - l_orderkey, - l_partkey, - url - FROM - ( - SELECT - l_orderkey, - l_partkey, - CASE - WHEN - l_partkey IS NOT NULL THEN '' - WHEN l_orderkey = 1 THEN '1' - ELSE - '2' - END AS url - FROM - lineitem - ) res1 - JOIN - ( - SELECT - * - FROM - part - ) res2 - ON l_partkey = p_partkey -) result - - - - http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan index a308b15..fa8c71e 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Hash.plan @@ -45,124 +45,91 @@ SORT(6) explain ------------------------------- ------------------------------------------------------------------------------- -Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009) +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011) ------------------------------------------------------------------------------- -|-eb_0000000000000_0000_000009 - |-eb_0000000000000_0000_000008 - |-eb_0000000000000_0000_000007 - |-eb_0000000000000_0000_000006 - |-eb_0000000000000_0000_000003 +|-eb_0000000000000_0000_000011 + |-eb_0000000000000_0000_000010 + |-eb_0000000000000_0000_000009 ------------------------------------------------------------------------------- Order of Execution ------------------------------------------------------------------------------- -1: eb_0000000000000_0000_000003 -2: eb_0000000000000_0000_000006 -3: eb_0000000000000_0000_000007 -4: eb_0000000000000_0000_000008 -5: eb_0000000000000_0000_000009 +1: eb_0000000000000_0000_000009 +2: eb_0000000000000_0000_000010 +3: eb_0000000000000_0000_000011 ------------------------------------------------------------------------------- ======================================================= -Block Id: eb_0000000000000_0000_000003 [LEAF] +Block Id: eb_0000000000000_0000_000009 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32) +[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) [Enforcers] 0: type=Broadcast, tables=default.orders - 1: type=Broadcast, tables=default.lineitem - 2: type=Broadcast, tables=default.part + 1: type=Broadcast, tables=default.part + 2: type=Broadcast, tables=default.lineitem + 3: type=Broadcast, tables=default.customer -JOIN(14)(INNER) - => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4) - => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT) - => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)} - SCAN(2) on default.part - => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4) - => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)} - => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)} - JOIN(13)(INNER) - => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4) - => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4) - => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)} - => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} - SCAN(0) on default.lineitem - => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4) - => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)} - => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)} - SCAN(1) on default.orders - => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4) - => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} - => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)} - -======================================================= -Block Id: eb_0000000000000_0000_000006 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.nation - 1: type=Broadcast, tables=default.customer - -JOIN(15)(INNER) - => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4) - => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT) - => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} - SCAN(3) on default.customer - => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4) - => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)} - => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)} - SCAN(4) on default.nation - => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4) - => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} - => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)} - -======================================================= -Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE] -======================================================= - -[Incoming] -[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32) -[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32) - -[Outgoing] -[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) - -SORT(20) +SORT(26) => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc) JOIN(16)(INNER) => Join Cond: default.orders.o_custkey (INT4) = default.customer.c_custkey (INT4) => target list: default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT) => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} => in schema: {(5) default.customer.c_custkey (INT4), default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - SCAN(19) on eb_0000000000000_0000_000006 + JOIN(15)(INNER) + => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4) + => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT) => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - => in schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - SCAN(18) on eb_0000000000000_0000_000003 + => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} + SCAN(3) on default.customer + => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4) + => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)} + => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)} + SCAN(4) on default.nation + => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4) + => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} + => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)} + JOIN(14)(INNER) + => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4) + => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT) => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - => in schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} + => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)} + SCAN(2) on default.part + => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4) + => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)} + => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)} + JOIN(13)(INNER) + => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4) + => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4) + => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)} + => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} + SCAN(0) on default.lineitem + => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4) + => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)} + => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)} + SCAN(1) on default.orders + => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4) + => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} + => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)} ======================================================= -Block Id: eb_0000000000000_0000_000008 [ROOT] +Block Id: eb_0000000000000_0000_000010 [ROOT] ======================================================= [Incoming] -[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) +[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) [Enforcers] - 0: sorted input=eb_0000000000000_0000_000007 + 0: sorted input=eb_0000000000000_0000_000009 SORT(6) => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc) - SCAN(21) on eb_0000000000000_0000_000007 + SCAN(27) on eb_0000000000000_0000_000009 => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} => in schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} ======================================================= -Block Id: eb_0000000000000_0000_000009 [TERMINAL] +Block Id: eb_0000000000000_0000_000011 [TERMINAL] ======================================================= http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan index a308b15..fa8c71e 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testBroadcastTwoPartJoin.Sort.plan @@ -45,124 +45,91 @@ SORT(6) explain ------------------------------- ------------------------------------------------------------------------------- -Execution Block Graph (TERMINAL - eb_0000000000000_0000_000009) +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000011) ------------------------------------------------------------------------------- -|-eb_0000000000000_0000_000009 - |-eb_0000000000000_0000_000008 - |-eb_0000000000000_0000_000007 - |-eb_0000000000000_0000_000006 - |-eb_0000000000000_0000_000003 +|-eb_0000000000000_0000_000011 + |-eb_0000000000000_0000_000010 + |-eb_0000000000000_0000_000009 ------------------------------------------------------------------------------- Order of Execution ------------------------------------------------------------------------------- -1: eb_0000000000000_0000_000003 -2: eb_0000000000000_0000_000006 -3: eb_0000000000000_0000_000007 -4: eb_0000000000000_0000_000008 -5: eb_0000000000000_0000_000009 +1: eb_0000000000000_0000_000009 +2: eb_0000000000000_0000_000010 +3: eb_0000000000000_0000_000011 ------------------------------------------------------------------------------- ======================================================= -Block Id: eb_0000000000000_0000_000003 [LEAF] +Block Id: eb_0000000000000_0000_000009 [LEAF] ======================================================= [Outgoing] -[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32) +[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) [Enforcers] 0: type=Broadcast, tables=default.orders - 1: type=Broadcast, tables=default.lineitem - 2: type=Broadcast, tables=default.part + 1: type=Broadcast, tables=default.part + 2: type=Broadcast, tables=default.lineitem + 3: type=Broadcast, tables=default.customer -JOIN(14)(INNER) - => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4) - => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT) - => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)} - SCAN(2) on default.part - => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4) - => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)} - => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)} - JOIN(13)(INNER) - => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4) - => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4) - => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)} - => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} - SCAN(0) on default.lineitem - => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4) - => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)} - => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)} - SCAN(1) on default.orders - => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4) - => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} - => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)} - -======================================================= -Block Id: eb_0000000000000_0000_000006 [LEAF] -======================================================= - -[Outgoing] -[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32) - -[Enforcers] - 0: type=Broadcast, tables=default.nation - 1: type=Broadcast, tables=default.customer - -JOIN(15)(INNER) - => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4) - => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT) - => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} - SCAN(3) on default.customer - => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4) - => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)} - => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)} - SCAN(4) on default.nation - => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4) - => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} - => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)} - -======================================================= -Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE] -======================================================= - -[Incoming] -[q_0000000000000_0000] 3 => 7 (type=HASH_SHUFFLE, key=default.orders.o_custkey (INT4), num=32) -[q_0000000000000_0000] 6 => 7 (type=HASH_SHUFFLE, key=default.customer.c_custkey (INT4), num=32) - -[Outgoing] -[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) - -SORT(20) +SORT(26) => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc) JOIN(16)(INNER) => Join Cond: default.orders.o_custkey (INT4) = default.customer.c_custkey (INT4) => target list: default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT) => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} => in schema: {(5) default.customer.c_custkey (INT4), default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - SCAN(19) on eb_0000000000000_0000_000006 + JOIN(15)(INNER) + => Join Cond: default.customer.c_nationkey (INT4) = default.nation.n_nationkey (INT4) + => target list: default.customer.c_custkey (INT4), default.nation.n_name (TEXT) => out schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - => in schema: {(2) default.customer.c_custkey (INT4), default.nation.n_name (TEXT)} - SCAN(18) on eb_0000000000000_0000_000003 + => in schema: {(4) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} + SCAN(3) on default.customer + => target list: default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4) + => out schema: {(2) default.customer.c_custkey (INT4), default.customer.c_nationkey (INT4)} + => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)} + SCAN(4) on default.nation + => target list: default.nation.n_name (TEXT), default.nation.n_nationkey (INT4) + => out schema: {(2) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4)} + => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)} + JOIN(14)(INNER) + => Join Cond: default.lineitem.l_partkey (INT4) = default.part.p_partkey (INT4) + => target list: default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT) => out schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} - => in schema: {(3) default.lineitem.l_orderkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT)} + => in schema: {(5) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.part.p_name (TEXT), default.part.p_partkey (INT4)} + SCAN(2) on default.part + => target list: default.part.p_name (TEXT), default.part.p_partkey (INT4) + => out schema: {(2) default.part.p_name (TEXT), default.part.p_partkey (INT4)} + => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)} + JOIN(13)(INNER) + => Join Cond: default.lineitem.l_orderkey (INT4) = default.orders.o_orderkey (INT4) + => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4) + => out schema: {(3) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4)} + => in schema: {(4) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} + SCAN(0) on default.lineitem + => target list: default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4) + => out schema: {(2) default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4)} + => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)} + SCAN(1) on default.orders + => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4) + => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)} + => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)} ======================================================= -Block Id: eb_0000000000000_0000_000008 [ROOT] +Block Id: eb_0000000000000_0000_000010 [ROOT] ======================================================= [Incoming] -[q_0000000000000_0000] 7 => 8 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) +[q_0000000000000_0000] 9 => 10 (type=RANGE_SHUFFLE, key=default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT), num=32) [Enforcers] - 0: sorted input=eb_0000000000000_0000_000007 + 0: sorted input=eb_0000000000000_0000_000009 SORT(6) => Sort Keys: default.lineitem.l_orderkey (INT4) (asc),default.part.p_name (TEXT) (asc),default.nation.n_name (TEXT) (asc) - SCAN(21) on eb_0000000000000_0000_000007 + SCAN(27) on eb_0000000000000_0000_000009 => out schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} => in schema: {(3) default.lineitem.l_orderkey (INT4), default.nation.n_name (TEXT), default.part.p_name (TEXT)} ======================================================= -Block Id: eb_0000000000000_0000_000009 [TERMINAL] +Block Id: eb_0000000000000_0000_000011 [TERMINAL] ======================================================= http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan index 2210ad9..e5b8455 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Hash.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: default.n1.n_name (TEXT) = ?upper_1 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan index 2210ad9..e5b8455 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition1.Sort.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: default.n1.n_name (TEXT) = ?upper_1 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan index 51a0645..7c88933 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Hash.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: default.n1.n_name (TEXT) = name (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan index 51a0645..7c88933 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition2.Sort.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: default.n1.n_name (TEXT) = name (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan index 97fd030..f35d486 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Hash.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: ?lower_1 (TEXT) = ?lower_2 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan index 97fd030..f35d486 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition3.Sort.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: ?lower_1 (TEXT) = ?lower_2 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} => in schema: {(3) default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n2.n_name (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan index 41127e8..fb73ee5 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Hash.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: name1 (TEXT) = name2 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)} => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan index 41127e8..fb73ee5 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testComplexJoinCondition4.Sort.plan @@ -40,9 +40,8 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [Enforcers] 0: type=Broadcast, tables=default.n1 - 1: type=Broadcast, tables=default.n2 -SORT(8) +SORT(10) => Sort Keys: default.n1.n_nationkey (INT4) (asc) JOIN(6)(INNER) => Join Cond: name1 (TEXT) = name2 (TEXT) @@ -70,7 +69,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(3) => Sort Keys: default.n1.n_nationkey (INT4) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)} => in schema: {(3) default.n1.n_nationkey (INT4), name1 (TEXT), name2 (TEXT)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan index c11b4c8..0fb22b3 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Hash.plan @@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32) [Enforcers] - 0: type=Broadcast, tables=default.nation - 1: type=Broadcast, tables=default.region + 0: type=Broadcast, tables=default.region -SORT(8) +SORT(10) => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc) JOIN(6)(CROSS) => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4) @@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(2) => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan index c11b4c8..0fb22b3 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.1.Sort.plan @@ -38,10 +38,9 @@ Block Id: eb_0000000000000_0000_000003 [LEAF] [q_0000000000000_0000] 3 => 4 (type=RANGE_SHUFFLE, key=default.nation.n_name (TEXT), default.region.r_name (TEXT), num=32) [Enforcers] - 0: type=Broadcast, tables=default.nation - 1: type=Broadcast, tables=default.region + 0: type=Broadcast, tables=default.region -SORT(8) +SORT(10) => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc) JOIN(6)(CROSS) => target list: default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4) @@ -68,7 +67,7 @@ Block Id: eb_0000000000000_0000_000004 [ROOT] SORT(2) => Sort Keys: default.nation.n_name (TEXT) (asc),default.region.r_name (TEXT) (asc) - SCAN(9) on eb_0000000000000_0000_000003 + SCAN(11) on eb_0000000000000_0000_000003 => out schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} => in schema: {(4) default.nation.n_name (TEXT), default.nation.n_regionkey (INT4), default.region.r_name (TEXT), default.region.r_regionkey (INT4)} http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan index ed77747..453e12f 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Hash.plan @@ -32,7 +32,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT] [Enforcers] 0: type=Broadcast, tables=default.region - 1: type=Broadcast, tables=default.customer JOIN(5)(CROSS) => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4) http://git-wip-us.apache.org/repos/asf/tajo/blob/8fd9ae72/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan index ed77747..453e12f 100644 --- a/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan +++ b/tajo-core/src/test/resources/results/TestInnerJoinQuery/testCrossJoin.2.Sort.plan @@ -32,7 +32,6 @@ Block Id: eb_0000000000000_0000_000003 [ROOT] [Enforcers] 0: type=Broadcast, tables=default.region - 1: type=Broadcast, tables=default.customer JOIN(5)(CROSS) => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT), default.region.r_comment (TEXT), default.region.r_name (TEXT), default.region.r_regionkey (INT4)
