Skip to content

Commit 6afe0b7

Browse files
WIP
1 parent 5476f19 commit 6afe0b7

File tree

5 files changed

+47
-23
lines changed

5 files changed

+47
-23
lines changed

firebase-firestore/src/main/java/com/google/firebase/firestore/core/OrderBy.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,25 @@
2424
public class OrderBy {
2525
/** The direction of the ordering */
2626
public enum Direction {
27-
ASCENDING(1),
28-
DESCENDING(-1);
27+
ASCENDING(1, "asc"),
28+
DESCENDING(-1, "desc");
2929

3030
private final int comparisonModifier;
31+
private final String shorthand;
3132

32-
Direction(int comparisonModifier) {
33+
Direction(int comparisonModifier, String canonicalString) {
3334
this.comparisonModifier = comparisonModifier;
35+
this.shorthand = canonicalString;
3436
}
3537

3638
int getComparisonModifier() {
3739
return comparisonModifier;
3840
}
41+
42+
/** Returns "asc" for ascending or "desc" for descending. */
43+
public String canonicalString() {
44+
return shorthand;
45+
}
3946
}
4047

4148
public static OrderBy getInstance(Direction direction, FieldPath path) {

firebase-firestore/src/main/java/com/google/firebase/firestore/core/Target.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import static com.google.firebase.firestore.model.Values.min;
1919

2020
import androidx.annotation.Nullable;
21-
import com.google.firebase.firestore.core.OrderBy.Direction;
2221
import com.google.firebase.firestore.model.DocumentKey;
2322
import com.google.firebase.firestore.model.FieldIndex;
2423
import com.google.firebase.firestore.model.ResourcePath;
@@ -312,7 +311,7 @@ public String getCanonicalId() {
312311
builder.append("|ob:");
313312
for (OrderBy orderBy : getOrderBy()) {
314313
builder.append(orderBy.getField().canonicalString());
315-
builder.append(orderBy.getDirection().equals(Direction.ASCENDING) ? "asc" : "desc");
314+
builder.append(orderBy.getDirection().canonicalString());
316315
}
317316

318317
// Add limit.

firebase-firestore/src/main/java/com/google/firebase/firestore/local/SQLiteIndexManager.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.google.firebase.firestore.core.Bound;
2323
import com.google.firebase.firestore.core.FieldFilter;
2424
import com.google.firebase.firestore.core.Filter;
25-
import com.google.firebase.firestore.core.OrderBy;
2625
import com.google.firebase.firestore.core.Target;
2726
import com.google.firebase.firestore.index.FirestoreIndexValueWriter;
2827
import com.google.firebase.firestore.index.IndexByteEncoder;
@@ -241,28 +240,21 @@ private SQLitePersistence.Query generateQuery(
241240
String lowerBoundOp,
242241
@Nullable Object[] upperBounds,
243242
@Nullable String upperBoundOp) {
244-
String fields;
245243
String orderBy;
246244
String limit;
247245

248246
if (target.getLimit() != -1) {
249-
fields = "document_name, index_value";
250-
orderBy =
251-
"ORDER BY index_value "
252-
+ (target.getFirstOrderBy().getDirection().equals(OrderBy.Direction.ASCENDING)
253-
? "ASC"
254-
: "DESC");
247+
String direction = target.getFirstOrderBy().getDirection().canonicalString();
248+
orderBy = "ORDER BY index_value " + direction + ", document_name " + direction;
255249
limit = "LIMIT " + target.getLimit();
256250
} else {
257-
fields = "document_name";
258251
orderBy = "";
259252
limit = "";
260253
}
261254

262255
StringBuilder statement = new StringBuilder();
263-
statement.append("SELECT ");
264-
statement.append(fields);
265-
statement.append(" FROM index_entries WHERE index_id = ? AND index_value ");
256+
statement.append(
257+
"SELECT document_name, index_value FROM index_entries WHERE index_id = ? AND index_value ");
266258
statement.append(lowerBoundOp);
267259
statement.append(" ? ");
268260
if (upperBounds != null) {
@@ -272,11 +264,9 @@ private SQLitePersistence.Query generateQuery(
272264
}
273265

274266
int statementCount = lowerBounds.length * (upperBounds == null ? 1 : upperBounds.length);
275-
String sql = repeatSequence(statement, statementCount, " UNION ");
276-
277-
if (!limit.isEmpty()) {
278-
sql = String.format("SELECT document_name FROM (%s) %s %s", sql, orderBy, limit);
279-
}
267+
String sql =
268+
String.format(
269+
"%s %s %s", repeatSequence(statement, statementCount, " UNION "), orderBy, limit);
280270

281271
Object[] bingArgs = new Object[statementCount * (upperBounds == null ? 2 : 3)];
282272
int i = 0;

firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,34 @@ public void testCollectionGroup() {
268268
verifyResults(query, "coll1/doc1", "coll2/doc2/coll1/doc1");
269269
}
270270

271+
@Test
272+
public void testLimitFilter() {
273+
indexManager.addFieldIndex(
274+
new FieldIndex("coll").withAddedField(field("value"), FieldIndex.Segment.Kind.ORDERED));
275+
addDoc("coll/doc1", map("value", 1));
276+
addDoc("coll/doc2", map("value", 1));
277+
addDoc("coll/doc3", map("value", 1));
278+
Query query = query("coll").filter(filter("value", "==", 1)).limitToFirst(2);
279+
verifyResults(query, "coll/doc1", "coll/doc2");
280+
}
281+
282+
@Test
283+
public void testLimitAppliesOrdering() {
284+
indexManager.addFieldIndex(
285+
new FieldIndex("coll")
286+
.withAddedField(field("value"), FieldIndex.Segment.Kind.ORDERED)
287+
.withAddedField(field("value"), FieldIndex.Segment.Kind.CONTAINS));
288+
addDoc("coll/doc1", map("value", Arrays.asList(1, "foo")));
289+
addDoc("coll/doc2", map("value", Arrays.asList(3, "foo")));
290+
addDoc("coll/doc3", map("value", Arrays.asList(2, "foo")));
291+
Query query =
292+
query("coll")
293+
.filter(filter("value", "array-contains", "foo"))
294+
.orderBy(orderBy("value"))
295+
.limitToFirst(2);
296+
verifyResults(query, "coll/doc1", "coll/doc3");
297+
}
298+
271299
@Test
272300
public void testUpdateTime() {
273301
indexManager.addFieldIndex(

firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteSchemaTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ public void createsIndexingTables() {
637637

638638
private SQLiteRemoteDocumentCache createRemoteDocumentCache() {
639639
SQLitePersistence persistence =
640-
new SQLitePersistence(serializer, databaseId, LruGarbageCollector.Params.Default(), opener);
640+
new SQLitePersistence(serializer, databaseId, LruGarbageCollector.Params.Default(), opener);
641641
persistence.start();
642642
return new SQLiteRemoteDocumentCache(persistence, serializer);
643643
}

0 commit comments

Comments
 (0)