@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { if (block.hasNode(NodeType.SELECTION) || block.hasNode(NodeType.JOIN)) { return true; } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { if (block.hasNode(NodeType.SELECTION) || block.hasNode(NodeType.JOIN)) { return true; } } return false; }
/** * Checks whether the query has 'from clause' or not. * * @param plan The logical plan * @return True if a query does not have 'from clause'. */ public static boolean checkIfNonFromQuery(LogicalPlan plan) { LogicalNode node = plan.getRootBlock().getRoot(); // one block, without where clause, no group-by, no-sort, no-join boolean isOneQueryBlock = plan.getQueryBlocks().size() == 1; boolean noRelation = !plan.getRootBlock().hasAlgebraicExpr(OpType.Relation); return !checkIfDDLPlan(node) && noRelation && isOneQueryBlock; }
/** * Checks whether the query has 'from clause' or not. * * @param plan The logical plan * @return True if a query does not have 'from clause'. */ public static boolean checkIfNonFromQuery(LogicalPlan plan) { LogicalNode node = plan.getRootBlock().getRoot(); // one block, without where clause, no group-by, no-sort, no-join boolean isOneQueryBlock = plan.getQueryBlocks().size() == 1; boolean noRelation = !plan.getRootBlock().hasAlgebraicExpr(OpType.Relation); return !checkIfDDLPlan(node) && noRelation && isOneQueryBlock; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { if (block.hasNode(NodeType.SELECTION) || block.hasNode(NodeType.JOIN)) { rewriter = new Rewriter(context.getPlan()); return true; } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { if (block.hasNode(NodeType.SELECTION) || block.hasNode(NodeType.JOIN)) { rewriter = new Rewriter(context.getPlan()); return true; } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { if (context.getQueryContext().getBool(SessionVars.INDEX_ENABLED)) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { for (RelationNode relationNode : block.getRelations()) { List<AccessPathInfo> accessPathInfos = block.getAccessInfos(relationNode); // If there are any alternative access paths if (accessPathInfos.size() > 1) { for (AccessPathInfo accessPathInfo : accessPathInfos) { if (accessPathInfo.getScanType() == AccessPathInfo.ScanTypeControl.INDEX_SCAN) { return true; } } } } } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { for (RelationNode relation : block.getRelations()) { if (relation.getType() == NodeType.SCAN) { TableDesc table = ((ScanNode)relation).getTableDesc(); if (table.hasPartition()) { return true; } } } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { for (LogicalPlan.QueryBlock block : context.getPlan().getQueryBlocks()) { for (RelationNode relation : block.getRelations()) { if (relation.getType() == NodeType.SCAN) { TableDesc table = ((ScanNode)relation).getTableDesc(); if (table.hasPartition()) { return true; } } } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { LogicalNode toBeOptimized = context.getPlan().getRootBlock().getRoot(); if (PlannerUtil.checkIfDDLPlan(toBeOptimized)) { return false; } for (QueryBlock eachBlock: context.getPlan().getQueryBlocks()) { if (eachBlock.hasTableExpression()) { return true; } } return false; }
@Override public boolean isEligible(LogicalPlanRewriteRuleContext context) { LogicalNode toBeOptimized = context.getPlan().getRootBlock().getRoot(); if (PlannerUtil.checkIfDDLPlan(toBeOptimized)) { return false; } for (QueryBlock eachBlock: context.getPlan().getQueryBlocks()) { if (eachBlock.hasTableExpression()) { return true; } } return false; }
@Override public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { long thresholdForNonCrossJoin = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) * StorageUnit.KB; long thresholdForCrossJoin = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD) * StorageUnit.KB; boolean broadcastJoinEnabled = queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED); if (broadcastJoinEnabled && (thresholdForNonCrossJoin > 0 || thresholdForCrossJoin > 0)) { for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { if (block.hasNode(NodeType.JOIN)) { init(plan); return true; } } } return false; }
@Override public boolean isEligible(OverridableConf queryContext, MasterPlan plan) { long thresholdForNonCrossJoin = queryContext.getLong(SessionVars.BROADCAST_NON_CROSS_JOIN_THRESHOLD) * StorageUnit.KB; long thresholdForCrossJoin = queryContext.getLong(SessionVars.BROADCAST_CROSS_JOIN_THRESHOLD) * StorageUnit.KB; boolean broadcastJoinEnabled = queryContext.getBool(SessionVars.TEST_BROADCAST_JOIN_ENABLED); if (broadcastJoinEnabled && (thresholdForNonCrossJoin > 0 || thresholdForCrossJoin > 0)) { for (LogicalPlan.QueryBlock block : plan.getLogicalPlan().getQueryBlocks()) { if (block.hasNode(NodeType.JOIN)) { init(plan, thresholdForNonCrossJoin, thresholdForCrossJoin, broadcastJoinEnabled); return true; } } } return false; }
@Test public final void testInsertInto6() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[6]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); ProjectionNode subquery = insertNode.getChild(); List<Target> targets = subquery.getTargets(); // targets MUST be manager, NULL as empid, deptname assertEquals(targets.get(0).getNamedColumn().getQualifiedName(), "default.dept.manager"); assertEquals(targets.get(1).getAlias(), "empid"); assertEquals(targets.get(1).getEvalTree().getType(), EvalType.CONST); assertEquals(targets.get(2).getNamedColumn().getQualifiedName(), "default.dept.deptname"); }
@Test public final void testInsertInto3() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[3]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertFalse(insertNode.isOverwrite()); assertTrue(insertNode.hasUri()); }
@Test public final void testInsertInto5() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[5]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertTrue(insertNode.isOverwrite()); assertTrue(insertNode.hasUri()); }
@Test public final void testInsertInto1() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[1]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertFalse(insertNode.isOverwrite()); assertEquals(IdentifierUtil.buildFQName(DEFAULT_DATABASE_NAME, "score"), insertNode.getTableName()); }
@Test public final void testInsertInto0() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[0]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertFalse(insertNode.isOverwrite()); assertTrue(insertNode.hasTargetTable()); assertEquals(IdentifierUtil.buildFQName(DEFAULT_DATABASE_NAME, "score"), insertNode.getTableName()); }
@Test public final void testInsertInto2() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[2]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertFalse(insertNode.isOverwrite()); assertEquals(IdentifierUtil.buildFQName(DEFAULT_DATABASE_NAME, "employee"), insertNode.getTableName()); assertTrue(insertNode.hasTargetSchema()); assertEquals(insertNode.getTargetSchema().getColumn(0).getSimpleName(), "name"); assertEquals(insertNode.getTargetSchema().getColumn(1).getSimpleName(), "deptname"); }
@Test public final void testInsertInto4() throws TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(insertStatements[4]); LogicalPlan plan = planner.createPlan(qc, expr); assertEquals(1, plan.getQueryBlocks().size()); InsertNode insertNode = getInsertNode(plan); assertTrue(insertNode.isOverwrite()); assertTrue(insertNode.hasTargetTable()); assertEquals(IdentifierUtil.buildFQName(DEFAULT_DATABASE_NAME, "employee"), insertNode.getTableName()); assertTrue(insertNode.hasTargetSchema()); assertEquals(insertNode.getTargetSchema().getColumn(0).getSimpleName(), "name"); assertEquals(insertNode.getTargetSchema().getColumn(1).getSimpleName(), "deptname"); }