Skip to content

Commit aae6dc9

Browse files
feat: add implicit ordering for startAt(DocumentReference) calls (#417)
1 parent 2054ae9 commit aae6dc9

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

google-cloud-firestore/src/main/java/com/google/cloud/firestore/Query.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -988,9 +988,14 @@ public Query startAt(@Nonnull DocumentSnapshot snapshot) {
988988
*/
989989
@Nonnull
990990
public Query startAt(Object... fieldValues) {
991-
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, true);
991+
ImmutableList<FieldOrder> fieldOrders =
992+
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
993+
? createImplicitOrderBy()
994+
: options.getFieldOrders();
995+
Cursor cursor = createCursor(fieldOrders, fieldValues, true);
992996

993997
Builder newOptions = options.toBuilder();
998+
newOptions.setFieldOrders(fieldOrders);
994999
newOptions.setStartCursor(cursor);
9951000
return new Query(rpcContext, newOptions.build());
9961001
}
@@ -1069,9 +1074,14 @@ public Query startAfter(@Nonnull DocumentSnapshot snapshot) {
10691074
* @return The created Query.
10701075
*/
10711076
public Query startAfter(Object... fieldValues) {
1072-
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, false);
1077+
ImmutableList<FieldOrder> fieldOrders =
1078+
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
1079+
? createImplicitOrderBy()
1080+
: options.getFieldOrders();
1081+
Cursor cursor = createCursor(fieldOrders, fieldValues, false);
10731082

10741083
Builder newOptions = options.toBuilder();
1084+
newOptions.setFieldOrders(fieldOrders);
10751085
newOptions.setStartCursor(cursor);
10761086
return new Query(rpcContext, newOptions.build());
10771087
}
@@ -1105,9 +1115,14 @@ public Query endBefore(@Nonnull DocumentSnapshot snapshot) {
11051115
*/
11061116
@Nonnull
11071117
public Query endBefore(Object... fieldValues) {
1108-
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, true);
1118+
ImmutableList<FieldOrder> fieldOrders =
1119+
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
1120+
? createImplicitOrderBy()
1121+
: options.getFieldOrders();
1122+
Cursor cursor = createCursor(fieldOrders, fieldValues, true);
11091123

11101124
Builder newOptions = options.toBuilder();
1125+
newOptions.setFieldOrders(fieldOrders);
11111126
newOptions.setEndCursor(cursor);
11121127
return new Query(rpcContext, newOptions.build());
11131128
}
@@ -1121,9 +1136,14 @@ public Query endBefore(Object... fieldValues) {
11211136
*/
11221137
@Nonnull
11231138
public Query endAt(Object... fieldValues) {
1124-
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, false);
1139+
ImmutableList<FieldOrder> fieldOrders =
1140+
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
1141+
? createImplicitOrderBy()
1142+
: options.getFieldOrders();
1143+
Cursor cursor = createCursor(fieldOrders, fieldValues, false);
11251144

11261145
Builder newOptions = options.toBuilder();
1146+
newOptions.setFieldOrders(fieldOrders);
11271147
newOptions.setEndCursor(cursor);
11281148
return new Query(rpcContext, newOptions.build());
11291149
}

google-cloud-firestore/src/test/java/com/google/cloud/firestore/QueryTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.cloud.firestore.LocalFirestoreHelper.COLLECTION_ID;
2020
import static com.google.cloud.firestore.LocalFirestoreHelper.DOCUMENT_NAME;
21+
import static com.google.cloud.firestore.LocalFirestoreHelper.DOCUMENT_PATH;
2122
import static com.google.cloud.firestore.LocalFirestoreHelper.SINGLE_FIELD_SNAPSHOT;
2223
import static com.google.cloud.firestore.LocalFirestoreHelper.endAt;
2324
import static com.google.cloud.firestore.LocalFirestoreHelper.filter;
@@ -598,6 +599,26 @@ public void withDocumentIdAndDocumentSnapshotCursor() {
598599
assertEquals(queryRequest, runQuery.getValue());
599600
}
600601

602+
@Test
603+
public void withDocumentReferenceCursor() {
604+
doAnswer(queryResponse())
605+
.when(firestoreMock)
606+
.streamRequest(
607+
runQuery.capture(),
608+
streamObserverCapture.capture(),
609+
Matchers.<ServerStreamingCallable>any());
610+
611+
DocumentReference documentCursor = firestoreMock.document(DOCUMENT_PATH);
612+
Value documentValue = reference(DOCUMENT_NAME);
613+
614+
query.startAt(documentCursor).get();
615+
616+
RunQueryRequest queryRequest =
617+
query(order("__name__", StructuredQuery.Direction.ASCENDING), startAt(documentValue, true));
618+
619+
assertEquals(queryRequest, runQuery.getValue());
620+
}
621+
601622
@Test
602623
public void withExtractedDirectionForDocumentSnapshotCursor() {
603624
doAnswer(queryResponse())

google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITSystemTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,20 @@ public void startAfter() throws Exception {
554554
assertEquals(2L, querySnapshot.getDocuments().get(0).get("foo"));
555555
}
556556

557+
@Test
558+
public void startAfterAddsAnImplicitOrderByForDocumentReferences() throws Exception {
559+
DocumentReference doc1 = randomColl.document("doc1");
560+
DocumentReference doc2 = randomColl.document("doc2");
561+
562+
doc1.set(map("foo", 1)).get();
563+
doc2.set(map("foo", 1)).get();
564+
565+
QuerySnapshot querySnapshot = randomColl.startAfter(doc1).get().get();
566+
assertEquals(1, querySnapshot.size());
567+
Iterator<QueryDocumentSnapshot> documents = querySnapshot.iterator();
568+
assertEquals(doc2, documents.next().getReference());
569+
}
570+
557571
@Test
558572
public void endAt() throws Exception {
559573
addDocument("foo", 1);

0 commit comments

Comments
 (0)