35
35
import com .apple .foundationdb .record .metadata .expressions .ThenKeyExpression ;
36
36
import com .apple .foundationdb .record .query .plan .cascades .KeyExpressionExpansionVisitor .VisitorState ;
37
37
import com .apple .foundationdb .record .query .plan .cascades .expressions .SelectExpression ;
38
+ import com .apple .foundationdb .record .query .plan .cascades .predicates .Placeholder ;
38
39
import com .apple .foundationdb .record .query .plan .cascades .predicates .PredicateWithValueAndRanges ;
39
40
import com .apple .foundationdb .record .query .plan .cascades .values .EmptyValue ;
40
41
import com .apple .foundationdb .record .query .plan .cascades .values .FieldValue ;
48
49
import java .util .ArrayDeque ;
49
50
import java .util .Deque ;
50
51
import java .util .List ;
52
+ import java .util .Objects ;
53
+ import java .util .stream .Collectors ;
51
54
52
55
/**
53
56
* 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
294
297
final SelectExpression selectExpression =
295
298
sealedBaseAndChildExpansion .buildSelect ();
296
299
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 ());
303
300
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 ());
318
301
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 ()
321
309
.addQuantifier (childQuantifier )
310
+ .addAllPredicates (pulledUpPlaceholders )
311
+ .addAllPlaceholders (pulledUpPlaceholders )
322
312
.addAllResultColumns (pulledUpExpansionColumns )
323
313
.build ();
324
314
}
@@ -328,6 +318,65 @@ public GraphExpansion visitExpression(@Nonnull final NestingKeyExpression nestin
328
318
}
329
319
}
330
320
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
+
331
380
@ Nonnull
332
381
@ Override
333
382
public GraphExpansion visitExpression (@ Nonnull final ThenKeyExpression thenKeyExpression ) {
0 commit comments