Skip to content

Commit e6cfedb

Browse files
TS426TS426
authored andcommitted
fix: address PR review comments for dialog date filters
- Update documentation to clarify activity filter behavior - Remove dead code (from/to fields in DialogReportQuery) - Fix ktlint formatting issues in tests
1 parent 61ca464 commit e6cfedb

File tree

7 files changed

+76
-323
lines changed

7 files changed

+76
-323
lines changed

bot/admin/server/src/main/kotlin/model/DialogsSearchQuery.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@ data class DialogsSearchQuery(
5151
val dialogCreationDateFrom: ZonedDateTime? = null,
5252
val dialogCreationDateTo: ZonedDateTime? = null,
5353
/**
54-
* Filter dialogs by activity period overlap.
55-
* A dialog is included if its activity period (from first to last action) overlaps the filter range.
56-
* Condition: activityFrom <= max(actions.date) AND min(actions.date) < activityTo
54+
* Filter dialogs that had activity during the specified period.
55+
* A dialog is included if:
56+
* - At least one action exists with date >= dialogActivityFrom (if set)
57+
* - At least one action exists with date < dialogActivityTo (if set)
58+
* Note: These conditions can be satisfied by different actions.
5759
*/
5860
val dialogActivityFrom: ZonedDateTime? = null,
5961
val dialogActivityTo: ZonedDateTime? = null,

bot/admin/server/src/test/kotlin/service/DialogSearchServiceTest.kt

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,17 @@ import kotlin.test.assertNull
2929
* Focus on date filtering parameters (dialogCreationDateFrom/To, dialogActivityFrom/To).
3030
*/
3131
class DialogSearchServiceTest {
32-
3332
@Nested
3433
inner class DialogsSearchQueryMappingTest {
35-
3634
@Test
3735
fun `toDialogReportQuery should map dialogCreationDateFrom correctly`() {
3836
// Given
3937
val creationDateFrom = ZonedDateTime.parse("2025-12-10T10:00:00Z")
40-
val query = createSearchQuery(
41-
dialogCreationDateFrom = creationDateFrom,
42-
dialogCreationDateTo = null
43-
)
38+
val query =
39+
createSearchQuery(
40+
dialogCreationDateFrom = creationDateFrom,
41+
dialogCreationDateTo = null,
42+
)
4443

4544
// When
4645
val reportQuery = query.toDialogReportQuery()
@@ -55,10 +54,11 @@ class DialogSearchServiceTest {
5554
fun `toDialogReportQuery should map dialogCreationDateTo correctly`() {
5655
// Given
5756
val creationDateTo = ZonedDateTime.parse("2025-12-15T10:00:00Z")
58-
val query = createSearchQuery(
59-
dialogCreationDateFrom = null,
60-
dialogCreationDateTo = creationDateTo
61-
)
57+
val query =
58+
createSearchQuery(
59+
dialogCreationDateFrom = null,
60+
dialogCreationDateTo = creationDateTo,
61+
)
6262

6363
// When
6464
val reportQuery = query.toDialogReportQuery()
@@ -74,10 +74,11 @@ class DialogSearchServiceTest {
7474
// Given
7575
val creationDateFrom = ZonedDateTime.parse("2025-12-10T10:00:00Z")
7676
val creationDateTo = ZonedDateTime.parse("2025-12-15T10:00:00Z")
77-
val query = createSearchQuery(
78-
dialogCreationDateFrom = creationDateFrom,
79-
dialogCreationDateTo = creationDateTo
80-
)
77+
val query =
78+
createSearchQuery(
79+
dialogCreationDateFrom = creationDateFrom,
80+
dialogCreationDateTo = creationDateTo,
81+
)
8182

8283
// When
8384
val reportQuery = query.toDialogReportQuery()
@@ -91,10 +92,11 @@ class DialogSearchServiceTest {
9192
fun `toDialogReportQuery should map dialogActivityFrom correctly`() {
9293
// Given
9394
val activityFrom = ZonedDateTime.parse("2025-12-10T10:00:00Z")
94-
val query = createSearchQuery(
95-
dialogActivityFrom = activityFrom,
96-
dialogActivityTo = null
97-
)
95+
val query =
96+
createSearchQuery(
97+
dialogActivityFrom = activityFrom,
98+
dialogActivityTo = null,
99+
)
98100

99101
// When
100102
val reportQuery = query.toDialogReportQuery()
@@ -109,10 +111,11 @@ class DialogSearchServiceTest {
109111
fun `toDialogReportQuery should map dialogActivityTo correctly`() {
110112
// Given
111113
val activityTo = ZonedDateTime.parse("2025-12-15T10:00:00Z")
112-
val query = createSearchQuery(
113-
dialogActivityFrom = null,
114-
dialogActivityTo = activityTo
115-
)
114+
val query =
115+
createSearchQuery(
116+
dialogActivityFrom = null,
117+
dialogActivityTo = activityTo,
118+
)
116119

117120
// When
118121
val reportQuery = query.toDialogReportQuery()
@@ -128,10 +131,11 @@ class DialogSearchServiceTest {
128131
// Given
129132
val activityFrom = ZonedDateTime.parse("2025-12-10T10:00:00Z")
130133
val activityTo = ZonedDateTime.parse("2025-12-15T10:00:00Z")
131-
val query = createSearchQuery(
132-
dialogActivityFrom = activityFrom,
133-
dialogActivityTo = activityTo
134-
)
134+
val query =
135+
createSearchQuery(
136+
dialogActivityFrom = activityFrom,
137+
dialogActivityTo = activityTo,
138+
)
135139

136140
// When
137141
val reportQuery = query.toDialogReportQuery()
@@ -148,12 +152,13 @@ class DialogSearchServiceTest {
148152
val creationDateTo = ZonedDateTime.parse("2025-12-05T10:00:00Z")
149153
val activityFrom = ZonedDateTime.parse("2025-12-10T10:00:00Z")
150154
val activityTo = ZonedDateTime.parse("2025-12-15T10:00:00Z")
151-
val query = createSearchQuery(
152-
dialogCreationDateFrom = creationDateFrom,
153-
dialogCreationDateTo = creationDateTo,
154-
dialogActivityFrom = activityFrom,
155-
dialogActivityTo = activityTo
156-
)
155+
val query =
156+
createSearchQuery(
157+
dialogCreationDateFrom = creationDateFrom,
158+
dialogCreationDateTo = creationDateTo,
159+
dialogActivityFrom = activityFrom,
160+
dialogActivityTo = activityTo,
161+
)
157162

158163
// When
159164
val reportQuery = query.toDialogReportQuery()
@@ -168,12 +173,13 @@ class DialogSearchServiceTest {
168173
@Test
169174
fun `toDialogReportQuery should handle null date parameters correctly`() {
170175
// Given
171-
val query = createSearchQuery(
172-
dialogCreationDateFrom = null,
173-
dialogCreationDateTo = null,
174-
dialogActivityFrom = null,
175-
dialogActivityTo = null
176-
)
176+
val query =
177+
createSearchQuery(
178+
dialogCreationDateFrom = null,
179+
dialogCreationDateTo = null,
180+
dialogActivityFrom = null,
181+
dialogActivityTo = null,
182+
)
177183

178184
// When
179185
val reportQuery = query.toDialogReportQuery()
@@ -209,7 +215,7 @@ class DialogSearchServiceTest {
209215
dialogCreationDateFrom: ZonedDateTime? = null,
210216
dialogCreationDateTo: ZonedDateTime? = null,
211217
dialogActivityFrom: ZonedDateTime? = null,
212-
dialogActivityTo: ZonedDateTime? = null
218+
dialogActivityTo: ZonedDateTime? = null,
213219
): DialogsSearchQuery {
214220
return DialogsSearchQuery(
215221
playerId = null,
@@ -234,7 +240,7 @@ class DialogSearchServiceTest {
234240
dialogCreationDateFrom = dialogCreationDateFrom,
235241
dialogCreationDateTo = dialogCreationDateTo,
236242
dialogActivityFrom = dialogActivityFrom,
237-
dialogActivityTo = dialogActivityTo
243+
dialogActivityTo = dialogActivityTo,
238244
)
239245
}
240246
}

bot/engine/src/main/kotlin/admin/dialog/DialogReportQuery.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ data class DialogReportQuery(
3838
val dialogId: String? = null,
3939
val intentName: String? = null,
4040
val exactMatch: Boolean = false,
41-
val from: ZonedDateTime? = null,
42-
val to: ZonedDateTime? = null,
4341
val connectorType: ConnectorType? = null,
4442
/**
4543
* Display test dialogs.
@@ -70,9 +68,11 @@ data class DialogReportQuery(
7068
val dialogCreationDateFrom: ZonedDateTime? = null,
7169
val dialogCreationDateTo: ZonedDateTime? = null,
7270
/**
73-
* Filter dialogs by activity period overlap.
74-
* A dialog is included if its activity period (from first to last action) overlaps the filter range.
75-
* Condition: activityFrom <= max(actions.date) AND min(actions.date) < activityTo
71+
* Filter dialogs that had activity during the specified period.
72+
* A dialog is included if:
73+
* - At least one action exists with date >= dialogActivityFrom (if set)
74+
* - At least one action exists with date < dialogActivityTo (if set)
75+
* Note: These conditions can be satisfied by different actions.
7676
*/
7777
val dialogActivityFrom: ZonedDateTime? = null,
7878
val dialogActivityTo: ZonedDateTime? = null,

bot/storage-mongo/src/main/kotlin/MongoAgg.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,14 @@ object MongoAgg {
325325
}
326326

327327
/**
328-
* Filters documents where the activity period overlaps with the filter period.
328+
* Filters documents that had activity during the specified period.
329329
*
330-
* Condition: fromDate <= youngestDate AND oldestDate < toDate
330+
* A document is included if:
331+
* - At least one action exists with date >= fromDate (if fromDate is set)
332+
* - At least one action exists with date < toDate (if toDate is set)
331333
*
332-
* A document is included if its activity period (from oldest to youngest date)
333-
* overlaps the filter range. This implements period overlap logic.
334+
* Note: These conditions can be satisfied by different actions.
335+
* Mathematically equivalent to: fromDate <= max(dates) AND min(dates) < toDate
334336
*
335337
* @param inputField the input array field (e.g., "stories")
336338
* @param datePath the path to the date field within each element (e.g., "actions.date")

bot/storage-mongo/src/main/kotlin/UserTimelineMongoDAO.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,6 @@ internal object UserTimelineMongoDAO : UserTimelineDAO, UserReportDAO, DialogRep
780780
if (query.playerId != null || query.displayTests) null else Test eq false,
781781
if (query.playerId == null) null else PlayerIds.id eq query.playerId!!.id,
782782
if (dialogIds.isEmpty()) null else _id `in` dialogIds,
783-
if (from == null) null else DialogCol_.LastUpdateDate gt from?.toInstant(),
784-
if (to == null) null else DialogCol_.LastUpdateDate lt to?.toInstant(),
785783
if (connectorType == null) null else Stories.actions.state.targetConnectorType.id eq connectorType!!.id,
786784
if (query.intentName.isNullOrBlank()) null else Stories.currentIntent.name_ eq query.intentName,
787785
if (query.ratings.isNotEmpty()) DialogCol_.Rating `in` query.ratings.toSet() else null,

0 commit comments

Comments
 (0)