Fixes in custom fields creation

od
Laurent 6 years ago
parent 72d2dbf766
commit cdfbf1bf3f
  1. 12
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt
  3. 18
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt
  4. 20
      app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt
  5. 26
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt
  6. 24
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/util/csv/TransactionCSVDescriptor.kt

@ -23,6 +23,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.enumerations.IntIdentifiable import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -39,7 +40,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
val customField = CustomField() val customField = CustomField()
customField.name = name customField.name = name
customField.type = type customField.type = type
customField realm.copyToRealm(customField)
} }
} }
@ -299,12 +300,15 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
this.entriesToDelete.clear() this.entriesToDelete.clear()
} }
fun getOrCreateEntry(value: String): CustomFieldEntry { fun getOrCreateEntry(realm: Realm, value: String): CustomFieldEntry {
this.entries.firstOrNull { it.value == value }?.let { this.entries.find { it.value == value }?.let {
Timber.d("L>> get")
return it return it
} ?: run { } ?: run {
val entry = this.addEntry() Timber.d("L>> create")
val entry = realm.copyToRealm(CustomFieldEntry())
entry.value = value entry.value = value
this.entries.add(entry)
return entry return entry
} }
} }

@ -100,7 +100,7 @@ class ImportFragment : RealmFragment(), ImportDelegate {
val message = exceptionMessage + ". " + requireContext().getString(R.string.import_error) val message = exceptionMessage + ". " + requireContext().getString(R.string.import_error)
val snackBar = Snackbar.make(view!!, message, Snackbar.LENGTH_INDEFINITE) val snackBar = Snackbar.make(view!!, message, Snackbar.LENGTH_INDEFINITE)
val textView = snackBar.view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text) val textView = snackBar.view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
textView.maxLines = 4 textView.maxLines = 5
snackBar.show() snackBar.show()
} }

