Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add implicit ordering for startAt(DocumentReference) calls #417

Merged
merged 2 commits into from Oct 22, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -982,9 +982,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 @@ -1063,9 +1068,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 @@ -1099,9 +1109,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 @@ -1115,9 +1130,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 @@ -593,6 +594,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 @@ -542,6 +542,17 @@ public void startAfter() throws Exception {
assertEquals(2L, querySnapshot.getDocuments().get(0).get("foo"));
}

@Test
public void startAfterAddsAnImplicitOrderByForDocumentReferences() throws Exception {
DocumentReference doc1 = addDocument("foo", 1);
DocumentReference doc2 = addDocument("foo", 2);

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