@usereactify/search 5.60.0-beta.0 → 5.60.0-beta.2

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 (56) hide show
  1. package/CHANGELOG.md +23 -2
  2. package/dist/package.json +1 -1
  3. package/dist/src/components/Example/ExampleProductCardWeight.js +3 -7
  4. package/dist/src/components/Example/ExampleProductCardWeight.js.map +1 -1
  5. package/dist/src/components/Sensor/SensorSearchTerm.d.ts +1 -2
  6. package/dist/src/components/Sensor/SensorSearchTerm.js +38 -120
  7. package/dist/src/components/Sensor/SensorSearchTerm.js.map +1 -1
  8. package/dist/src/components/Sensor/Sensors.d.ts +1 -3
  9. package/dist/src/components/Sensor/Sensors.js +10 -29
  10. package/dist/src/components/Sensor/Sensors.js.map +1 -1
  11. package/dist/src/components/Sensor/index.d.ts +0 -2
  12. package/dist/src/components/Sensor/index.js +0 -4
  13. package/dist/src/components/Sensor/index.js.map +1 -1
  14. package/dist/src/search-request-builder/base-builders.d.ts +18 -0
  15. package/dist/src/search-request-builder/base-builders.js +184 -0
  16. package/dist/src/search-request-builder/base-builders.js.map +1 -0
  17. package/dist/src/search-request-builder/curation-builders.d.ts +2 -0
  18. package/dist/src/search-request-builder/curation-builders.js +44 -0
  19. package/dist/src/search-request-builder/curation-builders.js.map +1 -0
  20. package/dist/src/search-request-builder/index.d.ts +3 -0
  21. package/dist/src/search-request-builder/index.js +12 -0
  22. package/dist/src/search-request-builder/index.js.map +1 -0
  23. package/dist/src/search-request-builder/search-request-builder.d.ts +3 -0
  24. package/dist/src/search-request-builder/search-request-builder.js +54 -0
  25. package/dist/src/search-request-builder/search-request-builder.js.map +1 -0
  26. package/dist/src/search-request-builder/types.d.ts +105 -0
  27. package/dist/src/search-request-builder/types.js +30 -0
  28. package/dist/src/search-request-builder/types.js.map +1 -0
  29. package/dist/src/search-request-builder/utils.d.ts +27 -0
  30. package/dist/src/search-request-builder/utils.js +144 -0
  31. package/dist/src/search-request-builder/utils.js.map +1 -0
  32. package/dist/src/types/elastic.d.ts +6 -9
  33. package/dist/src/types/elastic.js.map +1 -1
  34. package/dist/src/types/firestore.d.ts +2 -2
  35. package/dist/src/types/firestore.js.map +1 -1
  36. package/dist/src/utility/config.d.ts +2 -2
  37. package/dist/src/utility/config.js +5 -8
  38. package/dist/src/utility/config.js.map +1 -1
  39. package/dist/src/utility/props.d.ts +5 -224
  40. package/dist/src/utility/props.js +54 -101
  41. package/dist/src/utility/props.js.map +1 -1
  42. package/dist/src/utility/server.js +1 -1
  43. package/dist/src/utility/server.js.map +1 -1
  44. package/dist/src/utility/weight.d.ts +7 -0
  45. package/dist/src/utility/weight.js +146 -22
  46. package/dist/src/utility/weight.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/src/components/Sensor/SensorCollectionWeighted.d.ts +0 -1
  49. package/dist/src/components/Sensor/SensorCollectionWeighted.js +0 -21
  50. package/dist/src/components/Sensor/SensorCollectionWeighted.js.map +0 -1
  51. package/dist/src/components/Sensor/SensorSearchWeighted.d.ts +0 -1
  52. package/dist/src/components/Sensor/SensorSearchWeighted.js +0 -22
  53. package/dist/src/components/Sensor/SensorSearchWeighted.js.map +0 -1
  54. package/dist/src/utility/queries.d.ts +0 -393
  55. package/dist/src/utility/queries.js +0 -197
  56. package/dist/src/utility/queries.js.map +0 -1
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateBaseSearchRequest = generateBaseSearchRequest;
4
+ exports.generateCollectionSearchRequest = generateCollectionSearchRequest;
5
+ exports.generateCollectionBaseQuery = generateCollectionBaseQuery;
6
+ exports.generateWeightedSearchQuery = generateWeightedSearchQuery;
7
+ exports.generateWeightedCollectionQuery = generateWeightedCollectionQuery;
8
+ const types_1 = require("./types");
9
+ const utils_1 = require("./utils");
10
+ // Base Search Request Generation
11
+ function generateBaseSearchRequest(options) {
12
+ var _a, _b, _c, _d;
13
+ if ((0, types_1.isCollectionOptions)(options)) {
14
+ // Collection search mode
15
+ const markets = (_b = (_a = options.curation) === null || _a === void 0 ? void 0 : _a.markets) !== null && _b !== void 0 ? _b : [];
16
+ return generateCollectionSearchRequest({
17
+ collectionHandle: options.collectionHandle,
18
+ markets: markets,
19
+ });
20
+ }
21
+ if ((0, types_1.isSearchOptions)(options)) {
22
+ // Term search mode
23
+ const markets = (_d = (_c = options.curation) === null || _c === void 0 ? void 0 : _c.markets) !== null && _d !== void 0 ? _d : [];
24
+ return generateTermSearchRequest({
25
+ searchTerm: options.searchTerm,
26
+ baseSearchRequestMode: options.baseSearchRequestMode,
27
+ relevanceFields: options.relevanceFields,
28
+ searchableFields: options.searchableFields,
29
+ markets: markets,
30
+ });
31
+ }
32
+ throw new Error("Invalid options: must be either search or collection options");
33
+ }
34
+ // Term Search Request Generation
35
+ function generateTermSearchRequest(options) {
36
+ (0, utils_1.validateSearchInputs)(options);
37
+ if (options.baseSearchRequestMode === types_1.BaseSearchRequestMode.Weighted) {
38
+ return generateWeightedTermSearchRequest(options);
39
+ }
40
+ return generateRelevanceTermSearchRequest(options);
41
+ }
42
+ function generateWeightedTermSearchRequest(options) {
43
+ if (!options.searchableFields) {
44
+ throw new Error("SearchableFields required for weighted search");
45
+ }
46
+ const functionScoreQuery = generateWeightedSearchQuery({
47
+ searchTerm: options.searchTerm,
48
+ searchableFields: options.searchableFields,
49
+ boostingRules: [],
50
+ markets: options.markets,
51
+ });
52
+ return { query: { function_score: functionScoreQuery } };
53
+ }
54
+ function generateRelevanceTermSearchRequest(options) {
55
+ const fieldMappings = (0, utils_1.prepareRelevanceFields)(options.relevanceFields);
56
+ const multiMatchQueries = (0, utils_1.generateMultiMatchQueries)(options.searchTerm, fieldMappings);
57
+ const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);
58
+ return { query };
59
+ }
60
+ function buildRelevanceQueryStructure(multiMatchQueries, markets) {
61
+ return {
62
+ bool: {
63
+ must: [{ bool: { should: multiMatchQueries, minimum_should_match: "1" } }],
64
+ filter: (0, utils_1.generateMarketsFilter)(markets),
65
+ },
66
+ };
67
+ }
68
+ // Collection Search Request Generation
69
+ function generateCollectionSearchRequest(options) {
70
+ const query = generateCollectionBaseQuery(options);
71
+ return { query };
72
+ }
73
+ function generateCollectionBaseQuery(options) {
74
+ const mustClauses = [
75
+ {
76
+ nested: {
77
+ path: "collections",
78
+ query: {
79
+ term: { ["collections.handle"]: options.collectionHandle },
80
+ },
81
+ },
82
+ },
83
+ ];
84
+ const marketClause = (0, utils_1.generateMarketsFilter)(options.markets);
85
+ if (marketClause.length > 0) {
86
+ mustClauses.push(...marketClause);
87
+ }
88
+ return { bool: { must: mustClauses } };
89
+ }
90
+ // Weighted Search Implementation - using corrected property names
91
+ function generateWeightedSearchQuery(options) {
92
+ var _a, _b;
93
+ const searchTerms = (_b = (_a = options.searchTerm) === null || _a === void 0 ? void 0 : _a.split(" ")) !== null && _b !== void 0 ? _b : [];
94
+ const searchQueries = [];
95
+ for (const searchableField of options.searchableFields) {
96
+ const baseField = searchableField.field;
97
+ const maxEdits = searchableField.maxEdits;
98
+ for (const searchTerm of searchTerms) {
99
+ searchQueries.push({
100
+ match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "regular_analyzer" } },
101
+ });
102
+ if (searchableField.synonymEnabled) {
103
+ searchQueries.push({
104
+ match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "synonym_analyzer" } },
105
+ });
106
+ }
107
+ }
108
+ }
109
+ const searchScores = [];
110
+ for (const field of options.searchableFields) {
111
+ const baseField = field.field;
112
+ const maxPoints = field.points;
113
+ const maxEdits = field.maxEdits;
114
+ for (let edits = 0; edits <= maxEdits; edits++) {
115
+ const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);
116
+ const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);
117
+ const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;
118
+ for (const searchTerm of searchTerms) {
119
+ searchScores.push({
120
+ filter: {
121
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
122
+ },
123
+ weight: weightBase,
124
+ });
125
+ if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {
126
+ const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);
127
+ searchScores.push({
128
+ filter: {
129
+ bool: {
130
+ must_not: {
131
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
132
+ },
133
+ must: {
134
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "synonym_analyzer" } },
135
+ },
136
+ },
137
+ },
138
+ weight: weightSynonyms,
139
+ });
140
+ }
141
+ }
142
+ }
143
+ }
144
+ const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
145
+ const boolQuery = { should: [...searchQueries] };
146
+ if (marketClause) {
147
+ boolQuery.filter = [marketClause];
148
+ }
149
+ return {
150
+ query: {
151
+ bool: boolQuery,
152
+ },
153
+ functions: [
154
+ ...searchScores,
155
+ ...(0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
156
+ ],
157
+ score_mode: "sum",
158
+ boost_mode: "replace",
159
+ };
160
+ }
161
+ function generateWeightedCollectionQuery(options) {
162
+ const mustClauses = [
163
+ {
164
+ nested: {
165
+ path: "collections",
166
+ query: {
167
+ term: { ["collections.handle"]: options.collectionHandle },
168
+ },
169
+ },
170
+ },
171
+ ];
172
+ const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
173
+ if (marketClause)
174
+ mustClauses.push(marketClause);
175
+ return {
176
+ query: {
177
+ bool: { must: mustClauses },
178
+ },
179
+ functions: (0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
180
+ score_mode: "sum",
181
+ boost_mode: "replace",
182
+ };
183
+ }
184
+ //# sourceMappingURL=base-builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-builders.js","sourceRoot":"","sources":["../../../src/search-request-builder/base-builders.ts"],"names":[],"mappings":"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","sourcesContent":["import { Boosting, SearchableField } from \"../types/firestore\";\nimport {\n BaseSearchRequestMode,\n FunctionScoreContainer,\n FunctionScoreQuery,\n GenerateSearchRequestOptions,\n QueryContainer,\n SearchRequest,\n TermSearchRequestOptions,\n CollectionSearchRequestOptions,\n isSearchOptions,\n isCollectionOptions,\n} from \"./types\";\nimport {\n generateBoostingRules,\n generateMarketsClause,\n generateMarketsFilter,\n generateMultiMatchQueries,\n prepareRelevanceFields,\n validateSearchInputs,\n} from \"./utils\";\n\n// Base Search Request Generation\nexport function generateBaseSearchRequest(options: GenerateSearchRequestOptions): SearchRequest {\n if (isCollectionOptions(options)) {\n // Collection search mode\n const markets = options.curation?.markets ?? [];\n return generateCollectionSearchRequest({\n collectionHandle: options.collectionHandle,\n markets: markets,\n });\n }\n\n if (isSearchOptions(options)) {\n // Term search mode\n const markets = options.curation?.markets ?? [];\n return generateTermSearchRequest({\n searchTerm: options.searchTerm,\n baseSearchRequestMode: options.baseSearchRequestMode,\n relevanceFields: options.relevanceFields,\n searchableFields: options.searchableFields,\n markets: markets,\n });\n }\n\n throw new Error(\"Invalid options: must be either search or collection options\");\n}\n\n// Term Search Request Generation\nfunction generateTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n validateSearchInputs(options);\n\n if (options.baseSearchRequestMode === BaseSearchRequestMode.Weighted) {\n return generateWeightedTermSearchRequest(options);\n }\n\n return generateRelevanceTermSearchRequest(options);\n}\n\nfunction generateWeightedTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n if (!options.searchableFields) {\n throw new Error(\"SearchableFields required for weighted search\");\n }\n\n const functionScoreQuery = generateWeightedSearchQuery({\n searchTerm: options.searchTerm,\n searchableFields: options.searchableFields,\n boostingRules: [],\n markets: options.markets,\n });\n\n return { query: { function_score: functionScoreQuery } };\n}\n\nfunction generateRelevanceTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n const fieldMappings = prepareRelevanceFields(options.relevanceFields);\n const multiMatchQueries = generateMultiMatchQueries(options.searchTerm, fieldMappings);\n const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);\n return { query };\n}\n\nfunction buildRelevanceQueryStructure(multiMatchQueries: QueryContainer[], markets: string[]): QueryContainer {\n return {\n bool: {\n must: [{ bool: { should: multiMatchQueries, minimum_should_match: \"1\" } }],\n filter: generateMarketsFilter(markets),\n },\n };\n}\n\n// Collection Search Request Generation\nexport function generateCollectionSearchRequest(options: CollectionSearchRequestOptions): SearchRequest {\n const query = generateCollectionBaseQuery(options);\n return { query };\n}\n\nexport function generateCollectionBaseQuery(options: CollectionSearchRequestOptions): QueryContainer {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsFilter(options.markets);\n if (marketClause.length > 0) {\n mustClauses.push(...marketClause);\n }\n\n return { bool: { must: mustClauses } };\n}\n\n// Weighted Search Implementation - using corrected property names\nexport function generateWeightedSearchQuery(options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries: QueryContainer[] = [];\n for (const searchableField of options.searchableFields) {\n const baseField = searchableField.field;\n const maxEdits = searchableField.maxEdits;\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"regular_analyzer\" } },\n });\n if (searchableField.synonymEnabled) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"synonym_analyzer\" } },\n });\n }\n }\n }\n\n const searchScores: FunctionScoreContainer[] = [];\n for (const field of options.searchableFields) {\n const baseField = field.field;\n const maxPoints = field.points;\n const maxEdits = field.maxEdits;\n\n for (let edits = 0; edits <= maxEdits; edits++) {\n const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);\n const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);\n const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;\n\n for (const searchTerm of searchTerms) {\n searchScores.push({\n filter: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n weight: weightBase,\n });\n\n if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {\n const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);\n\n searchScores.push({\n filter: {\n bool: {\n must_not: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n must: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"synonym_analyzer\" } },\n },\n },\n },\n weight: weightSynonyms,\n });\n }\n }\n }\n }\n\n const marketClause = generateMarketsClause(options.markets);\n const boolQuery: any = { should: [...searchQueries] };\n\n if (marketClause) {\n boolQuery.filter = [marketClause];\n }\n\n return {\n query: {\n bool: boolQuery,\n },\n functions: [\n ...searchScores,\n ...generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n ],\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n\nexport function generateWeightedCollectionQuery(options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsClause(options.markets);\n if (marketClause) mustClauses.push(marketClause);\n\n return {\n query: {\n bool: { must: mustClauses },\n },\n functions: generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { GenerateSearchRequestOptions, SearchRequest } from "./types";
2
+ export declare function generateCurationSearchRequest(options: GenerateSearchRequestOptions): Partial<SearchRequest>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateCurationSearchRequest = generateCurationSearchRequest;
4
+ const types_1 = require("./types");
5
+ const utils_1 = require("./utils");
6
+ function generateCurationSearchRequest(options) {
7
+ if (options.curationSearchRequestMode === types_1.CurationSearchRequestMode.Weighted) {
8
+ return generateWeightedCurationSearchRequest(options);
9
+ }
10
+ return generateBoostedCurationSearchRequest(options);
11
+ }
12
+ function generateWeightedCurationSearchRequest(options) {
13
+ const curationRules = extractCurationRules(options.curation);
14
+ return {
15
+ query: {
16
+ function_score: {
17
+ query: { match_all: {} }, // Add required query field
18
+ functions: curationRules.boostingRules
19
+ .map((boostingRule) => (0, utils_1.generateBoostingRule)({ boostingRule, market: options.market }))
20
+ .filter(Boolean),
21
+ score_mode: "sum",
22
+ boost_mode: "replace",
23
+ },
24
+ },
25
+ };
26
+ }
27
+ // This `sort` field is handled by SensorSort.
28
+ // ReactiveSearch does not combine multiple top-level `sort` fields; a `SearchRequest` is limited to one.
29
+ function generateBoostedCurationSearchRequest(options) {
30
+ return {};
31
+ }
32
+ // Supporting Functions
33
+ function extractCurationRules(curation) {
34
+ var _a, _b, _c, _d, _e;
35
+ if (!curation) {
36
+ return { boostingRules: [], groupings: [], sortings: [] };
37
+ }
38
+ return {
39
+ boostingRules: (_a = curation.boostings) !== null && _a !== void 0 ? _a : [],
40
+ groupings: (_c = (_b = curation.boosting) === null || _b === void 0 ? void 0 : _b.groupings) !== null && _c !== void 0 ? _c : [],
41
+ sortings: (_e = (_d = curation.boosting) === null || _d === void 0 ? void 0 : _d.sortings) !== null && _e !== void 0 ? _e : [],
42
+ };
43
+ }
44
+ //# sourceMappingURL=curation-builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curation-builders.js","sourceRoot":"","sources":["../../../src/search-request-builder/curation-builders.ts"],"names":[],"mappings":";;AAWA,sEAMC;AAjBD,mCAQiB;AACjB,mCAA+C;AAE/C,SAAgB,6BAA6B,CAAC,OAAqC;IACjF,IAAI,OAAO,CAAC,yBAAyB,KAAK,iCAAyB,CAAC,QAAQ,EAAE,CAAC;QAC7E,OAAO,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,oCAAoC,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,qCAAqC,CAAC,OAAqC;IAClF,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE7D,OAAO;QACL,KAAK,EAAE;YACL,cAAc,EAAE;gBACd,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,2BAA2B;gBACrD,SAAS,EAAE,aAAa,CAAC,aAAa;qBACnC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,IAAA,4BAAoB,EAAC,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;qBACrF,MAAM,CAAC,OAAO,CAAC;gBAClB,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,SAAS;aACtB;SACF;KACF,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,yGAAyG;AACzG,SAAS,oCAAoC,CAAC,OAAqC;IACjF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,uBAAuB;AACvB,SAAS,oBAAoB,CAAC,QAA8C;;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,aAAa,EAAE,MAAA,QAAQ,CAAC,SAAS,mCAAI,EAAE;QACvC,SAAS,EAAE,MAAA,MAAA,QAAQ,CAAC,QAAQ,0CAAE,SAAS,mCAAI,EAAE;QAC7C,QAAQ,EAAE,MAAA,MAAA,QAAQ,CAAC,QAAQ,0CAAE,QAAQ,mCAAI,EAAE;KAC5C,CAAC;AACJ,CAAC","sourcesContent":["import {\n CurationRules,\n CurationSearchRequestMode,\n GenerateSearchRequestOptions,\n SearchRequest,\n SortOptions,\n SearchCuration,\n CollectionCuration,\n} from \"./types\";\nimport { generateBoostingRule } from \"./utils\";\n\nexport function generateCurationSearchRequest(options: GenerateSearchRequestOptions): Partial<SearchRequest> {\n if (options.curationSearchRequestMode === CurationSearchRequestMode.Weighted) {\n return generateWeightedCurationSearchRequest(options);\n }\n\n return generateBoostedCurationSearchRequest(options);\n}\n\nfunction generateWeightedCurationSearchRequest(options: GenerateSearchRequestOptions): Partial<SearchRequest> {\n const curationRules = extractCurationRules(options.curation);\n\n return {\n query: {\n function_score: {\n query: { match_all: {} }, // Add required query field\n functions: curationRules.boostingRules\n .map((boostingRule) => generateBoostingRule({ boostingRule, market: options.market }))\n .filter(Boolean),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n },\n },\n };\n}\n\n// This `sort` field is handled by SensorSort.\n// ReactiveSearch does not combine multiple top-level `sort` fields; a `SearchRequest` is limited to one.\nfunction generateBoostedCurationSearchRequest(options: GenerateSearchRequestOptions): Partial<SearchRequest> {\n return {};\n}\n\n// Supporting Functions\nfunction extractCurationRules(curation?: SearchCuration | CollectionCuration): CurationRules {\n if (!curation) {\n return { boostingRules: [], groupings: [], sortings: [] };\n }\n\n return {\n boostingRules: curation.boostings ?? [],\n groupings: curation.boosting?.groupings ?? [],\n sortings: curation.boosting?.sortings ?? [],\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { generateSearchRequest, determineSearchRequestModes } from "./search-request-builder";
2
+ export type { SearchRequest, GenerateSearchRequestOptions, SearchRequestModes } from "./types";
3
+ export { BaseSearchRequestMode, CurationSearchRequestMode } from "./types";
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurationSearchRequestMode = exports.BaseSearchRequestMode = exports.determineSearchRequestModes = exports.generateSearchRequest = void 0;
4
+ // Main public API exports
5
+ var search_request_builder_1 = require("./search-request-builder");
6
+ Object.defineProperty(exports, "generateSearchRequest", { enumerable: true, get: function () { return search_request_builder_1.generateSearchRequest; } });
7
+ Object.defineProperty(exports, "determineSearchRequestModes", { enumerable: true, get: function () { return search_request_builder_1.determineSearchRequestModes; } });
8
+ // Runtime enums (can be used as values)
9
+ var types_1 = require("./types");
10
+ Object.defineProperty(exports, "BaseSearchRequestMode", { enumerable: true, get: function () { return types_1.BaseSearchRequestMode; } });
11
+ Object.defineProperty(exports, "CurationSearchRequestMode", { enumerable: true, get: function () { return types_1.CurationSearchRequestMode; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/search-request-builder/index.ts"],"names":[],"mappings":";;;AAAA,0BAA0B;AAC1B,mEAA8F;AAArF,+HAAA,qBAAqB,OAAA;AAAE,qIAAA,2BAA2B,OAAA;AAK3D,wCAAwC;AACxC,iCAA2E;AAAlE,8GAAA,qBAAqB,OAAA;AAAE,kHAAA,yBAAyB,OAAA","sourcesContent":["// Main public API exports\nexport { generateSearchRequest, determineSearchRequestModes } from \"./search-request-builder\";\n\n// Types and enums (commonly used)\nexport type { SearchRequest, GenerateSearchRequestOptions, SearchRequestModes } from \"./types\";\n\n// Runtime enums (can be used as values)\nexport { BaseSearchRequestMode, CurationSearchRequestMode } from \"./types\";\n"]}
@@ -0,0 +1,3 @@
1
+ import { GenerateSearchRequestOptions, SearchRequest, SearchRequestModes } from "./types";
2
+ export declare function generateSearchRequest(options: GenerateSearchRequestOptions): SearchRequest;
3
+ export declare function determineSearchRequestModes(flags: string[]): SearchRequestModes;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSearchRequest = generateSearchRequest;
4
+ exports.determineSearchRequestModes = determineSearchRequestModes;
5
+ const base_builders_1 = require("./base-builders");
6
+ const curation_builders_1 = require("./curation-builders");
7
+ const types_1 = require("./types");
8
+ // Main Entry Point - Search Request Strategy Router
9
+ function generateSearchRequest(options) {
10
+ const baseSearchRequest = (0, base_builders_1.generateBaseSearchRequest)(options);
11
+ // Only apply curation enhancements if curation exists
12
+ if (options.curation) {
13
+ const curationSearchRequest = (0, curation_builders_1.generateCurationSearchRequest)(options);
14
+ return combineSearchRequest(baseSearchRequest, curationSearchRequest);
15
+ }
16
+ return baseSearchRequest;
17
+ }
18
+ // Combine Search Request Function
19
+ function combineSearchRequest(baseRequestSearch, curationSearchRequest) {
20
+ return Object.assign(Object.assign(Object.assign({}, baseRequestSearch), curationSearchRequest), (baseRequestSearch.query &&
21
+ curationSearchRequest.query && {
22
+ query: mergeQueries(baseRequestSearch.query, curationSearchRequest.query),
23
+ }));
24
+ }
25
+ function mergeQueries(baseQuery, enhancementQuery) {
26
+ if ("function_score" in enhancementQuery && enhancementQuery.function_score) {
27
+ return {
28
+ function_score: {
29
+ query: baseQuery,
30
+ functions: enhancementQuery.function_score.functions || [],
31
+ score_mode: enhancementQuery.function_score.score_mode,
32
+ boost_mode: enhancementQuery.function_score.boost_mode,
33
+ },
34
+ };
35
+ }
36
+ return enhancementQuery;
37
+ }
38
+ // Search Request Mode Detection Functions
39
+ function determineSearchRequestModes(flags) {
40
+ const baseSearchRequestMode = detectBaseSearchRequestMode(flags);
41
+ const curationSearchRequestMode = detectCurationSearchRequestMode(flags);
42
+ return { baseSearchRequestMode, curationSearchRequestMode };
43
+ }
44
+ function detectBaseSearchRequestMode(flags) {
45
+ return (flags === null || flags === void 0 ? void 0 : flags.includes("use_weighted_base_search_request"))
46
+ ? types_1.BaseSearchRequestMode.Weighted
47
+ : types_1.BaseSearchRequestMode.Relevance;
48
+ }
49
+ function detectCurationSearchRequestMode(flags) {
50
+ return (flags === null || flags === void 0 ? void 0 : flags.includes("use_weighted_curation_search_request"))
51
+ ? types_1.CurationSearchRequestMode.Weighted
52
+ : types_1.CurationSearchRequestMode.Boosted;
53
+ }
54
+ //# sourceMappingURL=search-request-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-request-builder.js","sourceRoot":"","sources":["../../../src/search-request-builder/search-request-builder.ts"],"names":[],"mappings":";;AAYA,sDAUC;AAiCD,kEAIC;AA3DD,mDAA4D;AAC5D,2DAAoE;AACpE,mCAOiB;AAEjB,oDAAoD;AACpD,SAAgB,qBAAqB,CAAC,OAAqC;IACzE,MAAM,iBAAiB,GAAG,IAAA,yCAAyB,EAAC,OAAO,CAAC,CAAC;IAE7D,sDAAsD;IACtD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,qBAAqB,GAAG,IAAA,iDAA6B,EAAC,OAAO,CAAC,CAAC;QACrE,OAAO,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,kCAAkC;AAClC,SAAS,oBAAoB,CAC3B,iBAAgC,EAChC,qBAA6C;IAE7C,qDACK,iBAAiB,GACjB,qBAAqB,GACrB,CAAC,iBAAiB,CAAC,KAAK;QACzB,qBAAqB,CAAC,KAAK,IAAI;QAC7B,KAAK,EAAE,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC;KAC1E,CAAC,EACJ;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,SAAyB,EAAE,gBAAgC;IAC/E,IAAI,gBAAgB,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAC5E,OAAO;YACL,cAAc,EAAE;gBACd,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE;gBAC1D,UAAU,EAAE,gBAAgB,CAAC,cAAc,CAAC,UAAU;gBACtD,UAAU,EAAE,gBAAgB,CAAC,cAAc,CAAC,UAAU;aACvD;SACF,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,0CAA0C;AAC1C,SAAgB,2BAA2B,CAAC,KAAe;IACzD,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,yBAAyB,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACzE,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAgB;IACnD,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,kCAAkC,CAAC;QACxD,CAAC,CAAC,6BAAqB,CAAC,QAAQ;QAChC,CAAC,CAAC,6BAAqB,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAgB;IACvD,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,sCAAsC,CAAC;QAC5D,CAAC,CAAC,iCAAyB,CAAC,QAAQ;QACpC,CAAC,CAAC,iCAAyB,CAAC,OAAO,CAAC;AACxC,CAAC","sourcesContent":["import { generateBaseSearchRequest } from \"./base-builders\";\nimport { generateCurationSearchRequest } from \"./curation-builders\";\nimport {\n BaseSearchRequestMode,\n CurationSearchRequestMode,\n GenerateSearchRequestOptions,\n QueryContainer,\n SearchRequest,\n SearchRequestModes,\n} from \"./types\";\n\n// Main Entry Point - Search Request Strategy Router\nexport function generateSearchRequest(options: GenerateSearchRequestOptions): SearchRequest {\n const baseSearchRequest = generateBaseSearchRequest(options);\n\n // Only apply curation enhancements if curation exists\n if (options.curation) {\n const curationSearchRequest = generateCurationSearchRequest(options);\n return combineSearchRequest(baseSearchRequest, curationSearchRequest);\n }\n\n return baseSearchRequest;\n}\n\n// Combine Search Request Function\nfunction combineSearchRequest(\n baseRequestSearch: SearchRequest,\n curationSearchRequest: Partial<SearchRequest>\n): SearchRequest {\n return {\n ...baseRequestSearch,\n ...curationSearchRequest,\n ...(baseRequestSearch.query &&\n curationSearchRequest.query && {\n query: mergeQueries(baseRequestSearch.query, curationSearchRequest.query),\n }),\n };\n}\n\nfunction mergeQueries(baseQuery: QueryContainer, enhancementQuery: QueryContainer): QueryContainer {\n if (\"function_score\" in enhancementQuery && enhancementQuery.function_score) {\n return {\n function_score: {\n query: baseQuery,\n functions: enhancementQuery.function_score.functions || [],\n score_mode: enhancementQuery.function_score.score_mode,\n boost_mode: enhancementQuery.function_score.boost_mode,\n },\n };\n }\n\n return enhancementQuery;\n}\n\n// Search Request Mode Detection Functions\nexport function determineSearchRequestModes(flags: string[]): SearchRequestModes {\n const baseSearchRequestMode = detectBaseSearchRequestMode(flags);\n const curationSearchRequestMode = detectCurationSearchRequestMode(flags);\n return { baseSearchRequestMode, curationSearchRequestMode };\n}\n\nfunction detectBaseSearchRequestMode(flags?: string[]): BaseSearchRequestMode {\n return flags?.includes(\"use_weighted_base_search_request\")\n ? BaseSearchRequestMode.Weighted\n : BaseSearchRequestMode.Relevance;\n}\n\nfunction detectCurationSearchRequestMode(flags?: string[]): CurationSearchRequestMode {\n return flags?.includes(\"use_weighted_curation_search_request\")\n ? CurationSearchRequestMode.Weighted\n : CurationSearchRequestMode.Boosted;\n}\n"]}
@@ -0,0 +1,105 @@
1
+ import { Boosting, BoostGrouping, BoostSorting, Curation, CurationType, Relevance, SearchableField } from "../types/firestore";
2
+ export declare const BaseSearchRequestMode: {
3
+ readonly Relevance: "relevance";
4
+ readonly Weighted: "weighted";
5
+ };
6
+ export type BaseSearchRequestMode = typeof BaseSearchRequestMode[keyof typeof BaseSearchRequestMode];
7
+ export declare const CurationSearchRequestMode: {
8
+ readonly Boosted: "boosted";
9
+ readonly Weighted: "weighted";
10
+ };
11
+ export type CurationSearchRequestMode = typeof CurationSearchRequestMode[keyof typeof CurationSearchRequestMode];
12
+ export interface SearchRequestModes {
13
+ baseSearchRequestMode: BaseSearchRequestMode;
14
+ curationSearchRequestMode: CurationSearchRequestMode;
15
+ }
16
+ export interface GenerateSearchRequestBaseOptions {
17
+ relevanceFields?: Relevance[];
18
+ searchableFields?: SearchableField[];
19
+ market?: string;
20
+ baseSearchRequestMode: BaseSearchRequestMode;
21
+ curationSearchRequestMode: CurationSearchRequestMode;
22
+ }
23
+ export interface GenerateSearchRequestSearchOptions extends GenerateSearchRequestBaseOptions {
24
+ searchTerm: string;
25
+ curation?: SearchCuration;
26
+ }
27
+ export interface GenerateSearchRequestCollectionOptions extends GenerateSearchRequestBaseOptions {
28
+ collectionHandle: string;
29
+ curation?: CollectionCuration;
30
+ }
31
+ export type GenerateSearchRequestOptions = GenerateSearchRequestSearchOptions | GenerateSearchRequestCollectionOptions;
32
+ export interface SearchCuration extends Curation {
33
+ type: CurationType.Search;
34
+ searchTerm: string;
35
+ }
36
+ export interface CollectionCuration extends Curation {
37
+ type: CurationType.Collection;
38
+ collectionHandle: string;
39
+ }
40
+ export interface CurationRules {
41
+ boostingRules: Boosting[];
42
+ groupings: BoostGrouping[];
43
+ sortings: BoostSorting[];
44
+ }
45
+ export interface TermSearchRequestOptions {
46
+ searchTerm: string;
47
+ baseSearchRequestMode: BaseSearchRequestMode;
48
+ relevanceFields?: Relevance[];
49
+ searchableFields?: SearchableField[];
50
+ markets: string[];
51
+ }
52
+ export interface CollectionSearchRequestOptions {
53
+ collectionHandle: string;
54
+ markets: string[];
55
+ }
56
+ export interface SearchRequest {
57
+ query?: QueryContainer;
58
+ sort?: SortOptions;
59
+ }
60
+ export interface QueryContainer {
61
+ bool?: BoolQuery;
62
+ function_score?: FunctionScoreQuery;
63
+ multi_match?: MultiMatchQuery;
64
+ match?: Record<string, any>;
65
+ match_all?: Record<string, any>;
66
+ term?: Record<string, any>;
67
+ terms?: Record<string, string[]>;
68
+ wildcard?: Record<string, string>;
69
+ range?: Record<string, any>;
70
+ nested?: NestedQuery;
71
+ }
72
+ export interface BoolQuery {
73
+ must?: QueryContainer | QueryContainer[];
74
+ should?: QueryContainer[];
75
+ must_not?: QueryContainer | QueryContainer[];
76
+ filter?: QueryContainer[];
77
+ minimum_should_match?: string | number;
78
+ }
79
+ export interface FunctionScoreQuery {
80
+ query: QueryContainer;
81
+ functions: FunctionScoreContainer[];
82
+ score_mode: FunctionScoreMode;
83
+ boost_mode: FunctionBoostMode;
84
+ }
85
+ export interface FunctionScoreContainer {
86
+ filter: QueryContainer;
87
+ weight: number;
88
+ }
89
+ export interface MultiMatchQuery {
90
+ query: string;
91
+ fields: string[];
92
+ type: "cross_fields" | "phrase" | "phrase_prefix";
93
+ operator: "and" | "or";
94
+ }
95
+ export interface NestedQuery {
96
+ path: string;
97
+ query: QueryContainer;
98
+ }
99
+ export type SortOptions = Record<string, any>[] | Record<string, any>;
100
+ export type FunctionScoreMode = "sum" | "multiply" | "avg" | "max" | "min" | "first";
101
+ export type FunctionBoostMode = "multiply" | "replace" | "sum" | "avg" | "max" | "min";
102
+ export declare function isSearchOptions(options: GenerateSearchRequestOptions): options is GenerateSearchRequestSearchOptions;
103
+ export declare function isCollectionOptions(options: GenerateSearchRequestOptions): options is GenerateSearchRequestCollectionOptions;
104
+ export declare function isSearchCuration(curation?: Curation): curation is SearchCuration;
105
+ export declare function isCollectionCuration(curation?: Curation): curation is CollectionCuration;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurationSearchRequestMode = exports.BaseSearchRequestMode = void 0;
4
+ exports.isSearchOptions = isSearchOptions;
5
+ exports.isCollectionOptions = isCollectionOptions;
6
+ exports.isSearchCuration = isSearchCuration;
7
+ exports.isCollectionCuration = isCollectionCuration;
8
+ const firestore_1 = require("../types/firestore");
9
+ exports.BaseSearchRequestMode = {
10
+ Relevance: "relevance",
11
+ Weighted: "weighted",
12
+ };
13
+ exports.CurationSearchRequestMode = {
14
+ Boosted: "boosted",
15
+ Weighted: "weighted",
16
+ };
17
+ // Type guards for runtime type checking
18
+ function isSearchOptions(options) {
19
+ return "searchTerm" in options;
20
+ }
21
+ function isCollectionOptions(options) {
22
+ return "collectionHandle" in options;
23
+ }
24
+ function isSearchCuration(curation) {
25
+ return (curation === null || curation === void 0 ? void 0 : curation.type) === firestore_1.CurationType.Search;
26
+ }
27
+ function isCollectionCuration(curation) {
28
+ return (curation === null || curation === void 0 ? void 0 : curation.type) === firestore_1.CurationType.Collection;
29
+ }
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/search-request-builder/types.ts"],"names":[],"mappings":";;;AAwIA,0CAEC;AAED,kDAIC;AAED,4CAEC;AAED,oDAEC;AAxJD,kDAQ4B;AAEf,QAAA,qBAAqB,GAAG;IACnC,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;CACZ,CAAC;AAGE,QAAA,yBAAyB,GAAG;IACvC,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;CACZ,CAAC;AAoHX,wCAAwC;AACxC,SAAgB,eAAe,CAAC,OAAqC;IACnE,OAAO,YAAY,IAAI,OAAO,CAAC;AACjC,CAAC;AAED,SAAgB,mBAAmB,CACjC,OAAqC;IAErC,OAAO,kBAAkB,IAAI,OAAO,CAAC;AACvC,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAmB;IAClD,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,wBAAY,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,SAAgB,oBAAoB,CAAC,QAAmB;IACtD,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,wBAAY,CAAC,UAAU,CAAC;AACpD,CAAC","sourcesContent":["import {\n Boosting,\n BoostGrouping,\n BoostSorting,\n Curation,\n CurationType,\n Relevance,\n SearchableField,\n} from \"../types/firestore\";\n\nexport const BaseSearchRequestMode = {\n Relevance: \"relevance\",\n Weighted: \"weighted\",\n} as const;\nexport type BaseSearchRequestMode = typeof BaseSearchRequestMode[keyof typeof BaseSearchRequestMode];\n\nexport const CurationSearchRequestMode = {\n Boosted: \"boosted\",\n Weighted: \"weighted\",\n} as const;\nexport type CurationSearchRequestMode = typeof CurationSearchRequestMode[keyof typeof CurationSearchRequestMode];\n\nexport interface SearchRequestModes {\n baseSearchRequestMode: BaseSearchRequestMode;\n curationSearchRequestMode: CurationSearchRequestMode;\n}\n\n// Base options shared by all search request types\nexport interface GenerateSearchRequestBaseOptions {\n relevanceFields?: Relevance[];\n searchableFields?: SearchableField[];\n market?: string;\n baseSearchRequestMode: BaseSearchRequestMode;\n curationSearchRequestMode: CurationSearchRequestMode;\n}\n\n// Search-specific options\nexport interface GenerateSearchRequestSearchOptions extends GenerateSearchRequestBaseOptions {\n searchTerm: string;\n curation?: SearchCuration;\n}\n\n// Collection-specific options\nexport interface GenerateSearchRequestCollectionOptions extends GenerateSearchRequestBaseOptions {\n collectionHandle: string;\n curation?: CollectionCuration;\n}\n\n// Union type for the main interface\nexport type GenerateSearchRequestOptions = GenerateSearchRequestSearchOptions | GenerateSearchRequestCollectionOptions;\n\n// Refined curation types with better type safety\nexport interface SearchCuration extends Curation {\n type: CurationType.Search;\n searchTerm: string;\n}\n\nexport interface CollectionCuration extends Curation {\n type: CurationType.Collection;\n collectionHandle: string;\n}\n\nexport interface CurationRules {\n boostingRules: Boosting[];\n groupings: BoostGrouping[];\n sortings: BoostSorting[];\n}\n\nexport interface TermSearchRequestOptions {\n searchTerm: string;\n baseSearchRequestMode: BaseSearchRequestMode;\n relevanceFields?: Relevance[];\n searchableFields?: SearchableField[];\n markets: string[];\n}\n\nexport interface CollectionSearchRequestOptions {\n collectionHandle: string;\n markets: string[];\n}\n\n// Elasticsearch/OpenSearch type aliases - using basic types to avoid external dependency\nexport interface SearchRequest {\n query?: QueryContainer;\n sort?: SortOptions;\n}\n\nexport interface QueryContainer {\n bool?: BoolQuery;\n function_score?: FunctionScoreQuery;\n multi_match?: MultiMatchQuery;\n match?: Record<string, any>;\n match_all?: Record<string, any>;\n term?: Record<string, any>;\n terms?: Record<string, string[]>;\n wildcard?: Record<string, string>;\n range?: Record<string, any>;\n nested?: NestedQuery;\n}\n\nexport interface BoolQuery {\n must?: QueryContainer | QueryContainer[];\n should?: QueryContainer[];\n must_not?: QueryContainer | QueryContainer[];\n filter?: QueryContainer[];\n minimum_should_match?: string | number;\n}\n\nexport interface FunctionScoreQuery {\n query: QueryContainer;\n functions: FunctionScoreContainer[];\n score_mode: FunctionScoreMode;\n boost_mode: FunctionBoostMode;\n}\n\nexport interface FunctionScoreContainer {\n filter: QueryContainer;\n weight: number;\n}\n\nexport interface MultiMatchQuery {\n query: string;\n fields: string[];\n type: \"cross_fields\" | \"phrase\" | \"phrase_prefix\";\n operator: \"and\" | \"or\";\n}\n\nexport interface NestedQuery {\n path: string;\n query: QueryContainer;\n}\n\nexport type SortOptions = Record<string, any>[] | Record<string, any>;\nexport type FunctionScoreMode = \"sum\" | \"multiply\" | \"avg\" | \"max\" | \"min\" | \"first\";\nexport type FunctionBoostMode = \"multiply\" | \"replace\" | \"sum\" | \"avg\" | \"max\" | \"min\";\n// Type guards for runtime type checking\nexport function isSearchOptions(options: GenerateSearchRequestOptions): options is GenerateSearchRequestSearchOptions {\n return \"searchTerm\" in options;\n}\n\nexport function isCollectionOptions(\n options: GenerateSearchRequestOptions\n): options is GenerateSearchRequestCollectionOptions {\n return \"collectionHandle\" in options;\n}\n\nexport function isSearchCuration(curation?: Curation): curation is SearchCuration {\n return curation?.type === CurationType.Search;\n}\n\nexport function isCollectionCuration(curation?: Curation): curation is CollectionCuration {\n return curation?.type === CurationType.Collection;\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { Boosting, Relevance } from "../types/firestore";
2
+ import { FunctionScoreContainer, QueryContainer, TermSearchRequestOptions } from "./types";
3
+ export declare function generateQueryField(options: {
4
+ fieldName: string;
5
+ market?: string;
6
+ }): string;
7
+ export declare function generateMarketsFilter(markets: string[]): QueryContainer[];
8
+ export declare function generateMarketsClause(markets: string[]): QueryContainer | null;
9
+ export declare function generateBoostingRule(options: {
10
+ boostingRule: Boosting;
11
+ market?: string;
12
+ }): FunctionScoreContainer;
13
+ export declare function generateBoostingRules(options: {
14
+ boostingRules: Boosting[];
15
+ market?: string;
16
+ }): FunctionScoreContainer[];
17
+ export declare function validateSearchInputs(options: TermSearchRequestOptions): void;
18
+ export declare function prepareRelevanceFields(relevanceFields?: Relevance[]): {
19
+ crossFields: string[];
20
+ phrase: string[];
21
+ phrasePrefix: string[];
22
+ };
23
+ export declare function generateMultiMatchQueries(searchTerm: string, fieldMappings: {
24
+ crossFields: string[];
25
+ phrase: string[];
26
+ phrasePrefix: string[];
27
+ }): QueryContainer[];