Fixes custom field entries on async writes

perftest
Laurent 3 years ago
parent 3eeb8379bd
commit 6a1249a78c
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  2. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  3. 17
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  4. 39
      app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt
  5. 10
      app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionViewModel.kt
  6. 12
      app/src/main/java/net/pokeranalytics/android/util/ListExtensions.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt

@ -723,7 +723,7 @@ sealed class QueryCondition : RowRepresentable {
constructor(customFieldEntry: CustomFieldEntry) : this() {
this.setObject(customFieldEntry)
this.customFieldId = customFieldEntry.customField?.id
this.customFieldId = customFieldEntry.managedCustomField?.id
?: throw PokerAnalyticsException.QueryValueMapUnexpectedValue
}

@ -22,6 +22,7 @@ import net.pokeranalytics.android.ui.view.RowUpdatable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.toCurrency
import timber.log.Timber
import java.text.NumberFormat
import java.util.*
import java.util.Currency
@ -46,7 +47,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R
@LinkingObjects("entries")
val customFields: RealmResults<CustomField>? = null
val customField: CustomField?
val managedCustomField: CustomField?
get() {
return this.customFields?.first()
}
@ -89,7 +90,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R
}
override fun getDisplayName(context: Context): String {
return if (value.isNotEmpty()) value else NULL_TEXT
return value.ifEmpty { NULL_TEXT }
}
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
@ -136,8 +137,8 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R
/**
* Return the amount
*/
fun getFormattedValue(currency: Currency? = null): String {
return when (customField?.type) {
fun getFormattedValue(parentCustomField: CustomField, currency: Currency? = null): String {
return when (parentCustomField.type) {
CustomField.Type.AMOUNT.uniqueIdentifier -> {
numericValue?.toCurrency(currency) ?: run { NULL_TEXT }
}
@ -145,6 +146,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R
NumberFormat.getInstance().format(this.numericValue)
}
else -> {
Timber.d("FORMATTED = $value")
value
}
}

@ -851,9 +851,14 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
SessionPropertiesRow.HANDS_COUNT -> handsCount = (value as Double?)?.toInt()
SessionPropertiesRow.NUMBER_OF_TABLES -> this.numberOfTables = (value as Double?)?.toInt() ?: 1
is CustomField -> {
customFieldEntries.filter { it.customField?.id == row.id }.let {
customFieldEntries.removeAll(it.toSet())
}
val entryIds = row.entries.map { it.id }
val entries = this.customFieldEntries.intersectBy(entryIds) { it.id }
this.customFieldEntries.removeAll(entries)
// customFieldEntries.filter { it.customField?.id == row.id }.let {
// customFieldEntries.removeAll(it.toSet())
// }
when (row.type) {
CustomField.Type.AMOUNT.uniqueIdentifier,
CustomField.Type.NUMBER.uniqueIdentifier -> {
@ -1028,8 +1033,10 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
SessionPropertiesRow.HANDS_COUNT -> this.handsCountFormatted(context)
SessionPropertiesRow.NUMBER_OF_TABLES -> this.numberOfTables.toString()
is CustomField -> {
customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry ->
return customFieldEntry.getFormattedValue(currency)
val entryIds = this.customFieldEntries.map { it.id }
val entries = row.entries.intersectBy(entryIds) { it.id }
entries.firstOrNull()?.let { customFieldEntry ->
return customFieldEntry.getFormattedValue(row, currency)
}
return NULL_TEXT
}

@ -279,6 +279,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
session.updateValue(value, row)
}
Timber.d("val = ${this.currentSession.customFieldEntries}")
// try {
// this.currentSession.updateValue(value, row)
// getRealm().executeTransactionAsync { realm ->
@ -312,6 +314,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
getRealm().executeTransactionAsync { realm ->
val session = realm.copyToRealmOrUpdate(this.currentSession)
session.preCompute()
for (customField in this.model.customFields) {
realm.copyToRealmOrUpdate(customField)
}
}
}
@ -703,15 +709,16 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
)
)
is CustomField -> {
val entry = row.entries.intersect(session.customFieldEntries).firstOrNull()
row.editingDescriptors(
when (row.type) {
CustomField.Type.LIST.uniqueIdentifier -> mapOf(
"defaultValue" to session.customFieldEntries.find { it.customField?.id == row.id }?.value,
"data" to row.entries
)
else -> mapOf(
"defaultValue" to session.customFieldEntries.find { it.customField?.id == row.id }?.numericValue
)
CustomField.Type.LIST.uniqueIdentifier -> {
mapOf(
"defaultValue" to entry?.value,
"data" to row.entries
)
}
else -> mapOf("defaultValue" to entry?.numericValue)
}
)
}
@ -721,19 +728,17 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
override fun resultCaptureTypeSelected(resultCaptureType: ResultCaptureType, applyBankroll: Boolean) {
when (resultCaptureType) {
ResultCaptureType.NET_RESULT -> {
this.currentSession.clearBuyinCashedOut()
}
ResultCaptureType.BUYIN_CASHED_OUT -> {
this.currentSession.clearNetResult()
updateSessionThenSaveAsynchronously {
when (resultCaptureType) {
ResultCaptureType.NET_RESULT -> {
this.currentSession.clearBuyinCashedOut()
}
ResultCaptureType.BUYIN_CASHED_OUT -> {
this.currentSession.clearNetResult()
}
}
}
getRealm().executeTransactionAsync { asyncRealm -> // cleanup existing results
asyncRealm.copyToRealmOrUpdate(this.currentSession)
}
this.model.resultCaptureType = resultCaptureType
if (applyBankroll) {
this.currentSession.bankroll?.let { bankroll ->

@ -46,6 +46,11 @@ class SessionViewModel : ViewModel() {
*/
var rows: List<RowRepresentable> = mutableListOf()
/**
* The list of customFields
*/
var customFields: List<CustomField> = listOf()
fun rowForPosition(position: Int): RowRepresentable {
return this.rows[position]
}
@ -104,7 +109,10 @@ class SessionViewModel : ViewModel() {
// Add custom fields
rows.add(SeparatorRow())
rows.addAll(realm.sorted<CustomField>())
val customFields = realm.sorted<CustomField>()
this.customFields = customFields.map { realm.copyFromRealm(it) }
rows.addAll(this.customFields)
this.rows = rows
}

@ -0,0 +1,12 @@
package net.pokeranalytics.android.util
fun <T, V> List<T>.intersectBy(other: List<V>, by: (T) -> (V)) : Set<T> {
val results = mutableSetOf<T>()
for (item in this) {
val key = by(item)
if (other.contains(key)) {
results.add(item)
}
}
return results
}

@ -79,11 +79,11 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
is SessionField.TournamentPosition -> field.format(data.result?.tournamentFinalPosition)
is SessionField.Comment -> data.comment
is SessionField.NumberCustomField -> {
val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id }
val entry = field.customField.entries.intersect(data.customFieldEntries).firstOrNull()
field.format(entry?.numericValue)
}
is SessionField.ListCustomField -> {
val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id }
val entry = field.customField.entries.intersect(data.customFieldEntries).firstOrNull()
entry?.value
}
else -> null

Loading…
Cancel
Save