@ -87,9 +87,11 @@ abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg el
lines.add(this.csvHeaders) lines.add(this.csvHeaders)
dataSequence.forEach { data -> dataSequence.forEach { data ->
val line = mutableListOf<String>() val line = mutableListOf<String>()
this.staticFields.forEach { field -> this.fields.forEach { field ->
line.add(this.toCSV(data, field) ?: "") val string = this.toCSV(data, field)
line.add(string ?: "")
} }
lines.add(line.joinToString(",")) lines.add(line.joinToString(","))
} }
@ -112,7 +114,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField)
/** /**
* The CSVField list describing the CSV header format * The CSVField list describing the CSV header format
*/ */
protected var staticFields: MutableList<CSVField> = mutableListOf() protected var fields: MutableList<CSVField> = mutableListOf()
/** /**
* A list of dynamic CSVField, described in the CSV header * A list of dynamic CSVField, described in the CSV header
@ -126,7 +128,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField)
init { init {
if (elements.isNotEmpty()) { if (elements.isNotEmpty()) {
this.staticFields = elements.toMutableList() this.fields = elements.toMutableList()
} }
} }
@ -151,7 +153,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField)
var count = 0 var count = 0
val headers = record.toSet() val headers = record.toSet()
this.staticFields.forEach { field -> this.fields.forEach { field ->
val index = headers.indexOf(field.header) val index = headers.indexOf(field.header)
if (index >= 0) { if (index >= 0) {
@ -159,8 +161,8 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField)
count++ count++
} }
} }
val mandatoryFields = this.staticFields.filter { !it.optional } val mandatoryFields = this.fields.filter { !it.optional }
Timber.d("source= ${this.source.name} > total fields = ${this.staticFields.size}, identified = $count") Timber.d("source= ${this.source.name} > total fields = ${this.fields.size}, identified = $count")
return count >= mandatoryFields.size return count >= mandatoryFields.size
} }
@ -175,7 +177,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField)
protected val csvHeaders: String protected val csvHeaders: String
get() { get() {
val headers = mutableListOf<String>() val headers = mutableListOf<String>()
this.staticFields.forEach { this.fields.forEach {
headers.add(it.header) headers.add(it.header)
} }
return headers.joinToString(",") return headers.joinToString(",")

@ -43,7 +43,7 @@ abstract class PACSVDescriptor<T : Identifiable>(source: DataSource,
var stackingIn: Double? = null var stackingIn: Double? = null
var stackingOut: Double? = null var stackingOut: Double? = null
this.staticFields.forEach { field -> this.fields.forEach { field ->
this.fieldMapping[field]?.let { index -> this.fieldMapping[field]?.let { index ->
@ -200,15 +200,23 @@ abstract class PACSVDescriptor<T : Identifiable>(source: DataSource,
stackingOut = field.parse(value) stackingOut = field.parse(value)
} }
is SessionField.ListCustomField -> { is SessionField.ListCustomField -> {
val entry = field.customField.getOrCreateEntry(value) val entry = field.customField.getOrCreateEntry(realm, value)
session.customFieldEntries.add(entry) session.customFieldEntries.add(entry)
} }
is SessionField.NumberCustomField -> { is SessionField.NumberCustomField -> {
val customField = field.customField val customField = field.customField
val entry = CustomFieldEntry()
entry.numericValue = field.parse(value) field.parse(value)?.let { number ->
customField.entries.add(entry) Timber.d("N>> create: $number")
session.customFieldEntries.add(entry) val entry = realm.copyToRealm(CustomFieldEntry())
entry.numericValue = number
customField.entries.add(entry)
session.customFieldEntries.add(entry)
} ?: run {
Timber.w("failed parse of numeric value: $value")
}
} }
else -> { else -> {
} }

@ -7,6 +7,7 @@ import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import org.apache.commons.csv.CSVRecord import org.apache.commons.csv.CSVRecord
import timber.log.Timber
/** /**
* A SessionCSVDescriptor is a CSVDescriptor specialized in parsing Session objects * A SessionCSVDescriptor is a CSVDescriptor specialized in parsing Session objects
@ -20,14 +21,14 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
realm.where(CustomField::class.java).findAll().sort("name").forEach { customField -> realm.where(CustomField::class.java).findAll().sort("name").forEach { customField ->
val header = customField.name + CustomFieldCSVField.separator + customField.type val header = customField.name + CustomFieldCSVField.separator + customField.type
val f = when (customField.type) { val f = when (customField.type) {
CustomField.Type.LIST.ordinal -> { CustomField.Type.LIST.uniqueIdentifier -> {
SessionField.NumberCustomField(header, customField) SessionField.ListCustomField(header, customField)
} }
else -> { else -> {
SessionField.ListCustomField(header, customField) SessionField.NumberCustomField(header, customField)
} }
} }
this.staticFields.add(f) this.fields.add(f)
} }
realm.close() realm.close()
@ -75,10 +76,13 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
is SessionField.TournamentPosition -> field.format(data.result?.tournamentFinalPosition) is SessionField.TournamentPosition -> field.format(data.result?.tournamentFinalPosition)
is SessionField.Comment -> data.comment is SessionField.Comment -> data.comment
is SessionField.NumberCustomField -> { is SessionField.NumberCustomField -> {
val entry = data.customFieldEntries.first { it.customField == field.customField } val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id }
field.format(entry.numericValue) field.format(entry?.numericValue)
}
is SessionField.ListCustomField -> {
val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id }
entry?.value
} }
is SessionField.ListCustomField -> data.customFieldEntries.first { it.customField == field.customField }.value
else -> null else -> null
} }
@ -103,11 +107,11 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
val customField = CustomField.getOrCreate(realm, name, type) val customField = CustomField.getOrCreate(realm, name, type)
val field = when (customField.type) { val field = when (customField.type) {
CustomField.Type.LIST.ordinal -> { CustomField.Type.LIST.uniqueIdentifier -> {
SessionField.NumberCustomField(header, customField) SessionField.ListCustomField(header, customField)
} }
else -> { else -> {
SessionField.ListCustomField(header, customField) SessionField.NumberCustomField(header, customField)
} }
} }
@ -115,7 +119,7 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
if (index >= 0) { if (index >= 0) {
this.fieldMapping[field] = index this.fieldMapping[field] = index
} }
this.staticFields.add(field) this.fields.add(field)
} }

@ -93,20 +93,26 @@ sealed class SessionField {
override var callback: ((String) -> Double?)? = null override var callback: ((String) -> Double?)? = null
) : NumberCSVField { ) : NumberCSVField {
override fun parse(value: String): Double? { private val multiplier: Int
get() {
return when (unit) {
Calendar.HOUR -> 3600 * 1000
Calendar.MINUTE -> 60 * 1000
Calendar.SECOND -> 1000
else -> throw PAIllegalStateException("Unmanaged time unit: $unit")
}
}
override fun parse(value: String): Double? {
this.callback?.let { this.callback?.let {
return it(value) return it(value)
} }
val v = NumberCSVField.defaultParse(value) val v = NumberCSVField.defaultParse(value)
val multiplier = when (unit) { return v?.times(this.multiplier)
Calendar.HOUR -> 3600 * 1000 }
Calendar.MINUTE -> 60 * 1000
Calendar.SECOND -> 1000 override fun format(data: Double?): String? {
else -> throw PAIllegalStateException("Unmanaged time unit: $unit") return super.format(data?.div(multiplier))
}
return v?.times(multiplier)
} }
} }

@ -39,7 +39,7 @@ class SessionTransactionCSVDescriptor(source: DataSource, private var isTourname
override fun parseData(realm: Realm, record: CSVRecord): Identifiable? { override fun parseData(realm: Realm, record: CSVRecord): Identifiable? {
var dataType: DataType? = null var dataType: DataType? = null
val typeField = staticFields.firstOrNull { it is SessionField.SessionType } val typeField = fields.firstOrNull { it is SessionField.SessionType }
typeField?.let { field -> typeField?.let { field ->
this.fieldMapping[field]?.let { index -> this.fieldMapping[field]?.let { index ->
val typeValue = record.get(index) val typeValue = record.get(index)
@ -65,7 +65,7 @@ class SessionTransactionCSVDescriptor(source: DataSource, private var isTourname
var buyin: Double? = null var buyin: Double? = null
var cashedOut: Double? = null var cashedOut: Double? = null
this.staticFields.forEach { field -> this.fields.forEach { field ->
val index = this.fieldMapping[field] val index = this.fieldMapping[field]
if (index != null) { if (index != null) {

@ -24,7 +24,7 @@ class TransactionCSVDescriptor(source: DataSource, vararg elements: CSVField) :
var currencyCode: String? = null var currencyCode: String? = null
var currencyRate: Double? = null var currencyRate: Double? = null
for (field in this.staticFields) { for (field in this.fields) {
val index = this.fieldMapping[field] val index = this.fieldMapping[field]
if (index != null) { if (index != null) {

Loading…
Cancel
Save