Skip to content

Commit f02f13d

Browse files
danmichaeljonesDan Jones
andauthored
Add new filter and aggregation response types (#21)
* Add new filter types * Add array filter types * Add date aggregation models * PR comments --------- Co-authored-by: Dan Jones <[email protected]>
1 parent 7fec80f commit f02f13d

File tree

4 files changed

+449
-16
lines changed

4 files changed

+449
-16
lines changed

src/query/response/api-response-mapping.ts

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
SearchResult,
77
Source,
88
Usage,
9+
DateFilterValue,
910
} from "./response.js";
1011

1112
import {
@@ -16,6 +17,7 @@ import {
1617
ApiSearchResult,
1718
ApiSource,
1819
ApiUsage,
20+
ApiDateFilterValue,
1921
} from "./api-response.js";
2022

2123
export const mapApiResponse = (
@@ -43,14 +45,122 @@ const mapApiSearches = (searches: SearchResult[][]): ApiSearchResult[][] =>
4345
}))
4446
);
4547

48+
const mapDateFilterValue = (value: DateFilterValue): ApiDateFilterValue | undefined => {
49+
if ("exactTimestamp" in value) {
50+
return {
51+
exact_timestamp: value.exactTimestamp,
52+
operator: value.operator,
53+
};
54+
} else if (
55+
"dateFrom" in value
56+
&& "dateTo" in value
57+
&& value.dateFrom != null
58+
&& value.dateTo != null
59+
) {
60+
return {
61+
date_from: value.dateFrom,
62+
date_to: value.dateTo,
63+
inclusive_from: value.inclusiveFrom,
64+
inclusive_to: value.inclusiveTo,
65+
};
66+
} else if ("dateFrom" in value && value.dateFrom != null) {
67+
return {
68+
date_from: value.dateFrom,
69+
inclusive_from: value.inclusiveFrom,
70+
};
71+
} else if ("dateTo" in value && value.dateTo != null) {
72+
return {
73+
date_to: value.dateTo,
74+
inclusive_to: value.inclusiveTo,
75+
};
76+
}
77+
else {
78+
return undefined
79+
}
80+
};
81+
4682
const mapApiPropertyFilters = (
4783
filters: PropertyFilter[]
4884
): ApiPropertyFilter[] =>
49-
filters.map((filter) => ({
50-
property_name: filter.propertyName,
51-
operator: filter.operator,
52-
value: filter.value,
53-
}));
85+
filters.map((filter) => {
86+
switch (filter.filterType) {
87+
case "integer":
88+
return {
89+
filter_type: "integer",
90+
property_name: filter.propertyName,
91+
operator: filter.operator,
92+
value: filter.value,
93+
};
94+
case "integerArray":
95+
return {
96+
filter_type: "integer_array",
97+
property_name: filter.propertyName,
98+
operator: filter.operator,
99+
value: filter.value,
100+
};
101+
case "text":
102+
return {
103+
filter_type: "text",
104+
property_name: filter.propertyName,
105+
operator: filter.operator,
106+
value: filter.value,
107+
};
108+
case "textArray":
109+
return {
110+
filter_type: "text_array",
111+
property_name: filter.propertyName,
112+
operator: filter.operator,
113+
value: filter.value,
114+
};
115+
case "boolean":
116+
return {
117+
filter_type: "boolean",
118+
property_name: filter.propertyName,
119+
operator: filter.operator,
120+
value: filter.value,
121+
};
122+
case "booleanArray":
123+
return {
124+
filter_type: "boolean_array",
125+
property_name: filter.propertyName,
126+
operator: filter.operator,
127+
value: filter.value,
128+
};
129+
case "dateRange":
130+
const value = mapDateFilterValue(filter.value);
131+
if (!value) {
132+
return undefined;
133+
}
134+
return {
135+
filter_type: "date_range",
136+
property_name: filter.propertyName,
137+
value,
138+
};
139+
case "dateArray":
140+
return {
141+
filter_type: "date_array",
142+
property_name: filter.propertyName,
143+
operator: filter.operator,
144+
value: filter.value,
145+
};
146+
case "geo":
147+
return {
148+
filter_type: "geo",
149+
property_name: filter.propertyName,
150+
latitude: filter.latitude,
151+
longitude: filter.longitude,
152+
max_distance_meters: filter.maxDistanceMeters,
153+
};
154+
case "isNull":
155+
return {
156+
filter_type: "is_null",
157+
property_name: filter.propertyName,
158+
is_null: filter.isNull,
159+
};
160+
default:
161+
return undefined
162+
}
163+
}).filter((filter): filter is ApiPropertyFilter => filter !== undefined);
54164

55165
const mapApiAggregations = (
56166
aggregations: AggregationResult[][]

src/query/response/api-response.ts

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
NumericMetrics,
33
TextMetrics,
44
BooleanMetrics,
5+
DateMetrics,
56
ComparisonOperator,
67
} from "./response.js";
78

