aws-service-stack 0.18.429 → 0.18.430

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/_examples/controller/local-task-controller.d.ts +4 -0
  2. package/dist/_examples/controller/local-task-controller.d.ts.map +1 -1
  3. package/dist/_examples/controller/local-task-controller.js +39 -1
  4. package/dist/_examples/controller/local-task-controller.js.map +1 -1
  5. package/dist/_examples/controller/order/order-config.d.ts.map +1 -1
  6. package/dist/_examples/controller/order/order-config.js +6 -4
  7. package/dist/_examples/controller/order/order-config.js.map +1 -1
  8. package/dist/_examples/model-shared/order.model.d.ts +7 -7
  9. package/dist/_examples/model-shared/order.model.d.ts.map +1 -1
  10. package/dist/_examples/model-shared/order.model.js.map +1 -1
  11. package/dist/_examples/repositories/order/order-es.repo.d.ts +8 -0
  12. package/dist/_examples/repositories/order/order-es.repo.d.ts.map +1 -0
  13. package/dist/_examples/repositories/order/order-es.repo.interface.d.ts +5 -0
  14. package/dist/_examples/repositories/order/order-es.repo.interface.d.ts.map +1 -0
  15. package/dist/_examples/repositories/order/order-es.repo.interface.js +3 -0
  16. package/dist/_examples/repositories/order/order-es.repo.interface.js.map +1 -0
  17. package/dist/_examples/repositories/order/order-es.repo.js +20 -0
  18. package/dist/_examples/repositories/order/order-es.repo.js.map +1 -0
  19. package/dist/_examples/service/order/order-service.d.ts +4 -2
  20. package/dist/_examples/service/order/order-service.d.ts.map +1 -1
  21. package/dist/_examples/service/order/order-service.js +2 -1
  22. package/dist/_examples/service/order/order-service.js.map +1 -1
  23. package/dist/exception/exception-handler.d.ts.map +1 -1
  24. package/dist/exception/exception-handler.js.map +1 -1
  25. package/dist/model/base.model.d.ts +12 -5
  26. package/dist/model/base.model.d.ts.map +1 -1
  27. package/dist/model/base.model.js.map +1 -1
  28. package/dist/model/cognito-user.model.d.ts +3 -2
  29. package/dist/model/cognito-user.model.d.ts.map +1 -1
  30. package/dist/model/cognito-user.model.js.map +1 -1
  31. package/dist/repositories/base-es.repo.d.ts.map +1 -1
  32. package/dist/repositories/base-es.repo.js +1 -1
  33. package/dist/repositories/base-es.repo.js.map +1 -1
  34. package/dist/service/crud-operations.d.ts.map +1 -1
  35. package/dist/service/crud-operations.js +10 -2
  36. package/dist/service/crud-operations.js.map +1 -1
  37. package/dist/utils/dynamodb.utils.d.ts.map +1 -1
  38. package/dist/utils/dynamodb.utils.js +29 -12
  39. package/dist/utils/dynamodb.utils.js.map +1 -1
  40. package/dist/utils/http/http.util.d.ts +3 -1
  41. package/dist/utils/http/http.util.d.ts.map +1 -1
  42. package/dist/utils/http/http.util.js +15 -30
  43. package/dist/utils/http/http.util.js.map +1 -1
  44. package/dist/utils/opensearch/opensearch.parser.js +1 -1
  45. package/dist/utils/opensearch/opensearch.parser.js.map +1 -1
  46. package/dist/utils/opensearch.utils.d.ts.map +1 -1
  47. package/dist/utils/opensearch.utils.js +11 -8
  48. package/dist/utils/opensearch.utils.js.map +1 -1
  49. package/dist/utils/reflection.util.d.ts.map +1 -1
  50. package/dist/utils/reflection.util.js +38 -0
  51. package/dist/utils/reflection.util.js.map +1 -1
  52. package/package.json +1 -1
