From 9b262df9e1987808067c7adcd583c44368f6c1ed Mon Sep 17 00:00:00 2001 From: Hyunsik Choi Date: Wed, 19 Aug 2015 23:49:23 +0900 Subject: [PATCH 1/2] TAJO-1787: Remove unused and legacy exceptions. --- .../apache/tajo/engine/eval/ExprTestBase.java | 1 - .../builder/DistinctGroupbyBuilder.java | 1 - .../rewriter/GlobalPlanRewriteRule.java | 1 - .../rewriter/rules/BroadcastJoinRule.java | 32 +++++----------- .../rewriter/rules/GlobalPlanRewriteUtil.java | 25 ++++++------ .../planner/physical/SortIntersectExec.java | 5 +-- .../engine/planner/physical/UnionExec.java | 5 +-- .../org/apache/tajo/master/GlobalEngine.java | 4 +- .../exec/ExplainPlanPreprocessorForTest.java | 1 - .../NonForwardQueryResultSystemScanner.java | 4 +- .../tajo/master/exec/QueryExecutor.java | 17 +++++---- .../tajo/querymaster/Repartitioner.java | 7 +--- .../plan/IllegalQueryStatusException.java | 38 ------------------- .../tajo/plan/InvalidQueryException.java | 35 ----------------- .../apache/tajo/plan/PlanningException.java | 30 --------------- .../apache/tajo/plan/expr/AlgebraicUtil.java | 7 +--- .../GreedyHeuristicJoinOrderAlgorithm.java | 3 -- .../plan/joinorder/JoinOrderAlgorithm.java | 6 --- .../tajo/plan/nameresolver/NameResolver.java | 4 -- .../rewrite/rules/FilterPushDownRule.java | 3 +- .../apache/tajo/plan/util/PlannerUtil.java | 6 +-- .../tajo/plan/verifier/VerifyException.java | 27 ------------- 22 files changed, 41 insertions(+), 221 deletions(-) delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/IllegalQueryStatusException.java delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/InvalidQueryException.java delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/PlanningException.java delete mode 100644 tajo-plan/src/main/java/org/apache/tajo/plan/verifier/VerifyException.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 f2b6477452..1705d2b6be 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 @@ -129,7 +129,6 @@ public TajoConf getConf() { * @param query a query for execution * @param condition this parameter means whether it is for success case or is not for failure case. * @return - * @throws PlanningException */ private static Target[] getRawTargets(QueryContext context, String query, boolean condition) throws TajoException, InvalidStatementException { 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 2c88fdb184..6fbecc1d85 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 @@ -36,7 +36,6 @@ import org.apache.tajo.plan.serder.PlanProto.DistinctGroupbyEnforcer.SortSpecArray; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.Target; import org.apache.tajo.plan.expr.AggregationFunctionCallEval; import org.apache.tajo.plan.expr.EvalNode; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java index 3a76c1210a..f681d2e7a4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/GlobalPlanRewriteRule.java @@ -21,7 +21,6 @@ import org.apache.tajo.OverridableConf; import org.apache.tajo.engine.planner.global.MasterPlan; import org.apache.tajo.exception.TajoException; -import org.apache.tajo.plan.PlanningException; /** * A rewrite rule for global plans diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java index 12c3e73a3f..12b7ce1bbd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java @@ -27,7 +27,6 @@ import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanRewriteRule; import org.apache.tajo.exception.TajoException; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; import org.apache.tajo.util.TUtil; @@ -179,11 +178,7 @@ private void visitLeafNode(ExecutionBlock current) { } } if (fullyBroadcastable && current.getScanNodes().length == 1) { - try { - updateScanOfParentAsBroadcastable(plan, current); - } catch (PlanningException e) { - // This case is when the current has two or more inputs via union, and simply ignored. - } + updateScanOfParentAsBroadcastable(plan, current); } } } @@ -199,12 +194,8 @@ private void visitNonLeafNode(ExecutionBlock current) { if (current.hasBroadcastRelation()) { // The current execution block and its every child are able to be merged. for (ExecutionBlock child : childs) { - try { - addUnionNodeIfNecessary(unionScanMap, plan, child, current); - mergeTwoPhaseJoin(plan, child, current); - } catch (PlanningException e) { - throw new RuntimeException(e); - } + addUnionNodeIfNecessary(unionScanMap, plan, child, current); + mergeTwoPhaseJoin(plan, child, current); } checkTotalSizeOfBroadcastableRelations(current); @@ -212,11 +203,7 @@ private void visitNonLeafNode(ExecutionBlock current) { // We assume that if every input of an execution block is broadcastable, // the output of the execution block is also broadcastable. if (!current.isPreservedRow() && isFullyBroadcastable(current)) { - try { - updateScanOfParentAsBroadcastable(plan, current); - } catch (PlanningException e) { - throw new RuntimeException(e); - } + updateScanOfParentAsBroadcastable(plan, current); } } } else { @@ -261,7 +248,7 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { } } - private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current) throws PlanningException { + private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current) { ExecutionBlock parent = plan.getParent(current); if (parent != null && !plan.isTerminal(parent)) { ScanNode scanForCurrent = GlobalPlanRewriteUtil.findScanForChildEb(current, parent); @@ -277,8 +264,7 @@ private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock c * @param parent parent block who has join nodes * @return */ - private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) - throws PlanningException { + private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) { ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(child, parent); parentFinder.set(scanForChild); @@ -301,8 +287,7 @@ private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, } private void addUnionNodeIfNecessary(Map unionScanMap, MasterPlan plan, - ExecutionBlock child, ExecutionBlock current) - throws PlanningException { + ExecutionBlock child, ExecutionBlock current) { if (unionScanMap != null) { List unionScans = TUtil.newList(); ExecutionBlockId representativeId = null; @@ -326,7 +311,8 @@ private void addUnionNodeIfNecessary(Map uni // left must not be null UnionNode unionNode = plan.getLogicalPlan().createNode(UnionNode.class); unionNode.setLeftChild(left); - unionNode.setRightChild(GlobalPlanner.buildInputExecutor(plan.getLogicalPlan(), plan.getChannel(unionScans.get(i), current.getId()))); + unionNode.setRightChild(GlobalPlanner.buildInputExecutor(plan.getLogicalPlan(), + plan.getChannel(unionScans.get(i), current.getId()))); unionNode.setInSchema(left.getOutSchema()); unionNode.setOutSchema(left.getOutSchema()); topUnion = unionNode; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java index cc98300b50..b67a5e94fa 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java @@ -21,7 +21,7 @@ import org.apache.tajo.engine.planner.global.DataChannel; import org.apache.tajo.engine.planner.global.ExecutionBlock; import org.apache.tajo.engine.planner.global.MasterPlan; -import org.apache.tajo.plan.PlanningException; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.logical.*; import java.util.List; @@ -71,10 +71,8 @@ public static ExecutionBlock mergeExecutionBlocks(MasterPlan plan, ExecutionBloc * @param newChild * @param originalChild * @param parent - * @throws PlanningException */ - public static void replaceChild(LogicalNode newChild, ScanNode originalChild, LogicalNode parent) - throws PlanningException { + public static void replaceChild(LogicalNode newChild, ScanNode originalChild, LogicalNode parent) { if (parent instanceof UnaryNode) { ((UnaryNode) parent).setChild(newChild); } else if (parent instanceof BinaryNode) { @@ -84,10 +82,10 @@ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, Lo } else if (binary.getRightChild().equals(originalChild)) { binary.setRightChild(newChild); } else { - throw new PlanningException(originalChild.getPID() + " is not a child of " + parent.getPID()); + throw new TajoInternalError(originalChild.getPID() + " is not a child of " + parent.getPID()); } } else { - throw new PlanningException(parent.getPID() + " seems to not have any children"); + throw new TajoInternalError(parent.getPID() + " seems to not have any children"); } } @@ -96,10 +94,9 @@ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, Lo * * @param child * @param parent - * @return - * @throws PlanningException + * @return ScanNode */ - public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) throws PlanningException { + public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) { ScanNode scanForChild = null; for (ScanNode scanNode : parent.getScanNodes()) { if (scanNode.getTableName().equals(child.getId().toString())) { @@ -108,7 +105,7 @@ public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock p } } if (scanForChild == null) { - throw new PlanningException("Cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); + throw new TajoInternalError("cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); } return scanForChild; } @@ -137,7 +134,7 @@ public static long getTableVolume(ScanNode scanNode) { /** * It calculates the total volume of all descendent relation nodes. */ - public static long computeDescendentVolume(LogicalNode node) throws PlanningException { + public static long computeDescendentVolume(LogicalNode node) { if (node instanceof RelationNode) { switch (node.getType()) { @@ -176,7 +173,7 @@ public static long computeDescendentVolume(LogicalNode node) throws PlanningExce return computeDescendentVolume(binaryNode.getLeftChild()) + computeDescendentVolume(binaryNode.getRightChild()); } - throw new PlanningException("Invalid State"); + throw new TajoInternalError("invalid state"); } public static class ParentFinder implements LogicalNodeVisitor { @@ -192,9 +189,9 @@ public void find(LogicalNode root) { this.visit(root); } - public LogicalNode getFound() throws PlanningException { + public LogicalNode getFound() { if (found == null) { - throw new PlanningException("Cannot find the parent of " + target.getPID()); + throw new TajoInternalError("cannot find the parent of " + target.getPID()); } return this.found; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortIntersectExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortIntersectExec.java index db77f85b28..1d38d455b7 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortIntersectExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortIntersectExec.java @@ -21,7 +21,7 @@ import org.apache.tajo.catalog.CatalogUtil; import org.apache.tajo.catalog.SchemaUtil; import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.plan.InvalidQueryException; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.storage.Tuple; import org.apache.tajo.worker.TaskAttemptContext; @@ -37,8 +37,7 @@ public SortIntersectExec(TaskAttemptContext context, PhysicalExec left, Physical TajoDataTypes.DataType[] leftTypes = SchemaUtil.toDataTypes(left.getSchema()); TajoDataTypes.DataType[] rightTypes = SchemaUtil.toDataTypes(right.getSchema()); if (!CatalogUtil.isMatchedFunction(Arrays.asList(leftTypes), Arrays.asList(rightTypes))) { - throw new InvalidQueryException( - "The both schemas are not compatible"); + throw new TajoInternalError("the both schemas are not compatible"); } comparator = new SetTupleComparator(left.getSchema(), right.getSchema()); this.isDistinct = isDistinct; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/UnionExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/UnionExec.java index 0383ae730c..9adca9a90d 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/UnionExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/UnionExec.java @@ -21,8 +21,8 @@ */ package org.apache.tajo.engine.planner.physical; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.worker.TaskAttemptContext; -import org.apache.tajo.plan.InvalidQueryException; import org.apache.tajo.storage.Tuple; import java.io.IOException; @@ -34,8 +34,7 @@ public class UnionExec extends BinaryPhysicalExec { public UnionExec(TaskAttemptContext context, PhysicalExec outer, PhysicalExec inner) { super(context, outer.getSchema(), inner.getSchema(), outer, inner); if (!outer.getSchema().equals(inner.getSchema())) { - throw new InvalidQueryException( - "The both schemas are not same"); + throw new TajoInternalError("the both schemas are not same"); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java index 11bbe33c34..b6dc65265a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java @@ -36,13 +36,12 @@ import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.parser.SQLAnalyzer; -import org.apache.tajo.exception.*; import org.apache.tajo.engine.query.QueryContext; +import org.apache.tajo.exception.*; import org.apache.tajo.master.TajoMaster.MasterContext; import org.apache.tajo.master.exec.DDLExecutor; import org.apache.tajo.master.exec.QueryExecutor; import org.apache.tajo.metrics.Master; -import org.apache.tajo.plan.IllegalQueryStatusException; import org.apache.tajo.plan.LogicalOptimizer; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.LogicalPlanner; @@ -58,7 +57,6 @@ import org.apache.tajo.storage.TablespaceManager; import org.apache.tajo.util.CommonTestingUtil; -import java.io.IOException; import java.sql.SQLException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; 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 b7b48ba356..0c83206cc8 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 @@ -23,7 +23,6 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.exception.TajoException; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.Target; import org.apache.tajo.plan.expr.AlgebraicUtil; import org.apache.tajo.plan.expr.EvalNode; diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java index b3482658a5..e1768184bd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java @@ -48,9 +48,7 @@ import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.master.TajoMaster.MasterContext; import org.apache.tajo.master.rm.NodeStatus; -import org.apache.tajo.plan.InvalidQueryException; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.expr.EvalNode; import org.apache.tajo.plan.logical.IndexScanNode; import org.apache.tajo.plan.logical.LogicalNode; @@ -121,7 +119,7 @@ public void init() throws IOException { } if (leafBlock == null) { - throw new InvalidQueryException("Global planner could not find any leaf block."); + throw new TajoInternalError("global planner could not find any leaf block."); } taskContext = new TaskAttemptContext(queryContext, null, 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 bd5d69651a..207f91babd 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 @@ -24,9 +24,11 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import org.apache.tajo.*; +import org.apache.tajo.BuiltinStorages; +import org.apache.tajo.QueryIdFactory; +import org.apache.tajo.SessionVars; +import org.apache.tajo.TajoConstants; import org.apache.tajo.catalog.*; -import org.apache.tajo.exception.DuplicateIndexException; import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.common.TajoDataTypes; @@ -37,6 +39,9 @@ import org.apache.tajo.engine.planner.physical.EvalExprExec; import org.apache.tajo.engine.planner.physical.InsertRowsExec; import org.apache.tajo.engine.query.QueryContext; +import org.apache.tajo.exception.DuplicateIndexException; +import org.apache.tajo.exception.TajoInternalError; +import org.apache.tajo.exception.UnsupportedException; import org.apache.tajo.ipc.ClientProtos.SerializedResultSet; import org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse; import org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse.ResultType; @@ -47,7 +52,6 @@ import org.apache.tajo.master.exec.prehook.DistributedQueryHookManager; import org.apache.tajo.master.exec.prehook.InsertIntoHook; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.Target; import org.apache.tajo.plan.expr.EvalContext; import org.apache.tajo.plan.expr.EvalNode; @@ -56,7 +60,6 @@ import org.apache.tajo.plan.function.python.TajoScriptEngine; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.plan.verifier.VerifyException; import org.apache.tajo.session.Session; import org.apache.tajo.storage.*; import org.apache.tajo.util.ProtoUtil; @@ -287,7 +290,7 @@ public void execNonFromQuery(QueryContext queryContext, Session session, String EvalContext evalContext = new EvalContext(); Target[] targets = plan.getRootBlock().getRawTargets(); if (targets == null) { - throw new PlanningException("No targets"); + throw new TajoInternalError("no targets"); } try { // start script executor @@ -501,8 +504,8 @@ public void executeDistributedQuery(QueryContext queryContext, Session session, FormatProperty formatProperty = space.getFormatProperty(tableDesc.getMeta()); if (!formatProperty.isInsertable()) { - throw new VerifyException( - String.format("%s tablespace does not allow INSERT operation.", tableDesc.getUri().toString())); + throw new UnsupportedException( + String.format("INSERT operation on %s tablespace", tableDesc.getUri().toString())); } space.prepareTable(rootNode.getChild()); 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 53f5504264..0d5880ef14 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 @@ -42,7 +42,6 @@ import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.exception.UndefinedTableException; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.logical.SortNode.SortPurpose; import org.apache.tajo.plan.serder.PlanProto.DistinctGroupbyEnforcer.MultipleAggregationStage; @@ -108,11 +107,7 @@ public static void scheduleFragmentsForJoinQuery(TaskSchedulerContext schedulerC } else { - try { - stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]); - } catch (PlanningException e) { - throw new IOException(e); - } + stats[i] = GlobalPlanRewriteUtil.computeDescendentVolume(scans[i]); // if table has no data, tablespace will return empty FileFragment. // So, we need to handle FileFragment by its size. diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/IllegalQueryStatusException.java b/tajo-plan/src/main/java/org/apache/tajo/plan/IllegalQueryStatusException.java deleted file mode 100644 index 31f9186132..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/IllegalQueryStatusException.java +++ /dev/null @@ -1,38 +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.plan; - -public class IllegalQueryStatusException extends Exception { - - public IllegalQueryStatusException() { - - } - - public IllegalQueryStatusException(String msg) { - super(msg); - } - - public IllegalQueryStatusException(Exception e) { - super(e); - } - - public IllegalQueryStatusException(String msg, Exception e) { - super(msg, e); - } -} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/InvalidQueryException.java b/tajo-plan/src/main/java/org/apache/tajo/plan/InvalidQueryException.java deleted file mode 100644 index a6b677f392..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/InvalidQueryException.java +++ /dev/null @@ -1,35 +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.plan; - -public class InvalidQueryException extends RuntimeException { - private static final long serialVersionUID = -7085849718839416246L; - - public InvalidQueryException() { - super(); - } - - public InvalidQueryException(String message) { - super(message); - } - - public InvalidQueryException(String message, Throwable t) { - super(message, t); - } -} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/PlanningException.java b/tajo-plan/src/main/java/org/apache/tajo/plan/PlanningException.java deleted file mode 100644 index 8f496005cc..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/PlanningException.java +++ /dev/null @@ -1,30 +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.plan; - -public class PlanningException extends Exception { - - public PlanningException(String message) { - super(message); - } - - public PlanningException(Throwable e) { - super(e); - } -} diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java index cba41c14d8..d11950135a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java @@ -21,14 +21,9 @@ import org.apache.tajo.algebra.*; import org.apache.tajo.catalog.Column; import org.apache.tajo.exception.TajoException; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.visitor.SimpleAlgebraVisitor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Stack; +import java.util.*; public class AlgebraicUtil { diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java index 79840244c5..3348097d83 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java @@ -23,7 +23,6 @@ import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.expr.AlgebraicUtil; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; @@ -168,7 +167,6 @@ private void prepareGraphUpdate(JoinGraphContext context, List edges, * each edge is join condition. * @param vertexes candidate operators to be joined. * @return The best join pair among them - * @throws PlanningException */ private JoinEdge getBestPair(JoinEdgeFinderContext context, JoinGraphContext graphContext, Set vertexes) throws TajoException { @@ -270,7 +268,6 @@ public void reset() { * @param leftTarget left target join vertex * @param rightTarget right target join vertex * @return If there is no join edge between two vertexes, it returns null. - * @throws PlanningException */ private static JoinEdge findJoin(final JoinEdgeFinderContext context, final JoinGraphContext graphContext, JoinVertex begin, final JoinVertex leftTarget, final JoinVertex rightTarget) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/JoinOrderAlgorithm.java b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/JoinOrderAlgorithm.java index 5fbbdbfb30..4218d6da65 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/JoinOrderAlgorithm.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/JoinOrderAlgorithm.java @@ -21,11 +21,6 @@ import org.apache.hadoop.classification.InterfaceStability; import org.apache.tajo.exception.TajoException; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; -import org.apache.tajo.plan.joinorder.FoundJoinOrder; -import org.apache.tajo.plan.joinorder.JoinGraph; - -import java.util.Set; /** * An interface for join order algorithms @@ -42,7 +37,6 @@ public interface JoinOrderAlgorithm { * relations. A vertex can be a relation or a group of joined relations. * An edge represents a join relation between two vertexes. * @return found join order - * @throws org.apache.tajo.plan.PlanningException */ FoundJoinOrder findBestOrder(LogicalPlan plan, LogicalPlan.QueryBlock block, JoinGraphContext joinGraphContext) throws TajoException; diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java b/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java index 3b39a101b1..7eb22d70ea 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java @@ -28,7 +28,6 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.exception.*; import org.apache.tajo.plan.LogicalPlan; -import org.apache.tajo.plan.PlanningException; import org.apache.tajo.plan.logical.RelationNode; import org.apache.tajo.util.Pair; import org.apache.tajo.util.StringUtils; @@ -84,7 +83,6 @@ abstract Column resolve(LogicalPlan plan, LogicalPlan.QueryBlock block, ColumnRe * @param block the current block * @param tableName The table name which can be either qualified or not. * @return A corresponding relation - * @throws PlanningException */ public static RelationNode lookupTable(LogicalPlan.QueryBlock block, String tableName) throws AmbiguousTableException { @@ -143,7 +141,6 @@ public static Collection lookupTableByColumns(LogicalPlan.QueryBlo * @param block The current query block * @param columnRef The column reference to be found * @return The found column - * @throws PlanningException */ static Column resolveFromRelsWithinBlock(LogicalPlan plan, LogicalPlan.QueryBlock block, ColumnReferenceExpr columnRef) @@ -320,7 +317,6 @@ static Column resolveAliasedName(LogicalPlan.QueryBlock block, ColumnReferenceEx * @param block The current block * @param columnRef The column name * @return A pair of normalized qualifier and column name - * @throws PlanningException */ static Pair lookupQualifierAndCanonicalName(LogicalPlan.QueryBlock block, ColumnReferenceExpr columnRef) diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java index 524d3ea14c..419b3e5494 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java @@ -29,7 +29,6 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; -import org.apache.tajo.plan.InvalidQueryException; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.LogicalPlan.QueryBlock; import org.apache.tajo.plan.LogicalPlanner; @@ -144,7 +143,7 @@ public LogicalNode visitFilter(FilterPushDownContext context, LogicalPlan plan, UnaryNode unary = (UnaryNode) node; unary.setChild(selNode.getChild()); } else { - throw new InvalidQueryException("Unexpected Logical Query Plan"); + throw new TajoInternalError("The node must be an unary node"); } } else { // if there remain search conditions diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java index 99e95be93f..8e0c421663 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java @@ -28,7 +28,6 @@ import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.exception.UndefinedTableException; -import org.apache.tajo.plan.InvalidQueryException; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.Target; import org.apache.tajo.plan.expr.*; @@ -41,7 +40,6 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.TUtil; -import java.io.IOException; import java.util.*; public class PlannerUtil { @@ -306,10 +304,10 @@ public static LogicalNode deleteNode(LogicalNode parent, LogicalNode tobeRemoved } else if (binaryParent.getRightChild().deepEquals(child)) { binaryParent.setRightChild(grandChild); } else { - throw new IllegalStateException("ERROR: both logical node must be parent and child nodes"); + throw new TajoInternalError("both logical node must be parent and child nodes"); } } else { - throw new InvalidQueryException("Unexpected logical plan: " + parent); + throw new TajoInternalError("unexpected logical plan: " + parent); } return child; } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/VerifyException.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/VerifyException.java deleted file mode 100644 index 2e7a9c273a..0000000000 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/VerifyException.java +++ /dev/null @@ -1,27 +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.plan.verifier; - -import org.apache.tajo.plan.PlanningException; - -public class VerifyException extends PlanningException { - public VerifyException(String message) { - super(message); - } -} From 0ca15b4cce2886d7f4dc947649d7283a57fe2a10 Mon Sep 17 00:00:00 2001 From: Hyunsik Choi Date: Thu, 20 Aug 2015 15:29:25 +0900 Subject: [PATCH 2/2] Fix unit test failures. --- .../rewriter/rules/BroadcastJoinRule.java | 41 +++++++++++++++++-- .../rewriter/rules/GlobalPlanRewriteUtil.java | 21 ---------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java index 12b7ce1bbd..6f7b4c968f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/BroadcastJoinRule.java @@ -26,6 +26,7 @@ import org.apache.tajo.engine.planner.global.MasterPlan; import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanRewriteRule; import org.apache.tajo.exception.TajoException; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.logical.*; import org.apache.tajo.plan.util.PlannerUtil; @@ -178,7 +179,11 @@ private void visitLeafNode(ExecutionBlock current) { } } if (fullyBroadcastable && current.getScanNodes().length == 1) { - updateScanOfParentAsBroadcastable(plan, current); + try { + updateScanOfParentAsBroadcastable(plan, current); + } catch (NoScanNodeForChildEbException e) { + // This case is when the current has two or more inputs via union, and simply ignored. + } } } } @@ -251,7 +256,7 @@ private void checkTotalSizeOfBroadcastableRelations(ExecutionBlock block) { private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock current) { ExecutionBlock parent = plan.getParent(current); if (parent != null && !plan.isTerminal(parent)) { - ScanNode scanForCurrent = GlobalPlanRewriteUtil.findScanForChildEb(current, parent); + ScanNode scanForCurrent = findScanForChildEb(current, parent); parent.addBroadcastRelation(scanForCurrent); } } @@ -265,7 +270,7 @@ private void updateScanOfParentAsBroadcastable(MasterPlan plan, ExecutionBlock c * @return */ private ExecutionBlock mergeTwoPhaseJoin(MasterPlan plan, ExecutionBlock child, ExecutionBlock parent) { - ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(child, parent); + ScanNode scanForChild = findScanForChildEb(child, parent); parentFinder.set(scanForChild); parentFinder.find(parent.getPlan()); @@ -319,7 +324,7 @@ private void addUnionNodeIfNecessary(Map uni left = unionNode; } - ScanNode scanForChild = GlobalPlanRewriteUtil.findScanForChildEb(plan.getExecBlock(representativeId), current); + ScanNode scanForChild = findScanForChildEb(plan.getExecBlock(representativeId), current); PlannerUtil.replaceNode(plan.getLogicalPlan(), current.getPlan(), scanForChild, topUnion); current.getUnionScanMap().clear(); @@ -332,4 +337,32 @@ private void addUnionNodeIfNecessary(Map uni private static boolean isFullyBroadcastable(ExecutionBlock block) { return block.getBroadcastRelations().size() == block.getScanNodes().length; } + + /** + * Find a scan node in the plan of the parent EB corresponding to the output of the child EB. + * + * @param child + * @param parent + * @return ScanNode + */ + private static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) { + ScanNode scanForChild = null; + for (ScanNode scanNode : parent.getScanNodes()) { + if (scanNode.getTableName().equals(child.getId().toString())) { + scanForChild = scanNode; + break; + } + } + if (scanForChild == null) { + throw new NoScanNodeForChildEbException( + "cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); + } + return scanForChild; + } + + private static class NoScanNodeForChildEbException extends RuntimeException { + NoScanNodeForChildEbException(String message) { + super(message); + } + } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java index b67a5e94fa..b14687dae6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/rewriter/rules/GlobalPlanRewriteUtil.java @@ -89,27 +89,6 @@ public static void replaceChild(LogicalNode newChild, ScanNode originalChild, Lo } } - /** - * Find a scan node in the plan of the parent EB corresponding to the output of the child EB. - * - * @param child - * @param parent - * @return ScanNode - */ - public static ScanNode findScanForChildEb(ExecutionBlock child, ExecutionBlock parent) { - ScanNode scanForChild = null; - for (ScanNode scanNode : parent.getScanNodes()) { - if (scanNode.getTableName().equals(child.getId().toString())) { - scanForChild = scanNode; - break; - } - } - if (scanForChild == null) { - throw new TajoInternalError("cannot find any scan nodes for " + child.getId() + " in " + parent.getId()); - } - return scanForChild; - } - /** * Get a volume of a table of a partitioned table * @param scanNode ScanNode corresponding to a table