From 44c28971c20ae53fae2cc10df11a23f3704cda21 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Sat, 20 Apr 2019 13:42:54 +0200 Subject: [PATCH] sort criterias and queryconditions list --- .../android/model/CriteriaTest.kt | 61 ++++++++++++ .../pokeranalytics/android/model/Criteria.kt | 96 ++++++++++--------- .../android/model/filter/QueryCondition.kt | 17 +++- 3 files changed, 122 insertions(+), 52 deletions(-) create mode 100644 app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt new file mode 100644 index 00000000..17b412f8 --- /dev/null +++ b/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt @@ -0,0 +1,61 @@ +package net.pokeranalytics.android.model + +import net.pokeranalytics.android.components.BaseFilterInstrumentedUnitTest +import net.pokeranalytics.android.components.RealmInstrumentedUnitTest +import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.model.realm.FilterCondition +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow +import org.junit.Assert +import org.junit.Test + +import org.junit.Assert.* +import java.util.* + +class CriteriaTest : BaseFilterInstrumentedUnitTest() { + + @Test + fun getQueryConditions() { + + val realm = this.mockRealm + realm.beginTransaction() + val cal = Calendar.getInstance() + cal.time = Date() + val s1 = Session.testInstance(100.0, false, cal.time) + cal.add(Calendar.YEAR, 1) + Session.testInstance(100.0, true, cal.time) + cal.add(Calendar.YEAR, -11) + val firstValue = cal.get(Calendar.YEAR) + Session.testInstance(100.0, true, cal.time) + cal.add(Calendar.YEAR, 7) + Session.testInstance(100.0, true, cal.time) + cal.add(Calendar.YEAR, -2) + Session.testInstance(100.0, true, cal.time) + cal.add(Calendar.YEAR, 10) + Session.testInstance(100.0, true, cal.time) + + val lastValue = firstValue + 10 + + realm.commitTransaction() + + val years = Criteria.Years.queryConditions as List + println("years = ${years.map { it.getDisplayName() }}") + + assertEquals(11, years.size) + assertEquals(firstValue, years.first().listOfValues.first()) + assertEquals(lastValue, years.last().listOfValues.first()) + } + + @Test + fun combined() { + + val critierias = listOf(Criteria.MonthsOfYear, Criteria.DaysOfWeek) + val combined = critierias.combined() + combined.forEach { + it.forEach {qc-> + println(qc.getDisplayName()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt index ce8aaba8..520c5f51 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.model import io.realm.Realm import io.realm.Sort import io.realm.kotlin.where +import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.NameManageable @@ -10,10 +11,54 @@ import net.pokeranalytics.android.model.realm.* import java.util.* import kotlin.collections.ArrayList +fun List.combined(): List> { + val comparatorList = ArrayList>() + this.forEach { + comparatorList.add(it.queryConditions) + } + return getCombinations(comparatorList) +} + +fun getCombinations(lists: List>): List> { + var combinations: LinkedHashSet> = LinkedHashSet() + var newCombinations: LinkedHashSet> + + var index = 0 + + // extract each of the integers in the first list + // and add each to ints as a new list + if (lists.isNotEmpty()) { + for (i in lists[0]) { + val newList = ArrayList() + newList.add(i) + combinations.add(newList) + } + index++ + } + while (index < lists.size) { + val nextList = lists[index] + newCombinations = LinkedHashSet() + for (first in combinations) { + for (second in nextList) { + val newList = ArrayList() + newList.addAll(first) + newList.add(second) + newCombinations.add(newList) + } + } + combinations = newCombinations + + index++ + } + + return combinations.toList() +} + + sealed class Criteria { abstract class RealmCriteria : Criteria() { inline fun comparison(): List { - return compare < QueryCondition.QueryDataCondition, T >() + return compare < QueryCondition.QueryDataCondition, T >().sorted() } } @@ -38,7 +83,7 @@ sealed class Criteria { } return compareList(values = values) } - return listOf() + return listOf().sorted() } } @@ -56,7 +101,7 @@ sealed class Criteria { object SessionTypes: SimpleCriteria(listOf(QueryCondition.IsCash, QueryCondition.IsTournament)) object BankrollTypes: SimpleCriteria(listOf(QueryCondition.IsLive, QueryCondition.IsOnline)) object DayPeriods: SimpleCriteria(listOf(QueryCondition.IsWeekDay, QueryCondition.IsWeekEnd)) - object Years: Criteria() + object Years: ListCriteria() object Blinds: ListCriteria() object TournamentFees: ListCriteria() @@ -87,7 +132,7 @@ sealed class Criteria { } } realm.close() - years + years.sorted() } is Blinds -> comparison() else -> throw PokerAnalyticsException.QueryTypeUnhandled @@ -117,47 +162,4 @@ sealed class Criteria { return objects } } - - fun List.combined(): List> { - val comparatorList = ArrayList>() - this.forEach { - comparatorList.add(it.queryConditions) - } - return getCombinations(comparatorList) - } - - private fun getCombinations(lists: List>): List> { - var combinations: MutableSet> = LinkedHashSet() - var newCombinations: MutableSet> - - var index = 0 - - // extract each of the integers in the first list - // and add each to ints as a new list - if (lists.isNotEmpty()) { - for (i in lists[0]) { - val newList = ArrayList() - newList.add(i) - combinations.add(newList) - } - index++ - } - while (index < lists.size) { - val nextList = lists[index] - newCombinations = LinkedHashSet() - for (first in combinations) { - for (second in nextList) { - val newList = ArrayList() - newList.addAll(first) - newList.add(second) - newCombinations.add(newList) - } - } - combinations = newCombinations - - index++ - } - - return combinations.toList() - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 9cb8ae53..4882bd93 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -71,16 +71,23 @@ sealed class QueryCondition : FilterElementRow { } return null } - - } - interface ListOfValues { + interface ListOfValues : Comparable> where T:Comparable { var listOfValues: ArrayList + + override fun compareTo(other: ListOfValues): Int { + return listOfValues.sorted().first().compareTo(other.listOfValues.sorted().first()) + } + } - interface SingleValue { + interface SingleValue : Comparable> where T:Comparable { var singleValue : T + + override fun compareTo(other: SingleValue): Int { + return singleValue.compareTo(other.singleValue) + } } interface ListOfDouble: ListOfValues @@ -165,7 +172,7 @@ sealed class QueryCondition : FilterElementRow { override var singleValue: Int = 0 } - abstract class ListOfValueQueryCondition < T: Any > : QueryCondition(), ListOfValues { + abstract class ListOfValueQueryCondition < T > : QueryCondition(), ListOfValues where T:Comparable { override var listOfValues = ArrayList() abstract fun labelForValue(value:T): String