@@ -105,7 +105,7 @@ function parseFilter(params, searchBy) {
105
105
  // If the params is a string (URL query string), parse it first
106
106
  let parsedParams;
107
107
  if (typeof params === "string") {
108
- parsedParams = toRecord(params);
108
+ parsedParams = toRecord(params, { parseDates: false });
109
109
  }
110
110
  else {
111
111
  parsedParams = params;
@@ -131,24 +131,11 @@ function parseFilter(params, searchBy) {
131
131
  if (typeof value === "number") {
132
132
  return value;
133
133
  }
134
- // If the value is already a Date, return it
135
- if (value instanceof Date) {
134
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(value)) {
136
135
  return value;
137
136
  }
138
137
  // Convert to string for parsing
139
138
  const stringValue = String(value);
140
- // Check if it's a valid date first (before number parsing)
141
- if (/^\d{4}-\d{2}-\d{2}/.test(stringValue) || /^\d{4}\.\d{2}\.\d{2}/.test(stringValue)) {
142
- const date = new Date(stringValue);
143
- if (!Number.isNaN(date.getTime()))
144
- return date;
145
- }
146
- // Check for another date format that might be used in range filters
147
- if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(stringValue)) {
148
- const date = new Date(stringValue);
149
- if (!Number.isNaN(date.getTime()))
150
- return date;
151
- }
152
139
  // Check if it's a valid number (including decimals)
153
140
  const numberValue = Number.parseFloat(stringValue);
154
141
  if (!Number.isNaN(numberValue)) {
@@ -207,6 +194,12 @@ function parseFilter(params, searchBy) {
207
194
  function smartParse(value) {
208
195
  if (value.includes("*"))
209
196
  return value;
197
+ if (/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(value)) {
198
+ const parsedDate = new Date(value);
199
+ if (!Number.isNaN(parsedDate.getTime())) {
200
+ return parsedDate;
201
+ }
202
+ }
210
203
  // Boolean
211
204
  if (value === "true")
212
205
  return true;
@@ -218,19 +211,6 @@ function smartParse(value) {
218
211
  // Float / Double
219
212
  if (/^-?\d*\.\d+$/.test(value))
220
213
  return parseFloat(value);
221
- // ISO Date (YYYY-MM-DD) or Dot Date (YYYY.MM.DD)
222
- if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
223
- const date = new Date(value);
224
- if (!isNaN(date.getTime()))
225
- return date;
226
- }
227
- if (/^\d{4}\.\d{2}\.\d{2}/.test(value)) {
228
- // Convert to ISO format for Date constructor
229
- const isoValue = value.replace(/\./g, "-");
230
- const date = new Date(isoValue);
231
- if (!isNaN(date.getTime()))
232
- return date;
233
- }
234
214
  if (typeof value === "string" && value.includes(",")) {
235
215
  const valueList = value.split(",");
236
216
  for (let i = 1; i < valueList.length; i++) {
@@ -241,13 +221,18 @@ function smartParse(value) {
241
221
  // Default: string
242
222
  return value;
243
223
  }
244
- function toRecord(queryString) {
224
+ function toRecord(queryString, options) {
245
225
  const result = {};
246
226
  const pairs = queryString.split("&");
227
+ const parseDates = options?.parseDates ?? true;
247
228
  for (const pair of pairs) {
248
229
  const [key, value] = pair.split("=");
249
230
  if (key && value !== undefined) {
250
- result[key] = smartParse(decodeURIComponent(value));
231
+ const decodedValue = decodeURIComponent(value);
232
+ result[key] =
233
+ !parseDates && /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/.test(decodedValue)
234
+ ? decodedValue
235
+ : smartParse(decodedValue);
251
236
  }
252
237
  }
253
238
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"http.util.js","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Access,\n CognitoUser,\n EndpointPolicy,\n EntityConfig,\n Filter,\n HttpMethod,\n RequestType,\n ResponseFields,\n SortOrder,\n toCaseInsensitive,\n} from \"../../index\";\nimport { APIGatewayProxyEvent } from \"aws-lambda\";\nimport { getFirst, normalizeLower, toArray, trimSpecialChar } from \"../string.util\";\n\nexport type APIResponse = {\n statusCode: number;\n headers?: Record<string, string>;\n body: string;\n};\n\nexport type APIResponseOptions = {\n origin?: string;\n contentType: string;\n fields?: ResponseFields;\n};\n\nexport const DEFAULT_API_RESPONSE_OPTIONS: APIResponseOptions = {\n origin: \"*\",\n contentType: \"application/json\",\n};\n\nexport const createApiResponse = (\n statusCode: number,\n body: any,\n options?: APIResponseOptions,\n responseHeaders?: Record<string, string>,\n): APIResponse => {\n const origin = options?.origin ?? DEFAULT_API_RESPONSE_OPTIONS.origin;\n const contentType = options?.contentType ?? DEFAULT_API_RESPONSE_OPTIONS.contentType;\n\n return {\n statusCode,\n body: JSON.stringify(body),\n headers: {\n \"Access-Control-Allow-Origin\": origin,\n \"Content-Type\": contentType,\n ...(responseHeaders ?? {}),\n },\n };\n};\n\nexport interface HttpRequest<B = any, Q = any, P = any> {\n event: any;\n methode: HttpMethod;\n resourcePath: string;\n body?: B;\n queryStringParameters?: Q;\n filter?: Filter;\n customQueryParameters?: Record<string, string>;\n multiValueQueryStringParameters?: Q;\n pathParameters?: P;\n identity?: CognitoUser;\n headers?: Record<string, string>;\n requestType: RequestType;\n policy: EndpointPolicy;\n entityId: string;\n profileId?: string;\n parentId?: string;\n}\n\nexport const parseHttpRequest = (event: APIGatewayProxyEvent, config: EntityConfig): HttpRequest => {\n const identity = event?.requestContext?.authorizer?.claims;\n\n // request user data\n const groupsCognito = toArray(identity?.[\"cognito:groups\"]);\n\n const username = identity?.[\"cognito:username\"] || \"\";\n const userId = identity?.sub || \"\";\n const profileId = identity?.profile || username;\n const parentId: string | undefined = identity?.[\"custom:parentId\"];\n\n const adminGroups = new Set(normalizeLower(toArray(config.ADMIN_GROUP_NAME)));\n const groups = normalizeLower(toArray(groupsCognito));\n const isAdmin = groups.some((g) => adminGroups.has(g));\n let requestType: RequestType = RequestType.GUEST;\n let isParent: boolean = false;\n\n if (identity?.[\"custom:isParent\"] != null) {\n isParent = identity[\"custom:isParent\"] === \"1\";\n }\n\n if (isAdmin) {\n requestType = RequestType.ADMIN;\n } else if (profileId || userId) requestType = RequestType.USER;\n\n const entityId = decodeURIComponent(event?.pathParameters?.id || \"\");\n const eventResourcePath = event?.requestContext?.resourcePath;\n const resourcePath = event.httpMethod + \" \" + eventResourcePath;\n const customEntries = Object.entries(identity ?? {}).filter(([key]) => key.startsWith(\"custom:\"));\n\n const parsedParams: HttpRequest = {\n event: event,\n methode: event.httpMethod as HttpMethod,\n queryStringParameters: event?.queryStringParameters || undefined,\n\n filter: event?.queryStringParameters\n ? parseFilter(\n event?.queryStringParameters as Record<string, any>,\n event.multiValueQueryStringParameters[\"searchBy\"],\n )\n : {},\n\n multiValueQueryStringParameters: event?.multiValueQueryStringParameters || undefined,\n pathParameters: event?.pathParameters || undefined,\n body: undefined,\n identity: identity\n ? {\n ...identity,\n isParent,\n isAdmin,\n parentId,\n groups,\n username,\n Authorization: event?.headers?.Authorization,\n identityId:\n event && \"x-cognito-identity-id\" in event.headers ? event.headers[\"x-cognito-identity-id\"] : undefined,\n attributes: Object.fromEntries(customEntries.map(([key, value]) => [key.replace(\"custom:\", \"\"), value])),\n }\n : undefined,\n // username,\n // userId,\n // isAdmin,\n profileId,\n parentId,\n requestType,\n resourcePath,\n entityId: entityId === \"null\" || entityId === \"undefined\" ? profileId : entityId,\n // groups,\n headers: { ...event?.headers },\n policy: findMatchedPolicy(event.httpMethod as HttpMethod, eventResourcePath, config.ENDPOINT_POLICY),\n };\n\n if (!isAdmin && parsedParams.policy.access && parsedParams.policy.access.includes(Access.OWNER)) {\n if (isParent) parsedParams.filter[config.OWNER_PARENT_ID_FIELD_NAME ?? \"ownerParentId\"] = profileId;\n else parsedParams.filter[config.OWNER_ID_FIELD_NAME ?? \"profileId\"] = profileId;\n if (parentId) parsedParams.filter[config.OWNER_PARENT_ID_FIELD_NAME ?? \"ownerParentId\"] = parentId;\n }\n\n if (event?.body) parsedParams.body = typeof event.body === \"string\" ? JSON.parse(event.body) : event.body;\n\n return parsedParams;\n};\n\nexport function parseFilter(params: Record<string, any> | string, searchBy?: string[]): Filter {\n const result: Filter = {};\n\n if (searchBy && searchBy.length > 0) {\n result.searchBy = searchBy;\n }\n\n // If the params is a string (URL query string), parse it first\n let parsedParams: Record<string, any>;\n if (typeof params === \"string\") {\n parsedParams = toRecord(params);\n } else {\n parsedParams = params;\n }\n\n parsedParams.searchKeyword = getFirst(parsedParams.searchKeyword);\n\n const parseParam = (key: string, parseFunc: (value: string) => any) => {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n result[key] = parseFunc(value);\n }\n };\n\n parseParam(\"page\", (value) => Number.parseInt(value, 10));\n parseParam(\"size\", (value) => Number.parseInt(value, 10));\n parseParam(\"sortBy\", (value) => value);\n parseParam(\"sort\", (value) => value as SortOrder);\n // parseParam(\"searchBy\", (value) => searchBy);\n parseParam(\"searchKeyword\", (value) => toCaseInsensitive(value));\n parseParam(\"lastKey\", (value) => value);\n parseParam(\"indexName\", (value) => value);\n parseParam(\"indexValue\", (value) => value);\n\n const parseRangeValue = (value: any) => {\n // If value is already a number, return it\n if (typeof value === \"number\") {\n return value;\n }\n\n // If the value is already a Date, return it\n if (value instanceof Date) {\n return value;\n }\n\n // Convert to string for parsing\n const stringValue = String(value);\n\n // Check if it's a valid date first (before number parsing)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(stringValue) || /^\\d{4}\\.\\d{2}\\.\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check for another date format that might be used in range filters\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check if it's a valid number (including decimals)\n const numberValue = Number.parseFloat(stringValue);\n if (!Number.isNaN(numberValue)) {\n // Handle zero values (both \"0\" and \"0.0\" should become 0)\n if (numberValue === 0) {\n return 0;\n }\n // Handle integer values\n if (Number.isInteger(numberValue)) {\n return Number.parseInt(stringValue, 10);\n }\n return numberValue;\n }\n\n return value;\n };\n\n // Initialize rangeFilters array\n result.rangeFilters = [];\n\n // Auto-detect range filter patterns with min_ and max_ prefixes\n for (const key in parsedParams) {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n // Check for min_ and max_ patterns\n const minMatch = key.match(/^min_(.+)$/i);\n const maxMatch = key.match(/^max_(.+)$/i);\n\n if (minMatch) {\n const fieldName = minMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.minValue = parseRangeValue(value);\n } else if (maxMatch) {\n const fieldName = maxMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.maxValue = parseRangeValue(value);\n } else if (!(key in result)) {\n result[key] = value;\n }\n }\n }\n\n // Clean up empty rangeFilters array\n if (result.rangeFilters!.length === 0) {\n delete result.rangeFilters;\n }\n\n return result;\n}\n\nfunction smartParse(value: string): any {\n if (value.includes(\"*\")) return value;\n\n // Boolean\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n // Integer\n if (/^-?\\d+$/.test(value)) return parseInt(value, 10);\n\n // Float / Double\n if (/^-?\\d*\\.\\d+$/.test(value)) return parseFloat(value);\n\n // ISO Date (YYYY-MM-DD) or Dot Date (YYYY.MM.DD)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) return date;\n }\n if (/^\\d{4}\\.\\d{2}\\.\\d{2}/.test(value)) {\n // Convert to ISO format for Date constructor\n const isoValue = value.replace(/\\./g, \"-\");\n const date = new Date(isoValue);\n if (!isNaN(date.getTime())) return date;\n }\n\n if (typeof value === \"string\" && value.includes(\",\")) {\n const valueList = value.split(\",\");\n for (let i = 1; i < valueList.length; i++) {\n valueList[i] = smartParse(valueList[i]);\n }\n return valueList;\n }\n\n // Default: string\n return value;\n}\n\nexport function toRecord(queryString: string): Record<string, any> {\n const result: Record<string, any> = {};\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const [key, value] = pair.split(\"=\");\n if (key && value !== undefined) {\n result[key] = smartParse(decodeURIComponent(value));\n }\n }\n\n return result;\n}\n\nexport function findMatchedPolicy(methode: HttpMethod, path: string, policies: EndpointPolicy[]): EndpointPolicy {\n if (!methode || !path || !policies.length) {\n return null;\n }\n\n return policies.find((policy) => policy.method === methode && trimSpecialChar(policy.path) === trimSpecialChar(path));\n}\n"]}
1
+ {"version":3,"file":"http.util.js","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Access,\n CognitoUser,\n EndpointPolicy,\n EntityConfig,\n Filter,\n HttpMethod,\n RequestType,\n ResponseFields,\n SortOrder,\n toCaseInsensitive,\n} from \"../../index\";\nimport { APIGatewayProxyEvent } from \"aws-lambda\";\nimport { getFirst, normalizeLower, toArray, trimSpecialChar } from \"../string.util\";\n\nexport type APIResponse = {\n statusCode: number;\n headers?: Record<string, string>;\n body: string;\n};\n\nexport type APIResponseOptions = {\n origin?: string;\n contentType: string;\n fields?: ResponseFields;\n};\n\nexport const DEFAULT_API_RESPONSE_OPTIONS: APIResponseOptions = {\n origin: \"*\",\n contentType: \"application/json\",\n};\n\nexport const createApiResponse = (\n statusCode: number,\n body: any,\n options?: APIResponseOptions,\n responseHeaders?: Record<string, string>,\n): APIResponse => {\n const origin = options?.origin ?? DEFAULT_API_RESPONSE_OPTIONS.origin;\n const contentType = options?.contentType ?? DEFAULT_API_RESPONSE_OPTIONS.contentType;\n\n return {\n statusCode,\n body: JSON.stringify(body),\n headers: {\n \"Access-Control-Allow-Origin\": origin,\n \"Content-Type\": contentType,\n ...(responseHeaders ?? {}),\n },\n };\n};\n\nexport interface HttpRequest<B = any, Q = any, P = any> {\n event: any;\n methode: HttpMethod;\n resourcePath: string;\n body?: B;\n queryStringParameters?: Q;\n filter?: Filter;\n customQueryParameters?: Record<string, string>;\n multiValueQueryStringParameters?: Q;\n pathParameters?: P;\n identity?: CognitoUser;\n headers?: Record<string, string>;\n requestType: RequestType;\n policy: EndpointPolicy;\n entityId: string;\n profileId?: string;\n parentId?: string;\n}\n\nexport const parseHttpRequest = (event: APIGatewayProxyEvent, config: EntityConfig): HttpRequest => {\n const identity = event?.requestContext?.authorizer?.claims;\n\n // request user data\n const groupsCognito = toArray(identity?.[\"cognito:groups\"]);\n\n const username = identity?.[\"cognito:username\"] || \"\";\n const userId = identity?.sub || \"\";\n const profileId = identity?.profile || username;\n const parentId: string | undefined = identity?.[\"custom:parentId\"];\n\n const adminGroups = new Set(normalizeLower(toArray(config.ADMIN_GROUP_NAME)));\n const groups = normalizeLower(toArray(groupsCognito));\n const isAdmin = groups.some((g) => adminGroups.has(g));\n let requestType: RequestType = RequestType.GUEST;\n let isParent: boolean = false;\n\n if (identity?.[\"custom:isParent\"] != null) {\n isParent = identity[\"custom:isParent\"] === \"1\";\n }\n\n if (isAdmin) {\n requestType = RequestType.ADMIN;\n } else if (profileId || userId) requestType = RequestType.USER;\n\n const entityId = decodeURIComponent(event?.pathParameters?.id || \"\");\n const eventResourcePath = event?.requestContext?.resourcePath;\n const resourcePath = event.httpMethod + \" \" + eventResourcePath;\n const customEntries = Object.entries(identity ?? {}).filter(([key]) => key.startsWith(\"custom:\"));\n\n const parsedParams: HttpRequest = {\n event: event,\n methode: event.httpMethod as HttpMethod,\n queryStringParameters: event?.queryStringParameters || undefined,\n\n filter: event?.queryStringParameters\n ? parseFilter(\n event?.queryStringParameters as Record<string, any>,\n event.multiValueQueryStringParameters[\"searchBy\"],\n )\n : {},\n\n multiValueQueryStringParameters: event?.multiValueQueryStringParameters || undefined,\n pathParameters: event?.pathParameters || undefined,\n body: undefined,\n identity: identity\n ? {\n ...identity,\n isParent,\n isAdmin,\n parentId,\n groups,\n username,\n Authorization: event?.headers?.Authorization,\n identityId:\n event && \"x-cognito-identity-id\" in event.headers ? event.headers[\"x-cognito-identity-id\"] : undefined,\n attributes: Object.fromEntries(customEntries.map(([key, value]) => [key.replace(\"custom:\", \"\"), value])),\n }\n : undefined,\n // username,\n // userId,\n // isAdmin,\n profileId,\n parentId,\n requestType,\n resourcePath,\n entityId: entityId === \"null\" || entityId === \"undefined\" ? profileId : entityId,\n // groups,\n headers: { ...event?.headers },\n policy: findMatchedPolicy(event.httpMethod as HttpMethod, eventResourcePath, config.ENDPOINT_POLICY),\n };\n\n if (!isAdmin && parsedParams.policy.access && parsedParams.policy.access.includes(Access.OWNER)) {\n if (isParent) parsedParams.filter[config.OWNER_PARENT_ID_FIELD_NAME ?? \"ownerParentId\"] = profileId;\n else parsedParams.filter[config.OWNER_ID_FIELD_NAME ?? \"profileId\"] = profileId;\n if (parentId) parsedParams.filter[config.OWNER_PARENT_ID_FIELD_NAME ?? \"ownerParentId\"] = parentId;\n }\n\n if (event?.body) parsedParams.body = typeof event.body === \"string\" ? JSON.parse(event.body) : event.body;\n\n return parsedParams;\n};\n\nexport function parseFilter(params: Record<string, any> | string, searchBy?: string[]): Filter {\n const result: Filter = {};\n\n if (searchBy && searchBy.length > 0) {\n result.searchBy = searchBy;\n }\n\n // If the params is a string (URL query string), parse it first\n let parsedParams: Record<string, any>;\n if (typeof params === \"string\") {\n parsedParams = toRecord(params, { parseDates: false });\n } else {\n parsedParams = params;\n }\n\n parsedParams.searchKeyword = getFirst(parsedParams.searchKeyword);\n\n const parseParam = (key: string, parseFunc: (value: string) => any) => {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n result[key] = parseFunc(value);\n }\n };\n\n parseParam(\"page\", (value) => Number.parseInt(value, 10));\n parseParam(\"size\", (value) => Number.parseInt(value, 10));\n parseParam(\"sortBy\", (value) => value);\n parseParam(\"sort\", (value) => value as SortOrder);\n // parseParam(\"searchBy\", (value) => searchBy);\n parseParam(\"searchKeyword\", (value) => toCaseInsensitive(value));\n parseParam(\"lastKey\", (value) => value);\n parseParam(\"indexName\", (value) => value);\n parseParam(\"indexValue\", (value) => value);\n\n const parseRangeValue = (value: any) => {\n // If value is already a number, return it\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?)?$/.test(value)) {\n return value;\n }\n\n // Convert to string for parsing\n const stringValue = String(value);\n\n // Check if it's a valid number (including decimals)\n const numberValue = Number.parseFloat(stringValue);\n if (!Number.isNaN(numberValue)) {\n // Handle zero values (both \"0\" and \"0.0\" should become 0)\n if (numberValue === 0) {\n return 0;\n }\n // Handle integer values\n if (Number.isInteger(numberValue)) {\n return Number.parseInt(stringValue, 10);\n }\n return numberValue;\n }\n\n return value;\n };\n\n // Initialize rangeFilters array\n result.rangeFilters = [];\n\n // Auto-detect range filter patterns with min_ and max_ prefixes\n for (const key in parsedParams) {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n // Check for min_ and max_ patterns\n const minMatch = key.match(/^min_(.+)$/i);\n const maxMatch = key.match(/^max_(.+)$/i);\n\n if (minMatch) {\n const fieldName = minMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.minValue = parseRangeValue(value);\n } else if (maxMatch) {\n const fieldName = maxMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.maxValue = parseRangeValue(value);\n } else if (!(key in result)) {\n result[key] = value;\n }\n }\n }\n\n // Clean up empty rangeFilters array\n if (result.rangeFilters!.length === 0) {\n delete result.rangeFilters;\n }\n\n return result;\n}\n\nfunction smartParse(value: string): any {\n if (value.includes(\"*\")) return value;\n if (/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?)?$/.test(value)) {\n const parsedDate = new Date(value);\n if (!Number.isNaN(parsedDate.getTime())) {\n return parsedDate;\n }\n }\n\n // Boolean\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n // Integer\n if (/^-?\\d+$/.test(value)) return parseInt(value, 10);\n\n // Float / Double\n if (/^-?\\d*\\.\\d+$/.test(value)) return parseFloat(value);\n\n if (typeof value === \"string\" && value.includes(\",\")) {\n const valueList = value.split(\",\");\n for (let i = 1; i < valueList.length; i++) {\n valueList[i] = smartParse(valueList[i]);\n }\n return valueList;\n }\n\n // Default: string\n return value;\n}\n\nexport function toRecord(queryString: string, options?: { parseDates?: boolean }): Record<string, any> {\n const result: Record<string, any> = {};\n const pairs = queryString.split(\"&\");\n const parseDates = options?.parseDates ?? true;\n\n for (const pair of pairs) {\n const [key, value] = pair.split(\"=\");\n if (key && value !== undefined) {\n const decodedValue = decodeURIComponent(value);\n result[key] =\n !parseDates && /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?)?$/.test(decodedValue)\n ? decodedValue\n : smartParse(decodedValue);\n }\n }\n\n return result;\n}\n\nexport function findMatchedPolicy(methode: HttpMethod, path: string, policies: EndpointPolicy[]): EndpointPolicy {\n if (!methode || !path || !policies.length) {\n return null;\n }\n\n return policies.find((policy) => policy.method === methode && trimSpecialChar(policy.path) === trimSpecialChar(path));\n}\n"]}
@@ -61,7 +61,7 @@ function buildSearchQueryOS(queryParams, config) {
61
61
  bool: boolQuery,
62
62
  },
63
63
  aggs: aggs,
64
- size: size ?? 25,
64
+ size: size ?? 100,
65
65
  from: from ?? 0,
66
66
  sort: (0, opensearch_parser_sort_1.buildSortOS)(filterObject),
67
67
  },
@@ -1 +1 @@
1
- {"version":3,"file":"opensearch.parser.js","sourceRoot":"","sources":["../../../src/utils/opensearch/opensearch.parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoolQueryOS, BoolQueryTypeOS, EntityConfig, RangeTypeOS } from \"@chinggis/types\";\nimport { buildSearchKeyword } from \"./opensearch.parser.keyword\";\nimport { buildSortOS } from \"./opensearch.parser.sort\";\nimport { boolQueryMap } from \"./opensearch.parser.query.map\";\nimport { parseQueryString } from \"./opensearch.parser.utils\";\nimport { calculatePagination } from \"../opensearch.utils\";\nimport { buildAggregations } from \"./opensearch.parser.aggs\";\n\n// ---------------- Main Function ----------------\nexport function buildSearchQueryOS(queryParams: any, config: EntityConfig) {\n const filterObject =\n typeof queryParams === \"string\" ? Object.fromEntries(new URLSearchParams(queryParams)) : queryParams;\n\n if (config.OWNER_PARENT_ID_FIELD_NAME && filterObject[config.OWNER_PARENT_ID_FIELD_NAME]) {\n filterObject[config.OWNER_PARENT_ID_FIELD_NAME + \".keyword__eq\"] = filterObject[config.OWNER_PARENT_ID_FIELD_NAME];\n }\n\n if (config.OWNER_ID_FIELD_NAME && filterObject[config.OWNER_ID_FIELD_NAME]) {\n filterObject[config.OWNER_ID_FIELD_NAME + \".keyword__eq\"] = filterObject[config.OWNER_ID_FIELD_NAME];\n }\n\n const filters = parseQueryString(filterObject);\n\n const filterMap: Record<string, any> = {}; // merge range per field\n\n const boolQuery: BoolQueryOS = {\n must: [],\n must_not: [],\n filter: [],\n should: [],\n minimum_should_match: undefined,\n };\n\n for (const [key, value] of Object.entries(filters)) {\n const [field, boolQueryType = BoolQueryTypeOS.eq] = key.split(\"__\");\n const fn = boolQueryMap[boolQueryType];\n if (!fn) continue;\n\n // Range filters\n if (boolQueryType === RangeTypeOS.gte || boolQueryType === RangeTypeOS.lte) {\n const existing = filterMap[field]?.range;\n filterMap[field] = fn(field, value, existing);\n continue;\n }\n\n // Other filters\n const builtQuery = fn(field, value);\n if (builtQuery.negation) boolQuery.must_not.push(builtQuery.query);\n else if (boolQueryType === BoolQueryTypeOS.prefix) {\n boolQuery.should.push(builtQuery?.query ? builtQuery.query : builtQuery);\n boolQuery.minimum_should_match = 1;\n } else boolQuery.must.push(builtQuery?.query ? builtQuery.query : builtQuery);\n }\n\n const filter = Object.values(filterMap);\n\n if (filter.length) boolQuery.filter = filter;\n\n buildSearchKeyword(filterObject, boolQuery);\n\n const { size, from } = calculatePagination(filterObject);\n\n const aggs = buildAggregations(filterObject);\n\n return {\n index: config.OPEN_SEARCH.INDEX,\n body: {\n query: {\n bool: boolQuery,\n },\n aggs: aggs,\n size: size ?? 25,\n from: from ?? 0,\n sort: buildSortOS(filterObject),\n },\n };\n}\n"]}
1
+ {"version":3,"file":"opensearch.parser.js","sourceRoot":"","sources":["../../../src/utils/opensearch/opensearch.parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoolQueryOS, BoolQueryTypeOS, EntityConfig, RangeTypeOS } from \"@chinggis/types\";\nimport { buildSearchKeyword } from \"./opensearch.parser.keyword\";\nimport { buildSortOS } from \"./opensearch.parser.sort\";\nimport { boolQueryMap } from \"./opensearch.parser.query.map\";\nimport { parseQueryString } from \"./opensearch.parser.utils\";\nimport { calculatePagination } from \"../opensearch.utils\";\nimport { buildAggregations } from \"./opensearch.parser.aggs\";\n\n// ---------------- Main Function ----------------\nexport function buildSearchQueryOS(queryParams: any, config: EntityConfig) {\n const filterObject =\n typeof queryParams === \"string\" ? Object.fromEntries(new URLSearchParams(queryParams)) : queryParams;\n\n if (config.OWNER_PARENT_ID_FIELD_NAME && filterObject[config.OWNER_PARENT_ID_FIELD_NAME]) {\n filterObject[config.OWNER_PARENT_ID_FIELD_NAME + \".keyword__eq\"] = filterObject[config.OWNER_PARENT_ID_FIELD_NAME];\n }\n\n if (config.OWNER_ID_FIELD_NAME && filterObject[config.OWNER_ID_FIELD_NAME]) {\n filterObject[config.OWNER_ID_FIELD_NAME + \".keyword__eq\"] = filterObject[config.OWNER_ID_FIELD_NAME];\n }\n\n const filters = parseQueryString(filterObject);\n\n const filterMap: Record<string, any> = {}; // merge range per field\n\n const boolQuery: BoolQueryOS = {\n must: [],\n must_not: [],\n filter: [],\n should: [],\n minimum_should_match: undefined,\n };\n\n for (const [key, value] of Object.entries(filters)) {\n const [field, boolQueryType = BoolQueryTypeOS.eq] = key.split(\"__\");\n const fn = boolQueryMap[boolQueryType];\n if (!fn) continue;\n\n // Range filters\n if (boolQueryType === RangeTypeOS.gte || boolQueryType === RangeTypeOS.lte) {\n const existing = filterMap[field]?.range;\n filterMap[field] = fn(field, value, existing);\n continue;\n }\n\n // Other filters\n const builtQuery = fn(field, value);\n if (builtQuery.negation) boolQuery.must_not.push(builtQuery.query);\n else if (boolQueryType === BoolQueryTypeOS.prefix) {\n boolQuery.should.push(builtQuery?.query ? builtQuery.query : builtQuery);\n boolQuery.minimum_should_match = 1;\n } else boolQuery.must.push(builtQuery?.query ? builtQuery.query : builtQuery);\n }\n\n const filter = Object.values(filterMap);\n\n if (filter.length) boolQuery.filter = filter;\n\n buildSearchKeyword(filterObject, boolQuery);\n\n const { size, from } = calculatePagination(filterObject);\n\n const aggs = buildAggregations(filterObject);\n\n return {\n index: config.OPEN_SEARCH.INDEX,\n body: {\n query: {\n bool: boolQuery,\n },\n aggs: aggs,\n size: size ?? 100,\n from: from ?? 0,\n sort: buildSortOS(filterObject),\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"opensearch.utils.d.ts","sourceRoot":"","sources":["../../src/utils/opensearch.utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA6C,MAAM,UAAU,CAAC;AAiB7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAclF;AA4KD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CA0ChE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,QAyCvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAgChD;AAED;;;KAGK;AACL,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAI9C;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAQrD"}
1
+ {"version":3,"file":"opensearch.utils.d.ts","sourceRoot":"","sources":["../../src/utils/opensearch.utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA6C,MAAM,UAAU,CAAC;AAiB7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBlF;AA4KD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CA2ChE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,QAyCvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAgChD;AAED;;;KAGK;AACL,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAI9C;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAQrD"}
@@ -26,15 +26,17 @@ function isValidDateString(value) {
26
26
  // Helper function to calculate pagination
27
27
  function calculatePagination(filter) {
28
28
  let queryFrom = 0;
29
- let querySize = 25;
30
- if (filter.page && filter.size) {
31
- queryFrom = (filter.page - 1) * filter.size;
32
- delete filter.page;
33
- }
34
- if (filter.size) {
35
- querySize = filter.size;
29
+ let querySize = 100;
30
+ const parsedSize = Number(filter.size);
31
+ const parsedPage = Number(filter.page);
32
+ if (Number.isFinite(parsedSize) && parsedSize > 0) {
33
+ querySize = parsedSize;
36
34
  delete filter.size;
37
35
  }
36
+ if (Number.isFinite(parsedPage) && parsedPage > 0) {
37
+ queryFrom = (parsedPage - 1) * querySize;
38
+ delete filter.page;
39
+ }
38
40
  return { from: queryFrom, size: querySize > 250 ? 250 : querySize };
39
41
  }
40
42
  function addSearchQuery(boolQuery, searchBy, searchKeyword) {
@@ -198,6 +200,7 @@ function buildQueryOSFromUrl(filter) {
198
200
  return {};
199
201
  const boolQuery = elastic_builder_1.default.boolQuery();
200
202
  const params = new URLSearchParams(url);
203
+ const filterObject = Object.fromEntries(params.entries());
201
204
  //todo search and search fields
202
205
  applySearchQuery(boolQuery, params);
203
206
  //todo rangeFilters
@@ -209,7 +212,7 @@ function buildQueryOSFromUrl(filter) {
209
212
  const fieldsInclude = undefined;
210
213
  const sortBy = "createdAt"; // The field to sort by
211
214
  const sort = index_1.SortOrder.DESC; // Sorting order, either ascending or descending
212
- const { from, size } = { from: 0, size: 25 }; //todo
215
+ const { from, size } = calculatePagination(filterObject);
213
216
  // Create a request body and handle sorting
214
217
  const requestBody = elastic_builder_1.default.requestBodySearch().query(boolQuery);
215
218
  if (sortBy && sort) {
@@ -1 +1 @@
1
- {"version":3,"file":"opensearch.utils.js","sourceRoot":"","sources":["../../src/utils/opensearch.utils.ts"],"names":[],"mappings":";;;;;AAkBA,kDAcC;AA4KD,kDA0CC;AAED,4CAyCC;AAED,oCAgCC;AAMD,8CAIC;AACD,wDAQC;AAtVD,kDAA0B;AAC1B,oCAA6E;AAC7E,sEAAkC;AAElC,kEAAkE;AAClE,SAAS,iBAAiB,CAAC,KAAa;IACtC,oEAAoE;IACpE,MAAM,cAAc,GAAG,sDAAsD,CAAC;IAC9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qEAAqE;IACrE,MAAM,MAAM,GAAG,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,0CAA0C;AAC1C,SAAgB,mBAAmB,CAAC,MAAc;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,SAAc,EAAE,QAA4B,EAAE,aAAsB;IAC1F,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO;IACvE,+BAA+B;IAC/B,IAAI,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/D,iEAAiE;IACjE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,cAAc,IAAI,GAAG,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAa,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEzE,MAAM,UAAU,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,UAAU,CAAC,MAAM,CAAC,yBAAG,CAAC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,iGAAiG;AACjG,2EAA2E;AAC3E,EAAE;AACF,iDAAiD;AACjD,mEAAmE;AACnE,EAAE;AACF,6BAA6B;AAC7B,wCAAwC;AACxC,4BAA4B;AAC5B,KAAK;AACL,EAAE;AACF,mEAAmE;AACnE,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,uCAAuC;AACvC,iCAAiC;AACjC,wFAAwF;AACxF,KAAK;AACL,EAAE;AACF,qCAAqC;AACrC,EAAE;AACF,uDAAuD;AACvD,iCAAiC;AACjC,GAAG;AAEH,4CAA4C;AAC5C,SAAS,cAAc,CAAC,SAAc,EAAE,SAAkB,EAAE,UAAmB;IAC7E,IAAI,CAAC,SAAS,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QAC/G,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,SAAS,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,SAAS,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,SAAS,sBAAsB,CAAC,SAAiB,EAAE,GAAY,EAAE,GAAY;IAC3E,MAAM,UAAU,GAAG,yBAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,SAAS;QAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,SAAS;QAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,oDAAoD;AACpD,SAAS,oBAAoB,CAAC,SAAiB,EAAE,GAAS,EAAE,GAAS;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,UAAU,GAAG,yBAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,OAAO;QAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO;QAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,0CAA0C;AAC1C,SAAS,eAAe,CAAC,SAAc,EAAE,YAA4B;IACnE,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO;IAE1D,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAC3C,CAAC,WAAW,EAAE,EAAE,CACd,CAAC,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC1E,WAAW,CAAC,SAAS;QACrB,WAAW,CACd,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,iBAAiB,EAAE,CAAC;QAC5C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC;QAChE,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;QAEzE,MAAM,UAAU,GAAG,aAAa;YAC9B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,GAAa,EAAE,GAAa,CAAC;YACjE,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE9C,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,iBAAiB,CAAC,SAAc,EAAE,MAAc;IACvD,MAAM,kBAAkB,GAAG;QACzB,MAAM;QACN,MAAM;QACN,MAAM;QACN,QAAQ;QACR,UAAU;QACV,eAAe;QACf,cAAc;QACd,WAAW;QACX,YAAY;QACZ,eAAe;QACf,eAAe;KAChB,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAExG,GAAG,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QAE5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,aAAa,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7D,SAAS;YACX,CAAC;YAED,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC1C,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,gBAAgB,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,SAAS,iBAAiB,CAAC,MAAW,EAAE,aAAwB,EAAE,aAAwB;IACxF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,gBAAgB,GAAG,aAAa,CAAC;IAC1C,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,MAAM,CAAC,gBAAgB,GAAG,aAAa,CAAC;IAC1C,CAAC;AACH,CAAC;AACD,SAAgB,mBAAmB,CAAC,MAAuB;IACzD,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAEhE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,SAAS,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,+BAA+B;IAC/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEpC,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IAEnB,4CAA4C;IAC5C,MAAM,aAAa,GAAyB,SAAS,CAAC;IACtD,MAAM,aAAa,GAAyB,SAAS,CAAC;IAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,uBAAuB;IACnD,MAAM,IAAI,GAAc,iBAAS,CAAC,IAAI,CAAC,CAAC,gDAAgD;IAExF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM;IAEpD,2CAA2C;IAC3C,MAAM,WAAW,GAAG,yBAAG,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,yBAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAQ,EAAE,CAAC;IAErB,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAEnC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAExD,MAAM,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAc,EAAE,MAAuB;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnD,uEAAuE;IACvE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,EAAE,CAAC;QAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAChB,yBAAG,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;QACJ,CAAC;QAED,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,uCAAuC;YACvC,MAAM,YAAY,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;YAErC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,yBAAG,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,GAChH,MAAM,CAAC;IAET,uBAAuB;IACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEnD,uBAAuB;IACvB,MAAM,SAAS,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IAElC,eAAe,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErC,2CAA2C;IAC3C,MAAM,WAAW,GAAG,yBAAG,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,yBAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAQ,EAAE,CAAC;IAErB,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAEnC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAExD,MAAM,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;KAGK;AACL,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,sBAAsB,CAAC,KAAe;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import dayjs from \"dayjs\";\nimport { Filter, RangeFilter, removeEmptyFields, SortOrder } from \"../index\";\nimport esb from \"elastic-builder\";\n\n// Helper function to validate if a string is a proper date format\nfunction isValidDateString(value: string): boolean {\n // Only accept ISO date formats (YYYY-MM-DD) or ISO datetime formats\n const isoDatePattern = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?)?$/;\n if (!isoDatePattern.test(value)) {\n return false;\n }\n\n // Additional validation with dayjs - just check if it's a valid date\n const parsed = dayjs(value);\n return parsed.isValid();\n}\n\n// Helper function to calculate pagination\nexport function calculatePagination(filter: Filter): { from: number; size: number } {\n let queryFrom = 0;\n let querySize = 25;\n\n if (filter.page && filter.size) {\n queryFrom = (filter.page - 1) * filter.size;\n delete filter.page;\n }\n if (filter.size) {\n querySize = filter.size;\n delete filter.size;\n }\n\n return { from: queryFrom, size: querySize > 250 ? 250 : querySize };\n}\n\nfunction addSearchQuery(boolQuery: any, searchBy?: string | string[], searchKeyword?: string) {\n if (!searchBy || !searchKeyword || searchKeyword.trim() === \"\") return;\n // 1. Олон *-уудыг нэг * болгох\n let cleanedKeyword = searchKeyword.replace(/\\*+/g, \"*\").trim();\n\n // 2. Хэрвээ keyword-ын төгсгөлд * байхгүй бол автоматаар * нэмэх\n if (!cleanedKeyword.endsWith(\"*\")) {\n cleanedKeyword += \"*\";\n }\n\n const fields: string[] = Array.isArray(searchBy) ? searchBy : [searchBy];\n\n const shouldBool = esb.boolQuery();\n for (const field of fields) {\n shouldBool.should(esb.wildcardQuery(field, cleanedKeyword).caseInsensitive(true));\n }\n shouldBool.minimumShouldMatch(1);\n\n boolQuery.must(shouldBool);\n}\n\n//function addSearchQuery(boolQuery: any, searchBy?: string | string[], searchKeyword?: string) {\n// if (!searchBy || !searchKeyword || searchKeyword.trim() === \"\") return;\n//\n// // 1. Collapse multiple '*' into a single '*'\n// let cleanedKeyword = searchKeyword.replace(/\\*+/g, \"*\").trim();\n//\n// // 2. Ensure trailing '*'\n// if (!cleanedKeyword.endsWith(\"*\")) {\n// cleanedKeyword += \"*\";\n// }\n//\n// // 3. Lowercase for reliable case-insensitive wildcard matching\n// cleanedKeyword = cleanedKeyword.toLowerCase();\n//\n// const fields: string[] = Array.isArray(searchBy) ? searchBy : [searchBy];\n//\n// const shouldBool = esb.boolQuery();\n// for (const field of fields) {\n// shouldBool.should(esb.wildcardQuery(field, cleanedKeyword).caseInsensitive(true));\n// }\n//\n// shouldBool.minimumShouldMatch(1);\n//\n// // 4. MUST always put boolQuery.must() inside array\n// boolQuery.must([shouldBool]);\n//}\n\n// Helper function to handle index filtering\nfunction addIndexFilter(boolQuery: any, indexName?: string, indexValue?: string): void {\n if ((indexName && indexValue && indexValue.trim() === \"true\") || (indexValue && indexValue.trim() === \"false\")) {\n boolQuery.filter(esb.termQuery(`${indexName}`, indexValue));\n } else if (indexName && indexValue && indexValue.trim() !== \"\") {\n boolQuery.filter(esb.termQuery(`${indexName}.keyword`, indexValue));\n }\n}\n\n// Helper function to create a range query for numbers\nfunction createNumberRangeQuery(fieldName: string, min?: number, max?: number): any {\n const rangeQuery = esb.rangeQuery(fieldName);\n if (min !== undefined) rangeQuery.gte(min);\n if (max !== undefined) rangeQuery.lte(max);\n return rangeQuery;\n}\n\n// Helper function to create a range query for dates\nfunction createDateRangeQuery(fieldName: string, min?: any, max?: any): any | null {\n const minDate = min ? dayjs(min).format(\"YYYY-MM-DD\") : undefined;\n const maxDate = max ? dayjs(max).format(\"YYYY-MM-DD\") : undefined;\n\n if (!minDate && !maxDate) return null;\n\n const rangeQuery = esb.rangeQuery(fieldName);\n if (minDate) rangeQuery.gte(minDate);\n if (maxDate) rangeQuery.lte(maxDate);\n return rangeQuery;\n}\n\n// Helper function to handle range filters\nfunction addRangeFilters(boolQuery: any, rangeFilters?: RangeFilter[]) {\n if (!rangeFilters || !Array.isArray(rangeFilters)) return;\n\n const validRangeFilters = rangeFilters.filter(\n (rangeFilter) =>\n (rangeFilter.minValue !== undefined || rangeFilter.maxValue !== undefined) &&\n rangeFilter.fieldName &&\n rangeFilter,\n );\n\n for (const rangeFilter of validRangeFilters) {\n const { fieldName, minValue: min, maxValue: max } = rangeFilter;\n const isNumberRange = typeof min === \"number\" || typeof max === \"number\";\n\n const rangeQuery = isNumberRange\n ? createNumberRangeQuery(fieldName, min as number, max as number)\n : createDateRangeQuery(fieldName, min, max);\n\n if (rangeQuery) {\n boolQuery.filter(rangeQuery);\n }\n }\n}\n\n// Helper function to handle dynamic field filtering\nfunction addDynamicFilters(boolQuery: any, filter: Filter): void {\n const specialFilterProps = [\n \"page\",\n \"size\",\n \"sort\",\n \"sortBy\",\n \"searchBy\",\n \"searchKeyword\",\n \"rangeFilters\",\n \"indexName\",\n \"indexValue\",\n \"fieldsExclude\",\n \"fieldsInclude\",\n ];\n\n for (const [key, value] of Object.entries(filter)) {\n if (value === undefined || value === null || value === \"\" || specialFilterProps.includes(key)) continue;\n\n log.debug(`dynamic filter:${key}=${value}`);\n\n if (typeof value === \"string\") {\n if (value.includes(\"*\")) {\n boolQuery.filter(esb.wildcardQuery(key + \".keyword\", value));\n continue;\n }\n\n if (isValidDateString(value)) {\n boolQuery.filter(esb.rangeQuery(key).gte(value));\n continue;\n }\n\n if (value.includes(\",\")) {\n const values = value.split(\",\").filter((v) => v.trim() !== \"\");\n if (values.length > 0) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, values));\n }\n continue;\n }\n\n if (value === \"true\" || value === \"false\") {\n boolQuery.filter(esb.termQuery(key, value));\n continue;\n }\n } else if (Array.isArray(value)) {\n if (value.length > 0) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, value));\n }\n continue;\n }\n\n if (Array.isArray(value)) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, value));\n } else {\n boolQuery.filter(esb.matchPhraseQuery(`${key}`, value));\n }\n }\n}\n\n// Helper function to handle field selection\nfunction addFieldSelection(result: any, fieldsExclude?: string[], fieldsInclude?: string[]): void {\n if (fieldsExclude) {\n result._source_excludes = fieldsExclude;\n } else if (fieldsInclude) {\n result._source_includes = fieldsInclude;\n }\n}\nexport function buildQueryOSFromUrl(filter: Filter | string): any {\n const url = typeof filter === \"string\" ? filter : filter.urlRaw;\n\n if (!url) return {};\n\n const boolQuery = esb.boolQuery();\n const params = new URLSearchParams(url);\n\n //todo search and search fields\n applySearchQuery(boolQuery, params);\n\n //todo rangeFilters\n //todo field exist\n //todo text search\n //todo aggergations\n\n //todo response fieldsExclude, fieldsInclude\n const fieldsExclude: string[] | undefined = undefined;\n const fieldsInclude: string[] | undefined = undefined;\n\n const sortBy = \"createdAt\"; // The field to sort by\n const sort: SortOrder = SortOrder.DESC; // Sorting order, either ascending or descending\n\n const { from, size } = { from: 0, size: 25 }; //todo\n\n // Create a request body and handle sorting\n const requestBody = esb.requestBodySearch().query(boolQuery);\n if (sortBy && sort) {\n requestBody.sort(esb.sort(sortBy, sort));\n }\n requestBody.from(from);\n requestBody.size(size);\n\n let result: any = {};\n\n result.body = requestBody.toJSON();\n\n addFieldSelection(result, fieldsExclude, fieldsInclude);\n\n result = removeEmptyFields(result);\n\n return result;\n}\n\nexport function applySearchQuery(boolQuery: any, params: URLSearchParams) {\n const search = params.get(\"search\");\n if (!search) return;\n\n const fieldsRaw = params.get(\"searchFields\");\n if (!fieldsRaw) return;\n\n const operator = (params.get(\"searchOperator\") || \"or\").toLowerCase();\n const fields = fieldsRaw\n .split(\",\")\n .map((f) => f.trim())\n .filter(Boolean);\n const keywords = search.split(\" \").filter(Boolean);\n\n // OR: (title contains \"iphone 15\" OR description contains \"iphone 15\")\n if (operator === \"or\") {\n const shouldQueries = [];\n\n for (const field of fields) {\n shouldQueries.push(\n esb.matchQuery(field, search).operator(\"and\"), // treats \"iphone 15\" as phrase\n );\n }\n\n boolQuery.should(shouldQueries).minimumShouldMatch(1);\n return;\n }\n\n // AND: (title contains keyword AND description contains keyword)\n if (operator === \"and\") {\n for (const field of fields) {\n // each field must contain ALL keywords\n const mustPerField = esb.boolQuery();\n\n for (const word of keywords) {\n mustPerField.must(esb.matchQuery(field, word));\n }\n\n boolQuery.must(mustPerField);\n }\n }\n}\n\nexport function buildQueryOS(filter: Filter): any {\n const { sort, sortBy, searchBy, searchKeyword, rangeFilters, indexName, indexValue, fieldsExclude, fieldsInclude } =\n filter;\n\n // Calculate pagination\n const { from, size } = calculatePagination(filter);\n\n // Build the main query\n const boolQuery = esb.boolQuery();\n\n addRangeFilters(boolQuery, rangeFilters);\n addSearchQuery(boolQuery, searchBy, searchKeyword);\n addIndexFilter(boolQuery, indexName, indexValue);\n addDynamicFilters(boolQuery, filter);\n\n // Create a request body and handle sorting\n const requestBody = esb.requestBodySearch().query(boolQuery);\n if (sortBy && sort) {\n requestBody.sort(esb.sort(sortBy, sort));\n }\n requestBody.from(from);\n requestBody.size(size);\n\n let result: any = {};\n\n result.body = requestBody.toJSON();\n\n addFieldSelection(result, fieldsExclude, fieldsInclude);\n\n result = removeEmptyFields(result);\n\n return result;\n}\n\n/**\n * All non-case sensitive rule accepted characters replaced with upper and lower case\n * а - [аА], б - []\n * */\nexport function toCaseInsensitive(value: string) {\n if (!value || typeof value !== \"string\") return value;\n\n return value.toLowerCase();\n}\nexport function toCaseInsensitiveArray(value: string[]) {\n if (!value) return value;\n\n if (Array.isArray(value)) {\n return value.map((v) => v.toLowerCase());\n }\n\n return value;\n}\n"]}
1
+ {"version":3,"file":"opensearch.utils.js","sourceRoot":"","sources":["../../src/utils/opensearch.utils.ts"],"names":[],"mappings":";;;;;AAkBA,kDAgBC;AA4KD,kDA2CC;AAED,4CAyCC;AAED,oCAgCC;AAMD,8CAIC;AACD,wDAQC;AAzVD,kDAA0B;AAC1B,oCAA6E;AAC7E,sEAAkC;AAElC,kEAAkE;AAClE,SAAS,iBAAiB,CAAC,KAAa;IACtC,oEAAoE;IACpE,MAAM,cAAc,GAAG,sDAAsD,CAAC;IAC9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qEAAqE;IACrE,MAAM,MAAM,GAAG,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,0CAA0C;AAC1C,SAAgB,mBAAmB,CAAC,MAAc;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAClD,SAAS,GAAG,UAAU,CAAC;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAClD,SAAS,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,SAAc,EAAE,QAA4B,EAAE,aAAsB;IAC1F,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO;IACvE,+BAA+B;IAC/B,IAAI,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/D,iEAAiE;IACjE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,cAAc,IAAI,GAAG,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAa,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEzE,MAAM,UAAU,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,UAAU,CAAC,MAAM,CAAC,yBAAG,CAAC,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,iGAAiG;AACjG,2EAA2E;AAC3E,EAAE;AACF,iDAAiD;AACjD,mEAAmE;AACnE,EAAE;AACF,6BAA6B;AAC7B,wCAAwC;AACxC,4BAA4B;AAC5B,KAAK;AACL,EAAE;AACF,mEAAmE;AACnE,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,uCAAuC;AACvC,iCAAiC;AACjC,wFAAwF;AACxF,KAAK;AACL,EAAE;AACF,qCAAqC;AACrC,EAAE;AACF,uDAAuD;AACvD,iCAAiC;AACjC,GAAG;AAEH,4CAA4C;AAC5C,SAAS,cAAc,CAAC,SAAc,EAAE,SAAkB,EAAE,UAAmB;IAC7E,IAAI,CAAC,SAAS,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QAC/G,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,SAAS,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,SAAS,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,SAAS,sBAAsB,CAAC,SAAiB,EAAE,GAAY,EAAE,GAAY;IAC3E,MAAM,UAAU,GAAG,yBAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,SAAS;QAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,SAAS;QAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,oDAAoD;AACpD,SAAS,oBAAoB,CAAC,SAAiB,EAAE,GAAS,EAAE,GAAS;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,UAAU,GAAG,yBAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,OAAO;QAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO;QAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,0CAA0C;AAC1C,SAAS,eAAe,CAAC,SAAc,EAAE,YAA4B;IACnE,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO;IAE1D,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAC3C,CAAC,WAAW,EAAE,EAAE,CACd,CAAC,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC1E,WAAW,CAAC,SAAS;QACrB,WAAW,CACd,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,iBAAiB,EAAE,CAAC;QAC5C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC;QAChE,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;QAEzE,MAAM,UAAU,GAAG,aAAa;YAC9B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,GAAa,EAAE,GAAa,CAAC;YACjE,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE9C,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,iBAAiB,CAAC,SAAc,EAAE,MAAc;IACvD,MAAM,kBAAkB,GAAG;QACzB,MAAM;QACN,MAAM;QACN,MAAM;QACN,QAAQ;QACR,UAAU;QACV,eAAe;QACf,cAAc;QACd,WAAW;QACX,YAAY;QACZ,eAAe;QACf,eAAe;KAChB,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAExG,GAAG,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QAE5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,aAAa,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7D,SAAS;YACX,CAAC;YAED,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC1C,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,MAAM,CAAC,yBAAG,CAAC,gBAAgB,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,SAAS,iBAAiB,CAAC,MAAW,EAAE,aAAwB,EAAE,aAAwB;IACxF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,gBAAgB,GAAG,aAAa,CAAC;IAC1C,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,MAAM,CAAC,gBAAgB,GAAG,aAAa,CAAC;IAC1C,CAAC;AACH,CAAC;AACD,SAAgB,mBAAmB,CAAC,MAAuB;IACzD,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAEhE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,SAAS,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAW,CAAC;IAEpE,+BAA+B;IAC/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEpC,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IAEnB,4CAA4C;IAC5C,MAAM,aAAa,GAAyB,SAAS,CAAC;IACtD,MAAM,aAAa,GAAyB,SAAS,CAAC;IAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,uBAAuB;IACnD,MAAM,IAAI,GAAc,iBAAS,CAAC,IAAI,CAAC,CAAC,gDAAgD;IAExF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAEzD,2CAA2C;IAC3C,MAAM,WAAW,GAAG,yBAAG,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,yBAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAQ,EAAE,CAAC;IAErB,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAEnC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAExD,MAAM,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAc,EAAE,MAAuB;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnD,uEAAuE;IACvE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,EAAE,CAAC;QAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAChB,yBAAG,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;QACJ,CAAC;QAED,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,uCAAuC;YACvC,MAAM,YAAY,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;YAErC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,yBAAG,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,GAChH,MAAM,CAAC;IAET,uBAAuB;IACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEnD,uBAAuB;IACvB,MAAM,SAAS,GAAG,yBAAG,CAAC,SAAS,EAAE,CAAC;IAElC,eAAe,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErC,2CAA2C;IAC3C,MAAM,WAAW,GAAG,yBAAG,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,yBAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAQ,EAAE,CAAC;IAErB,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAEnC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAExD,MAAM,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;KAGK;AACL,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,sBAAsB,CAAC,KAAe;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import dayjs from \"dayjs\";\nimport { Filter, RangeFilter, removeEmptyFields, SortOrder } from \"../index\";\nimport esb from \"elastic-builder\";\n\n// Helper function to validate if a string is a proper date format\nfunction isValidDateString(value: string): boolean {\n // Only accept ISO date formats (YYYY-MM-DD) or ISO datetime formats\n const isoDatePattern = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?)?$/;\n if (!isoDatePattern.test(value)) {\n return false;\n }\n\n // Additional validation with dayjs - just check if it's a valid date\n const parsed = dayjs(value);\n return parsed.isValid();\n}\n\n// Helper function to calculate pagination\nexport function calculatePagination(filter: Filter): { from: number; size: number } {\n let queryFrom = 0;\n let querySize = 100;\n const parsedSize = Number(filter.size);\n const parsedPage = Number(filter.page);\n\n if (Number.isFinite(parsedSize) && parsedSize > 0) {\n querySize = parsedSize;\n delete filter.size;\n }\n if (Number.isFinite(parsedPage) && parsedPage > 0) {\n queryFrom = (parsedPage - 1) * querySize;\n delete filter.page;\n }\n\n return { from: queryFrom, size: querySize > 250 ? 250 : querySize };\n}\n\nfunction addSearchQuery(boolQuery: any, searchBy?: string | string[], searchKeyword?: string) {\n if (!searchBy || !searchKeyword || searchKeyword.trim() === \"\") return;\n // 1. Олон *-уудыг нэг * болгох\n let cleanedKeyword = searchKeyword.replace(/\\*+/g, \"*\").trim();\n\n // 2. Хэрвээ keyword-ын төгсгөлд * байхгүй бол автоматаар * нэмэх\n if (!cleanedKeyword.endsWith(\"*\")) {\n cleanedKeyword += \"*\";\n }\n\n const fields: string[] = Array.isArray(searchBy) ? searchBy : [searchBy];\n\n const shouldBool = esb.boolQuery();\n for (const field of fields) {\n shouldBool.should(esb.wildcardQuery(field, cleanedKeyword).caseInsensitive(true));\n }\n shouldBool.minimumShouldMatch(1);\n\n boolQuery.must(shouldBool);\n}\n\n//function addSearchQuery(boolQuery: any, searchBy?: string | string[], searchKeyword?: string) {\n// if (!searchBy || !searchKeyword || searchKeyword.trim() === \"\") return;\n//\n// // 1. Collapse multiple '*' into a single '*'\n// let cleanedKeyword = searchKeyword.replace(/\\*+/g, \"*\").trim();\n//\n// // 2. Ensure trailing '*'\n// if (!cleanedKeyword.endsWith(\"*\")) {\n// cleanedKeyword += \"*\";\n// }\n//\n// // 3. Lowercase for reliable case-insensitive wildcard matching\n// cleanedKeyword = cleanedKeyword.toLowerCase();\n//\n// const fields: string[] = Array.isArray(searchBy) ? searchBy : [searchBy];\n//\n// const shouldBool = esb.boolQuery();\n// for (const field of fields) {\n// shouldBool.should(esb.wildcardQuery(field, cleanedKeyword).caseInsensitive(true));\n// }\n//\n// shouldBool.minimumShouldMatch(1);\n//\n// // 4. MUST always put boolQuery.must() inside array\n// boolQuery.must([shouldBool]);\n//}\n\n// Helper function to handle index filtering\nfunction addIndexFilter(boolQuery: any, indexName?: string, indexValue?: string): void {\n if ((indexName && indexValue && indexValue.trim() === \"true\") || (indexValue && indexValue.trim() === \"false\")) {\n boolQuery.filter(esb.termQuery(`${indexName}`, indexValue));\n } else if (indexName && indexValue && indexValue.trim() !== \"\") {\n boolQuery.filter(esb.termQuery(`${indexName}.keyword`, indexValue));\n }\n}\n\n// Helper function to create a range query for numbers\nfunction createNumberRangeQuery(fieldName: string, min?: number, max?: number): any {\n const rangeQuery = esb.rangeQuery(fieldName);\n if (min !== undefined) rangeQuery.gte(min);\n if (max !== undefined) rangeQuery.lte(max);\n return rangeQuery;\n}\n\n// Helper function to create a range query for dates\nfunction createDateRangeQuery(fieldName: string, min?: any, max?: any): any | null {\n const minDate = min ? dayjs(min).format(\"YYYY-MM-DD\") : undefined;\n const maxDate = max ? dayjs(max).format(\"YYYY-MM-DD\") : undefined;\n\n if (!minDate && !maxDate) return null;\n\n const rangeQuery = esb.rangeQuery(fieldName);\n if (minDate) rangeQuery.gte(minDate);\n if (maxDate) rangeQuery.lte(maxDate);\n return rangeQuery;\n}\n\n// Helper function to handle range filters\nfunction addRangeFilters(boolQuery: any, rangeFilters?: RangeFilter[]) {\n if (!rangeFilters || !Array.isArray(rangeFilters)) return;\n\n const validRangeFilters = rangeFilters.filter(\n (rangeFilter) =>\n (rangeFilter.minValue !== undefined || rangeFilter.maxValue !== undefined) &&\n rangeFilter.fieldName &&\n rangeFilter,\n );\n\n for (const rangeFilter of validRangeFilters) {\n const { fieldName, minValue: min, maxValue: max } = rangeFilter;\n const isNumberRange = typeof min === \"number\" || typeof max === \"number\";\n\n const rangeQuery = isNumberRange\n ? createNumberRangeQuery(fieldName, min as number, max as number)\n : createDateRangeQuery(fieldName, min, max);\n\n if (rangeQuery) {\n boolQuery.filter(rangeQuery);\n }\n }\n}\n\n// Helper function to handle dynamic field filtering\nfunction addDynamicFilters(boolQuery: any, filter: Filter): void {\n const specialFilterProps = [\n \"page\",\n \"size\",\n \"sort\",\n \"sortBy\",\n \"searchBy\",\n \"searchKeyword\",\n \"rangeFilters\",\n \"indexName\",\n \"indexValue\",\n \"fieldsExclude\",\n \"fieldsInclude\",\n ];\n\n for (const [key, value] of Object.entries(filter)) {\n if (value === undefined || value === null || value === \"\" || specialFilterProps.includes(key)) continue;\n\n log.debug(`dynamic filter:${key}=${value}`);\n\n if (typeof value === \"string\") {\n if (value.includes(\"*\")) {\n boolQuery.filter(esb.wildcardQuery(key + \".keyword\", value));\n continue;\n }\n\n if (isValidDateString(value)) {\n boolQuery.filter(esb.rangeQuery(key).gte(value));\n continue;\n }\n\n if (value.includes(\",\")) {\n const values = value.split(\",\").filter((v) => v.trim() !== \"\");\n if (values.length > 0) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, values));\n }\n continue;\n }\n\n if (value === \"true\" || value === \"false\") {\n boolQuery.filter(esb.termQuery(key, value));\n continue;\n }\n } else if (Array.isArray(value)) {\n if (value.length > 0) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, value));\n }\n continue;\n }\n\n if (Array.isArray(value)) {\n boolQuery.filter(esb.termsQuery(`${key}.keyword`, value));\n } else {\n boolQuery.filter(esb.matchPhraseQuery(`${key}`, value));\n }\n }\n}\n\n// Helper function to handle field selection\nfunction addFieldSelection(result: any, fieldsExclude?: string[], fieldsInclude?: string[]): void {\n if (fieldsExclude) {\n result._source_excludes = fieldsExclude;\n } else if (fieldsInclude) {\n result._source_includes = fieldsInclude;\n }\n}\nexport function buildQueryOSFromUrl(filter: Filter | string): any {\n const url = typeof filter === \"string\" ? filter : filter.urlRaw;\n\n if (!url) return {};\n\n const boolQuery = esb.boolQuery();\n const params = new URLSearchParams(url);\n const filterObject = Object.fromEntries(params.entries()) as Filter;\n\n //todo search and search fields\n applySearchQuery(boolQuery, params);\n\n //todo rangeFilters\n //todo field exist\n //todo text search\n //todo aggergations\n\n //todo response fieldsExclude, fieldsInclude\n const fieldsExclude: string[] | undefined = undefined;\n const fieldsInclude: string[] | undefined = undefined;\n\n const sortBy = \"createdAt\"; // The field to sort by\n const sort: SortOrder = SortOrder.DESC; // Sorting order, either ascending or descending\n\n const { from, size } = calculatePagination(filterObject);\n\n // Create a request body and handle sorting\n const requestBody = esb.requestBodySearch().query(boolQuery);\n if (sortBy && sort) {\n requestBody.sort(esb.sort(sortBy, sort));\n }\n requestBody.from(from);\n requestBody.size(size);\n\n let result: any = {};\n\n result.body = requestBody.toJSON();\n\n addFieldSelection(result, fieldsExclude, fieldsInclude);\n\n result = removeEmptyFields(result);\n\n return result;\n}\n\nexport function applySearchQuery(boolQuery: any, params: URLSearchParams) {\n const search = params.get(\"search\");\n if (!search) return;\n\n const fieldsRaw = params.get(\"searchFields\");\n if (!fieldsRaw) return;\n\n const operator = (params.get(\"searchOperator\") || \"or\").toLowerCase();\n const fields = fieldsRaw\n .split(\",\")\n .map((f) => f.trim())\n .filter(Boolean);\n const keywords = search.split(\" \").filter(Boolean);\n\n // OR: (title contains \"iphone 15\" OR description contains \"iphone 15\")\n if (operator === \"or\") {\n const shouldQueries = [];\n\n for (const field of fields) {\n shouldQueries.push(\n esb.matchQuery(field, search).operator(\"and\"), // treats \"iphone 15\" as phrase\n );\n }\n\n boolQuery.should(shouldQueries).minimumShouldMatch(1);\n return;\n }\n\n // AND: (title contains keyword AND description contains keyword)\n if (operator === \"and\") {\n for (const field of fields) {\n // each field must contain ALL keywords\n const mustPerField = esb.boolQuery();\n\n for (const word of keywords) {\n mustPerField.must(esb.matchQuery(field, word));\n }\n\n boolQuery.must(mustPerField);\n }\n }\n}\n\nexport function buildQueryOS(filter: Filter): any {\n const { sort, sortBy, searchBy, searchKeyword, rangeFilters, indexName, indexValue, fieldsExclude, fieldsInclude } =\n filter;\n\n // Calculate pagination\n const { from, size } = calculatePagination(filter);\n\n // Build the main query\n const boolQuery = esb.boolQuery();\n\n addRangeFilters(boolQuery, rangeFilters);\n addSearchQuery(boolQuery, searchBy, searchKeyword);\n addIndexFilter(boolQuery, indexName, indexValue);\n addDynamicFilters(boolQuery, filter);\n\n // Create a request body and handle sorting\n const requestBody = esb.requestBodySearch().query(boolQuery);\n if (sortBy && sort) {\n requestBody.sort(esb.sort(sortBy, sort));\n }\n requestBody.from(from);\n requestBody.size(size);\n\n let result: any = {};\n\n result.body = requestBody.toJSON();\n\n addFieldSelection(result, fieldsExclude, fieldsInclude);\n\n result = removeEmptyFields(result);\n\n return result;\n}\n\n/**\n * All non-case sensitive rule accepted characters replaced with upper and lower case\n * а - [аА], б - []\n * */\nexport function toCaseInsensitive(value: string) {\n if (!value || typeof value !== \"string\") return value;\n\n return value.toLowerCase();\n}\nexport function toCaseInsensitiveArray(value: string[]) {\n if (!value) return value;\n\n if (Array.isArray(value)) {\n return value.map((v) => v.toLowerCase());\n }\n\n return value;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"reflection.util.d.ts","sourceRoot":"","sources":["../../src/utils/reflection.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAiB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK/C,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,WAAW,MAAM,KAAG,OAEzD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAGnF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6CzD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA8C3F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,uBAS5E;AAKD,eAAO,MAAM,aAAa,GAAI,QAAQ,GAAG,EAAE,WAAW,MAAM,EAAE,KAAG,GAehE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,GAAG,EAAE,eAAe,MAAM,EAAE,aAAa,MAAM,KAAG,GAGnF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CA8BpH;AA8BD;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,UAAU,CAIxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,UAAU,CAG7E,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAU5C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAoB/C;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,WAAW,EAAE,WAAW,GACvB,YAAY,EAAE,CAShB;AAiJD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAU7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BvD"}
1
+ {"version":3,"file":"reflection.util.d.ts","sourceRoot":"","sources":["../../src/utils/reflection.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAiB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK/C,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,WAAW,MAAM,KAAG,OAEzD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAGnF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6CzD;AAoDD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA+C3F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,uBAS5E;AAKD,eAAO,MAAM,aAAa,GAAI,QAAQ,GAAG,EAAE,WAAW,MAAM,EAAE,KAAG,GAehE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,GAAG,EAAE,eAAe,MAAM,EAAE,aAAa,MAAM,KAAG,GAGnF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CA8BpH;AA8BD;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,UAAU,CAIxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,UAAU,CAG7E,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAU5C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAoB/C;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,WAAW,EAAE,WAAW,GACvB,YAAY,EAAE,CAShB;AAiJD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAU7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BvD"}
@@ -70,6 +70,43 @@ function handleRangeFilters(filter) {
70
70
  }
71
71
  return filter;
72
72
  }
73
+ function handleOperatorRangeFilters(filter) {
74
+ const rangeFilters = [...(filter.rangeFilters ?? [])];
75
+ const operatorRegex = /^(.*)__(gte|lte|gt|lt)$/;
76
+ const rangeFieldMap = new Map();
77
+ for (const existing of rangeFilters) {
78
+ rangeFieldMap.set(existing.fieldName, { ...existing });
79
+ }
80
+ for (const [key, value] of Object.entries(filter)) {
81
+ const match = operatorRegex.exec(key);
82
+ if (!match)
83
+ continue;
84
+ const [, fieldName, operator] = match;
85
+ const rangeFilter = rangeFieldMap.get(fieldName) ?? { fieldName };
86
+ if (operator === "gte") {
87
+ rangeFilter.minValue = value;
88
+ rangeFilter.minExclude = false;
89
+ }
90
+ else if (operator === "gt") {
91
+ rangeFilter.minValue = value;
92
+ rangeFilter.minExclude = true;
93
+ }
94
+ else if (operator === "lte") {
95
+ rangeFilter.maxValue = value;
96
+ rangeFilter.maxExclude = false;
97
+ }
98
+ else if (operator === "lt") {
99
+ rangeFilter.maxValue = value;
100
+ rangeFilter.maxExclude = true;
101
+ }
102
+ rangeFieldMap.set(fieldName, rangeFilter);
103
+ delete filter[key];
104
+ }
105
+ if (rangeFieldMap.size > 0) {
106
+ filter.rangeFilters = Array.from(rangeFieldMap.values());
107
+ }
108
+ return filter;
109
+ }
73
110
  function parseIndexFilter(filter, indexMap) {
74
111
  if (!filter)
75
112
  return undefined;
@@ -78,6 +115,7 @@ function parseIndexFilter(filter, indexMap) {
78
115
  }
79
116
  let result = { ...filter };
80
117
  result = handleRangeFilters(result);
118
+ result = handleOperatorRangeFilters(result);
81
119
  if (indexMap === undefined || !indexMap || (filter?.indexName && filter?.indexValue))
82
120
  return result;
83
121
  let bestMatch = null;