remove filterable relatedEntity and add a new filter variable to handle the entity

feature/top10
Razmig Sarkissian 7 years ago
parent a5fc2c6355
commit ef9b00e149
  1. 2
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt
  3. 5
      app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt
  4. 46
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt

@ -21,7 +21,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val realm = this.mockRealm val realm = this.mockRealm
realm.beginTransaction() realm.beginTransaction()
val filter = Filter() val filter = Filter(entity = Session)
filter.name = "testSaveLoadCashFilter" filter.name = "testSaveLoadCashFilter"
val filterElement = FilterElementRow.Cash val filterElement = FilterElementRow.Cash

@ -18,6 +18,8 @@ class FilterValueMapException(message: String) : Exception(message) {
} }
} }
class FilterMissingEntityException(message: String) : Exception(message)
class FilterUnhandledEntityException(message : String) : Exception(message)
class ConfigurationException(message: String) : Exception(message) { class ConfigurationException(message: String) : Exception(message) {
} }

@ -30,12 +30,9 @@ import io.realm.RealmObject
/** /**
* Interface to set at companion object level of a realm object to provide the entity and the fieldName (eg: parameter's path) * Companion-level Interface to indicate an RealmObject class can be filtered and to provide all the fieldNames (eg: parameter's path) needed to be query on.
*/ */
interface Filterable { interface Filterable {
val relatedEntity: Class<out RealmObject>
/** /**
* return the path of the parameter used in the [QueryType] related to this entity * return the path of the parameter used in the [QueryType] related to this entity
*/ */

@ -2,6 +2,8 @@ package net.pokeranalytics.android.model.realm
import io.realm.* import io.realm.*
import io.realm.annotations.PrimaryKey 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.Filterable
import net.pokeranalytics.android.model.filter.QueryType import net.pokeranalytics.android.model.filter.QueryType
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow 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 * 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 * 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 { companion object {
@TestOnly @TestOnly
fun queryOn(realm: Realm, entity: Filterable, queries:List<QueryType>): RealmResults<*> { 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 { queries.forEach {
realmQuery = (it.filter(realmQuery, entity)) realmQuery = (it.filter(realmQuery, entity))
} }
@ -85,7 +124,8 @@ open class Filter : RealmObject() {
} }
fun queryOn(entity: Filterable) : RealmResults<*> { 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 { this.filterElements.map {
it.queryType it.queryType
}.forEach { }.forEach {

@ -61,8 +61,6 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return realm.copyToRealm(session) return realm.copyToRealm(session)
} }
override val relatedEntity: Class<out RealmObject> = Session::class.java
override fun fieldNameForQueryType(queryType: QueryType): String? { override fun fieldNameForQueryType(queryType: QueryType): String? {
return when (queryType) { return when (queryType) {
LIVE -> "bankroll.live" LIVE -> "bankroll.live"

Loading…
Cancel
Save