Skip to content

Commit

Permalink
TEIID-4312 fixing inlining issues
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Jul 1, 2016
1 parent f610ede commit beb883e
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -274,10 +274,10 @@ private void planWith(PlanNode plan, Command command) throws QueryPlannerExcepti
planner.initialize(command, idGenerator, metadata, capFinder, analysisRecord, context);
planner.executeRules(stack, plan);
//discover all of the usage
List<Command> commands = CommandCollectorVisitor.getCommands(command);
List<Command> commands = CommandCollectorVisitor.getCommands(command, true);
while (!commands.isEmpty()) {
Command cmd = commands.remove(commands.size() - 1);
commands.addAll(CommandCollectorVisitor.getCommands(cmd));
commands.addAll(CommandCollectorVisitor.getCommands(cmd, true));
try {
//skip xml commands as they cannot be planned here and cannot directly reference with tables,
//but their subqueries still can
Expand Down Expand Up @@ -1366,7 +1366,10 @@ void buildTree(FromClause clause, final PlanNode parent)
if (nestedCommand != null) {
//only proc relational counts toward the planning stack
//other paths are inlining, so there isn't a proper virtual layer
planningStackEntry = group.isProcedure();
if (!group.isProcedure()) {
planningStackEntry = false;
hints.hasVirtualGroups = true;
}
} else if (!group.isProcedure()) {
Object id = getTrackableGroup(group, metadata);
if (id != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ public boolean equals(Object obj) {

if( EquivalenceUtil.areEqual(group.getDefinition(), other.getGroup().getDefinition()) ) {
return EquivalenceUtil.areEqual(getGroup().getNonCorrelationName(), other.getGroup().getNonCorrelationName()) &&
other.isOptional() == this.isOptional();
other.isOptional() == this.isOptional() &&
EquivalenceUtil.areEqual(expandedCommand, other.expandedCommand);
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,7 @@

import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.lang.BatchedUpdateCommand;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.ExistsCriteria;
import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.lang.WithQueryCommand;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.navigator.PreOrderNavigator;
import org.teiid.query.sql.proc.CommandStatement;
import org.teiid.query.sql.proc.LoopStatement;
Expand All @@ -53,6 +45,7 @@
public class CommandCollectorVisitor extends LanguageVisitor {

private List<Command> commands = new ArrayList<Command>();
private boolean collectExpanded;

/**
* Get the commands collected by the visitor. This should best be called
Expand Down Expand Up @@ -132,13 +125,25 @@ public void visit(Insert obj) {
}
}

@Override
public void visit(UnaryFromClause obj) {
if (collectExpanded && obj.getExpandedCommand() != null && !obj.getGroup().isProcedure()) {
this.commands.add(obj.getExpandedCommand());
}
}

/**
* Helper to quickly get the commands from obj
* @param obj Language object
* @param elements Collection to collect commands in
*/
public static final List<Command> getCommands(Command command) {
return getCommands(command, false);
}

public static final List<Command> getCommands(Command command, boolean includeExpanded) {
CommandCollectorVisitor visitor = new CommandCollectorVisitor();
visitor.collectExpanded = includeExpanded;
final boolean visitCommands = command instanceof SetQuery;
PreOrderNavigator navigator = new PreOrderNavigator(visitor) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public class TestWithClauseProcessing {

sql = "with a (x, y, z) as (select e1, e2, e3 from pm1.g1) SELECT e1 from pm1.g1, a"; //$NON-NLS-1$

plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), null, capFinder, new String[] {"SELECT 1 FROM pm1.g1 AS g_0", "SELECT g_0.e1 FROM pm1.g1 AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING);
plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), null, capFinder, new String[] {"SELECT g_0.e1 FROM pm1.g1 AS g_0, pm1.g1 AS g_1"}, ComparisonMode.EXACT_COMMAND_STRING);
}

@Test public void testWithPushdownMultiple() throws TeiidException {
Expand Down Expand Up @@ -771,7 +771,7 @@ public TupleSource registerRequest(CommandContext context,
HardcodedDataManager hdm = new HardcodedDataManager(RealMetadataFactory.example1Cached());

//cte1 should appear once
hdm.addData("WITH cte1 (e1, e2) AS (SELECT g_0.e1, g_0.e2 FROM g1 AS g_0) SELECT g_0.e1, g_0.e2 FROM cte1 AS g_0", Arrays.asList("a", 1));
hdm.addData("WITH cte1 (e1, e2) AS (SELECT g_0.e1, g_0.e2 FROM g1 AS g_0) SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM cte1 AS g_0 ORDER BY c_0", Arrays.asList("a", 1));
TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList("a", 1, "a", 1)});
}

Expand All @@ -784,7 +784,7 @@ public TupleSource registerRequest(CommandContext context,
ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(RealMetadataFactory.example1Cached());

hdm.addData("SELECT g_0.e2 AS c_0 FROM g1 AS g_0 WHERE g_0.e2 = 1 ORDER BY c_0", Arrays.asList(1));
hdm.addData("SELECT 1 FROM g1 AS g_0 WHERE g_0.e2 = 1", Arrays.asList(1));
TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1)});
}

Expand All @@ -797,7 +797,8 @@ public TupleSource registerRequest(CommandContext context,
ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(RealMetadataFactory.example1Cached());

hdm.addData("SELECT g_0.e2 AS c_0 FROM g1 AS g_0 WHERE g_0.e2 = 1 ORDER BY c_0", Arrays.asList(1));
hdm.addData("WITH cte3_1 (a) AS (SELECT 1 FROM g1 AS g_0 WHERE g_0.e2 = 1), cte3 (a) AS (SELECT g_0.a FROM cte3_1 AS g_0) SELECT g_0.a FROM cte3 AS g_0", Arrays.asList(1));

TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1)});
}

