Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
feat: add implicit ordering for startAt(DocumentReference) calls (#417)
  • Loading branch information
schmidt-sebastian committed Oct 22, 2020
1 parent 2054ae9 commit aae6dc9
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 4 deletions.
Expand Up @@ -988,9 +988,14 @@ public Query startAt(@Nonnull DocumentSnapshot snapshot) {
*/
@Nonnull
public Query startAt(Object... fieldValues) {
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, true);
ImmutableList<FieldOrder> fieldOrders =
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
? createImplicitOrderBy()
: options.getFieldOrders();
Cursor cursor = createCursor(fieldOrders, fieldValues, true);

Builder newOptions = options.toBuilder();
newOptions.setFieldOrders(fieldOrders);
newOptions.setStartCursor(cursor);
return new Query(rpcContext, newOptions.build());
}
Expand Down Expand Up @@ -1069,9 +1074,14 @@ public Query startAfter(@Nonnull DocumentSnapshot snapshot) {
* @return The created Query.
*/
public Query startAfter(Object... fieldValues) {
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, false);
ImmutableList<FieldOrder> fieldOrders =
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
? createImplicitOrderBy()
: options.getFieldOrders();
Cursor cursor = createCursor(fieldOrders, fieldValues, false);

Builder newOptions = options.toBuilder();
newOptions.setFieldOrders(fieldOrders);
newOptions.setStartCursor(cursor);
return new Query(rpcContext, newOptions.build());
}
Expand Down Expand Up @@ -1105,9 +1115,14 @@ public Query endBefore(@Nonnull DocumentSnapshot snapshot) {
*/
@Nonnull
public Query endBefore(Object... fieldValues) {
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, true);
ImmutableList<FieldOrder> fieldOrders =
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
? createImplicitOrderBy()
: options.getFieldOrders();
Cursor cursor = createCursor(fieldOrders, fieldValues, true);

Builder newOptions = options.toBuilder();
newOptions.setFieldOrders(fieldOrders);
newOptions.setEndCursor(cursor);
return new Query(rpcContext, newOptions.build());
}
Expand All @@ -1121,9 +1136,14 @@ public Query endBefore(Object... fieldValues) {
*/
@Nonnull
public Query endAt(Object... fieldValues) {
Cursor cursor = createCursor(options.getFieldOrders(), fieldValues, false);
ImmutableList<FieldOrder> fieldOrders =
fieldValues.length == 1 && fieldValues[0] instanceof DocumentReference
? createImplicitOrderBy()
: options.getFieldOrders();
Cursor cursor = createCursor(fieldOrders, fieldValues, false);

Builder newOptions = options.toBuilder();
newOptions.setFieldOrders(fieldOrders);
newOptions.setEndCursor(cursor);
return new Query(rpcContext, newOptions.build());
}
Expand Down
Expand Up @@ -18,6 +18,7 @@

import static com.google.cloud.firestore.LocalFirestoreHelper.COLLECTION_ID;
import static com.google.cloud.firestore.LocalFirestoreHelper.DOCUMENT_NAME;
import static com.google.cloud.firestore.LocalFirestoreHelper.DOCUMENT_PATH;
import static com.google.cloud.firestore.LocalFirestoreHelper.SINGLE_FIELD_SNAPSHOT;
import static com.google.cloud.firestore.LocalFirestoreHelper.endAt;
import static com.google.cloud.firestore.LocalFirestoreHelper.filter;
Expand Down Expand Up @@ -598,6 +599,26 @@ public void withDocumentIdAndDocumentSnapshotCursor() {
assertEquals(queryRequest, runQuery.getValue());
}

@Test
public void withDocumentReferenceCursor() {
doAnswer(queryResponse())
.when(firestoreMock)
.streamRequest(
runQuery.capture(),
streamObserverCapture.capture(),
Matchers.<ServerStreamingCallable>any());

DocumentReference documentCursor = firestoreMock.document(DOCUMENT_PATH);
Value documentValue = reference(DOCUMENT_NAME);

query.startAt(documentCursor).get();

RunQueryRequest queryRequest =
query(order("__name__", StructuredQuery.Direction.ASCENDING), startAt(documentValue, true));

assertEquals(queryRequest, runQuery.getValue());
}

@Test
public void withExtractedDirectionForDocumentSnapshotCursor() {
doAnswer(queryResponse())
Expand Down
Expand Up @@ -554,6 +554,20 @@ public void startAfter() throws Exception {
assertEquals(2L, querySnapshot.getDocuments().get(0).get("foo"));
}

@Test
public void startAfterAddsAnImplicitOrderByForDocumentReferences() throws Exception {
DocumentReference doc1 = randomColl.document("doc1");
DocumentReference doc2 = randomColl.document("doc2");

doc1.set(map("foo", 1)).get();
doc2.set(map("foo", 1)).get();

QuerySnapshot querySnapshot = randomColl.startAfter(doc1).get().get();
assertEquals(1, querySnapshot.size());
Iterator<QueryDocumentSnapshot> documents = querySnapshot.iterator();
assertEquals(doc2, documents.next().getReference());
}

@Test
public void endAt() throws Exception {
addDocument("foo", 1);
Expand Down

0 comments on commit aae6dc9

Please sign in to comment.