diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/AggregateIndexExpansionVisitor.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/AggregateIndexExpansionVisitor.java index e352c61b9f..32c102c93b 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/AggregateIndexExpansionVisitor.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/AggregateIndexExpansionVisitor.java @@ -70,7 +70,8 @@ public class AggregateIndexExpansionVisitor extends KeyExpressionExpansionVisitor implements ExpansionVisitor { @Nonnull - private static final Supplier>> aggregateMap = Suppliers.memoize(AggregateIndexExpansionVisitor::computeAggregateMap); + private static final Supplier>> aggregateMap = + Suppliers.memoize(AggregateIndexExpansionVisitor::computeAggregateMap); @Nonnull private final Index index; @@ -218,7 +219,7 @@ private Quantifier constructGroupBy(@Nonnull final Quantifier selectWhereQun, @N // construct aggregation RCV final Value argument; if (groupedValue instanceof EmptyValue) { - argument = RecordConstructorValue.ofColumns(ImmutableList.of()); + argument = QuantifiedObjectValue.of(selectWhereQun); } else if (groupedValue instanceof FieldValue) { final var aliasMap = AliasMap.identitiesFor(Sets.union(selectWhereQun.getCorrelatedTo(), groupedValue.getCorrelatedTo())); @@ -243,15 +244,20 @@ private Quantifier constructGroupBy(@Nonnull final Quantifier selectWhereQun, @N .map(Column::getValue) .collect(ImmutableList.toImmutableList()); final var selectQunValue = selectWhereQun.getRangesOver().get().getResultValue(); - final var aliasMap = AliasMap.identitiesFor(Sets.union(selectQunValue.getCorrelatedTo(), groupingValues.stream().flatMap(v -> v.getCorrelatedTo().stream()).collect(ImmutableSet.toImmutableSet()))); - final var pulledUpGroupingValuesMap = selectQunValue.pullUp(groupingValues, aliasMap, ImmutableSet.of(), selectWhereQun.getAlias()); - final var pulledUpGroupingValues = groupingValues.stream().map(groupingValue -> { - if (!pulledUpGroupingValuesMap.containsKey(groupingValue)) { - throw new RecordCoreException("could not pull grouping value " + groupingValue) - .addLogInfo(LogMessageKeys.VALUE, groupingValue); - } - return pulledUpGroupingValuesMap.get(groupingValue); - }).collect(ImmutableList.toImmutableList()); + final var aliasMap = AliasMap.identitiesFor( + Sets.union(selectQunValue.getCorrelatedTo(), + groupingValues.stream().flatMap(v -> v.getCorrelatedTo().stream()) + .collect(ImmutableSet.toImmutableSet()))); + final var pulledUpGroupingValuesMap = + selectQunValue.pullUp(groupingValues, aliasMap, ImmutableSet.of(), selectWhereQun.getAlias()); + final var pulledUpGroupingValues = + groupingValues.stream().map(groupingValue -> { + if (!pulledUpGroupingValuesMap.containsKey(groupingValue)) { + throw new RecordCoreException("could not pull grouping value " + groupingValue) + .addLogInfo(LogMessageKeys.VALUE, groupingValue); + } + return pulledUpGroupingValuesMap.get(groupingValue); + }).collect(ImmutableList.toImmutableList()); // construct grouping column(s) value, the grouping column is _always_ fixed at position-0 in the underlying select-where. final var groupingColsValue = RecordConstructorValue.ofUnnamed(pulledUpGroupingValues); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBNestedRepeatedQueryTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBNestedRepeatedQueryTest.java index 1ddbc5e7e1..44f07b2dd0 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBNestedRepeatedQueryTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBNestedRepeatedQueryTest.java @@ -73,6 +73,7 @@ import com.apple.foundationdb.record.query.plan.cascades.values.FieldValue; import com.apple.foundationdb.record.query.plan.cascades.values.IndexOnlyAggregateValue; import com.apple.foundationdb.record.query.plan.cascades.values.NumericAggregationValue; +import com.apple.foundationdb.record.query.plan.cascades.values.QuantifiedObjectValue; import com.apple.foundationdb.record.query.plan.cascades.values.RecordConstructorValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; import com.apple.foundationdb.record.query.plan.plans.QueryResult; @@ -1316,7 +1317,7 @@ void countByKeyIndexes() { final Quantifier outerQun = outerRecQun(); final Quantifier entryQun = explodeEntryKeys(outerQun); final Quantifier selectWhere = selectWhereGroupByKey(outerQun, entryQun); - final Quantifier groupBy = groupAggregateByKey(selectWhere, new CountValue.CountFn(), RecordConstructorValue.ofColumns(List.of())); + final Quantifier groupBy = groupAggregateByKey(selectWhere, new CountValue.CountFn(), QuantifiedObjectValue.of(selectWhere)); return unsorted(selectHaving(groupBy)); }); }