Expand All @@ -811,7 +812,8 @@ public TupleSource registerRequest(CommandContext context,
ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(RealMetadataFactory.example1Cached());

hdm.addData("SELECT g_0.e2 AS c_0 FROM g1 AS g_0 WHERE g_0.e2 = 1 ORDER BY c_0", Arrays.asList(1));
hdm.addData("WITH cte3_1 (a) AS (SELECT 1 FROM g1 AS g_0 WHERE g_0.e2 = 1) SELECT g_0.a FROM cte3_1 AS g_0", Arrays.asList(1));
hdm.addData("WITH cte3_1__2 (a) AS (SELECT 1 FROM g1 AS g_0 WHERE g_0.e2 = 1) SELECT g_0.a FROM cte3_1__2 AS g_0", Arrays.asList(1));
TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1)});
}

Expand Down Expand Up @@ -935,5 +937,39 @@ public TupleSource registerRequest(CommandContext context,
TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1, 1)});
}

@Test public void testProjectionMinimizationWithInlined() throws Exception {
CommandContext cc = TestProcessor.createCommandContext();
BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities();
bsc.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true);
bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_SELFJOIN, true);

TransformationMetadata metadata = RealMetadataFactory.fromDDL("CREATE foreign TABLE test_a(a integer, b integer)", "x", "y");

String sql = "with CTE1 as (WITH CTE11 as (SELECT a from test_a), CTE21 as (select t1.a from CTE11 t1 join CTE11 t2 on t1.a=t2.a), CTE31 as (select a from CTE21) SELECT CTE31.a FROM CTE21 join CTE31 on CTE31.a=CTE21.a ) select * from CTE1";

ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(metadata);
hdm.addData("WITH CTE11 (a) AS (SELECT g_0.a FROM test_a AS g_0), CTE21 (a) AS (SELECT g_0.a FROM CTE11 AS g_0, CTE11 AS g_1 WHERE g_0.a = g_1.a) SELECT g_1.a FROM CTE21 AS g_0, CTE21 AS g_1 WHERE g_1.a = g_0.a", Arrays.asList(1));

TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1)});
}

@Test public void testNestedInlining() throws Exception {
CommandContext cc = TestProcessor.createCommandContext();
BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities();
bsc.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true);
bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_SELFJOIN, true);

TransformationMetadata metadata = RealMetadataFactory.fromDDL("CREATE foreign TABLE test_a(a integer, b integer)", "x", "y");

String sql = "with CTE1 as (WITH alias as (SELECT a from test_a), alias2 as (select t2.a as a1, t1.a from alias t1 join (SELECT 1 as a) t2 on t1.a=t2.a), CTE31 as (select t2.a as a1 from alias2 t2) SELECT CTE31.a1 FROM alias2 join CTE31 on CTE31.a1=alias2.a ), CTE2 as ( WITH alias as (SELECT 1 as a), alias2 as (select t2.a a1, t1.a from alias t1 join (SELECT 1 as a) t2 on t1.a=t2.a), CTE32 as (select t2.a from alias2 t2) SELECT CTE32.a FROM alias2 join CTE32 on CTE32.a=alias2.a ) select * from CTE1 as T1 join CTE2 as T2 on T1.a1=T2.a";

ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(metadata);
hdm.addData("WITH alias2 (a1, a) AS (SELECT NULL, g_0.a FROM test_a AS g_0 WHERE g_0.a = 1) SELECT g_1.a AS c_0 FROM alias2 AS g_0, alias2 AS g_1 WHERE g_1.a = g_0.a AND g_1.a = 1 ORDER BY c_0", Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1));

TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList(1, 1), Arrays.asList(1, 1), Arrays.asList(1, 1), Arrays.asList(1, 1)});
}

}

0 comments on commit beb883e

Please sign in to comment.