Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,14 @@ fun <T : RealmModel, V> RealmQuery<T>.max(field: RealmMinMaxField<T, V>) : V? =
Sorting
*/

fun <T : RealmModel> RealmQuery<T>.sort(field: RealmSortableField<T>, sortOrder: Sort = Sort.ASCENDING) : RealmQuery<T> =
field.sort(this, sortOrder)
fun <T : RealmModel> RealmQuery<T>.sort(field: RealmSortableField<T>, sortOrder: Sort = Sort.ASCENDING) : RealmSortedQuery<T> =
RealmSortedQuery(this).sort(field, sortOrder)

fun <T : RealmModel> RealmQuery<T>.sort(field1: RealmSortableField<T>, sortOrder1: Sort, field2: RealmSortableField<T>, sortOrder2: Sort) : RealmQuery<T> =
field1.sort(this, sortOrder1, field2, sortOrder2)
fun <T : RealmModel> RealmQuery<T>.sort(field1: RealmSortableField<T>, sortOrder1: Sort, field2: RealmSortableField<T>, sortOrder2: Sort) : RealmSortedQuery<T> =
RealmSortedQuery(this)
.sort(field1, sortOrder1)
.sort(field2, sortOrder2)

fun <T : RealmModel> RealmQuery<T>.sort(fields: Array<RealmSortableField<T>>, sortOrders: Array<Sort>) : RealmQuery<T> =
RealmSortableField.sort(this, fields, sortOrders);
fun <T : RealmModel> RealmQuery<T>.sort(fields: Array<RealmSortableField<T>>, sortOrders: Array<Sort>) : RealmSortedQuery<T> =
RealmSortedQuery(this).sort(fields, sortOrders)

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -360,23 +361,14 @@ class RealmTypeSafeQuery<Model : RealmModel>(private val realmQuery: RealmQuery<
* Sort
*/

fun sort(field: RealmSortableField<Model>): RealmTypeSafeQuery<Model> {
field.sort(realmQuery)
return this
}
fun sort(field: RealmSortableField<Model>) = RealmSortedQuery(realmQuery).sort(field, Sort.ASCENDING)

fun sort(field: RealmSortableField<Model>, sortOrder: Sort): RealmTypeSafeQuery<Model> {
field.sort(realmQuery, sortOrder)
return this
}
fun sort(field: RealmSortableField<Model>, sortOrder: Sort) = RealmSortedQuery(realmQuery).sort(field, sortOrder)

fun sort(field1: RealmSortableField<Model>, sortOrder1: Sort, field2: RealmSortableField<Model>, sortOrder2: Sort): RealmTypeSafeQuery<Model> {
field1.sort(realmQuery, sortOrder1, field2, sortOrder2)
return this
}
fun sort(field1: RealmSortableField<Model>, sortOrder1: Sort, field2: RealmSortableField<Model>, sortOrder2: Sort)
= RealmSortedQuery(realmQuery)
.sort(field1, sortOrder1)
.sort(field2, sortOrder2)

fun sort(fields: Array<RealmSortableField<Model>>, sortOrders: Array<Sort>): RealmTypeSafeQuery<Model> {
RealmSortableField.sort(realmQuery, fields, sortOrders)
return this
}
fun sort(fields: Array<RealmSortableField<Model>>, sortOrders: Array<Sort>) = RealmSortedQuery(realmQuery).sort(fields, sortOrders)
}
Original file line number Diff line number Diff line change
@@ -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<Model : RealmModel> internal constructor(private val originalRealmQuery: RealmQuery<Model>) {

val realmQuery by lazy {
val sortParams = getSortParams()
originalRealmQuery.sort(sortParams.fieldNames, sortParams.sortOrders)
}

private val sortParams = LinkedList<Pair<String, Sort>>()

private class SortParams(val fieldNames: Array<String>, val sortOrders: Array<Sort>)

/*
* Sorts
*/
internal fun sort(field: RealmSortableField<Model>, sortOrder: Sort): RealmSortedQuery<Model> {
sortParams.add(Pair(field.name, sortOrder))
return this
}

internal fun sort(fields: Array<RealmSortableField<Model>>, sortOrders: Array<Sort>): RealmSortedQuery<Model> {
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<String>()
val sortOrders = emptyArray<Sort>()

sortParams.forEachIndexed { index, pair ->
fieldNames[index] = pair.first
sortOrders[index] = pair.second
}

return SortParams(fieldNames, sortOrders)
}
}