From 4efdbd5b098b1d3d023ca44a534842579253ed0d Mon Sep 17 00:00:00 2001 From: Paul Gillis Date: Fri, 7 Sep 2018 16:58:27 -0500 Subject: [PATCH] Fixed chained sorts in the latest version. --- .../RealmQueryExtensions.kt | 14 ++-- .../realmtypesafequery/RealmTypeSafeQuery.kt | 24 +++---- .../fields/RealmSortedQuery.kt | 64 +++++++++++++++++++ 3 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/fields/RealmSortedQuery.kt diff --git a/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmQueryExtensions.kt b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmQueryExtensions.kt index 7e07c0a..b48cba1 100644 --- a/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmQueryExtensions.kt +++ b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmQueryExtensions.kt @@ -179,12 +179,14 @@ fun RealmQuery.max(field: RealmMinMaxField) : V? = Sorting */ -fun RealmQuery.sort(field: RealmSortableField, sortOrder: Sort = Sort.ASCENDING) : RealmQuery = - field.sort(this, sortOrder) +fun RealmQuery.sort(field: RealmSortableField, sortOrder: Sort = Sort.ASCENDING) : RealmSortedQuery = + RealmSortedQuery(this).sort(field, sortOrder) -fun RealmQuery.sort(field1: RealmSortableField, sortOrder1: Sort, field2: RealmSortableField, sortOrder2: Sort) : RealmQuery = - field1.sort(this, sortOrder1, field2, sortOrder2) +fun RealmQuery.sort(field1: RealmSortableField, sortOrder1: Sort, field2: RealmSortableField, sortOrder2: Sort) : RealmSortedQuery = + RealmSortedQuery(this) + .sort(field1, sortOrder1) + .sort(field2, sortOrder2) -fun RealmQuery.sort(fields: Array>, sortOrders: Array) : RealmQuery = - RealmSortableField.sort(this, fields, sortOrders); +fun RealmQuery.sort(fields: Array>, sortOrders: Array) : RealmSortedQuery = + RealmSortedQuery(this).sort(fields, sortOrders) diff --git a/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmTypeSafeQuery.kt b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmTypeSafeQuery.kt index fcbb0bb..c256881 100644 --- a/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmTypeSafeQuery.kt +++ b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/RealmTypeSafeQuery.kt @@ -10,6 +10,7 @@ import com.quarkworks.android.realmtypesafequery.fields.RealmInableField import com.quarkworks.android.realmtypesafequery.fields.RealmMinMaxField import com.quarkworks.android.realmtypesafequery.fields.RealmNullableField import com.quarkworks.android.realmtypesafequery.fields.RealmSortableField +import com.quarkworks.android.realmtypesafequery.fields.RealmSortedQuery import com.quarkworks.android.realmtypesafequery.fields.RealmStringField import io.realm.Case import io.realm.Realm @@ -360,23 +361,14 @@ class RealmTypeSafeQuery(private val realmQuery: RealmQuery< * Sort */ - fun sort(field: RealmSortableField): RealmTypeSafeQuery { - field.sort(realmQuery) - return this - } + fun sort(field: RealmSortableField) = RealmSortedQuery(realmQuery).sort(field, Sort.ASCENDING) - fun sort(field: RealmSortableField, sortOrder: Sort): RealmTypeSafeQuery { - field.sort(realmQuery, sortOrder) - return this - } + fun sort(field: RealmSortableField, sortOrder: Sort) = RealmSortedQuery(realmQuery).sort(field, sortOrder) - fun sort(field1: RealmSortableField, sortOrder1: Sort, field2: RealmSortableField, sortOrder2: Sort): RealmTypeSafeQuery { - field1.sort(realmQuery, sortOrder1, field2, sortOrder2) - return this - } + fun sort(field1: RealmSortableField, sortOrder1: Sort, field2: RealmSortableField, sortOrder2: Sort) + = RealmSortedQuery(realmQuery) + .sort(field1, sortOrder1) + .sort(field2, sortOrder2) - fun sort(fields: Array>, sortOrders: Array): RealmTypeSafeQuery { - RealmSortableField.sort(realmQuery, fields, sortOrders) - return this - } + fun sort(fields: Array>, sortOrders: Array) = RealmSortedQuery(realmQuery).sort(fields, sortOrders) } \ No newline at end of file diff --git a/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/fields/RealmSortedQuery.kt b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/fields/RealmSortedQuery.kt new file mode 100644 index 0000000..cb4c77a --- /dev/null +++ b/query/src/main/kotlin/com/quarkworks/android/realmtypesafequery/fields/RealmSortedQuery.kt @@ -0,0 +1,64 @@ +package com.quarkworks.android.realmtypesafequery.fields + +import io.realm.Sort +import io.realm.RealmQuery +import io.realm.RealmModel +import java.util.LinkedList + + +/** + * @author berbschloe@quarkworks.co (Brandon Erbschloe) + * @author paul@quarkworks.co (Paul Gillis) + */ +class RealmSortedQuery internal constructor(private val originalRealmQuery: RealmQuery) { + + val realmQuery by lazy { + val sortParams = getSortParams() + originalRealmQuery.sort(sortParams.fieldNames, sortParams.sortOrders) + } + + private val sortParams = LinkedList>() + + private class SortParams(val fieldNames: Array, val sortOrders: Array) + + /* + * Sorts + */ + internal fun sort(field: RealmSortableField, sortOrder: Sort): RealmSortedQuery { + sortParams.add(Pair(field.name, sortOrder)) + return this + } + + internal fun sort(fields: Array>, sortOrders: Array): RealmSortedQuery { + if (fields.size != sortOrders.size) { + throw IllegalArgumentException("fields length(" + fields.size + ") must equal sortOrders length (" + sortOrders.size + ")") + } + + for (i in fields.indices) { + sort(fields[i], sortOrders[i]) + } + return this + } + + /* + * Results + */ + fun findAll() = realmQuery.findAll() + + // findAll() is needed because Realm's findFirst() ignores sort orders. + fun findFirst() = findAll().first(null) + + fun findAllAsync() = realmQuery.findAllAsync() + + private fun getSortParams(): SortParams { + val fieldNames = emptyArray() + val sortOrders = emptyArray() + + sortParams.forEachIndexed { index, pair -> + fieldNames[index] = pair.first + sortOrders[index] = pair.second + } + + return SortParams(fieldNames, sortOrders) + } +} \ No newline at end of file