Skip to content

Commit 323d426

Browse files
hatyonormen662
andauthored
Value translation API for Cascades (#2498)
* Add test file. * Working version. * * WIP. * Ignore .idea/scala_settings.xml. * Tests are passing. - The ValueMatchMatchUsingBoundEquivalence test suite is failing (test 5). - Everything else works. * Checkpoint. * PRod-candidate. * Introduce ValueTranslation API. * Remove redundant test file * Remove .idea/scala_settings.xml * Refactoring * Cleanup. * Refactoring, introduce composite translators. * Cleanup, update release-notes. * Address comments. * reduce API exposure before some refactorings * more refactorings * mostly refactored * Further refactoring / documentation. * Address PMD style violations. * address comments. * Address comments. --------- Co-authored-by: Normen Seemann <[email protected]>
1 parent f2c982c commit 323d426

File tree

118 files changed

+1824
-191
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+1824
-191
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ atlassian-ide-plugin.xml
4141
.idea/compiler.xml
4242
.idea/gradle.xml
4343
.idea/jarRepositories.xml
44+
.idea/scala_settings.xml
4445
.idea/shelf
4546

4647
# VSCode specific files/directories

docs/ReleaseNotes.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ Starting with version [3.4.455.0](#344550), the semantics of `UnnestedRecordType
2525
* **Performance** Improvement 1 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
2626
* **Performance** Improvement 2 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
2727
* **Performance** Improvement 3 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
28-
* **Performance** Improvement 4 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
28+
* **Performance** Implement a proper copy-on-write `replace` for `TreeLike` [(Issue #2500)](https://github.com/FoundationDB/fdb-record-layer/issues/2500)
2929
* **Performance** Improvement 5 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3030
* **Feature** Feature 1 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3131
* **Feature** Feature 2 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3232
* **Feature** Feature 3 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3333
* **Feature** Feature 4 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
34-
* **Feature** Feature 5 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
34+
* **Feature** API for robust matching of `Value`s [(Issue #2499)](https://github.com/FoundationDB/fdb-record-layer/issues/2499)
3535
* **Breaking change** Change 1 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3636
* **Breaking change** Change 2 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)
3737
* **Breaking change** Change 3 [(Issue #NNN)](https://github.com/FoundationDB/fdb-record-layer/issues/NNN)

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/provider/foundationdb/IndexScanComparisons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import com.apple.foundationdb.record.query.plan.ScanComparisons;
3434
import com.apple.foundationdb.record.query.plan.cascades.AliasMap;
3535
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
36-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
36+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3737
import com.apple.foundationdb.record.query.plan.cascades.explain.Attribute;
3838
import com.google.auto.service.AutoService;
3939
import com.google.common.collect.ImmutableList;

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/provider/foundationdb/IndexScanParameters.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import com.apple.foundationdb.record.RecordQueryPlanProto.PIndexScanParameters;
3030
import com.apple.foundationdb.record.metadata.Index;
3131
import com.apple.foundationdb.record.query.plan.cascades.Correlated;
32-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
32+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3333
import com.apple.foundationdb.record.query.plan.cascades.explain.Attribute;
3434
import com.apple.foundationdb.record.query.plan.serialization.PlanSerialization;
3535
import com.google.common.collect.ImmutableList;

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/provider/foundationdb/MultidimensionalIndexScanComparisons.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import com.apple.foundationdb.record.query.plan.ScanComparisons;
3636
import com.apple.foundationdb.record.query.plan.cascades.AliasMap;
3737
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
38-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
38+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3939
import com.apple.foundationdb.record.query.plan.cascades.explain.Attribute;
4040
import com.google.auto.service.AutoService;
4141
import com.google.common.collect.ImmutableList;

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/expressions/Comparisons.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
import com.apple.foundationdb.record.query.plan.cascades.AliasMap;
5757
import com.apple.foundationdb.record.query.plan.cascades.Correlated;
5858
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
59-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
59+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
6060
import com.apple.foundationdb.record.query.plan.cascades.values.LikeOperatorValue;
6161
import com.apple.foundationdb.record.query.plan.cascades.values.Value;
6262
import com.apple.foundationdb.record.query.plan.plans.QueryResult;
@@ -1461,7 +1461,7 @@ public Comparison translateCorrelations(@Nonnull final TranslationMap translatio
14611461
return this;
14621462
}
14631463

1464-
return new ValueComparison(type, comparandValue.translateCorrelations(translationMap), parameterRelationshipGraph);
1464+
return new ValueComparison(type, comparandValue.translateCorrelations(translationMap, false), parameterRelationshipGraph);
14651465
}
14661466

14671467
@Nonnull

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/expressions/RecordTypeKeyComparison.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import com.apple.foundationdb.record.query.plan.ScanComparisons;
3535
import com.apple.foundationdb.record.query.plan.cascades.GraphExpansion;
3636
import com.apple.foundationdb.record.query.plan.cascades.Quantifier;
37-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
37+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3838
import com.apple.foundationdb.record.query.plan.cascades.values.RecordTypeValue;
3939
import com.apple.foundationdb.record.util.HashUtils;
4040
import com.google.auto.service.AutoService;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import com.apple.foundationdb.record.query.plan.cascades.ComparisonRange;
3939
import com.apple.foundationdb.record.query.plan.cascades.Correlated;
4040
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
41-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
41+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
4242
import com.apple.foundationdb.record.query.plan.cascades.matching.structure.BindingMatcher;
4343
import com.apple.foundationdb.record.query.plan.cascades.matching.structure.CollectionMatcher;
4444
import com.apple.foundationdb.record.query.plan.cascades.matching.structure.Extractor;

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/bitmap/ComposedBitmapIndexQueryPlan.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import com.apple.foundationdb.record.query.plan.cascades.AliasMap;
3838
import com.apple.foundationdb.record.query.plan.cascades.CorrelationIdentifier;
3939
import com.apple.foundationdb.record.query.plan.cascades.Quantifier;
40-
import com.apple.foundationdb.record.query.plan.cascades.TranslationMap;
40+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
4141
import com.apple.foundationdb.record.query.plan.cascades.explain.NodeInfo;
4242
import com.apple.foundationdb.record.query.plan.cascades.explain.PlannerGraph;
4343
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public List<MatchedOrderingPart> computeMatchedOrderingParts(@Nonnull final Matc
188188
final var builder = ImmutableList.<MatchedOrderingPart>builder();
189189
final var candidateParameterIds = getOrderingAliases();
190190
final List<Value> deconstructedValue = Values.deconstructRecord(selectHavingResultValue);
191-
final AliasMap aliasMap = AliasMap.of(Iterables.getOnlyElement(selectHavingResultValue.getCorrelatedTo()), Quantifier.current());
191+
final AliasMap aliasMap = AliasMap.ofAliases(Iterables.getOnlyElement(selectHavingResultValue.getCorrelatedTo()), Quantifier.current());
192192

193193
// Compute the ordering for this index by collecting the result values of the selectHaving statement
194194
// associated with each sortParameterId. Note that for most aggregate indexes, the aggregate value is
@@ -258,7 +258,7 @@ public Ordering computeOrderingFromScanComparisons(@Nonnull final ScanComparison
258258
}
259259

260260
final List<Value> deconstructedValue = Values.deconstructRecord(selectHavingResultValue);
261-
final AliasMap aliasMap = AliasMap.of(Iterables.getOnlyElement(selectHavingResultValue.getCorrelatedTo()), Quantifier.current());
261+
final AliasMap aliasMap = AliasMap.ofAliases(Iterables.getOnlyElement(selectHavingResultValue.getCorrelatedTo()), Quantifier.current());
262262

263263
// TODO include the aggregate Value itself in the ordering.
264264
final var normalizedKeyExpressions = groupingKey.normalizeKeyForPositions();

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public int size() {
256256
* @return a new builder derived from the contents of this map.
257257
*/
258258
@Nonnull
259-
public Builder derived() {
259+
public Builder toBuilder() {
260260
return builder().putAll(this);
261261
}
262262

@@ -267,7 +267,7 @@ public Builder derived() {
267267
* @return a new builder derived from the contents of this map.
268268
*/
269269
@Nonnull
270-
public Builder derived(final int expectedAdditionalElements) {
270+
public Builder toBuilder(final int expectedAdditionalElements) {
271271
return builder(expectedAdditionalElements).putAll(this);
272272
}
273273

@@ -598,7 +598,7 @@ public static AliasMap emptyMap() {
598598
* @return a new {@link AliasMap} containing exactly the binding {@code source -> target}
599599
*/
600600
@Nonnull
601-
public static AliasMap of(@Nonnull final CorrelationIdentifier source, @Nonnull final CorrelationIdentifier target) {
601+
public static AliasMap ofAliases(@Nonnull final CorrelationIdentifier source, @Nonnull final CorrelationIdentifier target) {
602602
return new AliasMap(ImmutableBiMap.of(source, target), source.equals(target));
603603
}
604604

@@ -737,6 +737,9 @@ public Builder zip(@Nonnull final List<CorrelationIdentifier> left, @Nonnull fin
737737
*/
738738
@Nonnull
739739
public AliasMap build() {
740+
if (map.isEmpty()) {
741+
return AliasMap.emptyMap();
742+
}
740743
return AliasMap.copyOf(map);
741744
}
742745
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreBase;
2929
import com.apple.foundationdb.record.query.expressions.Comparisons;
3030
import com.apple.foundationdb.record.query.plan.ScanComparisons;
31+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3132
import com.google.common.base.Verify;
3233
import com.google.common.collect.ImmutableList;
3334
import com.google.common.collect.ImmutableSet;

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

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.apple.foundationdb.record.query.expressions.NestedField;
3232
import com.apple.foundationdb.record.query.expressions.QueryComponent;
3333
import com.apple.foundationdb.record.query.plan.ScanComparisons;
34+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3435
import com.google.common.base.Preconditions;
3536
import com.google.common.base.Verify;
3637
import com.google.common.collect.ImmutableList;

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

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.apple.foundationdb.record.query.plan.cascades.predicates.QueryPredicate;
2828
import com.apple.foundationdb.record.query.plan.cascades.rules.DataAccessRule;
2929
import com.apple.foundationdb.record.query.plan.cascades.values.Value;
30+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3031
import com.google.common.base.Suppliers;
3132
import com.google.common.base.Verify;
3233
import com.google.common.collect.ImmutableList;

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

+5
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,10 @@ public boolean equals(final Object o) {
241241
public int hashCode() {
242242
return Objects.hash(aliasMap);
243243
}
244+
245+
@Override
246+
public String toString() {
247+
return "≌[" + aliasMap + "]";
248+
}
244249
}
245250
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.apple.foundationdb.record.RecordCoreException;
2525
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;
2626
import com.apple.foundationdb.record.query.plan.cascades.typing.Typed;
27+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
2728
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan;
2829

2930
import javax.annotation.Nonnull;

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

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;
2727
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpressionWithChildren;
2828
import com.apple.foundationdb.record.query.plan.cascades.properties.ReferencesAndDependenciesProperty;
29+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
2930
import com.google.common.base.Verify;
3031
import com.google.common.collect.ImmutableList;
3132
import com.google.common.collect.Maps;

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;
2828
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpressionWithChildren;
2929
import com.apple.foundationdb.record.query.plan.cascades.typing.Type;
30+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3031
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan;
3132
import com.google.common.base.Verify;
3233
import com.google.common.collect.ImmutableList;
@@ -559,7 +560,7 @@ private static boolean containsInMember(@Nonnull final RelationalExpression memb
559560
return rangesOver.containsAllInMemo(otherRangesOver, nestedEquivalencesMap);
560561
}));
561562
} else {
562-
final AliasMap.Builder aliasMapBuilder = combinedEquivalenceMap.derived(quantifiers.size());
563+
final AliasMap.Builder aliasMapBuilder = combinedEquivalenceMap.toBuilder(quantifiers.size());
563564
for (int i = 0; i < quantifiers.size(); i++) {
564565
final Quantifier quantifier = Objects.requireNonNull(quantifiers.get(i));
565566
final Quantifier otherQuantifier = Objects.requireNonNull(otherQuantifiers.get(i));

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

+45-11
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package com.apple.foundationdb.record.query.plan.cascades;
2222

2323
import com.google.common.base.Verify;
24+
import com.google.common.collect.ImmutableList;
2425
import com.google.common.collect.Iterables;
2526
import org.apache.commons.lang3.tuple.MutablePair;
2627
import org.apache.commons.lang3.tuple.Pair;
@@ -30,8 +31,8 @@
3031
import java.util.ArrayDeque;
3132
import java.util.Deque;
3233
import java.util.Iterator;
33-
import java.util.List;
3434
import java.util.NoSuchElementException;
35+
import java.util.function.Predicate;
3536

3637
/**
3738
* An iterator that accesses all elements of a {@link TreeLike} object in pre-order fashion.
@@ -44,20 +45,28 @@
4445
* @param <T> The type of the iterator element.
4546
*/
4647
@NotThreadSafe
47-
public final class PreOrderIterator<T extends TreeLike<T>> implements Iterator<T> {
48+
public final class PreOrderPruningIterator<T extends TreeLike<T>> implements Iterator<T> {
4849

4950
@Nonnull
5051
private final Deque<Pair<Iterable<? extends T>, Integer>> stack;
5152

53+
@Nonnull
54+
private final Predicate<T> descendIntoChildrenPredicate;
55+
5256
private static final int INITIAL_POSITION = -1;
5357

54-
private PreOrderIterator(@Nonnull final T traversable) {
58+
private PreOrderPruningIterator(@Nonnull final T treeLike) {
59+
this(treeLike, ignored -> true);
60+
}
61+
62+
private PreOrderPruningIterator(@Nonnull final T treeLike, @Nonnull final Predicate<T> descendIntoChildrenPredicate) {
5563
// initialize the stack with the {@link TreeLike}'s depth as capacity to avoid resizing.
56-
stack = new ArrayDeque<>(traversable.height());
64+
stack = new ArrayDeque<>(treeLike.height());
5765
// this is the only list allocation done to put the root in the stack.
5866
// all the remaining lists added to the stack are references to children
5967
// lists (copy by reference).
60-
stack.push(MutablePair.of(List.of(traversable.getThis()), INITIAL_POSITION));
68+
stack.push(MutablePair.of(ImmutableList.of(treeLike.getThis()), INITIAL_POSITION));
69+
this.descendIntoChildrenPredicate = descendIntoChildrenPredicate;
6170
}
6271

6372
@Override
@@ -97,17 +106,42 @@ public T next() {
97106
// that incrementing it would lead to finding that next element correctly.
98107
final var result = Iterables.get(currentLevelItems, nextItemIndex);
99108
top.setValue(nextItemIndex);
100-
final var resultChildren = result.getChildren();
101109

102-
// descend immediately to the children (if any) so to conform to pre-order DFS semantics.
103-
if (!Iterables.isEmpty(resultChildren)) {
104-
stack.add(MutablePair.of(resultChildren, INITIAL_POSITION));
110+
// test whether we should descend into the children of the current node or prune them
111+
// and continue to the next unexplored node in pre-order.
112+
if (descendIntoChildrenPredicate.test(result)) {
113+
final var resultChildren = result.getChildren();
114+
115+
// descend immediately to the children (if any) so to conform to pre-order DFS semantics.
116+
if (!Iterables.isEmpty(resultChildren)) {
117+
stack.add(MutablePair.of(resultChildren, INITIAL_POSITION));
118+
}
105119
}
106120
return result;
107121
}
108122

123+
/**
124+
* Retuns an iterator that traverses {@code treeLike} in pre-order.
125+
* @param treeLike a {@link TreeLike} treeLike.
126+
* @param <T> The type of {@code treeLike} items.
127+
* @return an iterator that traverses the items in pre-order.
128+
*/
129+
@Nonnull
130+
public static <T extends TreeLike<T>> PreOrderPruningIterator<T> over(@Nonnull final T treeLike) {
131+
return new PreOrderPruningIterator<>(treeLike);
132+
}
133+
134+
/**
135+
* Retuns an iterator that traverses {@code treeLike} in pre-order with a children-pruning condition.
136+
* @param treeLike a {@link TreeLike} treeLike.
137+
* @param descendIntoChildrenPredicate a condition that determines whether, for the currently visited node, the iterator
138+
* should descend to the children or not.
139+
* @param <T> The type of {@code treeLike} items.
140+
* @return an iterator that traverses the items in pre-order.
141+
*/
109142
@Nonnull
110-
public static <T extends TreeLike<T>> PreOrderIterator<T> over(@Nonnull final T traversable) {
111-
return new PreOrderIterator<>(traversable);
143+
public static <T extends TreeLike<T>> PreOrderPruningIterator<T> overWithPruningPredicate(@Nonnull final T treeLike,
144+
@Nonnull Predicate<T> descendIntoChildrenPredicate) {
145+
return new PreOrderPruningIterator<>(treeLike, descendIntoChildrenPredicate);
112146
}
113147
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.apple.foundationdb.record.query.plan.QueryPlanConstraint;
2424
import com.apple.foundationdb.record.query.plan.cascades.predicates.PredicateWithValueAndRanges;
2525
import com.apple.foundationdb.record.query.plan.cascades.predicates.QueryPredicate;
26+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
2627
import com.google.common.collect.ImmutableSetMultimap;
2728
import com.google.common.collect.Iterables;
2829
import com.google.common.collect.Multimaps;

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

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.apple.foundationdb.record.query.plan.cascades.typing.Type.Record.Field;
3232
import com.apple.foundationdb.record.query.plan.cascades.values.FieldValue;
3333
import com.apple.foundationdb.record.query.plan.cascades.values.QuantifiedObjectValue;
34+
import com.apple.foundationdb.record.query.plan.cascades.values.translation.TranslationMap;
3435
import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan;
3536
import com.google.common.base.Suppliers;
3637
import com.google.common.base.Verify;

0 commit comments

Comments
 (0)