@@ -27,26 +28,109 @@ export type ApiSearchResult = {
2728

2829
export type ApiPropertyFilter =
2930
| ApiIntegerPropertyFilter
31+
| ApiIntegerArrayPropertyFilter
3032
| ApiTextPropertyFilter
31-
| ApiBooleanPropertyFilter;
33+
| ApiTextArrayPropertyFilter
34+
| ApiBooleanPropertyFilter
35+
| ApiBooleanArrayPropertyFilter
36+
| ApiDatePropertyFilter
37+
| ApiDateArrayPropertyFilter
38+
| ApiGeoPropertyFilter
39+
| ApiIsNullPropertyFilter;
3240

3341
type ApiPropertyFilterBase = {
42+
filter_type: string;
3443
property_name: string;
35-
operator: ComparisonOperator;
3644
};
3745

3846
export type ApiIntegerPropertyFilter = ApiPropertyFilterBase & {
47+
filter_type: "integer";
48+
operator: ComparisonOperator;
3949
value: number;
4050
};
4151

52+
export type ApiIntegerArrayPropertyFilter = ApiPropertyFilterBase & {
53+
filter_type: "integer_array";
54+
operator: ComparisonOperator;
55+
value: number[];
56+
};
57+
4258
export type ApiTextPropertyFilter = ApiPropertyFilterBase & {
59+
filter_type: "text";
60+
operator: ComparisonOperator;
4361
value: string;
4462
};
4563

64+
export type ApiTextArrayPropertyFilter = ApiPropertyFilterBase & {
65+
filter_type: "text_array";
66+
operator: ComparisonOperator;
67+
value: string[];
68+
};
69+
4670
export type ApiBooleanPropertyFilter = ApiPropertyFilterBase & {
71+
filter_type: "boolean";
72+
operator: ComparisonOperator;
4773
value: boolean;
4874
};
4975

76+
export type ApiBooleanArrayPropertyFilter = ApiPropertyFilterBase & {
77+
filter_type: "boolean_array";
78+
operator: ComparisonOperator;
79+
value: boolean[];
80+
};
81+
82+
export type ApiDateExact = {
83+
exact_timestamp: string;
84+
operator: ComparisonOperator;
85+
};
86+
87+
export type ApiDateRangeFrom = {
88+
date_from: string;
89+
inclusive_from: boolean;
90+
};
91+
92+
export type ApiDateRangeTo = {
93+
date_to: string;
94+
inclusive_to: boolean;
95+
};
96+
97+
export type ApiDateRangeBetween = {
98+
date_from: string;
99+
date_to: string;
100+
inclusive_from: boolean;
101+
inclusive_to: boolean;
102+
};
103+
104+
export type ApiDateFilterValue =
105+
ApiDateExact
106+
| ApiDateRangeFrom
107+
| ApiDateRangeTo
108+
| ApiDateRangeBetween;
109+
110+
export type ApiDatePropertyFilter = ApiPropertyFilterBase & {
111+
filter_type: "date_range";
112+
value: ApiDateFilterValue;
113+
};
114+
115+
export type ApiDateArrayPropertyFilter = ApiPropertyFilterBase & {
116+
filter_type: "date_array";
117+
operator: ComparisonOperator;
118+
value: string[];
119+
};
120+
121+
export type ApiGeoPropertyFilter = ApiPropertyFilterBase & {
122+
filter_type: "geo";
123+
latitude: number;
124+
longitude: number;
125+
max_distance_meters: number;
126+
};
127+
128+
export type ApiIsNullPropertyFilter = ApiPropertyFilterBase & {
129+
filter_type: "is_null";
130+
is_null: boolean;
131+
};
132+
133+
50134
export type ApiAggregationResult = {
51135
collection: string;
52136
search_query?: string;
@@ -58,7 +142,8 @@ export type ApiAggregationResult = {
58142
export type ApiPropertyAggregation =
59143
| ApiIntegerPropertyAggregation
60144
| ApiTextPropertyAggregation
61-
| ApiBooleanPropertyAggregation;
145+
| ApiBooleanPropertyAggregation
146+
| ApiDatePropertyAggregation;
62147

63148
type ApiPropertyAggregationBase = {
64149
property_name: string;
@@ -77,6 +162,10 @@ export type ApiBooleanPropertyAggregation = ApiPropertyAggregationBase & {
77162
metrics: BooleanMetrics;
78163
};
79164

165+
export type ApiDatePropertyAggregation = ApiPropertyAggregationBase & {
166+
metrics: DateMetrics;
167+
};
168+
80169
export type ApiUsage = {
81170
requests: number;
82171
request_tokens?: number;

0 commit comments

Comments
 (0)