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
realm.beginTransaction()
val filter = Filter()
val filter = Filter(entity = Session)
filter.name = "testSaveLoadCashFilter"
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) {
}

@ -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 {
val relatedEntity: Class<out RealmObject>
/**
* 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.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 {

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

Loading…
Cancel
Save