Skip to content

Commit e0bd1a3

Browse files
committed
search now properly handles dates and date ranges
1 parent 385daa6 commit e0bd1a3

File tree

8 files changed

+284
-206
lines changed

8 files changed

+284
-206
lines changed

ChangeLog.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
# Change Log
22

3-
### 2.2.0-rc1 (Sprint 1)
3+
### 2.2.0-rc2 (Sprint 3)
44
- exact phrase search using double quotes
5+
- date and date range search on date fields, using the following formats:
6+
- YYYY-MM-DD
7+
- YYYY-MM-DDTHH:MM:SS(.mmm)(Z) (where the .mmm and Z are optional, defaults to .000Z if missing)
8+
- YYYY-MM-DD..YYYY-MM-DD
9+
- YYYY-MM-DDTHH:MM:SS(.mmm)(Z)..YYYY-MM-DDTHH:MM:SS.(mmm)(Z)
510

611
### 2.1.0
712
- wildcard search using "*" and "?"

package-lock.json

Lines changed: 115 additions & 115 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/common/IsoDate/IsoDatetime.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export class IsoDatetime extends IsoDate {
198198
}
199199

200200
/**
201-
* Returns an ISO‑8601 string representing this datetime shifted by the given
201+
* Returns an IsoDatetime object representing this datetime shifted by the given
202202
* number of days (positive or negative). The shift respects month lengths,
203203
* leap‑year rules, and century leap‑year exceptions.
204204
*
@@ -247,6 +247,7 @@ export class IsoDatetime extends IsoDate {
247247
);
248248
return next;
249249
}
250+
250251
}
251252

252253

src/search/SearchQueryBuilder.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,22 @@ export class SearchQueryBuilder {
9393
let startDate;
9494
let stopDate;
9595
if (isDate || isDateRange) {
96+
// we currently support 3 use cases only:
97+
// 1. YYYY-MM-DD
98+
// 2. YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)
99+
// 3. YYYY-MM-DD..YYYY-MM-DD
100+
// 4. YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)..YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)
96101
if (isDate) {
102+
// case 1: YYYY-MM-DD
103+
// case 2: YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)
97104
// if the user had requested an IsoDate, it should stay as an IsoDate and not be cast to an IsoDatetime
98105
// otherwise YYYY or YYYY-MM requests would not work
99106
startDate = (this._searchText.length > 10) ? IsoDatetime.parse(this._searchText) : IsoDate.parse(this._searchText);
100-
stopDate = IsoDatetime.fromIsoDate(startDate).getNextDay();
107+
// we are now doing inclusive date ranges, so the same startDate and stopDate should now be used
108+
stopDate = startDate; //IsoDatetime.fromIsoDate(startDate).getNextDay();
101109
} else if (isDateRange) {
110+
// case 3: YYYY-MM-DD..YYYY-MM-DD
111+
// case 4: YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)..YYYY-MM-DDTHH:MM:SS(.mmmm)(Z)
102112
const dateRange = IsoDatetimeRange.parse(this._searchText);
103113
startDate = dateRange.start;
104114
stopDate = dateRange.end;
@@ -111,7 +121,7 @@ export class SearchQueryBuilder {
111121
"range": {
112122
"${path}": {
113123
"gte": "${toSearchDateDslString(startDate)}",
114-
"lt": "${toSearchDateDslString(stopDate)}"
124+
"lte": "${toSearchDateDslString(stopDate)}"
115125
}
116126
}
117127
}`;

src/search/SearchRequest.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { SearchOptions } from "./BasicSearchManager.js"
77
import { SearchExpression } from './SearchExpression.js';
88
import { IsoDate } from '../common/IsoDate/IsoDate.js';
99
import { IsoDatetime, isIsoDatetime } from '../common/IsoDate/IsoDatetime.js';
10-
import { IsoDatetimeRange } from '../common/IsoDate/IsoDatetimeRange.js';
10+
import { IsoDatetimeRange, isIsoDatetimeRange } from '../common/IsoDate/IsoDatetimeRange.js';
1111

1212

1313
export const SearchRequestType = {
@@ -245,24 +245,7 @@ export class SearchRequest {
245245

246246
/** returns true iff searchText is a IsoDate or IsoDatetime range */
247247
static isDateRangeString(searchText: string | null): boolean {
248-
// can be split with "/" or ".." or "..."
249-
let dates = searchText.split('..');
250-
if (dates.length !== 2) {
251-
dates = searchText.split('...');
252-
}
253-
if (dates.length !== 2) {
254-
dates = searchText.split('/');
255-
}
256-
if (dates.length !== 2) {
257-
return false;
258-
}
259-
260-
if (this.isDateString(dates[0]) && this.isDateString(dates[1])) {
261-
return true;
262-
}
263-
else {
264-
return false;
265-
}
248+
return isIsoDatetimeRange(searchText)
266249
}
267250

268251

