|
|
|
|
@ -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<Stat> = listOf(), |
|
|
|
|
aggregationType: AggregationType? = null |
|
|
|
|
var display: Display = Display.TABLE, |
|
|
|
|
var evolutionValues: EvolutionValues = EvolutionValues.NONE, |
|
|
|
|
var stats: List<Stat> = listOf(), |
|
|
|
|
var criterias: List<Criteria> = 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<Stat> = 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<Criteria> = listOf(), |
|
|
|
|
query: Query = Query(), |
|
|
|
|
options: Options = Options() |
|
|
|
|
): Report { |
|
|
|
|
fun computeStats(realm: Realm, options: Options = Options()): Report { |
|
|
|
|
|
|
|
|
|
val computableGroups: MutableList<ComputableGroup> = 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() |
|
|
|
|
|