Skip to content

Commit 6cadd5a

Browse files
committed
first plans
1 parent 6f8edd8 commit 6cadd5a

File tree

12 files changed

+183
-61
lines changed

12 files changed

+183
-61
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
7575
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
7676
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
77+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
7778
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
7879
import com.apple.foundationdb.record.query.plan.plans.TempTableScanPlan;
7980
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
@@ -257,7 +258,7 @@ public Cardinalities visitTempTableInsertPlan(@Nonnull final TempTableInsertPlan
257258
@Nonnull
258259
@Override
259260
public Cardinalities visitRecordQueryIntersectionOnValuesPlan(@Nonnull final RecordQueryIntersectionOnValuesPlan intersectionOnValuesPlan) {
260-
return weakenCardinalities(fromChildren(intersectionOnValuesPlan));
261+
return intersectCardinalities(fromChildren(intersectionOnValuesPlan));
261262
}
262263

263264
@Nonnull
@@ -398,6 +399,12 @@ public Cardinalities visitRecordQueryInUnionPlan(@Nonnull final RecordQueryInUni
398399
return inSourcesCardinalities.times(childCardinalities);
399400
}
400401

402+
@Nonnull
403+
@Override
404+
public Cardinalities visitRecordQueryMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan recordQueryMultiIntersectionOnValuesPlan) {
405+
return intersectCardinalities(fromChildren(recordQueryMultiIntersectionOnValuesPlan));
406+
}
407+
401408
@Nonnull
402409
@Override
403410
public Cardinalities visitRecordQueryInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan element) {
@@ -684,7 +691,8 @@ private Cardinalities intersectCardinalities(@Nonnull Iterable<Cardinalities> ca
684691
maxCardinality = cardinalities.getMaxCardinality();
685692
} else {
686693
if (!cardinalities.getMaxCardinality().isUnknown()) {
687-
maxCardinality = Cardinality.ofCardinality(Math.min(maxCardinality.getCardinality(), cardinalities.getMaxCardinality().getCardinality()));
694+
maxCardinality = Cardinality.ofCardinality(Math.min(maxCardinality.getCardinality(),
695+
cardinalities.getMaxCardinality().getCardinality()));
688696
} else {
689697
maxCardinality = Cardinality.unknownCardinality();
690698
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
6060
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
6161
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
62+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
6263
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
6364
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
6465
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionOnKeyExpressionPlan;
@@ -525,6 +526,12 @@ public Derivations visitInUnionOnKeyExpressionPlan(@Nonnull final RecordQueryInU
525526
throw new RecordCoreException("unsupported plan operator");
526527
}
527528

529+
@Nonnull
530+
@Override
531+
public Derivations visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
532+
return null; //TODO
533+
}
534+
528535
@Nonnull
529536
@Override
530537
public Derivations visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
4747
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
4848
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
49+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
4950
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
5051
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
5152
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionOnKeyExpressionPlan;
@@ -310,6 +311,12 @@ public Boolean visitInUnionOnKeyExpressionPlan(@Nonnull final RecordQueryInUnion
310311
return true;
311312
}
312313

314+
@Nonnull
315+
@Override
316+
public Boolean visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
317+
return true;
318+
}
319+
313320
@Nonnull
314321
@Override
315322
public Boolean visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
5959
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
6060
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
61+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
6162
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
6263
import com.apple.foundationdb.record.query.plan.plans.TempTableScanPlan;
6364
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
@@ -485,6 +486,12 @@ public Ordering visitInUnionOnKeyExpressionPlan(@Nonnull final RecordQueryInUnio
485486
return Ordering.empty();
486487
}
487488

489+
@Nonnull
490+
@Override
491+
public Ordering visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
492+
return Ordering.empty(); // TODO
493+
}
494+
488495
@Nonnull
489496
@Override
490497
public Ordering visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
4848
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
4949
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
50+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
5051
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
5152
import com.apple.foundationdb.record.query.plan.plans.TempTableScanPlan;
5253
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
@@ -306,6 +307,12 @@ public Optional<List<Value>> visitInUnionOnKeyExpressionPlan(@Nonnull final Reco
306307
return primaryKeyFromSingleChild(inUnionOnKeyExpressionPlan);
307308
}
308309