src/search/__snapshots__/SearchQueryBuilder.test.unit.ts.snap

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -150,79 +150,79 @@ CveResult {
150150
"range": Object {
151151
"cveMetadata.datePublished": Object {
152152
"gte": "2023-12-21||/d",
153-
"lt": "2023-12-22T00:00:00Z",
153+
"lte": "2023-12-21||/d",
154154
},
155155
},
156156
},
157157
Object {
158158
"range": Object {
159159
"cveMetadata.dateRejected": Object {
160160
"gte": "2023-12-21||/d",
161-
"lt": "2023-12-22T00:00:00Z",
161+
"lte": "2023-12-21||/d",
162162
},
163163
},
164164
},
165165
Object {
166166
"range": Object {
167167
"cveMetadata.dateReserved": Object {
168168
"gte": "2023-12-21||/d",
169-
"lt": "2023-12-22T00:00:00Z",
169+
"lte": "2023-12-21||/d",
170170
},
171171
},
172172
},
173173
Object {
174174
"range": Object {
175175
"cveMetadata.dateUpdated": Object {
176176
"gte": "2023-12-21||/d",
177-
"lt": "2023-12-22T00:00:00Z",
177+
"lte": "2023-12-21||/d",
178178
},
179179
},
180180
},
181181
Object {
182182
"range": Object {
183183
"containers.cna.datePublic": Object {
184184
"gte": "2023-12-21||/d",
185-
"lt": "2023-12-22T00:00:00Z",
185+
"lte": "2023-12-21||/d",
186186
},
187187
},
188188
},
189189
Object {
190190
"range": Object {
191191
"containers.cna.providerMetadata.dateUpdated": Object {
192192
"gte": "2023-12-21||/d",
193-
"lt": "2023-12-22T00:00:00Z",
193+
"lte": "2023-12-21||/d",
194194
},
195195
},
196196
},
197197
Object {
198198
"range": Object {
199199
"containers.cna.timeline.time": Object {
200200
"gte": "2023-12-21||/d",
201-
"lt": "2023-12-22T00:00:00Z",
201+
"lte": "2023-12-21||/d",
202202
},
203203
},
204204
},
205205
Object {
206206
"range": Object {
207207
"containers.adp.metrics.other.content.dateAdded": Object {
208208
"gte": "2023-12-21||/d",
209-
"lt": "2023-12-22T00:00:00Z",
209+
"lte": "2023-12-21||/d",
210210
},
211211
},
212212
},
213213
Object {
214214
"range": Object {
215215
"containers.adp.metrics.other.content.timestamp": Object {
216216
"gte": "2023-12-21||/d",
217-
"lt": "2023-12-22T00:00:00Z",
217+
"lte": "2023-12-21||/d",
218218
},
219219
},
220220
},
221221
Object {
222222
"range": Object {
223223
"containers.adp.providerMetadata.dateUpdated": Object {
224224
"gte": "2023-12-21||/d",
225-
"lt": "2023-12-22T00:00:00Z",
225+
"lte": "2023-12-21||/d",
226226
},
227227
},
228228
},
@@ -289,79 +289,79 @@ CveResult {
289289
"range": Object {
290290
"cveMetadata.datePublished": Object {
291291
"gte": "2024-11-27T09:00:00Z",
292-
"lt": "2024-12-01T00:00:00Z",
292+
"lte": "2024-12-01T00:00:00Z",
293293
},
294294
},
295295
},
296296
Object {
297297
"range": Object {
298298
"cveMetadata.dateRejected": Object {
299299
"gte": "2024-11-27T09:00:00Z",
300-
"lt": "2024-12-01T00:00:00Z",
300+
"lte": "2024-12-01T00:00:00Z",
301301
},
302302
},
303303
},
304304
Object {
305305
"range": Object {
306306
"cveMetadata.dateReserved": Object {
307307
"gte": "2024-11-27T09:00:00Z",
308-
"lt": "2024-12-01T00:00:00Z",
308+
"lte": "2024-12-01T00:00:00Z",
309309
},
310310
},
311311
},
312312
Object {
313313
"range": Object {
314314
"cveMetadata.dateUpdated": Object {
315315
"gte": "2024-11-27T09:00:00Z",
316-
"lt": "2024-12-01T00:00:00Z",
316+
"lte": "2024-12-01T00:00:00Z",
317317
},
318318
},
319319
},
320320
Object {
321321
"range": Object {
322322
"containers.cna.datePublic": Object {
323323
"gte": "2024-11-27T09:00:00Z",
324-
"lt": "2024-12-01T00:00:00Z",
324+
"lte": "2024-12-01T00:00:00Z",
325325
},
326326
},
327327
},
328328
Object {
329329
"range": Object {
330330
"containers.cna.providerMetadata.dateUpdated": Object {
331331
"gte": "2024-11-27T09:00:00Z",
332-
"lt": "2024-12-01T00:00:00Z",
332+
"lte": "2024-12-01T00:00:00Z",
333333
},
334334
},
335335
},
336336
Object {
337337
"range": Object {
338338
"containers.cna.timeline.time": Object {
339339
"gte": "2024-11-27T09:00:00Z",
340-
"lt": "2024-12-01T00:00:00Z",
340+
"lte": "2024-12-01T00:00:00Z",
341341
},
342342
},
343343
},
344344
Object {
345345
"range": Object {
346346
"containers.adp.metrics.other.content.dateAdded": Object {
347347
"gte": "2024-11-27T09:00:00Z",
348-
"lt": "2024-12-01T00:00:00Z",
348+
"lte": "2024-12-01T00:00:00Z",
349349
},
350350
},
351351
},
352352
Object {
353353
"range": Object {
354354
"containers.adp.metrics.other.content.timestamp": Object {
355355
"gte": "2024-11-27T09:00:00Z",
356-
"lt": "2024-12-01T00:00:00Z",
356+
"lte": "2024-12-01T00:00:00Z",
357357
},
358358
},
359359
},
360360
Object {
361361
"range": Object {
362362
"containers.adp.providerMetadata.dateUpdated": Object {
363363
"gte": "2024-11-27T09:00:00Z",
364-
"lt": "2024-12-01T00:00:00Z",
364+
"lte": "2024-12-01T00:00:00Z",
365365
},
366366
},
367367
},

0 commit comments

Comments
 (0)