aws-service-stack 0.18.318 → 0.18.320
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.
- package/dist/_examples/service/entity/entity-service.js +2 -1
- package/dist/_examples/service/entity/entity-service.js.map +1 -1
- package/dist/model/filter.model.d.ts +31 -0
- package/dist/model/filter.model.js +29 -0
- package/dist/model/filter.model.js.map +1 -1
- package/dist/repositories/base-es.repo.d.ts +4 -1
- package/dist/repositories/base-es.repo.interface.d.ts +4 -1
- package/dist/repositories/base-es.repo.interface.js.map +1 -1
- package/dist/repositories/base-es.repo.js +9 -4
- package/dist/repositories/base-es.repo.js.map +1 -1
- package/dist/service/crud.service.d.ts +4 -1
- package/dist/service/crud.service.interface.d.ts +4 -1
- package/dist/service/crud.service.interface.js.map +1 -1
- package/dist/service/crud.service.js +2 -2
- package/dist/service/crud.service.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/opensearch/opensearch.parser.aggs.d.ts +8 -0
- package/dist/utils/opensearch/opensearch.parser.aggs.js +66 -0
- package/dist/utils/opensearch/opensearch.parser.aggs.js.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.d.ts +13 -0
- package/dist/utils/opensearch/opensearch.parser.js +62 -0
- package/dist/utils/opensearch/opensearch.parser.js.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.keyword.d.ts +13 -0
- package/dist/utils/opensearch/opensearch.parser.keyword.js +61 -0
- package/dist/utils/opensearch/opensearch.parser.keyword.js.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.query.map.d.ts +5 -0
- package/dist/utils/opensearch/opensearch.parser.query.map.js +39 -0
- package/dist/utils/opensearch/opensearch.parser.query.map.js.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.sort.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.sort.js +22 -0
- package/dist/utils/opensearch/opensearch.parser.sort.js.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.utils.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.utils.js +47 -0
- package/dist/utils/opensearch/opensearch.parser.utils.js.map +1 -0
- package/dist/utils/opensearch/opensearch.transform.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.transform.js +48 -0
- package/dist/utils/opensearch/opensearch.transform.js.map +1 -0
- package/package.json +1 -1
- package/dist/utils/opensearch.parser.d.ts +0 -37
- package/dist/utils/opensearch.parser.js +0 -226
- package/dist/utils/opensearch.parser.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opensearch.parser.js","sourceRoot":"","sources":["../../src/utils/opensearch.parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { SortOrder } from \"@chinggis/types\";\nimport { calculatePagination } from \"./opensearch.utils\";\n\ninterface BoolQuery {\n must: Array<any>;\n must_not: Array<any>;\n filter: Array<any>;\n should: Array<any>;\n minimum_should_match?: number;\n}\n\nenum BoolQueryType {\n eq = \"eq\",\n ne = \"ne\",\n in = \"in\",\n gte = \"gte\",\n lte = \"lte\",\n exists = \"exists\",\n regex = \"regex\",\n}\n\nenum RangeType {\n lte = \"lte\",\n gte = \"gte\",\n}\n\nexport enum SearchOperator {\n AND = \"and\",\n OR = \"or\",\n}\n\n// ---------------- Bool Query Map ----------------\nconst boolQueryMap: Record<\n BoolQueryType,\n (field: string, value: string, existing?: Record<string, any>) => { query: any; negation?: boolean } | any\n> = {\n eq: (field, value) => buildTermFilter(field, value),\n ne: (field, value) => ({ query: buildTermFilter(field, value), negation: true }),\n in: (field, value) => buildTermsFilter(field, value),\n gte: (field, value, existing) => buildRangeFilter(field, value, RangeType.gte, existing),\n lte: (field, value, existing) => buildRangeFilter(field, value, RangeType.lte, existing),\n exists: (field, value) => buildExistsFilter(field, value),\n regex: (field, value) => buildRegexpFilter(field, value),\n};\n\n// ---------------- Main Function ----------------\nexport function buildSearchQueryOS(queryParams, opensearchIndex: string) {\n const filters = parseQueryString(queryParams);\n\n const filterMap: Record<string, any> = {}; // merge range per field\n\n const boolQuery: BoolQuery = {\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 if (!value) continue;\n\n const [field, boolQueryType = BoolQueryType.eq] = key.split(\"__\");\n const fn = boolQueryMap[boolQueryType];\n if (!fn) continue;\n\n // Range filters\n if (boolQueryType === RangeType.gte || boolQueryType === RangeType.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 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(queryParams, boolQuery);\n\n const { size, from } = calculatePagination(queryParams);\n\n return {\n index: opensearchIndex,\n body: {\n query: {\n bool: boolQuery,\n },\n size: size ?? 25,\n from: from ?? 0,\n sort: buildSortOS(queryParams),\n },\n };\n}\n\nexport function buildSearchKeyword(\n queryParams: string,\n boolQuery: {\n must: Array<any>;\n must_not: Array<any>;\n filter: Array<any>;\n should: Array<any>;\n minimum_should_match?: number;\n },\n) {\n const params = new URLSearchParams(queryParams);\n\n const search = params.get(\"search\");\n const fieldsRaw = params.get(\"searchFields\");\n const operator = (params.get(\"searchOperator\") || SearchOperator.OR).toLowerCase();\n\n if (!search || !fieldsRaw) {\n return boolQuery;\n }\n\n const fields = stringSplitter(fieldsRaw);\n\n for (const field of fields) {\n const query = buildSearchKeywordQuery(field, search);\n\n if (query) {\n if (operator === SearchOperator.OR) {\n boolQuery.should.push(query);\n boolQuery.minimum_should_match = 1;\n }\n\n if (operator === SearchOperator.AND) {\n boolQuery.must.push(query);\n }\n }\n }\n\n return boolQuery;\n}\n\nexport function buildSortOS(queryParams: string) {\n const params = new URLSearchParams(queryParams);\n\n const fieldsRaw = params.get(\"sortField\") || \"\";\n const ordersRaw = params.get(\"sort\") || \"\";\n\n const fields = fieldsRaw\n .split(\",\")\n .map((f) => f.trim())\n .filter(Boolean);\n const orders = ordersRaw.split(\",\").map((o) => o.trim().toLowerCase() as SortOrder);\n\n const sort: any[] = [];\n\n fields.forEach((field, i) => {\n sort.push({\n [field]: orders[i] || \"asc\", // default asc\n });\n });\n\n return sort; // use directly in body.sort\n}\n\n// ---------------- Operator Functions ----------------\nfunction buildTermFilter(field: string, value: string) {\n return { term: { [field]: value } };\n}\n\nfunction buildTermsFilter(field: string, value: string) {\n return { terms: { [field]: value.split(\",\") } };\n}\n\nfunction buildRangeFilter(field: string, value: string, operator: RangeType, existing?: Record<string, any>) {\n const val = isNaN(Number(value)) ? value : Number(value);\n return {\n range: {\n [field]: {\n ...(existing?.[field] || {}),\n [operator]: val,\n },\n },\n };\n}\n\nfunction buildExistsFilter(field: string, value: string | boolean) {\n return { query: { exists: { field } }, negation: value === \"false\" || value === false };\n}\n\nfunction buildRegexpFilter(field: string, value: string) {\n return { regexp: { [field]: value } };\n}\n\nfunction parseQueryString(queryParams: Record<string, string>): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(queryParams)) {\n if (!value) continue;\n\n // --- ONLY field__operator format ---\n if (!key.includes(\"__\")) continue;\n\n const parsedValue = smartParse(value);\n\n filtered[key] = parsedValue;\n }\n\n return filtered;\n}\n\nfunction stringSplitter(rawString: string, splitter = \",\") {\n return rawString\n .split(splitter)\n .map((f) => f.trim())\n .filter(Boolean);\n}\n\nfunction buildSearchKeywordQuery(field: string, searchKeyword: string) {\n if (!searchKeyword || searchKeyword.trim() === \"\") return undefined;\n\n // 1. Олон *-уудыг нэг * болгох\n let cleanedKeyword: any = searchKeyword.replace(/\\*+/g, \"*\").trim();\n\n if (!cleanedKeyword.endsWith(\"*\")) {\n // 2. Хэрвээ keyword-ын төгсгөлд * байхгүй бол автоматаар * нэмэх\n cleanedKeyword += \"*\";\n }\n\n // word-д *-оор эхэлсэн бол wildcard\n if (cleanedKeyword.startsWith(\"*\")) {\n return {\n wildcard: {\n [`${field}.keyword`]: {\n value: cleanedKeyword,\n case_insensitive: true,\n },\n },\n };\n }\n // энгийн keyword → phrase_prefix\n return {\n match_phrase_prefix: {\n [field]: cleanedKeyword,\n },\n };\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 // Default: string\n return value;\n}\n"]}
|