From d3189ea360f0453a63d575ae66c76fc1211ac8ba Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 1 May 2019 11:39:35 +0200 Subject: [PATCH] Integrate criterias + query in Options --- .../android/calculus/Calculator.kt | 50 ++++++++----------- .../pokeranalytics/android/calculus/Report.kt | 10 ++-- .../ui/fragment/CalendarDetailsFragment.kt | 7 ++- .../android/ui/fragment/CalendarFragment.kt | 45 ++++++++++++----- .../android/ui/fragment/ReportsFragment.kt | 13 +++-- .../android/ui/fragment/StatisticsFragment.kt | 2 +- .../ui/fragment/TableReportFragment.kt | 2 +- 7 files changed, 73 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 0bb9db94..5fee6f0d 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -24,10 +24,12 @@ class Calculator { * The options used for calculations or display */ class Options( - display: Display = Display.TABLE, - evolutionValues: EvolutionValues = EvolutionValues.NONE, - stats: List = listOf(), - aggregationType: AggregationType? = null + var display: Display = Display.TABLE, + var evolutionValues: EvolutionValues = EvolutionValues.NONE, + var stats: List = listOf(), + var criterias: List = listOf(), + var query: Query = Query(), + var aggregationType: AggregationType? = null ) { /** @@ -50,17 +52,12 @@ class Calculator { TIMED } - var display: Display = display - var evolutionValues: EvolutionValues = evolutionValues - var displayedStats: List = stats - var aggregationType: AggregationType? = aggregationType - /** * This function determines whether the standard deviation should be computed */ val computeStandardDeviation: Boolean get() { - this.displayedStats.forEach { + this.stats.forEach { if (it == STANDARD_DEVIATION_BB_PER_100_HANDS || it == STANDARD_DEVIATION || it == STANDARD_DEVIATION_HOURLY) { return true } @@ -70,7 +67,7 @@ class Calculator { val computeLongestStreak: Boolean get() { - return this.displayedStats.contains(LONGEST_STREAKS) + return this.stats.contains(LONGEST_STREAKS) } val shouldSortValues: Boolean get() { @@ -78,19 +75,19 @@ class Calculator { } val computeLocationsPlayed: Boolean get() { - return this.displayedStats.contains(LOCATIONS_PLAYED) + return this.stats.contains(LOCATIONS_PLAYED) } val computeDaysPlayed: Boolean get() { - return this.displayedStats.contains(DAYS_PLAYED) + return this.stats.contains(DAYS_PLAYED) } val shouldManageMultiGroupProgressValues: Boolean get() { - if (this.aggregationType != null) { - return this.aggregationType == AggregationType.MONTH || this.aggregationType == AggregationType.YEAR + return if (this.aggregationType != null) { + this.aggregationType == AggregationType.MONTH || this.aggregationType == AggregationType.YEAR } else { - return false + false } } @@ -107,36 +104,31 @@ class Calculator { ): Report { val options = Options(evolutionValues = Options.EvolutionValues.STANDARD, aggregationType = aggregationType) - options.displayedStats = listOf(stat) + options.stats = listOf(stat) if (aggregationType == AggregationType.DURATION) { options.evolutionValues = Options.EvolutionValues.TIMED } stats?.let { - options.displayedStats = stats + options.stats = stats } return when (aggregationType) { AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options) AggregationType.MONTH, AggregationType.YEAR -> { - this.computeStatsWithCriterias(realm, aggregationType.criterias, group.query, options) + this.computeStats(realm, options) } } } - fun computeStatsWithCriterias( - realm: Realm, - criterias: List = listOf(), - query: Query = Query(), - options: Options = Options() - ): Report { + fun computeStats(realm: Realm, options: Options = Options()): Report { val computableGroups: MutableList = mutableListOf() - criterias.combined().forEach { comparatorQuery -> + options.criterias.combined().forEach { comparatorQuery -> - comparatorQuery.merge(query) + comparatorQuery.merge(options.query) val group = ComputableGroup(comparatorQuery) computableGroups.add(group) @@ -144,7 +136,7 @@ class Calculator { } if (computableGroups.size == 0) { - val group = ComputableGroup(query) + val group = ComputableGroup(options.query) computableGroups.add(group) } @@ -339,7 +331,7 @@ class Calculator { var gBBSum: Double? = null var maxDuration: Double? = null - if (computableGroup.conditions.size == 0) { // SessionSets are fine + if (computableGroup.conditions.isEmpty()) { // SessionSets are fine gHourlyDuration = sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index c795e299..fe2258cf 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -44,7 +44,7 @@ class Report(var options: Calculator.Options) { */ fun lineEntries(stat: Stat? = null, context: Context): LineDataSet { val entries = mutableListOf() - val statToUse = stat ?: options.displayedStats.firstOrNull() + val statToUse = stat ?: options.stats.firstOrNull() val statName = statToUse?.name ?: "" statToUse?.let { @@ -60,7 +60,7 @@ class Report(var options: Calculator.Options) { fun barEntries(stat: Stat? = null, context: Context): BarDataSet { val entries = mutableListOf() - val statToUse = stat ?: options.displayedStats.firstOrNull() + val statToUse = stat ?: options.stats.firstOrNull() statToUse?.let { this._results.forEachIndexed { index, results -> @@ -79,7 +79,7 @@ class Report(var options: Calculator.Options) { fun multiLineEntries(context: Context): List { val dataSets = mutableListOf() - options.displayedStats.forEach { stat -> + options.stats.forEach { stat -> this._results.forEachIndexed { index, result -> val ds = result.singleLineEntries(stat, context) ds.color = ColorUtils.almostRandomColor(index, context) @@ -106,7 +106,7 @@ class ComputableGroup(query: Query, stats: List? = null) { /** * The display name of the group */ - var name: String = "" + val name: String get() { return this.query.name } @@ -114,7 +114,7 @@ class ComputableGroup(query: Query, stats: List? = null) { /** * A list of _conditions to get */ - var conditions: List = listOf() + val conditions: List get() { return this.query.conditions } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 7a7bd784..ebb162b8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -196,8 +196,11 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable // } val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY) - val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) - val report = Calculator.computeStatsWithCriterias(realm, listOf(), query, options) + val options = Calculator.Options( + evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + stats = requiredStats, + query = query) + val report = Calculator.computeStats(realm, options) Timber.d("Report take: ${System.currentTimeMillis() - startDate.time}ms") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index d04eada1..af69e89c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -36,7 +36,8 @@ import java.util.* import kotlin.coroutines.CoroutineContext -class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { +class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, + RowRepresentableDelegate { enum class TimeFilter { MONTH, YEAR @@ -94,7 +95,12 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep TimeFilter.MONTH -> { val date = datesForRows[row] sortedMonthlyReports[datesForRows[row]]?.let { - CalendarDetailsActivity.newInstance(requireContext(), it, sessionTypeCondition, date?.getMonthAndYear()) + CalendarDetailsActivity.newInstance( + requireContext(), + it, + sessionTypeCondition, + date?.getMonthAndYear() + ) } } TimeFilter.YEAR -> { @@ -235,8 +241,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep val monthlyReports: HashMap = HashMap() val yearlyReports: HashMap = HashMap() - val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY ) - val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) + val requiredStats: List = + listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY) // Compute data per AnyYear and AnyMonthOfYear @@ -249,15 +255,23 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } monthlyQueries.forEach { query -> - val report = Calculator.computeStatsWithCriterias(realm, query = query, options = options) + val options = Calculator.Options( + evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + stats = requiredStats, + query = query + ) + val report = Calculator.computeStats(realm, options = options) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data query.conditions.forEach { condition -> - when (condition) { - is QueryCondition.AnyYear -> calendar.set(Calendar.YEAR, condition.listOfValues.first()) - is QueryCondition.AnyMonthOfYear -> calendar.set(Calendar.MONTH, condition.listOfValues.first()) - } + when (condition) { + is QueryCondition.AnyYear -> calendar.set(Calendar.YEAR, condition.listOfValues.first()) + is QueryCondition.AnyMonthOfYear -> calendar.set( + Calendar.MONTH, + condition.listOfValues.first() + ) + } } monthlyReports[calendar.time] = computedResults @@ -275,14 +289,19 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } yearConditions.forEach { query -> - val report = Calculator.computeStatsWithCriterias(realm, query = query, options = options) + val options = Calculator.Options( + evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + stats = requiredStats, + query = query + ) + val report = Calculator.computeStats(realm, options = options) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data query.conditions.forEach { condition -> - when (condition) { - is QueryCondition.AnyYear -> calendar.set(Calendar.YEAR, condition.listOfValues.first()) - } + when (condition) { + is QueryCondition.AnyYear -> calendar.set(Calendar.YEAR, condition.listOfValues.first()) + } } yearlyReports[calendar.time] = computedResults } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index e5f22039..73301aba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -105,9 +105,9 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour /** * Launch computation */ - private fun launchComputation(criteria: List, reportName: String) { + private fun launchComputation(criteriaList: List, reportName: String) { - if (criteria.combined().size < 2) { + if (criteriaList.combined().size < 2) { Toast.makeText(context, R.string.less_then_2_values_for_display, Toast.LENGTH_LONG).show() return } @@ -120,10 +120,13 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour val realm = Realm.getDefaultInstance() val requiredStats: List = listOf(Stat.NET_RESULT) - val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) + val options = Calculator.Options( + evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + stats = requiredStats, + criterias = criteriaList + ) - val report = Calculator.computeStatsWithCriterias(realm, criteria, options = options) -// val report = Calculator.computeStatsWithComparators(realm, criteria = criteria, options = options) + val report = Calculator.computeStats(realm, options = options) Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 42eb98ec..1298a41e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -137,7 +137,7 @@ class StatisticsFragment : TableReportFragment() { computedStats.addAll(allStats) computedStats.addAll(cgStats) computedStats.addAll(tStats) - options.displayedStats = computedStats + options.stats = computedStats return Calculator.computeGroups(realm, listOf(allSessionGroup, cgSessionGroup, tSessionGroup), options) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt index 71a1243b..3544c551 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt @@ -135,7 +135,7 @@ open class TableReportFragment : SessionObserverFragment(), StaticRowRepresentab open fun convertReportIntoRepresentables(report: Report): ArrayList { val rows: ArrayList = ArrayList() - report.options.displayedStats.forEach {stat -> + report.options.stats.forEach {stat -> rows.add(CustomizableRowRepresentable(title = stat.localizedTitle(requireContext()))) report.results.forEach { val title = it.group.name