Added Import delete functions

csv
Laurent 6 years ago
parent fa61d76b71
commit b87dce5b75
  1. 67
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  2. 22
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt
  3. 26
      app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt
  4. 19
      app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt
  5. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt
  8. 25
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt

@ -3,46 +3,44 @@ package net.pokeranalytics.android.model
import android.content.Context import android.content.Context
import io.realm.Realm import io.realm.Realm
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.Localizable import net.pokeranalytics.android.ui.view.Localizable
import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import net.pokeranalytics.android.util.enumerations.IntSearchable
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
/** /**
* An enum managing the business objects related to a realm results * An enum managing the business objects related to a realm results
*/ */
enum class LiveData : Localizable { enum class LiveData(override var uniqueIdentifier: Int, val relatedEntity: Class<out Identifiable>) : Localizable, IntIdentifiable {
BANKROLL, BANKROLL(0, Bankroll::class.java),
GAME, GAME(1, Game::class.java),
LOCATION, LOCATION(2, Location::class.java),
TOURNAMENT_NAME, TOURNAMENT_NAME(3, TournamentName::class.java),
TOURNAMENT_FEATURE, TOURNAMENT_FEATURE(4, TournamentFeature::class.java),
TRANSACTION, TRANSACTION(5, Transaction::class.java),
TRANSACTION_TYPE, TRANSACTION_TYPE(6, TransactionType::class.java),
FILTER, FILTER(7, Filter::class.java),
CUSTOM_FIELD, CUSTOM_FIELD(8, CustomField::class.java),
REPORT_SETUP; REPORT_SETUP(9, ReportSetup::class.java),
SESSION(10, Session::class.java);
var subType:Int? = null
companion object : IntSearchable<LiveData> {
override fun valuesInternal(): Array<LiveData> {
return values()
}
val relatedEntity: Class<out Deletable> fun valueFromClass(clazz: Class<out Identifiable>) : LiveData? {
get() { return values().firstOrNull { it.relatedEntity == clazz }
return when (this) {
BANKROLL -> Bankroll::class.java
GAME -> Game::class.java
LOCATION -> Location::class.java
TOURNAMENT_NAME -> TournamentName::class.java
TOURNAMENT_FEATURE -> TournamentFeature::class.java
TRANSACTION -> Transaction::class.java
TRANSACTION_TYPE -> TransactionType::class.java
FILTER -> Filter::class.java
CUSTOM_FIELD -> CustomField::class.java
REPORT_SETUP -> ReportSetup::class.java
}
} }
}
var subType:Int? = null
fun updateOrCreate(realm: Realm, primaryKey: String?): Deletable { fun updateOrCreate(realm: Realm, primaryKey: String?): Identifiable {
val proxyItem: Deletable? = this.getData(realm, primaryKey) val proxyItem: Identifiable? = this.getData(realm, primaryKey)
proxyItem?.let { proxyItem?.let {
return realm.copyFromRealm(it) return realm.copyFromRealm(it)
} ?: run { } ?: run {
@ -50,12 +48,12 @@ enum class LiveData : Localizable {
} }
} }
private fun newEntity(): Deletable { private fun newEntity(): Identifiable {
return this.relatedEntity.newInstance() return this.relatedEntity.newInstance()
} }
fun getData(realm: Realm, primaryKey: String?): Deletable? { fun getData(realm: Realm, primaryKey: String?): Identifiable? {
var proxyItem: Deletable? = null var proxyItem: Identifiable? = null
primaryKey?.let { primaryKey?.let {
val t = realm.findById(this.relatedEntity, it) val t = realm.findById(this.relatedEntity, it)
t?.let { t?.let {
@ -78,6 +76,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.filter FILTER -> R.string.filter
CUSTOM_FIELD -> R.string.custom_field CUSTOM_FIELD -> R.string.custom_field
REPORT_SETUP -> R.string.custom REPORT_SETUP -> R.string.custom
SESSION -> R.string.session
} }
} }
@ -94,6 +93,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.filters FILTER -> R.string.filters
CUSTOM_FIELD -> R.string.custom_fields CUSTOM_FIELD -> R.string.custom_fields
REPORT_SETUP -> R.string.custom REPORT_SETUP -> R.string.custom
SESSION -> R.string.sessions
} }
} }
@ -110,6 +110,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.new_filter FILTER -> R.string.new_filter
CUSTOM_FIELD -> R.string.new_custom_field CUSTOM_FIELD -> R.string.new_custom_field
REPORT_SETUP -> R.string.new_report REPORT_SETUP -> R.string.new_report
else -> R.string.none
} }
} }

