@webiny/api-headless-cms-ddb-es 0.0.0-mt-3 → 0.0.0-unstable.1e66d121db

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 (159) hide show
  1. package/configurations.d.ts +2 -2
  2. package/configurations.js +18 -7
  3. package/configurations.js.map +1 -0
  4. package/definitions/entry.d.ts +2 -2
  5. package/definitions/entry.js +6 -7
  6. package/definitions/entry.js.map +1 -0
  7. package/definitions/entryElasticsearch.d.ts +2 -2
  8. package/definitions/entryElasticsearch.js +3 -7
  9. package/definitions/entryElasticsearch.js.map +1 -0
  10. package/definitions/group.d.ts +2 -2
  11. package/definitions/group.js +3 -7
  12. package/definitions/group.js.map +1 -0
  13. package/definitions/model.d.ts +2 -2
  14. package/definitions/model.js +3 -7
  15. package/definitions/model.js.map +1 -0
  16. package/definitions/settings.d.ts +2 -2
  17. package/definitions/settings.js +3 -7
  18. package/definitions/settings.js.map +1 -0
  19. package/definitions/system.d.ts +2 -2
  20. package/definitions/system.js +3 -7
  21. package/definitions/system.js.map +1 -0
  22. package/definitions/table.d.ts +2 -2
  23. package/definitions/table.js.map +1 -0
  24. package/definitions/tableElasticsearch.d.ts +2 -2
  25. package/definitions/tableElasticsearch.js.map +1 -0
  26. package/dynamoDb/index.d.ts +1 -1
  27. package/dynamoDb/index.js +4 -6
  28. package/dynamoDb/index.js.map +1 -0
  29. package/dynamoDb/storage/date.d.ts +2 -3
  30. package/dynamoDb/storage/date.js +80 -46
  31. package/dynamoDb/storage/date.js.map +1 -0
  32. package/dynamoDb/storage/longText.d.ts +7 -4
  33. package/dynamoDb/storage/longText.js +72 -54
  34. package/dynamoDb/storage/longText.js.map +1 -0
  35. package/dynamoDb/storage/richText.d.ts +2 -3
  36. package/dynamoDb/storage/richText.js +85 -67
  37. package/dynamoDb/storage/richText.js.map +1 -0
  38. package/elasticsearch/createElasticsearchIndex.d.ts +9 -0
  39. package/elasticsearch/createElasticsearchIndex.js +60 -0
  40. package/elasticsearch/createElasticsearchIndex.js.map +1 -0
  41. package/elasticsearch/deleteElasticsearchIndex.d.ts +8 -0
  42. package/elasticsearch/deleteElasticsearchIndex.js +43 -0
  43. package/elasticsearch/deleteElasticsearchIndex.js.map +1 -0
  44. package/elasticsearch/index.d.ts +1 -1
  45. package/elasticsearch/index.js +1 -1
  46. package/elasticsearch/index.js.map +1 -0
  47. package/elasticsearch/indexing/dateTimeIndexing.js +15 -1
  48. package/elasticsearch/indexing/dateTimeIndexing.js.map +1 -0
  49. package/elasticsearch/indexing/defaultFieldIndexing.js.map +1 -0
  50. package/elasticsearch/indexing/index.js +1 -1
  51. package/elasticsearch/indexing/index.js.map +1 -0
  52. package/elasticsearch/indexing/longTextIndexing.js.map +1 -0
  53. package/elasticsearch/indexing/numberIndexing.js.map +1 -0
  54. package/elasticsearch/indexing/objectIndexing.d.ts +9 -0
  55. package/elasticsearch/indexing/objectIndexing.js +32 -9
  56. package/elasticsearch/indexing/objectIndexing.js.map +1 -0
  57. package/elasticsearch/indexing/richTextIndexing.js.map +1 -0
  58. package/elasticsearch/indices/base.d.ts +2 -0
  59. package/elasticsearch/indices/base.js +19 -0
  60. package/elasticsearch/indices/base.js.map +1 -0
  61. package/elasticsearch/indices/index.d.ts +1 -0
  62. package/elasticsearch/indices/index.js +16 -0
  63. package/elasticsearch/indices/index.js.map +1 -0
  64. package/elasticsearch/indices/japanese.d.ts +2 -0
  65. package/elasticsearch/indices/japanese.js +20 -0
  66. package/elasticsearch/indices/japanese.js.map +1 -0
  67. package/elasticsearch/search/index.d.ts +2 -2
  68. package/elasticsearch/search/index.js +3 -5
  69. package/elasticsearch/search/index.js.map +1 -0
  70. package/elasticsearch/search/refSearch.d.ts +2 -3
  71. package/elasticsearch/search/refSearch.js +25 -16
  72. package/elasticsearch/search/refSearch.js.map +1 -0
  73. package/elasticsearch/search/timeSearch.d.ts +2 -3
  74. package/elasticsearch/search/timeSearch.js +22 -14
  75. package/elasticsearch/search/timeSearch.js.map +1 -0
  76. package/helpers/createElasticsearchQueryBody.js +311 -73
  77. package/helpers/createElasticsearchQueryBody.js.map +1 -0
  78. package/helpers/entryIndexHelpers.js +33 -18
  79. package/helpers/entryIndexHelpers.js.map +1 -0
  80. package/helpers/fields.d.ts +4 -62
  81. package/helpers/fields.js +39 -8
  82. package/helpers/fields.js.map +1 -0
  83. package/helpers/index.js.map +1 -0
  84. package/helpers/searchPluginsList.d.ts +2 -2
  85. package/helpers/searchPluginsList.js +1 -1
  86. package/helpers/searchPluginsList.js.map +1 -0
  87. package/helpers/transformValueForSearch.d.ts +5 -2
  88. package/helpers/transformValueForSearch.js +3 -0
  89. package/helpers/transformValueForSearch.js.map +1 -0
  90. package/index.js +62 -24
  91. package/index.js.map +1 -0
  92. package/operations/entry/dataLoaders.d.ts +6 -2
  93. package/operations/entry/dataLoaders.js +31 -13
  94. package/operations/entry/dataLoaders.js.map +1 -0
  95. package/operations/entry/elasticsearchFields.js +6 -0
  96. package/operations/entry/elasticsearchFields.js.map +1 -0
  97. package/operations/entry/index.d.ts +2 -2
  98. package/operations/entry/index.js +442 -324
  99. package/operations/entry/index.js.map +1 -0
  100. package/operations/entry/keys.js.map +1 -0
  101. package/operations/group/index.d.ts +2 -2
  102. package/operations/group/index.js +8 -15
  103. package/operations/group/index.js.map +1 -0
  104. package/operations/model/index.d.ts +2 -2
  105. package/operations/model/index.js +38 -39
  106. package/operations/model/index.js.map +1 -0
  107. package/operations/settings/index.d.ts +2 -2
  108. package/operations/settings/index.js +7 -13
  109. package/operations/settings/index.js.map +1 -0
  110. package/operations/system/index.d.ts +2 -2
  111. package/operations/system/index.js +5 -11
  112. package/operations/system/index.js.map +1 -0
  113. package/package.json +25 -29
  114. package/plugins/CmsEntryElasticsearchBodyModifierPlugin.d.ts +2 -2
  115. package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js +1 -1
  116. package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js.map +1 -0
  117. package/plugins/CmsEntryElasticsearchFieldPlugin.d.ts +3 -3
  118. package/plugins/CmsEntryElasticsearchFieldPlugin.js +1 -1
  119. package/plugins/CmsEntryElasticsearchFieldPlugin.js.map +1 -0
  120. package/plugins/CmsEntryElasticsearchIndexPlugin.d.ts +4 -0
  121. package/plugins/CmsEntryElasticsearchIndexPlugin.js +17 -0
  122. package/plugins/CmsEntryElasticsearchIndexPlugin.js.map +1 -0
  123. package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.d.ts +30 -0
  124. package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js +43 -0
  125. package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js.map +1 -0
  126. package/plugins/CmsEntryElasticsearchQueryModifierPlugin.d.ts +2 -2
  127. package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js +1 -1
  128. package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js.map +1 -0
  129. package/plugins/CmsEntryElasticsearchSortModifierPlugin.d.ts +2 -2
  130. package/plugins/CmsEntryElasticsearchSortModifierPlugin.js +1 -1
  131. package/plugins/CmsEntryElasticsearchSortModifierPlugin.js.map +1 -0
  132. package/types.d.ts +2 -32
  133. package/types.js +0 -13
  134. package/types.js.map +1 -0
  135. package/upgrades/index.d.ts +1 -1
  136. package/upgrades/index.js +1 -7
  137. package/upgrades/index.js.map +1 -0
  138. package/helpers/operatorPluginsList.d.ts +0 -7
  139. package/helpers/operatorPluginsList.js +0 -30
  140. package/operations/entry/fields.d.ts +0 -3
  141. package/operations/entry/fields.js +0 -60
  142. package/operations/system/createElasticsearchTemplate.d.ts +0 -5
  143. package/operations/system/createElasticsearchTemplate.js +0 -62
  144. package/upgrades/utils.d.ts +0 -1
  145. package/upgrades/utils.js +0 -16
  146. package/upgrades/v5.0.0/cleanDatabaseRecord.d.ts +0 -6
  147. package/upgrades/v5.0.0/cleanDatabaseRecord.js +0 -16
  148. package/upgrades/v5.0.0/createOldVersionIndiceName.d.ts +0 -2
  149. package/upgrades/v5.0.0/createOldVersionIndiceName.js +0 -12
  150. package/upgrades/v5.0.0/entryValueFixer.d.ts +0 -4
  151. package/upgrades/v5.0.0/entryValueFixer.js +0 -124
  152. package/upgrades/v5.0.0/fieldFinder.d.ts +0 -6
  153. package/upgrades/v5.0.0/fieldFinder.js +0 -42
  154. package/upgrades/v5.0.0/helpers.d.ts +0 -4
  155. package/upgrades/v5.0.0/helpers.js +0 -57
  156. package/upgrades/v5.0.0/index.d.ts +0 -4
  157. package/upgrades/v5.0.0/index.js +0 -232
  158. package/upgrades/v5.8.0/index.d.ts +0 -4
  159. package/upgrades/v5.8.0/index.js +0 -426
