Skip to content

Commit a393f27

Browse files
authored
Merge pull request #219 from tiagonuneslx/query-cursors
Firestore query-cursors/pagination: Added Query.startAfter (Android, iOS, js)
2 parents 25357a0 + 0a569bc commit a393f27

File tree

6 files changed

+32
-1
lines changed
  • firebase-common/src/jsMain/kotlin/dev/gitlive/firebase
  • firebase-firestore/src

6 files changed

+32
-1
lines changed

firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ external object firebase {
379379
fun limit(limit: Double): Query
380380
fun orderBy(field: String, direction: Any): Query
381381
fun orderBy(field: FieldPath, direction: Any): Query
382+
fun startAfter(document: DocumentSnapshot): Query
382383
}
383384

384385
open class CollectionReference : Query {

firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ actual open class Query(open val android: com.google.firebase.firestore.Query) {
354354

355355
internal actual fun _orderBy(field: String, direction: Direction) = Query(android.orderBy(field, direction))
356356
internal actual fun _orderBy(field: FieldPath, direction: Direction) = Query(android.orderBy(field.android, direction))
357+
358+
internal actual fun _startAfter(document: DocumentSnapshot) = Query(android.startAfter(document.android))
357359
}
358360

359361
actual typealias Direction = com.google.firebase.firestore.Query.Direction

firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ expect open class Query {
6767

6868
internal fun _orderBy(field: String, direction: Direction): Query
6969
internal fun _orderBy(field: FieldPath, direction: Direction): Query
70+
71+
internal fun _startAfter(document: DocumentSnapshot): Query
7072
}
7173

7274
fun Query.where(field: String, equalTo: Any?) = _where(field, equalTo)
@@ -81,6 +83,8 @@ fun Query.where(path: FieldPath, inArray: List<Any>? = null, arrayContainsAny: L
8183
fun Query.orderBy(field: String, direction: Direction = Direction.ASCENDING) = _orderBy(field, direction)
8284
fun Query.orderBy(field: FieldPath, direction: Direction = Direction.ASCENDING) = _orderBy(field, direction)
8385

86+
fun Query.startAfter(document: DocumentSnapshot) = _startAfter(document)
87+
8488
expect class WriteBatch {
8589
inline fun <reified T> set(documentRef: DocumentReference, data: T, encodeDefaults: Boolean = true, merge: Boolean = false): WriteBatch
8690
inline fun <reified T> set(documentRef: DocumentReference, data: T, encodeDefaults: Boolean = true, vararg mergeFields: String): WriteBatch

firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,25 @@ class FirebaseFirestoreTest {
220220
assertEquals("AutoId", resultDoc.get("prop1"))
221221
}
222222

223+
@Test
224+
fun testStartAfterDocumentSnapshot() = runTest {
225+
setupFirestoreData()
226+
val query = Firebase.firestore
227+
.collection("FirebaseFirestoreTest")
228+
.orderBy("prop1", Direction.ASCENDING)
229+
230+
val firstPage = query.limit(2).get().documents // First 2 results
231+
assertEquals(2, firstPage.size)
232+
assertEquals("aaa", firstPage[0].get("prop1"))
233+
assertEquals("bbb", firstPage[1].get("prop1"))
234+
235+
val lastDocumentSnapshot = firstPage.lastOrNull()
236+
assertNotNull(lastDocumentSnapshot)
237+
val secondPage = query.startAfter(lastDocumentSnapshot).limit(2).get().documents // Second 2 results (only one left)
238+
assertEquals(1, secondPage.size)
239+
assertEquals("ccc", secondPage[0].get("prop1"))
240+
}
241+
223242
private suspend fun setupFirestoreData() {
224243
Firebase.firestore.collection("FirebaseFirestoreTest")
225244
.document("one")

firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,10 @@ actual open class Query(open val ios: FIRQuery) {
270270
)
271271

272272
internal actual fun _orderBy(field: String, direction: Direction) = Query(ios.queryOrderedByField(field, direction == Direction.DESCENDING))
273-
274273
internal actual fun _orderBy(field: FieldPath, direction: Direction) = Query(ios.queryOrderedByFieldPath(field.ios, direction == Direction.DESCENDING))
275274

275+
internal actual fun _startAfter(document: DocumentSnapshot) = Query(ios.queryStartingAfterDocument(document.ios))
276+
276277
}
277278
@Suppress("UNCHECKED_CAST")
278279
actual class CollectionReference(override val ios: FIRCollectionReference) : Query(ios) {

firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,10 @@ actual open class Query(open val js: firebase.firestore.Query) {
329329
Query(js.orderBy(field.js, direction.jsString))
330330
}
331331

332+
internal actual fun _startAfter(document: DocumentSnapshot) = rethrow {
333+
Query(js.startAfter(document.js))
334+
}
335+
332336
actual val snapshots get() = callbackFlow<QuerySnapshot> {
333337
val unsubscribe = rethrow {
334338
js.onSnapshot(

0 commit comments

Comments
 (0)