310+
@Nonnull
311+
@Override
312+
public Optional<List<Value>> visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
313+
return Optional.empty();
314+
}
315+
309316
@Nonnull
310317
@Override
311318
public Optional<List<Value>> visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInValuesJoinPlan;
4545
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan;
4646
import com.apple.foundationdb.record.query.plan.plans.RecordQueryInsertPlan;
47+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
4748
import com.apple.foundationdb.record.query.plan.plans.RecordQueryRecursiveUnionPlan;
4849
import com.apple.foundationdb.record.query.plan.plans.TempTableInsertPlan;
4950
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionOnKeyExpressionPlan;
@@ -292,6 +293,12 @@ public Boolean visitInUnionOnKeyExpressionPlan(@Nonnull final RecordQueryInUnion
292293
return true;
293294
}
294295

296+
@Nonnull
297+
@Override
298+
public Boolean visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
299+
return false;
300+
}
301+
295302
@Nonnull
296303
@Override
297304
public Boolean visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

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

Lines changed: 107 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
package com.apple.foundationdb.record.query.plan.cascades.rules;
2222

2323
import com.apple.foundationdb.annotation.API;
24+
import com.apple.foundationdb.record.query.plan.cascades.AggregateIndexMatchCandidate;
2425
import com.apple.foundationdb.record.query.plan.cascades.AliasMap;
2526
import com.apple.foundationdb.record.query.plan.cascades.CascadesPlanner;
2627
import com.apple.foundationdb.record.query.plan.cascades.CascadesRuleCall;
28+
import com.apple.foundationdb.record.query.plan.cascades.Column;
2729
import com.apple.foundationdb.record.query.plan.cascades.ComparisonRange;
2830
import com.apple.foundationdb.record.query.plan.cascades.Compensation;
2931
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
@@ -39,12 +41,18 @@
3941
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;
4042
import com.apple.foundationdb.record.query.plan.cascades.expressions.SelectExpression;
4143
import com.apple.foundationdb.record.query.plan.cascades.matching.structure.BindingMatcher;
44+
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
45+
import com.apple.foundationdb.record.query.plan.cascades.values.QuantifiedObjectValue;
46+
import com.apple.foundationdb.record.query.plan.cascades.values.RecordConstructorValue;
4247
import com.apple.foundationdb.record.query.plan.cascades.values.Value;
43-
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionPlan;
48+
import com.apple.foundationdb.record.query.plan.cascades.values.Values;
49+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
50+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
4451
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan;
4552
import com.apple.foundationdb.record.query.plan.plans.RecordQuerySetPlan;
4653
import com.apple.foundationdb.record.util.pair.NonnullPair;
4754
import com.apple.foundationdb.record.util.pair.Pair;
55+
import com.google.common.base.Verify;
4856
import com.google.common.collect.ImmutableList;
4957
import com.google.common.collect.ImmutableSet;
5058
import com.google.common.collect.Iterables;
@@ -62,8 +70,8 @@
6270

6371
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.MatchPartitionMatchers.ofExpressionAndMatches;
6472
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.MultiMatcher.some;
65-
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.PartialMatchMatchers.matchingAggregateIndexMatchCandidate;
6673
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.PartialMatchMatchers.completeMatch;
74+
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.PartialMatchMatchers.matchingAggregateIndexMatchCandidate;
6775
import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RelationalExpressionMatchers.anyExpression;
6876

