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

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 (51) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/dist/package.json +1 -1
  3. package/dist/src/components/Sensor/SensorSearchTerm.d.ts +1 -2
  4. package/dist/src/components/Sensor/SensorSearchTerm.js +38 -120
  5. package/dist/src/components/Sensor/SensorSearchTerm.js.map +1 -1
  6. package/dist/src/components/Sensor/Sensors.d.ts +1 -3
  7. package/dist/src/components/Sensor/Sensors.js +10 -29
  8. package/dist/src/components/Sensor/Sensors.js.map +1 -1
  9. package/dist/src/components/Sensor/index.d.ts +0 -2
  10. package/dist/src/components/Sensor/index.js +0 -4
  11. package/dist/src/components/Sensor/index.js.map +1 -1
  12. package/dist/src/search-request-builder/base-builders.d.ts +18 -0
  13. package/dist/src/search-request-builder/base-builders.js +184 -0
  14. package/dist/src/search-request-builder/base-builders.js.map +1 -0
  15. package/dist/src/search-request-builder/curation-builders.d.ts +2 -0
  16. package/dist/src/search-request-builder/curation-builders.js +44 -0
  17. package/dist/src/search-request-builder/curation-builders.js.map +1 -0
  18. package/dist/src/search-request-builder/index.d.ts +3 -0
  19. package/dist/src/search-request-builder/index.js +12 -0
  20. package/dist/src/search-request-builder/index.js.map +1 -0
  21. package/dist/src/search-request-builder/search-request-builder.d.ts +3 -0
  22. package/dist/src/search-request-builder/search-request-builder.js +54 -0
  23. package/dist/src/search-request-builder/search-request-builder.js.map +1 -0
  24. package/dist/src/search-request-builder/types.d.ts +105 -0
  25. package/dist/src/search-request-builder/types.js +30 -0
  26. package/dist/src/search-request-builder/types.js.map +1 -0
  27. package/dist/src/search-request-builder/utils.d.ts +27 -0
  28. package/dist/src/search-request-builder/utils.js +144 -0
  29. package/dist/src/search-request-builder/utils.js.map +1 -0
  30. package/dist/src/types/elastic.d.ts +6 -9
  31. package/dist/src/types/elastic.js.map +1 -1
  32. package/dist/src/types/firestore.d.ts +2 -2
  33. package/dist/src/types/firestore.js.map +1 -1
  34. package/dist/src/utility/config.d.ts +2 -2
  35. package/dist/src/utility/config.js +5 -8
  36. package/dist/src/utility/config.js.map +1 -1
  37. package/dist/src/utility/props.d.ts +5 -224
  38. package/dist/src/utility/props.js +54 -101
  39. package/dist/src/utility/props.js.map +1 -1
  40. package/dist/src/utility/server.js +1 -1
  41. package/dist/src/utility/server.js.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/src/components/Sensor/SensorCollectionWeighted.d.ts +0 -1
  44. package/dist/src/components/Sensor/SensorCollectionWeighted.js +0 -21
  45. package/dist/src/components/Sensor/SensorCollectionWeighted.js.map +0 -1
  46. package/dist/src/components/Sensor/SensorSearchWeighted.d.ts +0 -1
  47. package/dist/src/components/Sensor/SensorSearchWeighted.js +0 -22
  48. package/dist/src/components/Sensor/SensorSearchWeighted.js.map +0 -1
  49. package/dist/src/utility/queries.d.ts +0 -393
  50. package/dist/src/utility/queries.js +0 -197
  51. package/dist/src/utility/queries.js.map +0 -1