@@ -1,18 +1,16 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.createElasticsearchQueryBody = void 0;
9
9
 
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
11
 
12
12
  var _error = _interopRequireDefault(require("@webiny/error"));
13
13
 
14
- var _operatorPluginsList = require("./operatorPluginsList");
15
-
16
14
  var _transformValueForSearch = require("./transformValueForSearch");
17
15
 
18
16
  var _searchPluginsList = require("./searchPluginsList");
@@ -35,12 +33,12 @@ var _CmsEntryElasticsearchSortModifierPlugin = require("../plugins/CmsEntryElast
35
33
 
36
34
  var _CmsEntryElasticsearchBodyModifierPlugin = require("../plugins/CmsEntryElasticsearchBodyModifierPlugin");
37
35
 
38
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
36
+ var _operators = require("@webiny/api-elasticsearch/operators");
39
37
 
40
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
38
+ var _normalize = require("@webiny/api-elasticsearch/normalize");
41
39
 
42
- const specialFields = ["published", "latest", "locale", "tenant"];
43
- const noKeywordFields = ["date", "number", "boolean"];
40
+ const specialFields = ["published", "latest"];
41
+ const noKeywordFields = ["date", "datetime", "number", "boolean"];
44
42
 
45
43
  const createElasticsearchSortParams = args => {
46
44
  const {
@@ -51,28 +49,60 @@ const createElasticsearchSortParams = args => {
51
49
  } = args;
52
50
 
53
51
  if (!sort || sort.length === 0) {
54
- return undefined;
52
+ return [];
55
53
  }
56
54
 
55
+ const fieldIdToStorageIdIdMap = {};
57
56
  const sortPlugins = Object.values(modelFields).reduce((plugins, modelField) => {
58
57
  const searchPlugin = searchPlugins[modelField.type];
59
- plugins[modelField.field.fieldId] = new _CmsEntryElasticsearchFieldPlugin.CmsEntryElasticsearchFieldPlugin({
58
+ const {
59
+ fieldId,
60
+ storageId
61
+ } = modelField.field;
62
+ fieldIdToStorageIdIdMap[fieldId] = fieldId;
63
+ /**
64
+ * Plugins must be stored with fieldId as key because it is later used to find the sorting plugin.
65
+ */
66
+
67
+ plugins[fieldId] = new _CmsEntryElasticsearchFieldPlugin.CmsEntryElasticsearchFieldPlugin({
60
68
  unmappedType: modelField.unmappedType,
61
69
  keyword: hasKeyword(modelField),
62
70
  sortable: modelField.isSortable,
63
71
  searchable: modelField.isSearchable,
64
- field: modelField.field.fieldId,
72
+ field: fieldId,
65
73
  path: createFieldPath({
74
+ key: storageId,
66
75
  parentPath,
67
- modelField: modelField,
76
+ modelField,
68
77
  searchPlugin
69
78
  })
70
79
  });
71
80
  return plugins;
72
81
  }, {});
82
+ const transformedSort = sort.map(value => {
83
+ const matched = value.match(/^([a-zA-Z-0-9_]+)_(ASC|DESC)$/);
84
+
85
+ if (!matched) {
86
+ return null;
87
+ }
88
+
89
+ const [, fieldId, order] = matched;
90
+
91
+ if (fieldIdToStorageIdIdMap[fieldId]) {
92
+ return `${fieldIdToStorageIdIdMap[fieldId]}_${order}`;
93
+ }
94
+
95
+ return value;
96
+ }).filter(Boolean);
73
97
  return (0, _sort.createSort)({
74
98
  fieldPlugins: sortPlugins,
75
- sort
99
+ sort: transformedSort
100
+ });
101
+ };
102
+
103
+ const findFieldByFieldId = (model, fieldId) => {
104
+ return model.fields.find(field => {
105
+ return field.fieldId === fieldId;
76
106
  });
77
107
  };
78
108
  /**
@@ -82,10 +112,16 @@ const createElasticsearchSortParams = args => {
82
112
  */
83
113
 
84
114
 
85
- const createInitialQueryValue = args => {
115
+ const createInitialQueryValue = params => {
86
116
  const {
87
- where
88
- } = args;
117
+ model,
118
+ where: initialWhere
119
+ } = params;
120
+ /**
121
+ * Cast as partial so we can remove unnecessary keys.
122
+ */
123
+
124
+ const where = (0, _objectSpread2.default)({}, initialWhere);
89
125
  const query = {
90
126
  must: [],
91
127
  must_not: [],
@@ -98,22 +134,16 @@ const createInitialQueryValue = args => {
98
134
  if (sharedIndex) {
99
135
  query.must.push({
100
136
  term: {
101
- "tenant.keyword": where.tenant
102
- }
103
- });
104
- }
105
-
106
- delete where["tenant"];
107
-
108
- if (where.locale) {
109
- query.must.push({
110
- term: {
111
- "locale.keyword": where.locale
137
+ "tenant.keyword": model.tenant
112
138
  }
113
139
  });
114
140
  }
115
141
 
116
- delete where["locale"];
142
+ query.must.push({
143
+ term: {
144
+ "locale.keyword": model.locale
145
+ }
146
+ });
117
147
  /**
118
148
  * We must transform published and latest where args into something that is understandable by our Elasticsearch
119
149
  */
@@ -131,12 +161,8 @@ const createInitialQueryValue = args => {
131
161
  }
132
162
  });
133
163
  } // we do not allow not published and not latest
134
- else if (where.published === false) {
135
- throw new _error.default(`Cannot call Elasticsearch query with "published" set at false.`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
136
- where
137
- });
138
- } else if (where.latest === false) {
139
- throw new _error.default(`Cannot call Elasticsearch query with "latest" set at false.`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
164
+ else {
165
+ throw new _error.default(`Cannot call Elasticsearch query when not setting "published" or "latest".`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
140
166
  where
141
167
  });
142
168
  } //
@@ -148,20 +174,26 @@ const createInitialQueryValue = args => {
148
174
  const createFieldPath = ({
149
175
  modelField,
150
176
  searchPlugin,
151
- parentPath
177
+ parentPath,
178
+ key
152
179
  }) => {
153
- let path;
180
+ let path = null;
154
181
 
155
182
  if (searchPlugin && typeof searchPlugin.createPath === "function") {
156
183
  path = searchPlugin.createPath({
157
- field: modelField.field
184
+ field: modelField.field,
185
+ value: null,
186
+ key
158
187
  });
159
188
  } else if (typeof modelField.path === "function") {
160
- path = modelField.path(modelField.field.fieldId);
189
+ path = modelField.path(modelField.field.storageId);
161
190
  }
162
191
 
163
192
  if (!path) {
164
- path = modelField.path || modelField.field.fieldId || modelField.field.id;
193
+ /**
194
+ * We know that modelFieldPath is a string or undefined at this point.
195
+ */
196
+ path = modelField.path || modelField.field.storageId || modelField.field.id;
165
197
  }
166
198
 
167
199
  return modelField.isSystemField || !parentPath || path.match(parentPath) ? path : `${parentPath}.${path}`;
@@ -191,6 +223,149 @@ const hasKeyword = modelField => {
191
223
 
192
224
  return true;
193
225
  };
226
+
227
+ /**
228
+ * A list of typeof strings that are 100% not ref field filtering.
229
+ * We also need to check for array and date.
230
+ */
231
+ const nonRefFieldTypes = ["string", "number", "undefined", "symbol", "bigint", "function", "boolean"];
232
+
233
+ const isRefFieldFiltering = params => {
234
+ const {
235
+ key,
236
+ value,
237
+ field
238
+ } = params;
239
+ const typeOf = typeof value;
240
+
241
+ if (!value || nonRefFieldTypes.includes(typeOf) || Array.isArray(value) || value instanceof Date || !!value.toISOString) {
242
+ return false;
243
+ } else if (typeOf === "object" && field.type === "ref") {
244
+ return true;
245
+ }
246
+
247
+ throw new _error.default("Could not determine if the search value is ref field search.", "REF_FIELD_SEARCH_ERROR", {
248
+ value,
249
+ field,
250
+ key
251
+ });
252
+ };
253
+
254
+ const fieldPathFactory = params => {
255
+ const {
256
+ plugin,
257
+ modelField,
258
+ value,
259
+ parentPath,
260
+ keyword,
261
+ key
262
+ } = params;
263
+ const field = modelField.field;
264
+ let fieldPath = null;
265
+
266
+ if (plugin) {
267
+ fieldPath = plugin.createPath({
268
+ field,
269
+ value,
270
+ key
271
+ });
272
+ }
273
+
274
+ if (!fieldPath) {
275
+ fieldPath = field.storageId;
276
+
277
+ if (modelField.path) {
278
+ fieldPath = typeof modelField.path === "function" ? modelField.path(value) : modelField.path;
279
+ }
280
+ }
281
+
282
+ const keywordValue = keyword ? ".keyword" : "";
283
+
284
+ if (!parentPath) {
285
+ return `${fieldPath}${keywordValue}`;
286
+ }
287
+
288
+ return `${parentPath}.${fieldPath}${keywordValue}`;
289
+ };
290
+
291
+ const applyFiltering = params => {
292
+ const {
293
+ query,
294
+ modelField,
295
+ operator,
296
+ key,
297
+ value: initialValue,
298
+ operatorPlugins,
299
+ searchPlugins,
300
+ parentPath
301
+ } = params;
302
+ const plugin = operatorPlugins[operator];
303
+
304
+ if (!plugin) {
305
+ throw new _error.default("Operator plugin missing.", "PLUGIN_MISSING", {
306
+ operator
307
+ });
308
+ }
309
+
310
+ const fieldSearchPlugin = searchPlugins[modelField.type];
311
+ const value = (0, _transformValueForSearch.transformValueForSearch)({
312
+ plugins: searchPlugins,
313
+ field: modelField.field,
314
+ value: initialValue
315
+ });
316
+ const keyword = hasKeyword(modelField);
317
+ plugin.apply(query, {
318
+ basePath: fieldPathFactory({
319
+ plugin: fieldSearchPlugin,
320
+ modelField,
321
+ parentPath: modelField.isSystemField ? null : parentPath,
322
+ value,
323
+ key
324
+ }),
325
+ path: fieldPathFactory({
326
+ plugin: fieldSearchPlugin,
327
+ modelField,
328
+ value,
329
+ parentPath: modelField.isSystemField ? null : parentPath,
330
+ keyword,
331
+ key
332
+ }),
333
+ value,
334
+ keyword
335
+ });
336
+ };
337
+
338
+ const applyFullTextSearch = params => {
339
+ const {
340
+ query,
341
+ modelFields,
342
+ term,
343
+ fields
344
+ } = params;
345
+
346
+ if (!term || term.length === 0 || fields.length === 0) {
347
+ return;
348
+ }
349
+
350
+ const fieldPaths = fields.reduce((collection, field) => {
351
+ const modelField = modelFields[field.fieldId];
352
+
353
+ if (!modelField) {
354
+ return collection;
355
+ }
356
+
357
+ collection.push(`values.${field.storageId}`);
358
+ return collection;
359
+ }, []);
360
+ query.must.push({
361
+ query_string: {
362
+ allow_leading_wildcard: true,
363
+ fields: fieldPaths,
364
+ query: (0, _normalize.normalizeValue)(term),
365
+ default_operator: "or"
366
+ }
367
+ });
368
+ };
194
369
  /*
195
370
  * Iterate through where keys and apply plugins where necessary
196
371
  */
@@ -198,18 +373,28 @@ const hasKeyword = modelField => {
198
373
 
199
374
  const execElasticsearchBuildQueryPlugins = params => {
200
375
  const {
376
+ model,
201
377
  where: initialWhere,
202
378
  modelFields,
203
379
  parentPath,
204
380
  plugins,
205
- searchPlugins
381
+ searchPlugins,
382
+ fullTextSearch
206
383
  } = params;
207
-
208
- const where = _objectSpread({}, initialWhere);
209
-
210
- const query = createInitialQueryValue(_objectSpread(_objectSpread({}, params), {}, {
384
+ const where = (0, _objectSpread2.default)({}, initialWhere);
385
+ const query = createInitialQueryValue((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
211
386
  where
212
387
  }));
388
+ /**
389
+ * Add full text search for requested fields.
390
+ */
391
+
392
+ applyFullTextSearch({
393
+ query,
394
+ modelFields,
395
+ term: fullTextSearch.term,
396
+ fields: fullTextSearch.fields
397
+ });
213
398
  /**
214
399
  * Always remove special fields, as these do not exist in Elasticsearch.
215
400
  */
@@ -222,7 +407,7 @@ const execElasticsearchBuildQueryPlugins = params => {
222
407
  return query;
223
408
  }
224
409
 
225
- const operatorPlugins = (0, _operatorPluginsList.operatorPluginsList)(plugins);
410
+ const operatorPlugins = (0, _operators.getElasticsearchOperatorPluginsByLocale)(plugins, model.locale);
226
411
 
227
412
  for (const key in where) {
228
413
  if (where.hasOwnProperty(key) === false) {
@@ -232,9 +417,12 @@ const execElasticsearchBuildQueryPlugins = params => {
232
417
  * We do not need to go further if value is undefined.
233
418
  * There are few hardcoded possibilities when value is undefined, for example, ownedBy.
234
419
  */
420
+ // TODO figure out how to have type.
235
421
 
236
422
 
237
- if (where[key] === undefined) {
423
+ const value = where[key];
424
+
425
+ if (value === undefined) {
238
426
  continue;
239
427
  }
240
428
 
@@ -242,10 +430,26 @@ const execElasticsearchBuildQueryPlugins = params => {
242
430
  field,
243
431
  operator
244
432
  } = (0, _where.parseWhereKey)(key);
245
- const modelField = modelFields[field];
433
+ /**
434
+ * TODO This will be required until the storage operations receive the fieldId instead of field storageId.
435
+ * TODO For this to work without field searching, we need to refactor how the query looks like.
436
+ *
437
+ * Storage operations should NEVER receive an field storageId, only alias - fieldId.
438
+ */
439
+
440
+ let fieldId = field;
441
+ const cmsModelField = findFieldByFieldId(model, fieldId);
442
+
443
+ if (!cmsModelField && !modelFields[fieldId]) {
444
+ throw new _error.default(`There is no CMS Model Field field "${fieldId}".`);
445
+ } else if (cmsModelField) {
446
+ fieldId = cmsModelField.fieldId;
447
+ }
448
+
449
+ const modelField = modelFields[fieldId];
246
450
 
247
451
  if (!modelField) {
248
- throw new _error.default(`There is no field "${field}".`);
452
+ throw new _error.default(`There is no field "${fieldId}".`);
249
453
  }
250
454
 
251
455
  const {
@@ -254,34 +458,50 @@ const execElasticsearchBuildQueryPlugins = params => {
254
458
  } = modelField;
255
459
 
256
460
  if (!isSearchable) {
257
- throw new _error.default(`Field "${field}" is not searchable.`);
461
+ throw new _error.default(`Field "${fieldId}" is not searchable.`);
258
462
  }
463
+ /**
464
+ * There is a possibility that value is an object.
465
+ * In that case, check if field is ref field and continue a bit differently.
466
+ */
467
+
259
468
 
260
- const plugin = operatorPlugins[operator];
469
+ if (isRefFieldFiltering({
470
+ key,
471
+ value,
472
+ field: cmsField
473
+ })) {
474
+ /**
475
+ * We we need to go through each key in where[key] to determine the filters.
476
+ */
477
+ for (const whereKey in value) {
478
+ const {
479
+ operator
480
+ } = (0, _where.parseWhereKey)(whereKey);
481
+ applyFiltering({
482
+ query,
483
+ modelField,
484
+ operator,
485
+ key: whereKey,
486
+ value: value[whereKey],
487
+ searchPlugins,
488
+ operatorPlugins,
489
+ parentPath
490
+ });
491
+ }
261
492
 
262
- if (!plugin) {
263
- throw new _error.default("Operator plugin missing.", "PLUGIN_MISSING", {
264
- operator
265
- });
493
+ continue;
266
494
  }
267
495
 
268
- const fieldSearchPlugin = searchPlugins[modelField.type];
269
- const value = (0, _transformValueForSearch.transformValueForSearch)({
270
- plugins: searchPlugins,
271
- field: cmsField,
272
- value: where[key]
273
- });
274
- const fieldPath = createFieldPath({
275
- searchPlugin: fieldSearchPlugin,
496
+ applyFiltering({
497
+ query,
276
498
  modelField,
277
- parentPath: parentPath
278
- });
279
- const keyword = hasKeyword(modelField);
280
- plugin.apply(query, {
281
- basePath: fieldPath,
282
- path: keyword ? `${fieldPath}.keyword` : fieldPath,
499
+ operator,
500
+ key,
283
501
  value,
284
- keyword
502
+ searchPlugins,
503
+ operatorPlugins,
504
+ parentPath
285
505
  });
286
506
  }
287
507
 
@@ -296,20 +516,38 @@ const createElasticsearchQueryBody = params => {
296
516
  parentPath = null
297
517
  } = params;
298
518
  const {
299
- where,
519
+ where = {},
300
520
  after,
301
521
  limit,
302
- sort: initialSort
522
+ sort: initialSort,
523
+ search,
524
+ fields = []
303
525
  } = args;
304
526
  const modelFields = (0, _fields.createModelFields)(plugins, model);
305
527
  const searchPlugins = (0, _searchPluginsList.searchPluginsList)(plugins);
528
+ const fullTextSearchFields = [];
529
+
530
+ for (const fieldId of fields) {
531
+ const field = model.fields.find(f => f.fieldId === fieldId);
532
+
533
+ if (!field) {
534
+ continue;
535
+ }
536
+
537
+ fullTextSearchFields.push(field);
538
+ }
539
+
306
540
  const query = execElasticsearchBuildQueryPlugins({
307
541
  model,
308
542
  plugins,
309
543
  where,
310
544
  modelFields,
311
545
  parentPath,
312
- searchPlugins
546
+ searchPlugins,
547
+ fullTextSearch: {
548
+ term: search,
549
+ fields: fullTextSearchFields
550
+ }
313
551
  });
314
552
  const queryPlugins = plugins.byType(_CmsEntryElasticsearchQueryModifierPlugin.CmsEntryElasticsearchQueryModifierPlugin.type).filter(pl => {
315
553
  return !pl.modelId || pl.modelId === model.modelId;
@@ -352,7 +590,7 @@ const createElasticsearchQueryBody = params => {
352
590
  }
353
591
  },
354
592
  sort,
355
- size: limit + 1,
593
+ size: (limit || 0) + 1,
356
594
  // eslint-disable-next-line
357
595
  search_after: (0, _cursors.decodeCursor)(after),
358
596
  // eslint-disable-next-line
@@ -0,0 +1 @@
1
+ {"version":3,"names":["specialFields","noKeywordFields","createElasticsearchSortParams","args","sort","modelFields","parentPath","searchPlugins","length","fieldIdToStorageIdIdMap","sortPlugins","Object","values","reduce","plugins","modelField","searchPlugin","type","fieldId","storageId","field","CmsEntryElasticsearchFieldPlugin","unmappedType","keyword","hasKeyword","sortable","isSortable","searchable","isSearchable","path","createFieldPath","key","transformedSort","map","value","matched","match","order","filter","Boolean","createSort","fieldPlugins","findFieldByFieldId","model","fields","find","createInitialQueryValue","params","where","initialWhere","query","must","must_not","should","sharedIndex","process","env","ELASTICSEARCH_SHARED_INDEXES","push","term","tenant","locale","published","createPublishedType","latest","createLatestType","WebinyError","createPath","id","isSystemField","includes","nonRefFieldTypes","isRefFieldFiltering","typeOf","Array","isArray","Date","toISOString","fieldPathFactory","plugin","fieldPath","keywordValue","applyFiltering","operator","initialValue","operatorPlugins","fieldSearchPlugin","transformValueForSearch","apply","basePath","applyFullTextSearch","fieldPaths","collection","query_string","allow_leading_wildcard","normalizeValue","default_operator","execElasticsearchBuildQueryPlugins","fullTextSearch","sf","keys","getElasticsearchOperatorPluginsByLocale","hasOwnProperty","undefined","parseWhereKey","cmsModelField","cmsField","whereKey","createElasticsearchQueryBody","after","limit","initialSort","search","createModelFields","searchPluginsList","fullTextSearchFields","f","queryPlugins","byType","CmsEntryElasticsearchQueryModifierPlugin","pl","modelId","modifyQuery","CmsEntryElasticsearchSortModifierPlugin","modifySort","body","bool","size","search_after","decodeCursor","track_total_hits","bodyPlugins","CmsEntryElasticsearchBodyModifierPlugin","modifyBody"],"sources":["createElasticsearchQueryBody.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { transformValueForSearch } from \"./transformValueForSearch\";\nimport { searchPluginsList } from \"./searchPluginsList\";\nimport {\n CmsEntryListParams,\n CmsEntryListSort,\n CmsEntryListWhere,\n CmsModel,\n CmsModelField\n} from \"@webiny/api-headless-cms/types\";\nimport {\n SearchBody as esSearchBody,\n Sort as esSort,\n ElasticsearchBoolQueryConfig\n} from \"@webiny/api-elasticsearch/types\";\nimport { decodeCursor } from \"@webiny/api-elasticsearch/cursors\";\nimport { createSort } from \"@webiny/api-elasticsearch/sort\";\nimport { createModelFields, ModelField, ModelFields } from \"./fields\";\nimport { CmsEntryElasticsearchFieldPlugin } from \"~/plugins/CmsEntryElasticsearchFieldPlugin\";\nimport { parseWhereKey } from \"@webiny/api-elasticsearch/where\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { createLatestType, createPublishedType } from \"~/operations/entry\";\nimport { CmsEntryElasticsearchQueryModifierPlugin } from \"~/plugins/CmsEntryElasticsearchQueryModifierPlugin\";\nimport { CmsEntryElasticsearchSortModifierPlugin } from \"~/plugins/CmsEntryElasticsearchSortModifierPlugin\";\nimport { CmsEntryElasticsearchBodyModifierPlugin } from \"~/plugins/CmsEntryElasticsearchBodyModifierPlugin\";\nimport {\n CmsEntryElasticsearchQueryBuilderValueSearchPlugin,\n CreatePathCallableParams\n} from \"~/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin\";\nimport { getElasticsearchOperatorPluginsByLocale } from \"@webiny/api-elasticsearch/operators\";\nimport { normalizeValue } from \"@webiny/api-elasticsearch/normalize\";\nimport { ElasticsearchQueryBuilderOperatorPlugin } from \"@webiny/api-elasticsearch/plugins/definition/ElasticsearchQueryBuilderOperatorPlugin\";\n\ninterface CreateElasticsearchParams {\n plugins: PluginsContainer;\n model: CmsModel;\n args: CmsEntryListParams;\n parentPath?: string;\n}\n\ninterface CreateElasticsearchSortParams {\n plugins: PluginsContainer;\n sort?: CmsEntryListSort;\n modelFields: ModelFields;\n parentPath?: string | null;\n model: CmsModel;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n}\n\ninterface CreateElasticsearchQueryArgs {\n model: CmsModel;\n plugins: PluginsContainer;\n where: CmsEntryListWhere;\n modelFields: ModelFields;\n parentPath?: string | null;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n fullTextSearch: {\n term?: string;\n fields: CmsModelField[];\n };\n}\n\nconst specialFields: (keyof Partial<CmsEntryListWhere>)[] = [\"published\", \"latest\"];\nconst noKeywordFields = [\"date\", \"datetime\", \"number\", \"boolean\"];\n\nconst createElasticsearchSortParams = (args: CreateElasticsearchSortParams): esSort => {\n const { sort, modelFields, parentPath, searchPlugins } = args;\n\n if (!sort || sort.length === 0) {\n return [];\n }\n\n const fieldIdToStorageIdIdMap: Record<string, string> = {};\n\n const sortPlugins = Object.values(modelFields).reduce((plugins, modelField) => {\n const searchPlugin = searchPlugins[modelField.type];\n\n const { fieldId, storageId } = modelField.field;\n\n fieldIdToStorageIdIdMap[fieldId] = fieldId;\n /**\n * Plugins must be stored with fieldId as key because it is later used to find the sorting plugin.\n */\n plugins[fieldId] = new CmsEntryElasticsearchFieldPlugin({\n unmappedType: modelField.unmappedType,\n keyword: hasKeyword(modelField),\n sortable: modelField.isSortable,\n searchable: modelField.isSearchable,\n field: fieldId,\n path: createFieldPath({\n key: storageId,\n parentPath,\n modelField,\n searchPlugin\n })\n });\n return plugins;\n }, {} as Record<string, CmsEntryElasticsearchFieldPlugin>);\n\n const transformedSort = sort\n .map(value => {\n const matched = value.match(/^([a-zA-Z-0-9_]+)_(ASC|DESC)$/);\n if (!matched) {\n return null;\n }\n const [, fieldId, order] = matched;\n if (fieldIdToStorageIdIdMap[fieldId]) {\n return `${fieldIdToStorageIdIdMap[fieldId]}_${order}`;\n }\n\n return value;\n })\n .filter(Boolean) as string[];\n return createSort({\n fieldPlugins: sortPlugins,\n sort: transformedSort\n });\n};\n\nconst findFieldByFieldId = (model: CmsModel, fieldId: string): CmsModelField | undefined => {\n return model.fields.find(field => {\n return field.fieldId === fieldId;\n });\n};\n/**\n * Latest and published are specific in Elasticsearch to that extend that they are tagged in the __type property.\n * We allow either published or either latest.\n * Latest is used in the manage API and published in the read API.\n */\nconst createInitialQueryValue = (\n params: CreateElasticsearchQueryArgs\n): ElasticsearchBoolQueryConfig => {\n const { model, where: initialWhere } = params;\n /**\n * Cast as partial so we can remove unnecessary keys.\n */\n const where: CmsEntryListWhere = {\n ...initialWhere\n };\n\n const query: ElasticsearchBoolQueryConfig = {\n must: [],\n must_not: [],\n should: [],\n filter: []\n };\n\n // When ES index is shared between tenants, we need to filter records by tenant ID\n const sharedIndex = process.env.ELASTICSEARCH_SHARED_INDEXES === \"true\";\n if (sharedIndex) {\n query.must.push({ term: { \"tenant.keyword\": model.tenant } });\n }\n\n query.must.push({\n term: {\n \"locale.keyword\": model.locale\n }\n });\n\n /**\n * We must transform published and latest where args into something that is understandable by our Elasticsearch\n */\n if (where.published === true) {\n query.must.push({\n term: {\n \"__type.keyword\": createPublishedType()\n }\n });\n } else if (where.latest === true) {\n query.must.push({\n term: {\n \"__type.keyword\": createLatestType()\n }\n });\n }\n // we do not allow not published and not latest\n else {\n throw new WebinyError(\n `Cannot call Elasticsearch query when not setting \"published\" or \"latest\".`,\n \"ELASTICSEARCH_UNSUPPORTED_QUERY\",\n {\n where\n }\n );\n }\n //\n return query;\n};\n\ninterface CreateFieldPathParams {\n modelField: ModelField;\n key: string;\n searchPlugin?: CmsEntryElasticsearchQueryBuilderValueSearchPlugin;\n parentPath?: string | null;\n}\nconst createFieldPath = ({\n modelField,\n searchPlugin,\n parentPath,\n key\n}: CreateFieldPathParams): string => {\n let path: string | null = null;\n if (searchPlugin && typeof searchPlugin.createPath === \"function\") {\n path = searchPlugin.createPath({\n field: modelField.field,\n value: null,\n key\n });\n } else if (typeof modelField.path === \"function\") {\n path = modelField.path(modelField.field.storageId);\n }\n if (!path) {\n /**\n * We know that modelFieldPath is a string or undefined at this point.\n */\n path = (modelField.path as string) || modelField.field.storageId || modelField.field.id;\n }\n return modelField.isSystemField || !parentPath || path.match(parentPath)\n ? path\n : `${parentPath}.${path}`;\n};\n\nconst hasKeyword = (modelField: ModelField): boolean => {\n /**\n * We defined some field types that MUST have no keyword added to the field path\n */\n if (noKeywordFields.includes(modelField.type)) {\n return false;\n } else if (modelField.unmappedType) {\n /**\n * If modelField has unmapped type defined, do not add keyword.\n */\n return false;\n } else if (modelField.keyword === false) {\n /**\n * And if specifically defined that modelField has no keyword, do not add it.\n */\n return false;\n }\n /**\n * All other fields have keyword added.\n */\n return true;\n};\n\ninterface IsRefFieldFilteringParams {\n key: string;\n value: any;\n field: CmsModelField;\n}\n\n/**\n * A list of typeof strings that are 100% not ref field filtering.\n * We also need to check for array and date.\n */\nconst nonRefFieldTypes: string[] = [\n \"string\",\n \"number\",\n \"undefined\",\n \"symbol\",\n \"bigint\",\n \"function\",\n \"boolean\"\n];\nconst isRefFieldFiltering = (params: IsRefFieldFilteringParams): boolean => {\n const { key, value, field } = params;\n const typeOf = typeof value;\n if (\n !value ||\n nonRefFieldTypes.includes(typeOf) ||\n Array.isArray(value) ||\n value instanceof Date ||\n !!value.toISOString\n ) {\n return false;\n } else if (typeOf === \"object\" && field.type === \"ref\") {\n return true;\n }\n throw new WebinyError(\n \"Could not determine if the search value is ref field search.\",\n \"REF_FIELD_SEARCH_ERROR\",\n {\n value,\n field,\n key\n }\n );\n};\n\ninterface FieldPathFactoryParams extends Omit<CreatePathCallableParams, \"field\"> {\n plugin?: CmsEntryElasticsearchQueryBuilderValueSearchPlugin;\n modelField: ModelField;\n key: string;\n parentPath?: string | null;\n keyword?: boolean;\n}\nconst fieldPathFactory = (params: FieldPathFactoryParams): string => {\n const { plugin, modelField, value, parentPath, keyword, key } = params;\n\n const field = modelField.field;\n\n let fieldPath: string | null = null;\n if (plugin) {\n fieldPath = plugin.createPath({ field, value, key });\n }\n if (!fieldPath) {\n fieldPath = field.storageId;\n if (modelField.path) {\n fieldPath =\n typeof modelField.path === \"function\" ? modelField.path(value) : modelField.path;\n }\n }\n\n const keywordValue = keyword ? \".keyword\" : \"\";\n if (!parentPath) {\n return `${fieldPath}${keywordValue}`;\n }\n return `${parentPath}.${fieldPath}${keywordValue}`;\n};\n\ninterface ApplyFilteringParams {\n query: ElasticsearchBoolQueryConfig;\n modelField: ModelField;\n operator: string;\n key: string;\n value: any;\n operatorPlugins: Record<string, ElasticsearchQueryBuilderOperatorPlugin>;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n parentPath?: string | null;\n}\nconst applyFiltering = (params: ApplyFilteringParams) => {\n const {\n query,\n modelField,\n operator,\n key,\n value: initialValue,\n operatorPlugins,\n searchPlugins,\n parentPath\n } = params;\n const plugin = operatorPlugins[operator];\n if (!plugin) {\n throw new WebinyError(\"Operator plugin missing.\", \"PLUGIN_MISSING\", {\n operator\n });\n }\n const fieldSearchPlugin = searchPlugins[modelField.type];\n const value = transformValueForSearch({\n plugins: searchPlugins,\n field: modelField.field,\n value: initialValue\n });\n\n const keyword = hasKeyword(modelField);\n plugin.apply(query, {\n basePath: fieldPathFactory({\n plugin: fieldSearchPlugin,\n modelField,\n parentPath: modelField.isSystemField ? null : parentPath,\n value,\n key\n }),\n path: fieldPathFactory({\n plugin: fieldSearchPlugin,\n modelField,\n value,\n parentPath: modelField.isSystemField ? null : parentPath,\n keyword,\n key\n }),\n value,\n keyword\n });\n};\n\ninterface ApplyFullTextSearchParams {\n query: ElasticsearchBoolQueryConfig;\n modelFields: ModelFields;\n term?: string;\n fields: CmsModelField[];\n}\nconst applyFullTextSearch = (params: ApplyFullTextSearchParams): void => {\n const { query, modelFields, term, fields } = params;\n if (!term || term.length === 0 || fields.length === 0) {\n return;\n }\n\n const fieldPaths = fields.reduce((collection, field) => {\n const modelField = modelFields[field.fieldId];\n if (!modelField) {\n return collection;\n }\n\n collection.push(`values.${field.storageId}`);\n\n return collection;\n }, [] as string[]);\n\n query.must.push({\n query_string: {\n allow_leading_wildcard: true,\n fields: fieldPaths,\n query: normalizeValue(term),\n default_operator: \"or\"\n }\n });\n};\n\n/*\n * Iterate through where keys and apply plugins where necessary\n */\nconst execElasticsearchBuildQueryPlugins = (\n params: CreateElasticsearchQueryArgs\n): ElasticsearchBoolQueryConfig => {\n const {\n model,\n where: initialWhere,\n modelFields,\n parentPath,\n plugins,\n searchPlugins,\n fullTextSearch\n } = params;\n\n const where: Partial<CmsEntryListWhere> = {\n ...initialWhere\n };\n const query = createInitialQueryValue({\n ...params,\n where\n });\n\n /**\n * Add full text search for requested fields.\n */\n applyFullTextSearch({\n query,\n modelFields,\n term: fullTextSearch.term,\n fields: fullTextSearch.fields\n });\n\n /**\n * Always remove special fields, as these do not exist in Elasticsearch.\n */\n for (const sf of specialFields) {\n delete where[sf];\n }\n\n if (Object.keys(where).length === 0) {\n return query;\n }\n\n const operatorPlugins = getElasticsearchOperatorPluginsByLocale(plugins, model.locale);\n\n for (const key in where) {\n if (where.hasOwnProperty(key) === false) {\n continue;\n }\n /**\n * We do not need to go further if value is undefined.\n * There are few hardcoded possibilities when value is undefined, for example, ownedBy.\n */\n // TODO figure out how to have type.\n const value = (where as any)[key];\n if (value === undefined) {\n continue;\n }\n const { field, operator } = parseWhereKey(key);\n /**\n * TODO This will be required until the storage operations receive the fieldId instead of field storageId.\n * TODO For this to work without field searching, we need to refactor how the query looks like.\n *\n * Storage operations should NEVER receive an field storageId, only alias - fieldId.\n */\n\n let fieldId = field;\n const cmsModelField = findFieldByFieldId(model, fieldId);\n if (!cmsModelField && !modelFields[fieldId]) {\n throw new WebinyError(`There is no CMS Model Field field \"${fieldId}\".`);\n } else if (cmsModelField) {\n fieldId = cmsModelField.fieldId;\n }\n\n const modelField = modelFields[fieldId];\n\n if (!modelField) {\n throw new WebinyError(`There is no field \"${fieldId}\".`);\n }\n const { isSearchable = false, field: cmsField } = modelField;\n if (!isSearchable) {\n throw new WebinyError(`Field \"${fieldId}\" is not searchable.`);\n }\n /**\n * There is a possibility that value is an object.\n * In that case, check if field is ref field and continue a bit differently.\n */\n if (isRefFieldFiltering({ key, value, field: cmsField })) {\n /**\n * We we need to go through each key in where[key] to determine the filters.\n */\n for (const whereKey in value) {\n const { operator } = parseWhereKey(whereKey);\n applyFiltering({\n query,\n modelField,\n operator,\n key: whereKey,\n value: value[whereKey],\n searchPlugins,\n operatorPlugins,\n parentPath\n });\n }\n continue;\n }\n applyFiltering({\n query,\n modelField,\n operator,\n key,\n value,\n searchPlugins,\n operatorPlugins,\n parentPath\n });\n }\n\n return query;\n};\n\nexport const createElasticsearchQueryBody = (params: CreateElasticsearchParams): esSearchBody => {\n const { plugins, model, args, parentPath = null } = params;\n const { where = {}, after, limit, sort: initialSort, search, fields = [] } = args;\n\n const modelFields = createModelFields(plugins, model);\n const searchPlugins = searchPluginsList(plugins);\n\n const fullTextSearchFields: CmsModelField[] = [];\n for (const fieldId of fields) {\n const field = model.fields.find(f => f.fieldId === fieldId);\n if (!field) {\n continue;\n }\n fullTextSearchFields.push(field);\n }\n\n const query = execElasticsearchBuildQueryPlugins({\n model,\n plugins,\n where,\n modelFields,\n parentPath,\n searchPlugins,\n fullTextSearch: {\n term: search,\n fields: fullTextSearchFields\n }\n });\n\n const queryPlugins = plugins\n .byType<CmsEntryElasticsearchQueryModifierPlugin>(\n CmsEntryElasticsearchQueryModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of queryPlugins) {\n pl.modifyQuery({ query, model, where });\n }\n\n const sort = createElasticsearchSortParams({\n plugins,\n sort: initialSort,\n modelFields,\n parentPath,\n model,\n searchPlugins\n });\n\n const sortPlugins = plugins\n .byType<CmsEntryElasticsearchSortModifierPlugin>(\n CmsEntryElasticsearchSortModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of sortPlugins) {\n pl.modifySort({\n sort,\n model\n });\n }\n\n const body: esSearchBody = {\n query: {\n bool: {\n must: query.must.length > 0 ? query.must : undefined,\n must_not: query.must_not.length > 0 ? query.must_not : undefined,\n should: query.should.length > 0 ? query.should : undefined,\n filter: query.filter.length > 0 ? query.filter : undefined\n }\n },\n sort,\n size: (limit || 0) + 1,\n // eslint-disable-next-line\n search_after: decodeCursor(after) as any,\n // eslint-disable-next-line\n track_total_hits: true\n };\n\n const bodyPlugins = plugins\n .byType<CmsEntryElasticsearchBodyModifierPlugin>(\n CmsEntryElasticsearchBodyModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of bodyPlugins) {\n pl.modifyBody({\n body,\n model\n });\n }\n\n return body;\n};\n"],"mappings":"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"}