6977
/**
@@ -246,19 +254,31 @@ protected IntersectionResult createIntersectionAndCompensation(@Nonnull final Me
246254
RecordQuerySetPlan.resolveComparisonDirection(comparisonOrderingParts);
247255
comparisonOrderingParts = RecordQuerySetPlan.adjustFixedBindings(comparisonOrderingParts, comparisonIsReverse);
248256

249-
final var newQuantifiers =
250-
partition
251-
.stream()
252-
.map(pair -> Objects.requireNonNull(matchToPlanMap.get(pair.getElement().getPartialMatch())))
253-
.map(memoizer::memoizePlans)
254-
.map(Quantifier::physical)
255-
.collect(ImmutableList.toImmutableList());
257+
final var newQuantifiersBuilder = ImmutableList.<Quantifier.Physical>builder();
258+
final var candidateTopAliasesBuilder = ImmutableList.<CorrelationIdentifier>builder();
259+
for (final var singleMatchedAccessWithIndex : partition) {
260+
final var singleMatchedAccess = singleMatchedAccessWithIndex.getElement();
261+
final var plan = Objects.requireNonNull(matchToPlanMap.get(
262+
singleMatchedAccess.getPartialMatch()));
263+
final var reference = memoizer.memoizePlans(plan);
264+
newQuantifiersBuilder.add(Quantifier.physical(reference));
265+
candidateTopAliasesBuilder.add(singleMatchedAccess.getCandidateTopAlias());
266+
}
256267

268+
final var newQuantifiers = newQuantifiersBuilder.build();
269+
final var commonAndPickUpValues =
270+
computeCommonAndPickUpValues(partition, commonPrimaryKeyValues.size());
271+
final var intersectionResultValue =
272+
computeIntersectionResultValue(newQuantifiers, commonAndPickUpValues.getLeft(), commonAndPickUpValues.getRight());
257273
final var intersectionPlan =
258-
RecordQueryIntersectionPlan.fromQuantifiers(newQuantifiers,
259-
comparisonOrderingParts, comparisonIsReverse);
274+
RecordQueryMultiIntersectionOnValuesPlan.intersection(newQuantifiers,
275+
comparisonOrderingParts, intersectionResultValue, comparisonIsReverse);
260276
final var compensatedIntersection =
261-
compensation.applyAllNeededCompensations(memoizer, intersectionPlan);
277+
compensation.applyAllNeededCompensations(memoizer, intersectionPlan,
278+
baseAlias -> computeTranslationMap(baseAlias,
279+
newQuantifiers, candidateTopAliasesBuilder.build(),
280+
(Type.Record)intersectionResultValue.getResultType(),
281+
commonPrimaryKeyValues.size()));
262282
expressionsBuilder.add(compensatedIntersection);
263283
}
264284
}
@@ -267,4 +287,79 @@ protected IntersectionResult createIntersectionAndCompensation(@Nonnull final Me
267287
return IntersectionResult.of(hasCommonOrdering ? intersectionOrdering : null, compensation,
268288
expressionsBuilder.build());
269289
}
290+
291+
@Nonnull
292+
private static NonnullPair<List<Value>, List<Value>> computeCommonAndPickUpValues(@Nonnull final List<Vectored<SingleMatchedAccess>> partition,
293+
final int numGrouped) {
294+
final var commonValuesAndPickUpValueByAccess =
295+
partition
296+
.stream()
297+
.map(singleMatchedAccessWithIndex ->
298+
singleMatchedAccessWithIndex.getElement()
299+
.getPartialMatch()
300+
.getMatchCandidate())
301+
.map(matchCandidate -> (AggregateIndexMatchCandidate)matchCandidate)
302+
.map(AggregateIndexMatchCandidate::getGroupingAndAggregateAccessors)
303+
.collect(ImmutableList.toImmutableList());
304+
305+
final var pickUpValuesBuilder = ImmutableList.<Value>builder();
306+
for (int i = 0; i < commonValuesAndPickUpValueByAccess.size(); i++) {
307+
final var commonAndPickUpValuePair = commonValuesAndPickUpValueByAccess.get(i);
308+
final var commonValues = commonAndPickUpValuePair.getLeft();
309+
Verify.verify(commonValues.size() == numGrouped);
310+
final var pickUpValue = commonAndPickUpValuePair.getRight();
311+
pickUpValuesBuilder.add(pickUpValue);
312+
}
313+
return NonnullPair.of(commonValuesAndPickUpValueByAccess.get(0).getLeft(), pickUpValuesBuilder.build());
314+
}
315+
316+
@Nonnull
317+
private static Value computeIntersectionResultValue(@Nonnull final List<? extends Quantifier> quantifiers,
318+
@Nonnull final List<Value> commonValues,
319+
@Nonnull final List<Value> pickUpValues) {
320+
final var columnBuilder = ImmutableList.<Column<? extends Value>>builder();
321+
322+
// grab the common values from the first quantifier
323+
final var commonTranslationMap =
324+
TranslationMap.ofAliases(Quantifier.current(), quantifiers.get(0).getAlias());
325+
for (final var commonValue : commonValues) {
326+
columnBuilder.add(Column.unnamedOf(commonValue.translateCorrelations(commonTranslationMap)));
327+
}
328+
329+
for (int i = 0; i < quantifiers.size(); i++) {
330+
final var quantifier = quantifiers.get(i);
331+
final var pickUpTranslationMap =
332+
TranslationMap.ofAliases(Quantifier.current(), quantifier.getAlias());
333+
columnBuilder.add(Column.unnamedOf(pickUpValues.get(i).translateCorrelations(pickUpTranslationMap)));
334+
}
335+
336+
return RecordConstructorValue.ofColumns(columnBuilder.build());
337+
}
338+
339+
private static TranslationMap computeTranslationMap(@Nonnull final CorrelationIdentifier intersectionAlias,
340+
@Nonnull final List<? extends Quantifier> quantifiers,
341+
@Nonnull final List<CorrelationIdentifier> candidateTopAliases,
342+
@Nonnull final Type.Record intersectionResultType,
343+
final int numGrouped) {
344+
final var builder = TranslationMap.builder();
345+
final var deconstructedIntersectionValues =
346+
Values.deconstructRecord(QuantifiedObjectValue.of(intersectionAlias, intersectionResultType));
347+
for (int quantifierIndex = 0; quantifierIndex < quantifiers.size(); quantifierIndex++) {
348+
final var quantifier = quantifiers.get(quantifierIndex);
349+
final var quantifierFlowedObjectType = (Type.Record)quantifier.getFlowedObjectType();
350+
final var quantifierFields = quantifierFlowedObjectType.getFields();
351+
Verify.verify(quantifierFields.size() == numGrouped + 1);
352+
final var columnBuilder =
353+
ImmutableList.<Column<? extends Value>>builder();
354+
for (int columnIndex = 0; columnIndex < numGrouped; columnIndex++) {
355+
columnBuilder.add(Column.of(quantifierFields.get(columnIndex), deconstructedIntersectionValues.get(columnIndex)));
356+
}
357+
columnBuilder.add(Column.of(quantifierFields.get(numGrouped),
358+
deconstructedIntersectionValues.get(numGrouped + quantifierIndex)));
359+
builder.when(candidateTopAliases.get(quantifierIndex)).then((alias, leaf) ->
360+
RecordConstructorValue.ofColumns(columnBuilder.build()));
361+
}
362+
363+
return builder.build();
364+
}
270365
}

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainPlanVisitor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionPlan;
5353
import com.apple.foundationdb.record.query.plan.plans.RecordQueryLoadByKeysPlan;
5454
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMapPlan;
55+
import com.apple.foundationdb.record.query.plan.plans.RecordQueryMultiIntersectionOnValuesPlan;
5556
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan;
5657
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlanVisitor;
5758
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlanWithExplain;
@@ -328,6 +329,12 @@ public ExplainTokens visitInComparandJoinPlan(@Nonnull final RecordQueryInCompar
328329
return visitInJoinPlan(inComparandJoinPlan);
329330
}
330331

332+
@Nonnull
333+
@Override
334+
public ExplainTokens visitMultiIntersectionOnValuesPlan(@Nonnull final RecordQueryMultiIntersectionOnValuesPlan element) {
335+
return new ExplainTokens().addToString("TODO"); // TODO
336+
}
337+
331338
@Nonnull
332339
@Override
333340
public ExplainTokens visitInParameterJoinPlan(@Nonnull final RecordQueryInParameterJoinPlan inParameterJoinPlan) {

0 commit comments

Comments
 (0)