Skip to content

Commit

Permalink
TEIID-5217 honoring the preserve hint
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Jan 16, 2018
1 parent 7efd71a commit 60da8b1
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
Expand Up @@ -78,7 +78,7 @@ private boolean planLeftOuterJoinAssociativity(PlanNode plan,
Iterator<PlanNode> i = joins.iterator();
PlanNode join = i.next();
i.remove();
if (!join.getProperty(Info.JOIN_TYPE).equals(JoinType.JOIN_LEFT_OUTER)) {
if (!join.getProperty(Info.JOIN_TYPE).equals(JoinType.JOIN_LEFT_OUTER) || join.hasBooleanProperty(Info.PRESERVE)) {
continue;
}
PlanNode childJoin = null;
Expand Down Expand Up @@ -108,7 +108,7 @@ private boolean planLeftOuterJoinAssociativity(PlanNode plan,
}

List<Criteria> childJoinCriteria = (List<Criteria>) childJoin.getProperty(Info.JOIN_CRITERIA);
if (!isCriteriaValid(childJoinCriteria, metadata, childJoin)) {
if (!isCriteriaValid(childJoinCriteria, metadata, childJoin) || childJoin.hasBooleanProperty(Info.PRESERVE)) {
continue;
}

Expand Down Expand Up @@ -243,6 +243,10 @@ private boolean planLeftOuterJoinAssociativityBeforePlanning(PlanNode plan,
PlanNode join = i.next();
i.remove();

if (join.hasBooleanProperty(Info.PRESERVE)) {
continue;
}

//check for left outer join ordering, such that we can combine for pushdown
if (checkLeftOrdering(metadata, capabilitiesFinder, analysisRecord,
context, join)) {
Expand Down Expand Up @@ -271,7 +275,7 @@ private boolean planLeftOuterJoinAssociativityBeforePlanning(PlanNode plan,
}

List<Criteria> childJoinCriteria = (List<Criteria>) childJoin.getProperty(Info.JOIN_CRITERIA);
if (!isCriteriaValid(childJoinCriteria, metadata, childJoin)) {
if (!isCriteriaValid(childJoinCriteria, metadata, childJoin) || join.hasBooleanProperty(Info.PRESERVE)) {
continue;
}

Expand Down Expand Up @@ -344,7 +348,7 @@ private boolean checkLeftOrdering(QueryMetadataInterface metadata,
left = childJoin;
nested = true;
}
if (nested && hasOuter) {
if (nested && hasOuter && !left.hasBooleanProperty(Info.PRESERVE)) {
if (right.getType() != NodeConstants.Types.ACCESS) {
return false;
}
Expand All @@ -363,7 +367,7 @@ private boolean checkLeftOrdering(QueryMetadataInterface metadata,
return false;
}
PlanNode parent = join.getParent();
join.getParent().replaceChild(join, join.getFirstChild());
parent.replaceChild(join, join.getFirstChild());
join.removeAllChildren();
left.getFirstChild().addAsParent(join);
join.addLastChild(right);
Expand Down
Expand Up @@ -1177,6 +1177,17 @@ private void helpTestNullDependent(String expressionSQL,
"SELECT g_0.e1 AS c_0 FROM pm2.g2 AS g_0 LEFT OUTER JOIN pm2.g3 AS g_1 ON g_0.e2 = g_1.e2 ORDER BY c_0"}, new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}

@Test public void testLeftOuterAssocitivtyLeftLinearWithPreserve() throws Exception {
BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, true);
TestOptimizer.helpPlan("SELECT pm1.g1.e3 from /*+ preserve */ (pm1.g1 left outer join pm2.g2 on pm1.g1.e1 = pm2.g2.e1 left outer join pm2.g3 on pm2.g2.e2 = pm2.g3.e2)", //$NON-NLS-1$
RealMetadataFactory.example1Cached(),
new String[] {
"SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM pm2.g2 AS g_0 ORDER BY c_0",
"SELECT g_0.e1 AS c_0, g_0.e3 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_0",
"SELECT g_0.e2 AS c_0 FROM pm2.g3 AS g_0 ORDER BY c_0"}, new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}

@Test public void testLeftOuterAssocitivtyLeftLinearSwap() throws Exception {
BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, true);
Expand Down Expand Up @@ -1555,4 +1566,19 @@ private void helpTestNullDependent(String expressionSQL,
"SELECT g_0.e1 AS c_0, g_0.e3 AS c_1 FROM (pm1.g1 AS g_0 INNER JOIN pm1.g3 AS g_1 ON g_0.e1 = g_1.e1) LEFT OUTER JOIN pm1.g2 AS g_2 ON g_0.e1 = g_2.e1 ORDER BY c_0"}, new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}

@Test public void testLeftOuterAssocitivtyWithStarJoinWithPreserve() throws Exception {
BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, true);
TestOptimizer.helpPlan("SELECT pm1.g1.e3 from /*+ preserve */ (pm1.g1 "
+ "left outer join pm2.g2 on pm1.g1.e1 = pm2.g2.e1 "
+ "inner join pm1.g3 on pm1.g1.e1 = pm1.g3.e1 "
+ "left outer join pm1.g2 on pm1.g1.e1 = pm1.g2.e1)", //$NON-NLS-1$
RealMetadataFactory.example1Cached(),
new String[] {
"SELECT g_0.e1 AS c_0 FROM pm2.g2 AS g_0 ORDER BY c_0",
"SELECT g_0.e1 AS c_0 FROM pm1.g2 AS g_0 ORDER BY c_0",
"SELECT g_0.e1 AS c_0 FROM pm1.g3 AS g_0 ORDER BY c_0",
"SELECT g_0.e1 AS c_0, g_0.e3 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_0"}, new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}

}

0 comments on commit 60da8b1

Please sign in to comment.