@@ -1,197 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateCollectionFunctionScore = exports.generateSearchFunctionScore = exports.generateQueryCollectionWeighted = exports.generateQuerySearchWeighted = void 0;
4
- const firestore_1 = require("../types/firestore");
5
- const generateQuerySearchWeighted = (options) => {
6
- var _a, _b;
7
- return (0, exports.generateSearchFunctionScore)({
8
- searchTerm: (_a = options.curation.searchTerm) !== null && _a !== void 0 ? _a : "",
9
- searchableFields: options.searchableFields,
10
- boostingRules: (_b = options.curation.boostings) !== null && _b !== void 0 ? _b : [],
11
- curationMarkets: options.curation.markets,
12
- currentMarket: options.currentMarket,
13
- });
14
- };
15
- exports.generateQuerySearchWeighted = generateQuerySearchWeighted;
16
- const generateQueryCollectionWeighted = (options) => {
17
- var _a, _b;
18
- const collectionFunctionScore = (0, exports.generateCollectionFunctionScore)({
19
- collectionHandle: (_a = options.curation.collectionHandle) !== null && _a !== void 0 ? _a : "",
20
- boostingRules: (_b = options.curation.boostings) !== null && _b !== void 0 ? _b : [],
21
- curationMarkets: options.curation.markets,
22
- currentMarket: options.currentMarket,
23
- });
24
- return { function_score: collectionFunctionScore };
25
- };
26
- exports.generateQueryCollectionWeighted = generateQueryCollectionWeighted;
27
- const generateMarketsClause = (curationMarkets) => {
28
- if (!curationMarkets.length)
29
- return null;
30
- return { terms: { markets: curationMarkets } };
31
- };
32
- const generateQueryField = (options) => {
33
- if (!options.currentMarket) {
34
- if (options.fieldName === "price")
35
- return "price_min";
36
- return options.fieldName;
37
- }
38
- if (options.fieldName === "price") {
39
- return `price_min_market_${options.currentMarket}`;
40
- }
41
- if (options.fieldName === "price_min") {
42
- return `price_min_market_${options.currentMarket}`;
43
- }
44
- if (options.fieldName === "price_max") {
45
- return `price_max_market_${options.currentMarket}`;
46
- }
47
- if (options.fieldName === "inventory_total") {
48
- return `inventory_quantity_market_${options.currentMarket}`;
49
- }
50
- return options.fieldName;
51
- };
52
- const generateBoostingRule = (options) => {
53
- const fieldName = generateQueryField({
54
- fieldName: options.boostingRule.fieldName,
55
- currentMarket: options.currentMarket,
56
- });
57
- if (options.boostingRule.operation === firestore_1.Operation.Contains) {
58
- return {
59
- filter: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } },
60
- weight: options.boostingRule.points,
61
- };
62
- }
63
- if (options.boostingRule.operation === firestore_1.Operation.NotContains) {
64
- return {
65
- filter: {
66
- bool: { must_not: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } } },
67
- },
68
- weight: options.boostingRule.points,
69
- };
70
- }
71
- if (options.boostingRule.operation === firestore_1.Operation.Equals) {
72
- return {
73
- filter: { term: { [fieldName]: options.boostingRule.value } },
74
- weight: options.boostingRule.points,
75
- };
76
- }
77
- if (options.boostingRule.operation === firestore_1.Operation.GreaterThan) {
78
- return {
79
- filter: { range: { [fieldName]: { gt: parseFloat(options.boostingRule.value) } } },
80
- weight: options.boostingRule.points,
81
- };
82
- }
83
- if (options.boostingRule.operation === firestore_1.Operation.LessThan) {
84
- return {
85
- filter: { range: { [fieldName]: { lt: parseFloat(options.boostingRule.value) } } },
86
- weight: options.boostingRule.points,
87
- };
88
- }
89
- throw new Error(`Unable to process rule`);
90
- };
91
- const generateBoostingRules = (options) => {
92
- return options.boostingRules
93
- .map((boostingRule) => generateBoostingRule({ boostingRule: boostingRule, currentMarket: options.currentMarket }))
94
- .filter(Boolean);
95
- };
96
- const generateSearchFunctionScore = (options) => {
97
- var _a, _b;
98
- const searchTerms = (_b = (_a = options.searchTerm) === null || _a === void 0 ? void 0 : _a.split(" ")) !== null && _b !== void 0 ? _b : [];
99
- const searchQueries = [];
100
- for (const searchableField of options.searchableFields) {
101
- const baseField = searchableField.field;
102
- const maxEdits = searchableField.allowedMistakes;
103
- for (const searchTerm of searchTerms) {
104
- searchQueries.push({
105
- match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "regular_analyzer" } },
106
- });
107
- if (searchableField.synyonymEnabled) {
108
- searchQueries.push({
109
- match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "synonym_analyzer" } },
110
- });
111
- }
112
- }
113
- }
114
- const searchScores = [];
115
- for (const field of options.searchableFields) {
116
- const baseField = field.field;
117
- const maxPoints = field.points;
118
- const maxEdits = field.allowedMistakes;
119
- for (let edits = 0; edits <= maxEdits; edits++) {
120
- // The total points (e.g. 1000) minus the total mistakes (e.g. 3) multiplied by the mistakes multiplier (e.g. 10% of 1000) = 1000 - (3 * (1000 / 10)) = 700;
121
- const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);
122
- // The total points (e.g. 1000) divided by the mistakes multiplier (e.g. 10%) = 1000 / 100 = 100;
123
- const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);
124
- // Which weight to use, weightMaxEdits should be used once and weightSomeEdits every other time
125
- const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;
126
- for (const searchTerm of searchTerms) {
127
- // Regular match
128
- searchScores.push({
129
- filter: {
130
- match: {
131
- [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" },
132
- },
133
- },
134
- weight: weightBase,
135
- });
136
- // Synonym match _and not_ regular match
137
- if (field.synyonymEnabled && field.synonymPenaltyPercent > 0) {
138
- // The weightBase (e.g. weightMaxEdits 700 or weightSomeEdits 100) multiplied by the synonyms multiplier as a percentage of the whole points (e.g. input 5% = output 95%) = 700 * (95%)
139
- const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);
140
- searchScores.push({
141
- filter: {
142
- bool: {
143
- must_not: {
144
- match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
145
- },
146
- must: {
147
- match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "synonym_analyzer" } },
148
- },
149
- },
150
- },
151
- weight: weightSynonyms,
152
- });
153
- }
154
- }
155
- }
156
- }
157
- return {
158
- query: {
159
- bool: Object.assign(Object.assign({}, generateMarketsClause(options.curationMarkets)), { should: [...searchQueries] }),
160
- },
161
- functions: [
162
- ...searchScores,
163
- ...generateBoostingRules({ boostingRules: options.boostingRules, currentMarket: options.currentMarket }),
164
- ],
165
- score_mode: "sum",
166
- boost_mode: "replace",
167
- };
168
- };
169
- exports.generateSearchFunctionScore = generateSearchFunctionScore;
170
- const generateCollectionFunctionScore = (options) => {
171
- const mustClauses = [
172
- {
173
- nested: {
174
- path: "collections",
175
- query: {
176
- term: { ["collections.handle"]: options.collectionHandle },
177
- },
178
- },
179
- },
180
- ];
181
- const marketClause = generateMarketsClause(options.curationMarkets);
182
- if (marketClause)
183
- mustClauses.push(marketClause);
184
- return {
185
- query: {
186
- bool: { must: mustClauses },
187
- },
188
- functions: generateBoostingRules({
189
- boostingRules: options.boostingRules,
190
- currentMarket: options.currentMarket,
191
- }),
192
- score_mode: "sum",
193
- boost_mode: "replace",
194
- };
195
- };
196
- exports.generateCollectionFunctionScore = generateCollectionFunctionScore;
197
- //# sourceMappingURL=queries.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/utility/queries.ts"],"names":[],"mappings":";;;AAAA,kDAAkG;AAE3F,MAAM,2BAA2B,GAAG,CAAC,OAI3C,EAAE,EAAE;;IACH,OAAO,IAAA,mCAA2B,EAAC;QACjC,UAAU,EAAE,MAAA,OAAO,CAAC,QAAQ,CAAC,UAAU,mCAAI,EAAE;QAC7C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,aAAa,EAAE,MAAA,OAAO,CAAC,QAAQ,CAAC,SAAS,mCAAI,EAAE;QAC/C,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACzC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;AACL,CAAC,CAAC;AAZW,QAAA,2BAA2B,+BAYtC;AAEK,MAAM,+BAA+B,GAAG,CAAC,OAG/C,EAAE,EAAE;;IACH,MAAM,uBAAuB,GAAG,IAAA,uCAA+B,EAAC;QAC9D,gBAAgB,EAAE,MAAA,OAAO,CAAC,QAAQ,CAAC,gBAAgB,mCAAI,EAAE;QACzD,aAAa,EAAE,MAAA,OAAO,CAAC,QAAQ,CAAC,SAAS,mCAAI,EAAE;QAC/C,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACzC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IACH,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;AACrD,CAAC,CAAC;AAXW,QAAA,+BAA+B,mCAW1C;AAEF,MAAM,qBAAqB,GAAG,CAAC,eAAyB,EAAE,EAAE;IAC1D,IAAI,CAAC,eAAe,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAsD,EAAE,EAAE;IACpF,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO;YAAE,OAAO,WAAW,CAAC;QACtD,OAAO,OAAO,CAAC,SAAS,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO,oBAAoB,OAAO,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,oBAAoB,OAAO,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,oBAAoB,OAAO,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC5C,OAAO,6BAA6B,OAAO,CAAC,aAAa,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,OAAO,CAAC,SAAS,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAA2D,EAAE,EAAE;IAC3F,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACnC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS;QACzC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,qBAAS,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO;YACL,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,EAAE;YACxE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,qBAAS,CAAC,WAAW,EAAE,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE;aACrF;YACD,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,qBAAS,CAAC,MAAM,EAAE,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE;YAC7D,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,qBAAS,CAAC,WAAW,EAAE,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE;YAClF,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,qBAAS,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO;YACL,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE;YAClF,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAA8D,EAAE,EAAE;IAC/F,OAAO,OAAO,CAAC,aAAa;SACzB,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;SACjH,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC;AAEK,MAAM,2BAA2B,GAAG,CAAC,OAM3C,EAAE,EAAE;;IACH,MAAM,WAAW,GAAG,MAAA,MAAA,OAAO,CAAC,UAAU,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;IAEzD,MAAM,aAAa,GAAG,EAAE,CAAC;IACzB,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC;QACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,CAAC;QACjD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,aAAa,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE;aACjG,CAAC,CAAC;YACH,IAAI,eAAe,CAAC,eAAe,EAAE,CAAC;gBACpC,aAAa,CAAC,IAAI,CAAC;oBACjB,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE;iBACjG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC;QAEvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,4JAA4J;YAC5J,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7G,iGAAiG;YACjG,MAAM,eAAe,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxE,+FAA+F;YAC/F,MAAM,UAAU,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;YAEzE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,gBAAgB;gBAChB,YAAY,CAAC,IAAI,CAAC;oBAChB,MAAM,EAAE;wBACN,KAAK,EAAE;4BACL,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE;yBACnF;qBACF;oBACD,MAAM,EAAE,UAAU;iBACnB,CAAC,CAAC;gBAEH,wCAAwC;gBACxC,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,EAAE,CAAC;oBAC7D,uLAAuL;oBACvL,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAC;oBAE5E,YAAY,CAAC,IAAI,CAAC;wBAChB,MAAM,EAAE;4BACN,IAAI,EAAE;gCACJ,QAAQ,EAAE;oCACR,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE;iCAC9F;gCACD,IAAI,EAAE;oCACJ,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE;iCAC9F;6BACF;yBACF;wBACD,MAAM,EAAE,cAAc;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,kCAAO,qBAAqB,CAAC,OAAO,CAAC,eAAe,CAAC,KAAE,MAAM,EAAE,CAAC,GAAG,aAAa,CAAC,GAAE;SACxF;QACD,SAAS,EAAE;YACT,GAAG,YAAY;YACf,GAAG,qBAAqB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;SACzG;QACD,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;AAnFW,QAAA,2BAA2B,+BAmFtC;AAEK,MAAM,+BAA+B,GAAG,CAAC,OAK/C,EAAE,EAAE;IACH,MAAM,WAAW,GAA0B;QACzC;YACE,MAAM,EAAE;gBACN,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE;iBAC3D;aACF;SACF;KACF,CAAC;IAEF,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACpE,IAAI,YAAY;QAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;SAC5B;QACD,SAAS,EAAE,qBAAqB,CAAC;YAC/B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;QACF,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,+BAA+B,mCA+B1C","sourcesContent":["import { Boosting, Curation, CurationType, Operation, SearchableField } from \"../types/firestore\";\n\nexport const generateQuerySearchWeighted = (options: {\n curation: Curation & { type: CurationType.Search };\n searchableFields: SearchableField[];\n currentMarket?: string;\n}) => {\n return generateSearchFunctionScore({\n searchTerm: options.curation.searchTerm ?? \"\",\n searchableFields: options.searchableFields,\n boostingRules: options.curation.boostings ?? [],\n curationMarkets: options.curation.markets,\n currentMarket: options.currentMarket,\n });\n};\n\nexport const generateQueryCollectionWeighted = (options: {\n curation: Curation & { type: CurationType.Collection };\n currentMarket?: string;\n}) => {\n const collectionFunctionScore = generateCollectionFunctionScore({\n collectionHandle: options.curation.collectionHandle ?? \"\",\n boostingRules: options.curation.boostings ?? [],\n curationMarkets: options.curation.markets,\n currentMarket: options.currentMarket,\n });\n return { function_score: collectionFunctionScore };\n};\n\nconst generateMarketsClause = (curationMarkets: string[]) => {\n if (!curationMarkets.length) return null;\n return { terms: { markets: curationMarkets } };\n};\n\nconst generateQueryField = (options: { fieldName: string; currentMarket?: string }) => {\n if (!options.currentMarket) {\n if (options.fieldName === \"price\") return \"price_min\";\n return options.fieldName;\n }\n\n if (options.fieldName === \"price\") {\n return `price_min_market_${options.currentMarket}`;\n }\n if (options.fieldName === \"price_min\") {\n return `price_min_market_${options.currentMarket}`;\n }\n if (options.fieldName === \"price_max\") {\n return `price_max_market_${options.currentMarket}`;\n }\n if (options.fieldName === \"inventory_total\") {\n return `inventory_quantity_market_${options.currentMarket}`;\n }\n\n return options.fieldName;\n};\n\nconst generateBoostingRule = (options: { boostingRule: Boosting; currentMarket?: string }) => {\n const fieldName = generateQueryField({\n fieldName: options.boostingRule.fieldName,\n currentMarket: options.currentMarket,\n });\n\n if (options.boostingRule.operation === Operation.Contains) {\n return {\n filter: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.NotContains) {\n return {\n filter: {\n bool: { must_not: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } } },\n },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.Equals) {\n return {\n filter: { term: { [fieldName]: options.boostingRule.value } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.GreaterThan) {\n return {\n filter: { range: { [fieldName]: { gt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.LessThan) {\n return {\n filter: { range: { [fieldName]: { lt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n throw new Error(`Unable to process rule`);\n};\n\nconst generateBoostingRules = (options: { boostingRules: Boosting[]; currentMarket?: string }) => {\n return options.boostingRules\n .map((boostingRule) => generateBoostingRule({ boostingRule: boostingRule, currentMarket: options.currentMarket }))\n .filter(Boolean);\n};\n\nexport const generateSearchFunctionScore = (options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n curationMarkets: string[];\n currentMarket?: string;\n}) => {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries = [];\n for (const searchableField of options.searchableFields) {\n const baseField = searchableField.field;\n const maxEdits = searchableField.allowedMistakes;\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"regular_analyzer\" } },\n });\n if (searchableField.synyonymEnabled) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"synonym_analyzer\" } },\n });\n }\n }\n }\n\n const searchScores = [];\n for (const field of options.searchableFields) {\n const baseField = field.field;\n const maxPoints = field.points;\n const maxEdits = field.allowedMistakes;\n\n for (let edits = 0; edits <= maxEdits; edits++) {\n // The total points (e.g. 1000) minus the total mistakes (e.g. 3) multiplied by the mistakes multiplier (e.g. 10% of 1000) = 1000 - (3 * (1000 / 10)) = 700;\n const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);\n // The total points (e.g. 1000) divided by the mistakes multiplier (e.g. 10%) = 1000 / 100 = 100;\n const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);\n // Which weight to use, weightMaxEdits should be used once and weightSomeEdits every other time\n const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;\n\n for (const searchTerm of searchTerms) {\n // Regular match\n searchScores.push({\n filter: {\n match: {\n [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" },\n },\n },\n weight: weightBase,\n });\n\n // Synonym match _and not_ regular match\n if (field.synyonymEnabled && field.synonymPenaltyPercent > 0) {\n // The weightBase (e.g. weightMaxEdits 700 or weightSomeEdits 100) multiplied by the synonyms multiplier as a percentage of the whole points (e.g. input 5% = output 95%) = 700 * (95%)\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 return {\n query: {\n bool: { ...generateMarketsClause(options.curationMarkets), should: [...searchQueries] },\n },\n functions: [\n ...searchScores,\n ...generateBoostingRules({ boostingRules: options.boostingRules, currentMarket: options.currentMarket }),\n ],\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n};\n\nexport const generateCollectionFunctionScore = (options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n curationMarkets: string[];\n currentMarket?: string;\n}) => {\n const mustClauses: Record<string, any>[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsClause(options.curationMarkets);\n if (marketClause) mustClauses.push(marketClause);\n\n return {\n query: {\n bool: { must: mustClauses },\n },\n functions: generateBoostingRules({\n boostingRules: options.boostingRules,\n currentMarket: options.currentMarket,\n }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n};\n"]}