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

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

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

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

@ -7,6 +7,7 @@ import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Session
import org.apache.commons.csv.CSVRecord
import timber.log.Timber
/**
* 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 ->
val header = customField.name + CustomFieldCSVField.separator + customField.type
val f = when (customField.type) {
CustomField.Type.LIST.ordinal -> {
SessionField.NumberCustomField(header, customField)
CustomField.Type.LIST.uniqueIdentifier -> {
SessionField.ListCustomField(header, customField)
}
else -> {
SessionField.ListCustomField(header, customField)
SessionField.NumberCustomField(header, customField)
}
}
this.staticFields.add(f)
this.fields.add(f)
}
realm.close()
@ -75,10 +76,13 @@ 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.first { it.customField == field.customField }
field.format(entry.numericValue)
val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id }
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
}
@ -103,11 +107,11 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
val customField = CustomField.getOrCreate(realm, name, type)
val field = when (customField.type) {
CustomField.Type.LIST.ordinal -> {
SessionField.NumberCustomField(header, customField)
CustomField.Type.LIST.uniqueIdentifier -> {
SessionField.ListCustomField(header, customField)
}
else -> {
SessionField.ListCustomField(header, customField)
SessionField.NumberCustomField(header, customField)
}
}
@ -115,7 +119,7 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el
if (index >= 0) {
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
) : 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 {
return it(value)
}
val v = NumberCSVField.defaultParse(value)
val multiplier = when (unit) {
Calendar.HOUR -> 3600 * 1000
Calendar.MINUTE -> 60 * 1000
Calendar.SECOND -> 1000
else -> throw PAIllegalStateException("Unmanaged time unit: $unit")
}
return v?.times(multiplier)
return v?.times(this.multiplier)
}
override fun format(data: Double?): String? {
return super.format(data?.div(multiplier))
}
}

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

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

Loading…
Cancel
Save