|
|
|
@ -1,12 +1,9 @@ |
|
|
|
package net.pokeranalytics.android.model.filter |
|
|
|
package net.pokeranalytics.android.model.filter |
|
|
|
|
|
|
|
|
|
|
|
import io.realm.RealmList |
|
|
|
|
|
|
|
import io.realm.RealmQuery |
|
|
|
import io.realm.RealmQuery |
|
|
|
import net.pokeranalytics.android.exceptions.PokerAnalyticsException |
|
|
|
import net.pokeranalytics.android.exceptions.PokerAnalyticsException |
|
|
|
import net.pokeranalytics.android.model.realm.FilterCondition |
|
|
|
import net.pokeranalytics.android.model.realm.FilterCondition |
|
|
|
import net.pokeranalytics.android.model.realm.FilterElementBlind |
|
|
|
|
|
|
|
import net.pokeranalytics.android.model.realm.Session |
|
|
|
import net.pokeranalytics.android.model.realm.Session |
|
|
|
import net.pokeranalytics.android.util.Preferences |
|
|
|
|
|
|
|
import net.pokeranalytics.android.util.extensions.endOfDay |
|
|
|
import net.pokeranalytics.android.util.extensions.endOfDay |
|
|
|
import net.pokeranalytics.android.util.extensions.startOfDay |
|
|
|
import net.pokeranalytics.android.util.extensions.startOfDay |
|
|
|
import java.util.* |
|
|
|
import java.util.* |
|
|
|
@ -32,7 +29,7 @@ enum class QueryCondition(var operator: Operator? = null) { |
|
|
|
LIMIT, |
|
|
|
LIMIT, |
|
|
|
TABLE_SIZE, |
|
|
|
TABLE_SIZE, |
|
|
|
TOURNAMENT_TYPE, |
|
|
|
TOURNAMENT_TYPE, |
|
|
|
BLINDS, |
|
|
|
BLIND, |
|
|
|
LAST_GAMES, |
|
|
|
LAST_GAMES, |
|
|
|
LAST_SESSIONS, |
|
|
|
LAST_SESSIONS, |
|
|
|
MORE_NUMBER_OF_TABLE(Operator.MORE), |
|
|
|
MORE_NUMBER_OF_TABLE(Operator.MORE), |
|
|
|
@ -77,10 +74,6 @@ enum class QueryCondition(var operator: Operator? = null) { |
|
|
|
STARTED_FROM_TIME, |
|
|
|
STARTED_FROM_TIME, |
|
|
|
ENDED_TO_TIME, |
|
|
|
ENDED_TO_TIME, |
|
|
|
|
|
|
|
|
|
|
|
CURRENCY, |
|
|
|
|
|
|
|
CURRENCY_CODE, |
|
|
|
|
|
|
|
BIG_BLIND, |
|
|
|
|
|
|
|
SMALL_BLIND, |
|
|
|
|
|
|
|
COMMENT, |
|
|
|
COMMENT, |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
; |
|
|
|
@ -118,7 +111,7 @@ enum class QueryCondition(var operator: Operator? = null) { |
|
|
|
return when (this) { |
|
|
|
return when (this) { |
|
|
|
BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") |
|
|
|
BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") |
|
|
|
BLINDS -> arrayOf("blinds") |
|
|
|
BLIND -> arrayOf("blinds", "hasDefaultCurrency") |
|
|
|
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") |
|
|
|
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") |
|
|
|
DAY_OF_WEEK -> arrayOf("dayOfWeek") |
|
|
|
DAY_OF_WEEK -> arrayOf("dayOfWeek") |
|
|
|
MONTH -> arrayOf("month") |
|
|
|
MONTH -> arrayOf("month") |
|
|
|
@ -132,169 +125,145 @@ enum class QueryCondition(var operator: Operator? = null) { |
|
|
|
* providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] |
|
|
|
* providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
inline fun <reified T : Filterable> filter(realmQuery: RealmQuery<T>): RealmQuery<T> { |
|
|
|
inline fun <reified T : Filterable> filter(realmQuery: RealmQuery<T>): RealmQuery<T> { |
|
|
|
when { |
|
|
|
val fieldName = FilterHelper.fieldNameForQueryType<T>(this) |
|
|
|
this == BLINDS -> { |
|
|
|
fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown |
|
|
|
|
|
|
|
when (operator) { |
|
|
|
val smallBlindFieldName = FilterHelper.fieldNameForQueryType<T>(SMALL_BLIND) |
|
|
|
Operator.LESS -> { |
|
|
|
val bigBlindFieldName = FilterHelper.fieldNameForQueryType<T>(BIG_BLIND) |
|
|
|
val value: Double by valueMap |
|
|
|
val currencyCodeFieldName = FilterHelper.fieldNameForQueryType<T>(CURRENCY_CODE) |
|
|
|
return realmQuery.lessThanOrEqualTo(fieldName, value) |
|
|
|
smallBlindFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown |
|
|
|
} |
|
|
|
bigBlindFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown |
|
|
|
Operator.MORE -> { |
|
|
|
currencyCodeFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown |
|
|
|
val value: Double by valueMap |
|
|
|
|
|
|
|
return realmQuery.greaterThanOrEqualTo(fieldName, value) |
|
|
|
val blinds: RealmList<FilterElementBlind> by valueMap |
|
|
|
} |
|
|
|
blinds.forEachIndexed { index, blind -> |
|
|
|
Operator.BETWEEN -> { |
|
|
|
realmQuery |
|
|
|
val leftValue: Double by valueMap |
|
|
|
.beginGroup() |
|
|
|
val rightValue: Double by valueMap |
|
|
|
|
|
|
|
return realmQuery.between(fieldName, leftValue, rightValue) |
|
|
|
blind.sb?.let { |
|
|
|
} |
|
|
|
realmQuery |
|
|
|
} |
|
|
|
.equalTo(smallBlindFieldName, it) |
|
|
|
|
|
|
|
.and() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
realmQuery |
|
|
|
|
|
|
|
.equalTo(bigBlindFieldName, blind.bb) |
|
|
|
|
|
|
|
.and() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
blind.currencyCode?.let { |
|
|
|
|
|
|
|
realmQuery.equalTo(currencyCodeFieldName, it) |
|
|
|
|
|
|
|
} ?: run { |
|
|
|
|
|
|
|
realmQuery.isNull(currencyCodeFieldName) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
realmQuery.endGroup() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (index < blinds.size - 1) { |
|
|
|
return when (this) { |
|
|
|
realmQuery.or() |
|
|
|
LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) |
|
|
|
} |
|
|
|
CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) |
|
|
|
|
|
|
|
TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) |
|
|
|
|
|
|
|
ALL_TOURNAMENT_FEATURES -> { |
|
|
|
|
|
|
|
val ids: Array<String> by valueMap |
|
|
|
|
|
|
|
ids.forEach { |
|
|
|
|
|
|
|
realmQuery.equalTo(fieldName, it) |
|
|
|
} |
|
|
|
} |
|
|
|
return realmQuery |
|
|
|
realmQuery |
|
|
|
} |
|
|
|
} |
|
|
|
else -> { |
|
|
|
ANY_TOURNAMENT_FEATURES -> { |
|
|
|
|
|
|
|
val ids: Array<String> by valueMap |
|
|
|
val fieldName = FilterHelper.fieldNameForQueryType<T>(this) |
|
|
|
realmQuery.`in`(fieldName, ids) |
|
|
|
fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown |
|
|
|
} |
|
|
|
|
|
|
|
BLIND -> { |
|
|
|
when (operator) { |
|
|
|
val blinds: Array<String> by valueMap |
|
|
|
Operator.LESS -> { |
|
|
|
val hasDefaultCurrency: Array<Boolean> by valueMap |
|
|
|
val value: Double by valueMap |
|
|
|
//realmQuery.`in`(fieldName, blinds) |
|
|
|
return realmQuery.lessThanOrEqualTo(fieldName, value) |
|
|
|
blinds.forEachIndexed { index, s -> |
|
|
|
} |
|
|
|
val isUsingDefaultCurrency = hasDefaultCurrency[index] |
|
|
|
Operator.MORE -> { |
|
|
|
realmQuery.beginGroup() |
|
|
|
val value: Double by valueMap |
|
|
|
if (isUsingDefaultCurrency) { |
|
|
|
return realmQuery.greaterThanOrEqualTo(fieldName, value) |
|
|
|
realmQuery.endsWith(fieldName, s) |
|
|
|
} |
|
|
|
.and() |
|
|
|
Operator.BETWEEN -> { |
|
|
|
.isNull("bankroll.currency.code") |
|
|
|
val leftValue: Double by valueMap |
|
|
|
} else { |
|
|
|
val rightValue: Double by valueMap |
|
|
|
realmQuery.equalTo(fieldName, s) |
|
|
|
return realmQuery.between(fieldName, leftValue, rightValue) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.endGroup() |
|
|
|
|
|
|
|
if (index < blinds.size - 1) { |
|
|
|
|
|
|
|
realmQuery.or() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
realmQuery |
|
|
|
return when (this) { |
|
|
|
} |
|
|
|
LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) |
|
|
|
BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { |
|
|
|
CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) |
|
|
|
val ids: Array<String> by valueMap |
|
|
|
TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) |
|
|
|
realmQuery.`in`(fieldName, ids) |
|
|
|
ALL_TOURNAMENT_FEATURES -> { |
|
|
|
} |
|
|
|
val ids: Array<String> by valueMap |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { |
|
|
|
ids.forEach { |
|
|
|
val values: Array<Int?>? by valueMap |
|
|
|
realmQuery.equalTo(fieldName, it) |
|
|
|
realmQuery.`in`(fieldName, values) |
|
|
|
} |
|
|
|
} |
|
|
|
realmQuery |
|
|
|
STARTED_FROM_DATE -> { |
|
|
|
} |
|
|
|
val date: Date by valueMap |
|
|
|
ANY_TOURNAMENT_FEATURES -> { |
|
|
|
realmQuery.greaterThanOrEqualTo(fieldName, date) |
|
|
|
val ids: Array<String> by valueMap |
|
|
|
} |
|
|
|
realmQuery.`in`(fieldName, ids) |
|
|
|
STARTED_TO_DATE -> { |
|
|
|
} |
|
|
|
val date: Date by valueMap |
|
|
|
BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { |
|
|
|
realmQuery.lessThanOrEqualTo(fieldName, date) |
|
|
|
val ids: Array<String> by valueMap |
|
|
|
} |
|
|
|
realmQuery.`in`(fieldName, ids) |
|
|
|
ENDED_FROM_DATE -> { |
|
|
|
} |
|
|
|
val date: Date by valueMap |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { |
|
|
|
realmQuery.greaterThanOrEqualTo(fieldName, date) |
|
|
|
val values: Array<Int?>? by valueMap |
|
|
|
} |
|
|
|
realmQuery.`in`(fieldName, values) |
|
|
|
ENDED_TO_DATE -> { |
|
|
|
} |
|
|
|
val date: Date by valueMap |
|
|
|
STARTED_FROM_DATE -> { |
|
|
|
realmQuery.lessThanOrEqualTo(fieldName, date) |
|
|
|
val date: Date by valueMap |
|
|
|
} |
|
|
|
realmQuery.greaterThanOrEqualTo(fieldName, date) |
|
|
|
DAY_OF_WEEK -> { |
|
|
|
} |
|
|
|
val dayOfWeek: Int by valueMap |
|
|
|
STARTED_TO_DATE -> { |
|
|
|
realmQuery.equalTo(fieldName, dayOfWeek) |
|
|
|
val date: Date by valueMap |
|
|
|
} |
|
|
|
realmQuery.lessThanOrEqualTo(fieldName, date) |
|
|
|
MONTH -> { |
|
|
|
} |
|
|
|
val month: Int by valueMap |
|
|
|
ENDED_FROM_DATE -> { |
|
|
|
realmQuery.equalTo(fieldName, month) |
|
|
|
val date: Date by valueMap |
|
|
|
} |
|
|
|
realmQuery.greaterThanOrEqualTo(fieldName, date) |
|
|
|
YEAR -> { |
|
|
|
} |
|
|
|
val year: Int by valueMap |
|
|
|
ENDED_TO_DATE -> { |
|
|
|
realmQuery.equalTo(fieldName, year) |
|
|
|
val date: Date by valueMap |
|
|
|
} |
|
|
|
realmQuery.lessThanOrEqualTo(fieldName, date) |
|
|
|
WEEK_END, WEEK_DAY -> { |
|
|
|
} |
|
|
|
var query = realmQuery |
|
|
|
DAY_OF_WEEK -> { |
|
|
|
if (this == WEEK_DAY) { |
|
|
|
val dayOfWeek: Int by valueMap |
|
|
|
query = realmQuery.not() |
|
|
|
realmQuery.equalTo(fieldName, dayOfWeek) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
MONTH -> { |
|
|
|
|
|
|
|
val month: Int by valueMap |
|
|
|
|
|
|
|
realmQuery.equalTo(fieldName, month) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
YEAR -> { |
|
|
|
|
|
|
|
val year: Int by valueMap |
|
|
|
|
|
|
|
realmQuery.equalTo(fieldName, year) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
WEEK_END, WEEK_DAY -> { |
|
|
|
|
|
|
|
var query = realmQuery |
|
|
|
|
|
|
|
if (this == WEEK_DAY) { |
|
|
|
|
|
|
|
query = realmQuery.not() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
query.`in`(fieldName, arrayOf(Calendar.SATURDAY, Calendar.SUNDAY)) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
TODAY -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
realmQuery.between(fieldName, startDate.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
TODAY_AND_YESTERDAY-> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.add(Calendar.HOUR_OF_DAY, -24) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
YESTERDAY -> { |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = Date() |
|
|
|
|
|
|
|
calendar.add(Calendar.HOUR_OF_DAY, -24) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), calendar.time.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_WEEK -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.SUNDAY) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_MONTH -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_MONTH, 1) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_YEAR -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_YEAR, 1) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else -> { |
|
|
|
|
|
|
|
throw PokerAnalyticsException.QueryTypeUnhandled |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
query.`in`(fieldName, arrayOf(Calendar.SATURDAY, Calendar.SUNDAY)) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
TODAY -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
realmQuery.between(fieldName, startDate.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
TODAY_AND_YESTERDAY-> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.add(Calendar.HOUR_OF_DAY, -24) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
YESTERDAY -> { |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = Date() |
|
|
|
|
|
|
|
calendar.add(Calendar.HOUR_OF_DAY, -24) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), calendar.time.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_WEEK -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.SUNDAY) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_MONTH -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_MONTH, 1) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
THIS_YEAR -> { |
|
|
|
|
|
|
|
val startDate = Date() |
|
|
|
|
|
|
|
val calendar = Calendar.getInstance() |
|
|
|
|
|
|
|
calendar.time = startDate |
|
|
|
|
|
|
|
calendar.set(Calendar.DAY_OF_YEAR, 1) |
|
|
|
|
|
|
|
realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else -> { |
|
|
|
|
|
|
|
throw PokerAnalyticsException.QueryTypeUnhandled |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun updateValueMap(filterCondition: FilterCondition) { |
|
|
|
fun updateValueMap(filterCondition: FilterCondition) { |
|
|
|
@ -314,8 +283,10 @@ enum class QueryCondition(var operator: Operator? = null) { |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { |
|
|
|
LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { |
|
|
|
valueMap = mapOf("values" to filterCondition.values) |
|
|
|
valueMap = mapOf("values" to filterCondition.values) |
|
|
|
} |
|
|
|
} |
|
|
|
BLINDS -> { |
|
|
|
BLIND -> { |
|
|
|
valueMap = mapOf("blinds" to filterCondition.blinds) |
|
|
|
valueMap = mapOf( |
|
|
|
|
|
|
|
"blinds" to filterCondition.blinds, |
|
|
|
|
|
|
|
"hasDefaultCurrency" to filterCondition.hasDefaultCurrency) |
|
|
|
} |
|
|
|
} |
|
|
|
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { |
|
|
|
STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { |
|
|
|
valueMap = mapOf("date" to filterCondition.date) |
|
|
|
valueMap = mapOf("date" to filterCondition.date) |
|
|
|
|