Skip to content

Commit 1a2c045

Browse files
authored
add placeholders in all appropriate select expressions (#3451)
1 parent ce8f7c0 commit 1a2c045

File tree

2 files changed

+71
-24
lines changed

2 files changed

+71
-24
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/AggregateIndexExpansionVisitor.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,6 @@ private NonnullPair<Quantifier, List<Placeholder>> constructSelectWhereAndPlaceh
173173

174174
// add the SELECT-WHERE part, where we expose grouping and grouped columns, allowing query fragments that governs
175175
// only these columns to properly bind to this part, similar to how value indices work.
176-
final ImmutableList.Builder<CorrelationIdentifier> placeholders = ImmutableList.builder();
177-
placeholders.addAll(baseExpansion.getPlaceholderAliases());
178176

179177
if (index.hasPredicate()) {
180178
final var filteredIndexPredicate = Objects.requireNonNull(index.getPredicate()).toPredicate(baseQuantifier.getFlowedObjectValue());

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/KeyExpressionExpansionVisitor.java

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.apple.foundationdb.record.metadata.expressions.ThenKeyExpression;
3636
import com.apple.foundationdb.record.query.plan.cascades.KeyExpressionExpansionVisitor.VisitorState;
3737
import com.apple.foundationdb.record.query.plan.cascades.expressions.SelectExpression;
38+
import com.apple.foundationdb.record.query.plan.cascades.predicates.Placeholder;
3839
import com.apple.foundationdb.record.query.plan.cascades.predicates.PredicateWithValueAndRanges;
3940
import com.apple.foundationdb.record.query.plan.cascades.values.EmptyValue;
4041
import com.apple.foundationdb.record.query.plan.cascades.values.FieldValue;
@@ -48,6 +49,8 @@
4849
import java.util.ArrayDeque;
4950
import java.util.Deque;
5051
import java.util.List;
52+
import java.util.Objects;
53+
import java.util.stream.Collectors;
5154

5255
/**
5356
* Expansion visitor that implements the shared logic between primary scan data access and value index access.
@@ -294,31 +297,18 @@ public GraphExpansion visitExpression(@Nonnull final NestingKeyExpression nestin
294297
final SelectExpression selectExpression =
295298
sealedBaseAndChildExpansion.buildSelect();
296299
final Quantifier childQuantifier = Quantifier.forEach(Reference.initialOf(selectExpression));
297-
298-
final var childExpansionValues =
299-
childExpansion.getResultColumns()
300-
.stream()
301-
.map(Column::getValue)
302-
.collect(ImmutableList.toImmutableList());
303300
final var childResultValue = selectExpression.getResultValue();
304-
final var pulledUpValuesMap =
305-
childResultValue.pullUp(childExpansionValues, EvaluationContext.empty(),
306-
AliasMap.emptyMap(), ImmutableSet.of(), childQuantifier.getAlias());
307-
final ImmutableList<Column<? extends Value>> pulledUpExpansionColumns =
308-
childExpansionValues.stream()
309-
.map(value -> {
310-
if (!pulledUpValuesMap.containsKey(value)) {
311-
throw new RecordCoreException("could not pull expansion value " + value)
312-
.addLogInfo(LogMessageKeys.VALUE, value);
313-
}
314-
return pulledUpValuesMap.get(value);
315-
})
316-
.map(Column::unnamedOf)
317-
.collect(ImmutableList.toImmutableList());
318301

319-
return sealedBaseAndChildExpansion
320-
.builderWithInheritedPlaceholders()
302+
final var pulledUpExpansionColumns =
303+
pullUpResultColumns(childExpansion, childResultValue, childQuantifier);
304+
305+
final var pulledUpPlaceholders =
306+
pullUpPlaceholders(childExpansion, childResultValue, childQuantifier);
307+
308+
return GraphExpansion.builder()
321309
.addQuantifier(childQuantifier)
310+
.addAllPredicates(pulledUpPlaceholders)
311+
.addAllPlaceholders(pulledUpPlaceholders)
322312
.addAllResultColumns(pulledUpExpansionColumns)
323313
.build();
324314
}
@@ -328,6 +318,65 @@ public GraphExpansion visitExpression(@Nonnull final NestingKeyExpression nestin
328318
}
329319
}
330320

321+
@Nonnull
322+
private static ImmutableList<Placeholder> pullUpPlaceholders(@Nonnull final GraphExpansion childExpansion,
323+
@Nonnull final Value childResultValue,
324+
@Nonnull final Quantifier childQuantifier) {
325+
final var childExpansionPlaceholderValuesMap =
326+
childExpansion.getPlaceholders()
327+
.stream()
328+
.collect(Collectors.toMap(PredicateWithValueAndRanges::getValue,
329+
Placeholder::getParameterAlias,
330+
(l, r) -> {
331+
if (l.equals(r)) {
332+
return l;
333+
}
334+
throw new RecordCoreException("ambiguous values in placeholder map");
335+
},
336+
LinkedIdentityMap::new));
337+
final var childExpansionPlaceholderValues = childExpansionPlaceholderValuesMap.keySet();
338+
final var pulledUpPlaceholderValuesMap =
339+
childResultValue.pullUp(childExpansionPlaceholderValues, EvaluationContext.empty(),
340+
AliasMap.emptyMap(), ImmutableSet.of(), childQuantifier.getAlias());
341+
return childExpansionPlaceholderValues
342+
.stream()
343+
.map(value -> {
344+
if (!pulledUpPlaceholderValuesMap.containsKey(value)) {
345+
throw new RecordCoreException("could not pull expansion value " + value)
346+
.addLogInfo(LogMessageKeys.VALUE, value);
347+
}
348+
final var pulledUpValue = pulledUpPlaceholderValuesMap.get(value);
349+
final var parameterAlias =
350+
Objects.requireNonNull(childExpansionPlaceholderValuesMap.get(value));
351+
return Placeholder.newInstanceWithoutRanges(pulledUpValue, parameterAlias);
352+
})
353+
.collect(ImmutableList.toImmutableList());
354+
}
355+
356+
@Nonnull
357+
private static ImmutableList<Column<? extends Value>> pullUpResultColumns(@Nonnull final GraphExpansion childExpansion,
358+
@Nonnull final Value childResultValue,
359+
@Nonnull final Quantifier childQuantifier) {
360+
final var childExpansionValues =
361+
childExpansion.getResultColumns()
362+
.stream()
363+
.map(Column::getValue)
364+
.collect(ImmutableList.toImmutableList());
365+
final var pulledUpValuesMap =
366+
childResultValue.pullUp(childExpansionValues, EvaluationContext.empty(),
367+
AliasMap.emptyMap(), ImmutableSet.of(), childQuantifier.getAlias());
368+
return childExpansionValues.stream()
369+
.map(value -> {
370+
if (!pulledUpValuesMap.containsKey(value)) {
371+
throw new RecordCoreException("could not pull expansion value " + value)
372+
.addLogInfo(LogMessageKeys.VALUE, value);
373+
}
374+
return pulledUpValuesMap.get(value);
375+
})
376+
.map(Column::unnamedOf)
377+
.collect(ImmutableList.toImmutableList());
378+
}
379+
331380
@Nonnull
332381
@Override
333382
public GraphExpansion visitExpression(@Nonnull final ThenKeyExpression thenKeyExpression) {

0 commit comments

Comments
 (0)