|
|
|
|
@ -2,6 +2,8 @@ package net.pokeranalytics.android.model.realm |
|
|
|
|
|
|
|
|
|
import io.realm.* |
|
|
|
|
import io.realm.annotations.PrimaryKey |
|
|
|
|
import net.pokeranalytics.android.exceptions.FilterMissingEntityException |
|
|
|
|
import net.pokeranalytics.android.exceptions.FilterUnhandledEntityException |
|
|
|
|
import net.pokeranalytics.android.model.filter.Filterable |
|
|
|
|
import net.pokeranalytics.android.model.filter.QueryType |
|
|
|
|
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow |
|
|
|
|
@ -15,12 +17,49 @@ import java.util.* |
|
|
|
|
* It contains a list of [FilterElement] describing the complete query to launch |
|
|
|
|
* The [Filter] is working closely with a [Filterable] interface providing the entity we want the query being launched on |
|
|
|
|
*/ |
|
|
|
|
open class Filter : RealmObject() { |
|
|
|
|
open class Filter() : RealmObject() { |
|
|
|
|
|
|
|
|
|
constructor(entity:Filterable) : this() { |
|
|
|
|
this.entityType = FilterableClass.filterableClass(entity = entity).ordinal |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private var entityType : Int? = null |
|
|
|
|
private val filterableClass : FilterableClass? |
|
|
|
|
get() { |
|
|
|
|
entityType?.let { |
|
|
|
|
return FilterableClass.values()[it] |
|
|
|
|
} |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private enum class FilterableClass { |
|
|
|
|
SESSION, |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
|
fun filterableClass(entity: Filterable): FilterableClass { |
|
|
|
|
return when (entity) { |
|
|
|
|
is Session.Companion -> SESSION |
|
|
|
|
else -> throw FilterUnhandledEntityException("this entity is not filterable") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val relatedEntity: Class < out RealmObject > |
|
|
|
|
get() { |
|
|
|
|
return when (this) { |
|
|
|
|
SESSION -> Session::class.java |
|
|
|
|
else -> throw FilterUnhandledEntityException("this entity is not filterable") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
|
@TestOnly |
|
|
|
|
fun queryOn(realm: Realm, entity: Filterable, queries:List<QueryType>): RealmResults<*> { |
|
|
|
|
var realmQuery : RealmQuery<out RealmObject> = realm.where(entity.relatedEntity) |
|
|
|
|
var realmQuery : RealmQuery<out RealmObject> = realm.where(FilterableClass.filterableClass(entity).relatedEntity) |
|
|
|
|
queries.forEach { |
|
|
|
|
realmQuery = (it.filter(realmQuery, entity)) |
|
|
|
|
} |
|
|
|
|
@ -85,7 +124,8 @@ open class Filter : RealmObject() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun queryOn(entity: Filterable) : RealmResults<*> { |
|
|
|
|
var realmQuery : RealmQuery<out RealmObject> = realm.where(entity.relatedEntity) |
|
|
|
|
val realmEntity : Class < out RealmObject > = filterableClass?.relatedEntity ?: throw FilterMissingEntityException("this filter has no entity initialized") |
|
|
|
|
var realmQuery : RealmQuery<out RealmObject> = realm.where(realmEntity) |
|
|
|
|
this.filterElements.map { |
|
|
|
|
it.queryType |
|
|
|
|
}.forEach { |
|
|
|
|
|