Skip to content

Commit c51c39d

Browse files
committed
Add tests and fix bugs for BuildTargetIndex
1 parent 8aed796 commit c51c39d

File tree

2 files changed

+179
-6
lines changed

2 files changed

+179
-6
lines changed

firebase-firestore/src/main/java/com/google/firebase/firestore/model/TargetIndexMatcher.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import com.google.firebase.firestore.core.OrderBy;
2323
import com.google.firebase.firestore.core.Target;
2424
import java.util.ArrayList;
25+
import java.util.HashSet;
2526
import java.util.Iterator;
2627
import java.util.List;
28+
import java.util.Set;
2729

2830
/**
2931
* A light query planner for Firestore.
@@ -187,21 +189,35 @@ public boolean servedByIndex(FieldIndex index) {
187189
}
188190

189191
public FieldIndex BuildTargetIndex() {
192+
Set<FieldPath> uniqueFields = new HashSet<>();
190193
List<FieldIndex.Segment> segments = new ArrayList<>();
191194

192195
for (FieldFilter filter : equalityFilters) {
196+
if (filter.getField().isKeyField()) {
197+
continue;
198+
}
193199
boolean isArrayOperator =
194200
filter.getOperator().equals(FieldFilter.Operator.ARRAY_CONTAINS)
195201
|| filter.getOperator().equals(FieldFilter.Operator.ARRAY_CONTAINS_ANY);
196-
segments.add(
197-
FieldIndex.Segment.create(
198-
filter.getField(),
199-
isArrayOperator
200-
? FieldIndex.Segment.Kind.CONTAINS
201-
: FieldIndex.Segment.Kind.ASCENDING));
202+
if (isArrayOperator) {
203+
segments.add(
204+
FieldIndex.Segment.create(filter.getField(), FieldIndex.Segment.Kind.CONTAINS));
205+
} else {
206+
if (uniqueFields.contains(filter.getField())) {
207+
continue;
208+
}
209+
uniqueFields.add(filter.getField());
210+
segments.add(
211+
FieldIndex.Segment.create(filter.getField(), FieldIndex.Segment.Kind.ASCENDING));
212+
}
202213
}
203214

204215
for (OrderBy orderBy : orderBys) {
216+
if (uniqueFields.contains(orderBy.getField())) {
217+
continue;
218+
}
219+
uniqueFields.add(orderBy.getField());
220+
205221
segments.add(
206222
FieldIndex.Segment.create(
207223
orderBy.getField(),

firebase-firestore/src/test/java/com/google/firebase/firestore/model/TargetIndexMatcherTest.java

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,163 @@ public void withMultipleNotIn() {
440440
validateServesTarget(q, "a", FieldIndex.Segment.Kind.ASCENDING);
441441
}
442442

443+
@Test
444+
public void buildTargetIndex() {
445+
Query q =
446+
query("collId")
447+
.filter(filter("a", "==", 1))
448+
.filter(filter("b", "==", 2))
449+
.orderBy(orderBy("__name__", "desc"));
450+
TargetIndexMatcher targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
451+
FieldIndex expectedIndex = targetIndexMatcher.BuildTargetIndex();
452+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
453+
454+
q = query("collId").orderBy(orderBy("a"));
455+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
456+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
457+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
458+
459+
q = query("collId").orderBy(orderBy("a")).orderBy(orderBy("b"));
460+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
461+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
462+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
463+
464+
q = query("collId").filter(filter("a", "array-contains", "a")).orderBy(orderBy("b"));
465+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
466+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
467+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
468+
469+
q = query("collId").orderBy(orderBy("b"));
470+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
471+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
472+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
473+
474+
q = query("collId").orderBy(orderBy("a"));
475+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
476+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
477+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
478+
479+
q = query("collId").filter(filter("a", ">", 1)).filter(filter("a", "<", 10));
480+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
481+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
482+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
483+
484+
q = query("collId").filter(filter("a", "in", Arrays.asList(1, 2))).filter(filter("b", "==", 5));
485+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
486+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
487+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
488+
489+
q = query("collId").filter(filter("value", "array-contains", "foo")).orderBy(orderBy("value"));
490+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
491+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
492+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
493+
494+
q =
495+
query("collId")
496+
.filter(filter("a", "array-contains", "a"))
497+
.filter(filter("a", ">", "b"))
498+
.orderBy(orderBy("a", "asc"));
499+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
500+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
501+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
502+
503+
q = query("collId").filter(filter("a", "==", 1)).orderBy(orderBy("__name__", "desc"));
504+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
505+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
506+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
507+
508+
q = query("collId").filter(filter("a1", "==", "a")).filter(filter("a2", "==", "b"));
509+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
510+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
511+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
512+
513+
q =
514+
query("collId")
515+
.filter(filter("equality1", "==", "a"))
516+
.filter(filter("equality2", "==", "b"))
517+
.filter(filter("inequality", ">=", "c"));
518+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
519+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
520+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
521+
522+
q =
523+
query("collId")
524+
.filter(filter("equality1", "==", "a"))
525+
.filter(filter("inequality", ">=", "c"))
526+
.filter(filter("equality2", "==", "b"));
527+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
528+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
529+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
530+
531+
q = query("collId").orderBy(orderBy("a"));
532+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
533+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
534+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
535+
536+
q = query("collId").orderBy(orderBy("a", "desc"));
537+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
538+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
539+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
540+
541+
q = query("collId").orderBy(orderBy("a")).orderBy(orderBy("__name__"));
542+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
543+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
544+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
545+
546+
q = query("collId").filter(filter("a", "!=", 1));
547+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
548+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
549+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
550+
551+
q = query("collId").filter(filter("a", "!=", 1)).orderBy(orderBy("a")).orderBy(orderBy("b"));
552+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
553+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
554+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
555+
556+
q = query("collId").filter(filter("a", "==", "a")).filter(filter("b", ">", "b"));
557+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
558+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
559+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
560+
561+
q =
562+
query("collId")
563+
.filter(filter("a1", "==", "a"))
564+
.filter(filter("a2", ">", "b"))
565+
.orderBy(orderBy("a2", "asc"));
566+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
567+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
568+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
569+
570+
q =
571+
query("collId")
572+
.filter(filter("a", ">=", 1))
573+
.filter(filter("a", "==", 5))
574+
.filter(filter("a", "<=", 10));
575+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
576+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
577+
// assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
578+
579+
q =
580+
query("collId")
581+
.filter(filter("a", "not-in", Arrays.asList(1, 2, 3)))
582+
.filter(filter("a", ">=", 2));
583+
targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
584+
expectedIndex = targetIndexMatcher.BuildTargetIndex();
585+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
586+
}
587+
588+
@Test
589+
public void failedTest() {
590+
Query q =
591+
query("collId")
592+
.filter(filter("a", ">=", 1))
593+
.filter(filter("a", "==", 5))
594+
.filter(filter("a", "<=", 10));
595+
TargetIndexMatcher targetIndexMatcher = new TargetIndexMatcher(q.toTarget());
596+
FieldIndex expectedIndex = targetIndexMatcher.BuildTargetIndex();
597+
assertTrue(targetIndexMatcher.servedByIndex(expectedIndex));
598+
}
599+
443600
@Test
444601
public void withMultipleOrderBys() {
445602
Query q =

0 commit comments

Comments
 (0)