Skip to content

Commit

Permalink
TEIID-4553 updating to check for count(literal)
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Nov 2, 2016
1 parent b95072e commit a0b4c01
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 7 deletions.
Expand Up @@ -63,6 +63,7 @@
import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.sql.visitor.EvaluatableVisitor;
import org.teiid.query.sql.visitor.ExpressionMappingVisitor;
import org.teiid.query.sql.visitor.GroupsUsedByElementsVisitor;
import org.teiid.query.util.CommandContext;
Expand Down Expand Up @@ -525,7 +526,7 @@ private void addUnionGroupBy(
for (AggregateSymbol agg : aggregates) {
agg = (AggregateSymbol)agg.clone();
if (agg.getAggregateFunction() == Type.COUNT) {
if (agg.getArgs().length == 0) {
if (isCountStar(agg)) {
allSymbols.addSymbol(new ExpressionSymbol("stagedAgg", new Constant(1))); //$NON-NLS-1$
} else {
SearchedCaseExpression count = new SearchedCaseExpression(Arrays.asList(new IsNullCriteria(agg.getArg(0))), Arrays.asList(new Constant(Integer.valueOf(0))));
Expand Down Expand Up @@ -1040,9 +1041,7 @@ private <T extends Expression> Map<PlanNode, List<T>> createNodeMapping(PlanNode
if ((!as.canStage() && as.isCardinalityDependent())) {
return null;
}
if (as.getAggregateFunction() == Type.COUNT && as.getArgs().length == 0) {
countStar = true;
}
countStar = isCountStar(as);
}
PlanNode originatingNode = null;
Set<GroupSymbol> groups = null;
Expand Down Expand Up @@ -1109,6 +1108,10 @@ private <T extends Expression> Map<PlanNode, List<T>> createNodeMapping(PlanNode
return result;
}

private static boolean isCountStar(AggregateSymbol as) {
return as.getAggregateFunction() == Type.COUNT && (as.getArgs().length == 0 || EvaluatableVisitor.willBecomeConstant(as.getArg(0)));
}

private static Map<AggregateSymbol, Expression> buildAggregateMap(Collection<? extends AggregateSymbol> aggregateExpressions,
QueryMetadataInterface metadata, Set<AggregateSymbol> nestedAggregates, boolean join) throws QueryResolverException,
TeiidComponentException {
Expand All @@ -1121,7 +1124,7 @@ private static Map<AggregateSymbol, Expression> buildAggregateMap(Collection<? e
if (aggFunction == Type.COUNT) {
//COUNT(x) -> IFNULL(CONVERT(SUM(COUNT(x)), INTEGER), 0)
AggregateSymbol newAgg = null;
if (partitionAgg.getArgs().length == 0 && join) {
if (isCountStar(partitionAgg) && join) {
//count * case (if on the inner side of an outer join)
Function ifnull = new Function(FunctionLibrary.IFNULL, new Expression[] {partitionAgg, new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER)});
newAgg = new AggregateSymbol(NonReserved.SUM, false, ifnull);
Expand Down
Expand Up @@ -539,6 +539,13 @@ null, getAggregatesFinder(),
hdm.addData("SELECT g_0.e3, g_0.e1 FROM pm2.g1 AS g_0", Arrays.asList(false, "a"), Arrays.asList(true, "b"), Arrays.asList(true, "b"));

TestProcessor.helpProcess(plan, hdm, new List[] {Arrays.asList(null, "a", 1), Arrays.asList(1, "b", 6), Arrays.asList(2, "b", 4), Arrays.asList(3, null, 4)});

sql = "SELECT x.e2, y.e1, count(1) from pm1.g1 x full outer join pm2.g1 y on x.e3 = y.e3 group by x.e2, y.e1"; //$NON-NLS-1$
plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), null, capFinder,
new String[] {"SELECT g_0.e3, g_0.e2, COUNT(1) FROM pm1.g1 AS g_0 GROUP BY g_0.e3, g_0.e2", "SELECT g_0.e3, g_0.e1 FROM pm2.g1 AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$

hdm.addData("SELECT g_0.e3, g_0.e2, COUNT(1) FROM pm1.g1 AS g_0 GROUP BY g_0.e3, g_0.e2", Arrays.asList(true, 1, 3), Arrays.asList(true, 2, 2), Arrays.asList(null, 3, 4));
TestProcessor.helpProcess(plan, hdm, new List[] {Arrays.asList(null, "a", 1), Arrays.asList(1, "b", 6), Arrays.asList(2, "b", 4), Arrays.asList(3, null, 4)});
}

/**
Expand Down
Expand Up @@ -1259,5 +1259,25 @@ private FunctionMethod addAgg(Schema s, String name, Class<?> clazz, String retu
TestProcessor.helpProcess(plan, TestProcessor.createCommandContext(),
hdm, new List<?>[] {Arrays.asList("b,b"), Arrays.asList("a,a")});
}


@Test public void testCountConstantWithoutStats() throws Exception {
String sql = "select count(1) from test_count_1 t1 join test_count_2 t2 on t1.a=t2.a group by t1.a";

TransformationMetadata metadata = RealMetadataFactory.fromDDL("create foreign table test_count_1 (a string); create foreign table test_count_2 (a string)", "x", "y");
HardcodedDataManager hdm = new HardcodedDataManager();

hdm.addData("SELECT g_0.a FROM y.test_count_1 AS g_0", Arrays.asList("a"), Arrays.asList("a"));
hdm.addData("SELECT g_0.a FROM y.test_count_2 AS g_0", Arrays.asList("a"), Arrays.asList("a"));

BasicSourceCapabilities bsc = TestAggregatePushdown.getAggregateCapabilities();
bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_INNER, false);
bsc.setCapabilitySupport(Capability.QUERY_FROM_JOIN_OUTER, false);
bsc.setCapabilitySupport(Capability.QUERY_ORDERBY, false);
bsc.setCapabilitySupport(Capability.QUERY_GROUP_BY, false);

ProcessorPlan plan = TestProcessor.helpGetPlan(sql, metadata, new DefaultCapabilitiesFinder(bsc));
TestProcessor.helpProcess(plan, TestProcessor.createCommandContext(),
hdm, new List<?>[] {Arrays.asList(4)});
}

}
Expand Up @@ -141,7 +141,7 @@ private static CommandContext createContext() {
helpProcess(plan, context, dataManager, expectedResults);

plan = helpGetPlan(helpParse("select count(1) from v where y is not null"), tm, new DefaultCapabilitiesFinder(caps), context);
dataManager.addData("SELECT g_0.y AS c_0 FROM y.t AS g_0 WHERE g_0.x = 'user' ORDER BY c_0", new List<?>[] {Arrays.asList(1), Arrays.asList(2)});
dataManager.addData("SELECT g_0.y FROM y.t AS g_0 WHERE g_0.x = 'user'", new List<?>[] {Arrays.asList(1), Arrays.asList(2)});
dataManager.addData("SELECT g_0.y AS c_0 FROM y.t1 AS g_0 WHERE g_0.y IS NOT NULL ORDER BY c_0", Arrays.asList(1));
expectedResults = new List<?>[] {Arrays.asList(1)};
helpProcess(plan, context, dataManager, expectedResults);
Expand Down

0 comments on commit a0b4c01

Please sign in to comment.