@ -5,6 +5,9 @@ import io.realm.Realm
import io.realm.RealmModel import io.realm.RealmModel
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.exceptions.ModelException
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.IdentifiableObject
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
enum class SaveValidityStatus { enum class SaveValidityStatus {
@ -45,7 +48,24 @@ interface NameManageable : Manageable {
} }
} }
class ObjectIdentifier(var id: String, var clazz: Class<out Identifiable>) class ObjectIdentifier(var id: String, var clazz: Class<out Identifiable>) {
val identifiableObject: IdentifiableObject
get() {
val livedata = LiveData.valueFromClass(this.clazz)
livedata?.let {
val io = IdentifiableObject()
io.id = this.id
io.classId = it.uniqueIdentifier
return io
} ?: run {
throw PAIllegalStateException("clazz $clazz has no corresponding LiveData value")
}
}
}
/** /**
* An interface associate a unique uniqueIdentifier to an object * An interface associate a unique uniqueIdentifier to an object

@ -0,0 +1,26 @@
package net.pokeranalytics.android.model.realm
import io.realm.RealmModel
import io.realm.RealmObject
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.util.extensions.findById
open class IdentifiableObject : RealmObject() {
/**
* The id of an Identifiable object
*/
var id: String = ""
/**
* The uniqueIdentifier of the LiveData object
*/
var classId: Int = 0
val realmModel: RealmModel?
get() {
val clazz = LiveData.valueByIdentifier(this.classId).relatedEntity
return this.realm.findById(clazz, id)
}
}

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.kotlin.deleteFromRealm
import java.util.* import java.util.*
open class Import : RealmObject() { open class Import : RealmObject() {
@ -10,19 +11,25 @@ open class Import : RealmObject() {
var fileName: String = "" var fileName: String = ""
var sessions: RealmList<Session> = RealmList() var identifiableObjects: RealmList<IdentifiableObject> = RealmList()
var transactions: RealmList<Transaction> = RealmList()
fun delete() { fun delete() {
this.realm.executeTransaction { this.realm.executeTransaction {
this.sessions.forEach { this.identifiableObjects.forEach {
it.cleanup()
it.deleteFromRealm() val realmModel = it.realmModel
when (realmModel) {
is Session -> {
realmModel.cleanup()
}
else -> {}
}
realmModel?.deleteFromRealm()
} }
transactions.deleteAllFromRealm()
} }
} }

@ -45,7 +45,7 @@ import kotlin.collections.ArrayList
typealias BB = Double typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable, DatedBankrollGraphEntry { TimeFilterable, Filterable, DatedBankrollGraphEntry {
enum class Type { enum class Type {
@ -493,6 +493,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return R.string.no_br_popup_message return R.string.no_br_popup_message
} }
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isValidForDelete(realm: Realm): Boolean {
return true
}
// States // States
/** /**

@ -47,7 +47,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
open fun setData(dataType: Int) { open fun setData(dataType: Int) {
this.dataType = LiveData.values()[dataType] this.dataType = LiveData.values()[dataType]
this.identifiableClass = this.dataType.relatedEntity this.identifiableClass = this.dataType.relatedEntity as Class<out Deletable>
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext()))
this.items = this.retrieveItems(getRealm()) this.items = this.retrieveItems(getRealm())

@ -75,7 +75,7 @@ open class DataManagerFragment : RealmFragment() {
*/ */
private fun loadItem() { private fun loadItem() {
this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) as Deletable
this.deleteButtonShouldAppear = this.primaryKey != null this.deleteButtonShouldAppear = this.primaryKey != null
} }

@ -1,13 +1,9 @@
package net.pokeranalytics.android.util.csv package net.pokeranalytics.android.util.csv
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.deleteFromRealm
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.ObjectIdentifier
import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Import import net.pokeranalytics.android.model.realm.Import
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.extensions.findById
import org.apache.commons.csv.CSVRecord import org.apache.commons.csv.CSVRecord
import timber.log.Timber import timber.log.Timber
import java.text.NumberFormat import java.text.NumberFormat
@ -27,25 +23,19 @@ enum class DataSource {
*/ */
abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg elements: CSVField) : CSVDescriptor(source, *elements) { abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg elements: CSVField) : CSVDescriptor(source, *elements) {
/**
* List of Realm object identificators
*/
private val realmModelIds = mutableListOf<ObjectIdentifier>()
abstract fun parseData(realm: Realm, record: CSVRecord): T? abstract fun parseData(realm: Realm, record: CSVRecord): T?
override fun parse(realm: Realm, record: CSVRecord): Int { override fun parse(realm: Realm, record: CSVRecord): Int {
val data = this.parseData(realm, record) val data = this.parseData(realm, record)
data?.let { data?.let {
// Timber.d(">>>>>>> identifier added: ${it.id}") this.import.identifiableObjects.add(it.objectIdentifier.identifiableObject)
this.realmModelIds.add(it.objectIdentifier)
} }
return if (data != null) 1 else 0 return if (data != null) 1 else 0
} }
protected fun addAdditionallyCreatedIdentifiable(identifiable: Identifiable) { protected fun addAdditionallyCreatedIdentifiable(identifiable: Identifiable) {
this.realmModelIds.add(identifiable.objectIdentifier) this.import.identifiableObjects.add(identifiable.objectIdentifier.identifiableObject)
} }
override fun cancel(realm: Realm) { override fun cancel(realm: Realm) {
@ -61,20 +51,11 @@ abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg el
} }
private fun deleteInsertedFromRealm(realm: Realm) { private fun deleteInsertedFromRealm(realm: Realm) {
this.realmModelIds.forEach { identifier -> this.import.delete()
val data = realm.findById(identifier.clazz, identifier.id)
if (data is Session) {
data.cleanup()
}
data?.deleteFromRealm()
}
this.realmModelIds.clear()
} }
override fun save(realm: Realm) { override fun save(realm: Realm) {
super.save(realm) super.save(realm)
this.realmModelIds.clear()
} }
} }

Loading…
Cancel
Save