Skip to content

Commit f26944c

Browse files
committed
fix: Remove anchorEnd and handle dates
1 parent c21b464 commit f26944c

File tree

3 files changed

+39
-53
lines changed

3 files changed

+39
-53
lines changed

src/features/instance/databases/DatabaseTableView.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,21 @@ export function DatabaseTableView() {
6969
resolver: zodResolver(ColumnFiltersSchema),
7070
});
7171
const columnFiltersValues = columnFiltersForm.watch();
72-
const rawSearchConditions: SearchCondition[] | null = useMemo(() => {
72+
const debouncedColumnFiltersValues = useDebounce(columnFiltersValues, 500, JSON.stringify);
73+
const searchConditions: SearchCondition[] | null = useMemo(() => {
7374
const conditions: SearchCondition[] = [];
74-
for (const key in columnFiltersValues) {
75-
if (columnFiltersValues[key]?.length) {
76-
conditions.push(translateColumnFilterToSearchCondition(key, columnFiltersValues[key], attributesMap[key]));
75+
for (const key in debouncedColumnFiltersValues) {
76+
if (debouncedColumnFiltersValues[key]?.length) {
77+
try {
78+
conditions.push(translateColumnFilterToSearchCondition(key, debouncedColumnFiltersValues[key], attributesMap[key]));
79+
}
80+
catch (err) {
81+
toast.error(String(err));
82+
}
7783
}
7884
}
7985
return conditions.length ? conditions : null;
80-
}, [attributesMap, columnFiltersValues])
81-
const searchConditions = useDebounce(rawSearchConditions, 500, JSON.stringify);
86+
}, [attributesMap, debouncedColumnFiltersValues]);
8287

8388
const { dataTableColumns, hashAttribute } = formatBrowseDataTableHeader(describeTableData);
8489
const [isAddModalOpen, setIsAddModalOpen] = useState(false);

src/features/instance/operations/queries/getSearchByConditions.test.ts

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,26 @@ function attr(type?: InstanceAttribute['type']): InstanceAttribute {
1313
}
1414

1515
describe('translateStringSearchType', () => {
16-
it('returns equals when both anchors are present', () => {
17-
expect(translateStringSearchType(true, true, attr('String'))).toBe('equals');
18-
});
19-
2016
it('returns starts_with when only start anchor is present', () => {
21-
expect(translateStringSearchType(true, false, attr('String'))).toBe('starts_with');
22-
});
23-
24-
it('returns ends_with when only end anchor is present', () => {
25-
expect(translateStringSearchType(false, true, attr('String'))).toBe('ends_with');
17+
expect(translateStringSearchType(true, attr('String'))).toBe('starts_with');
2618
});
2719

2820
it('returns equals for ID type when no anchors', () => {
29-
expect(translateStringSearchType(false, false, attr('ID'))).toBe('equals');
21+
expect(translateStringSearchType(false, attr('ID'))).toBe('equals');
3022
});
3123

32-
it('defaults to starts_with when no anchors and non-ID', () => {
33-
expect(translateStringSearchType(false, false, attr('String'))).toBe('starts_with');
34-
expect(translateStringSearchType(false, false, attr('Date'))).toBe('starts_with');
24+
it('defaults to equals when no anchors and non-ID', () => {
25+
expect(translateStringSearchType(false, attr('String'))).toBe('equals');
26+
expect(translateStringSearchType(false, attr('Date'))).toBe('equals');
3527
});
3628
});
3729

3830
describe('translateStringSearchValue', () => {
39-
it('strips both anchors', () => {
40-
expect(translateStringSearchValue(true, true, '^foo$')).toBe('foo');
41-
});
42-
it('strips start anchor only', () => {
43-
expect(translateStringSearchValue(true, false, '^foo')).toBe('foo');
44-
});
45-
it('strips end anchor only', () => {
46-
expect(translateStringSearchValue(false, true, 'foo$')).toBe('foo');
31+
it('strips start anchor', () => {
32+
expect(translateStringSearchValue(true, 'foo*')).toBe('foo');
4733
});
4834
it('returns as-is with no anchors', () => {
49-
expect(translateStringSearchValue(false, false, 'foo')).toBe('foo');
35+
expect(translateStringSearchValue(false, 'foo')).toBe('foo');
5036
});
5137
});
5238

@@ -87,26 +73,26 @@ describe('translateBooleanValue', () => {
8773
describe('translateColumnFilterToSearchCondition', () => {
8874
it('handles String attribute with anchors', () => {
8975
expect(
90-
translateColumnFilterToSearchCondition('name', '^foo$', attr('String')),
76+
translateColumnFilterToSearchCondition('name', 'foo', attr('String')),
9177
).toEqual({
9278
search_attribute: 'name',
9379
search_type: 'equals',
9480
search_value: 'foo',
9581
});
9682

9783
expect(
98-
translateColumnFilterToSearchCondition('name', 'bar$', attr('String')),
84+
translateColumnFilterToSearchCondition('name', 'bar*', attr('String')),
9985
).toEqual({
10086
search_attribute: 'name',
101-
search_type: 'ends_with',
87+
search_type: 'starts_with',
10288
search_value: 'bar',
10389
});
10490

10591
expect(
10692
translateColumnFilterToSearchCondition('name', 'baz', attr('String')),
10793
).toEqual({
10894
search_attribute: 'name',
109-
search_type: 'starts_with',
95+
search_type: 'equals',
11096
search_value: 'baz',
11197
});
11298
});

src/features/instance/operations/queries/getSearchByConditions.ts

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,12 @@ export function getSearchByConditionsOptions({
8484
export function translateColumnFilterToSearchCondition(key: string, value: string, attribute: InstanceAttribute | undefined): SearchCondition {
8585
switch (attribute?.type) {
8686
case 'ID':
87-
case 'Date':
8887
case 'String': {
89-
// TODO: Handle dates.
90-
const anchorStart = value[0] === '^';
91-
const anchorEnd = value[value.length - 1] === '$';
88+
const anchorStart = value[value.length - 1] === '*';
9289
return {
9390
search_attribute: key,
94-
search_type: translateStringSearchType(anchorStart, anchorEnd, attribute),
95-
search_value: translateStringSearchValue(anchorStart, anchorEnd, value),
91+
search_type: translateStringSearchType(anchorStart, attribute),
92+
search_value: translateStringSearchValue(anchorStart, value),
9693
};
9794
}
9895
case 'Int':
@@ -108,6 +105,16 @@ export function translateColumnFilterToSearchCondition(key: string, value: strin
108105
search_value: parsed,
109106
};
110107
}
108+
case 'Date': {
109+
const comparator = value.match(/^[><=]+/)?.[0];
110+
const rawValue = comparator ? value.slice(comparator.length) : value;
111+
const parsed = new Date(rawValue).toISOString();
112+
return {
113+
search_attribute: key,
114+
search_type: translateNumberComparator(comparator),
115+
search_value: parsed,
116+
};
117+
}
111118
case 'Boolean': {
112119
return {
113120
search_attribute: key,
@@ -127,30 +134,18 @@ export function translateColumnFilterToSearchCondition(key: string, value: strin
127134
}
128135
}
129136

130-
export function translateStringSearchType(anchorStart: boolean, anchorEnd: boolean, attribute: InstanceAttribute): Comparator {
131-
if (anchorStart && anchorEnd) {
132-
return 'equals';
133-
}
137+
export function translateStringSearchType(anchorStart: boolean, attribute: InstanceAttribute): Comparator {
134138
if (anchorStart) {
135139
return 'starts_with';
136140
}
137-
if (anchorEnd) {
138-
return 'ends_with';
139-
}
140141
if (attribute.type === 'ID') {
141142
return 'equals';
142143
}
143-
return 'starts_with';
144+
return 'equals';
144145
}
145146

146-
export function translateStringSearchValue(anchorStart: boolean, anchorEnd: boolean, value: string) {
147-
if (anchorStart && anchorEnd) {
148-
return value.slice(1, -1);
149-
}
147+
export function translateStringSearchValue(anchorStart: boolean, value: string) {
150148
if (anchorStart) {
151-
return value.slice(1);
152-
}
153-
if (anchorEnd) {
154149
return value.slice(0, -1);
155150
}
156151
return value;

0 commit comments

Comments
 (0)