This is an automated email from the ASF dual-hosted git repository. volodymyr pushed a commit to branch mongo in repository https://gitbox.apache.org/repos/asf/drill.git
commit ef95d6e8a2241ca2fb1a8d1d94dd44e4b2d9540a Author: Volodymyr Vysotskyi <[email protected]> AuthorDate: Tue Jul 13 23:00:10 2021 +0300 DRILL-7971: Fix sum without group by --- .../exec/store/mongo/MongoAggregateUtils.java | 8 ++-- .../store/mongo/plan/MongoPluginImplementor.java | 15 +++++- .../drill/exec/store/mongo/TestMongoQueries.java | 53 ++++++++++++++++++++-- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoAggregateUtils.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoAggregateUtils.java index 79e4872..505b234 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoAggregateUtils.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoAggregateUtils.java @@ -92,7 +92,7 @@ public class MongoAggregateUtils { @Override public String get(int index) { String outName = outNames.get(index); return maybeQuote(outName) + ": " - + maybeQuote("$" + (index == 0 ? "_id" : outName)); + + quote("$" + (index == 0 ? "_id" : outName)); } @Override public int size() { @@ -107,12 +107,12 @@ public class MongoAggregateUtils { fixups.add( maybeQuote(outNames.get(group)) + ": " - + maybeQuote("$_id." + outNames.get(group))); + + quote("$_id." + outNames.get(group))); ++i; } for (AggregateCall ignored : aggregate.getAggCallList()) { String outName = outNames.get(i++); - fixups.add(maybeQuote(outName) + ": " + maybeQuote("$" + outName)); + fixups.add(maybeQuote(outName) + ": " + quote("$" + outName)); } } if (!aggregate.getGroupSet().isEmpty()) { @@ -146,7 +146,7 @@ public class MongoAggregateUtils { } else { BiFunction<String, Object, BsonField> mongoAccumulator = mongoAccumulator(aggregationName); if (mongoAccumulator != null) { - return mongoAccumulator.apply(maybeQuote(outName), maybeQuote("$" + inNames.get(0))); + return mongoAccumulator.apply(maybeQuote(outName), "$" + inNames.get(0)); } } return null; diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/MongoPluginImplementor.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/MongoPluginImplementor.java index 2247683..fad7c25 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/MongoPluginImplementor.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/plan/MongoPluginImplementor.java @@ -49,7 +49,7 @@ public class MongoPluginImplementor implements PluginImplementor { visitChild(aggregate.getInput()); operations.addAll( - MongoAggregateUtils.getAggregateOperations(aggregate, aggregate.getRowType(), groupScan)); + MongoAggregateUtils.getAggregateOperations(aggregate, aggregate.getInput().getRowType())); List<String> outNames = MongoAggregateUtils.mongoFieldNames(aggregate.getRowType()); columns = outNames.stream() .map(SchemaPath::getSimplePath) @@ -106,7 +106,18 @@ public class MongoPluginImplementor implements PluginImplementor { // final String aggregateString = "{$project: " + findString + "}"; // final Pair<String, String> op = Pair.of(findString, aggregateString); // implementor.add(op.left, op.right); - final List<String> outNames = MongoAggregateUtils.mongoFieldNames(project.getRowType()); + + List<String> outNames = MongoAggregateUtils.mongoFieldNames(project.getRowType()); +// Document fields = new Document(); +// fields.put(DrillMongoConstants.ID, 0); +// List<String> inNames = MongoAggregateUtils.mongoFieldNames(project.getInput().getRowType()); +// for (int i = 0; i < outNames.size(); i++) { +// String fieldName = outNames.get(i); +// fields.put(fieldName, inNames.get(((RexInputRef) project.getChildExps().get(i)).getIndex())); +// } +// +// operations.add(Aggregates.project(fields).toBsonDocument()); + this.columns = outNames.stream() .map(SchemaPath::getSimplePath) .collect(Collectors.toList()); diff --git a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoQueries.java b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoQueries.java index 18f1ad5..090bad0 100644 --- a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoQueries.java +++ b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoQueries.java @@ -110,7 +110,8 @@ public class TestMongoQueries extends MongoTestBase { public void testCountColumnPushDown() throws Exception { String query = "select count(t.name) as c from mongo.%s.`%s` t"; - queryBuilder().sql(query, DONUTS_DB, DONUTS_COLLECTION) + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) .planMatcher() .exclude("Agg\\(") .include("MongoGroupScan.*group") @@ -125,10 +126,30 @@ public class TestMongoQueries extends MongoTestBase { } @Test + public void testSumColumnPushDown() throws Exception { + String query = "select sum(t.sales) as s from mongo.%s.`%s` t"; + + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) + .planMatcher() + .exclude("Agg\\(") + .include("MongoGroupScan.*group") + .match(); + + testBuilder() + .sqlQuery(query, DONUTS_DB, DONUTS_COLLECTION) + .unOrdered() + .baselineColumns("s") + .baselineValues(1194) + .go(); + } + + @Test public void testCountGroupByPushDown() throws Exception { String query = "select count(t.id) as c, t.type from mongo.%s.`%s` t group by t.type"; - queryBuilder().sql(query, DONUTS_DB, DONUTS_COLLECTION) + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) .planMatcher() .exclude("Agg\\(") .include("MongoGroupScan.*group") @@ -143,10 +164,30 @@ public class TestMongoQueries extends MongoTestBase { } @Test + public void testSumGroupByPushDown() throws Exception { + String query = "select sum(t.sales) s, t.type from mongo.%s.`%s` t group by t.type"; + + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) + .planMatcher() + .exclude("Agg\\(") + .include("MongoGroupScan.*group") + .match(); + + testBuilder() + .sqlQuery(query, DONUTS_DB, DONUTS_COLLECTION) + .unOrdered() + .baselineColumns("s", "type") + .baselineValues(1194, "donut") + .go(); + } + + @Test public void testCountColumnPushDownWithFilter() throws Exception { String query = "select count(t.id) as c from mongo.%s.`%s` t where t.name = 'Cake'"; - queryBuilder().sql(query, DONUTS_DB, DONUTS_COLLECTION) + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) .planMatcher() .exclude("Agg\\(", "Filter") .include("MongoGroupScan.*group") @@ -165,7 +206,8 @@ public class TestMongoQueries extends MongoTestBase { String query = "select t1.id as id, t1.name from mongo.%1$s.`%2$s` t1 where t1.name = 'Cake' union all " + "select t2.id as id, t2.name from mongo.%1$s.`%2$s` t2"; - queryBuilder().sql(query, DONUTS_DB, DONUTS_COLLECTION) + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) .planMatcher() .exclude("UnionAll\\(") .include("MongoGroupScan.*\\$unionWith") @@ -189,7 +231,8 @@ public class TestMongoQueries extends MongoTestBase { String query = "select t1.id as id, t1.name from mongo.%1$s.`%2$s` t1 where t1.name = 'Cake' union " + "select t2.id as id, t2.name from mongo.%1$s.`%2$s` t2 "; - queryBuilder().sql(query, DONUTS_DB, DONUTS_COLLECTION) + queryBuilder() + .sql(query, DONUTS_DB, DONUTS_COLLECTION) .planMatcher() .exclude("UnionAll\\(", "Agg\\(") .include("MongoGroupScan.*\\$unionWith")
