|
15 | 15 | package com.google.firebase.firestore.remote;
|
16 | 16 |
|
17 | 17 | import static com.google.firebase.firestore.model.Values.refValue;
|
| 18 | +import static com.google.firebase.firestore.testutil.TestUtil.andFilter; |
18 | 19 | import static com.google.firebase.firestore.testutil.TestUtil.bound;
|
19 | 20 | import static com.google.firebase.firestore.testutil.TestUtil.deleteMutation;
|
20 | 21 | import static com.google.firebase.firestore.testutil.TestUtil.deletedDoc;
|
|
24 | 25 | import static com.google.firebase.firestore.testutil.TestUtil.key;
|
25 | 26 | import static com.google.firebase.firestore.testutil.TestUtil.map;
|
26 | 27 | import static com.google.firebase.firestore.testutil.TestUtil.mergeMutation;
|
| 28 | +import static com.google.firebase.firestore.testutil.TestUtil.orFilter; |
27 | 29 | import static com.google.firebase.firestore.testutil.TestUtil.orderBy;
|
28 | 30 | import static com.google.firebase.firestore.testutil.TestUtil.patchMutation;
|
29 | 31 | import static com.google.firebase.firestore.testutil.TestUtil.query;
|
@@ -680,6 +682,85 @@ public void testEncodesMultipleFiltersOnDeeperCollections() {
|
680 | 682 | serializer.decodeQueryTarget(serializer.encodeQueryTarget(q.toTarget())), q.toTarget());
|
681 | 683 | }
|
682 | 684 |
|
| 685 | + @Test |
| 686 | + public void testEncodesCompositeFiltersOnDeeperCollections() { |
| 687 | + // (prop < 42) || (author == "dimond" && tags array-contains "pending") |
| 688 | + Query q = |
| 689 | + Query.atPath(ResourcePath.fromString("rooms/1/messages/10/attachments")) |
| 690 | + .filter( |
| 691 | + orFilter( |
| 692 | + filter("prop", "<", 42), |
| 693 | + andFilter( |
| 694 | + filter("author", "==", "dimond"), |
| 695 | + filter("tags", "array-contains", "pending")))); |
| 696 | + Target actual = serializer.encodeTarget(wrapTargetData(q)); |
| 697 | + |
| 698 | + StructuredQuery.Builder structuredQueryBuilder = |
| 699 | + StructuredQuery.newBuilder() |
| 700 | + .addFrom(CollectionSelector.newBuilder().setCollectionId("attachments")) |
| 701 | + .setWhere( |
| 702 | + Filter.newBuilder() |
| 703 | + .setCompositeFilter( |
| 704 | + StructuredQuery.CompositeFilter.newBuilder() |
| 705 | + // TODO(orquery): Replace with Operator.OR once it's available. |
| 706 | + .setOp(CompositeFilter.Operator.OPERATOR_UNSPECIFIED) |
| 707 | + .addFilters( |
| 708 | + Filter.newBuilder() |
| 709 | + .setFieldFilter( |
| 710 | + StructuredQuery.FieldFilter.newBuilder() |
| 711 | + .setField( |
| 712 | + FieldReference.newBuilder().setFieldPath("prop")) |
| 713 | + .setOp(Operator.LESS_THAN) |
| 714 | + .setValue(Value.newBuilder().setIntegerValue(42)))) |
| 715 | + .addFilters( |
| 716 | + Filter.newBuilder() |
| 717 | + .setCompositeFilter( |
| 718 | + StructuredQuery.CompositeFilter.newBuilder() |
| 719 | + .setOp(CompositeFilter.Operator.AND) |
| 720 | + .addFilters( |
| 721 | + Filter.newBuilder() |
| 722 | + .setFieldFilter( |
| 723 | + StructuredQuery.FieldFilter.newBuilder() |
| 724 | + .setField( |
| 725 | + FieldReference.newBuilder() |
| 726 | + .setFieldPath("author")) |
| 727 | + .setOp(Operator.EQUAL) |
| 728 | + .setValue( |
| 729 | + Value.newBuilder() |
| 730 | + .setStringValue("dimond")))) |
| 731 | + .addFilters( |
| 732 | + Filter.newBuilder() |
| 733 | + .setFieldFilter( |
| 734 | + StructuredQuery.FieldFilter.newBuilder() |
| 735 | + .setField( |
| 736 | + FieldReference.newBuilder() |
| 737 | + .setFieldPath("tags")) |
| 738 | + .setOp(Operator.ARRAY_CONTAINS) |
| 739 | + .setValue( |
| 740 | + Value.newBuilder() |
| 741 | + .setStringValue( |
| 742 | + "pending")))))))) |
| 743 | + .addOrderBy( |
| 744 | + Order.newBuilder() |
| 745 | + .setField(FieldReference.newBuilder().setFieldPath("prop")) |
| 746 | + .setDirection(Direction.ASCENDING)) |
| 747 | + .addOrderBy(defaultKeyOrder()); |
| 748 | + QueryTarget.Builder queryBuilder = |
| 749 | + QueryTarget.newBuilder() |
| 750 | + .setParent("projects/p/databases/d/documents/rooms/1/messages/10") |
| 751 | + .setStructuredQuery(structuredQueryBuilder); |
| 752 | + Target expected = |
| 753 | + Target.newBuilder() |
| 754 | + .setQuery(queryBuilder) |
| 755 | + .setTargetId(1) |
| 756 | + .setResumeToken(ByteString.EMPTY) |
| 757 | + .build(); |
| 758 | + |
| 759 | + assertEquals(expected, actual); |
| 760 | + assertEquals( |
| 761 | + serializer.decodeQueryTarget(serializer.encodeQueryTarget(q.toTarget())), q.toTarget()); |
| 762 | + } |
| 763 | + |
683 | 764 | @Test
|
684 | 765 | public void testInSerialization() {
|
685 | 766 | FieldFilter inputFilter = filter("field", "in", asList(42));
|
|
0 commit comments