From de60311bd072db01eaf50965f3fdc307bfedc4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wieland=20Sch=C3=B6bl?= Date: Wed, 7 Apr 2021 11:40:28 +0200 Subject: [PATCH] feat: add support for multiple values in value filter --- package-lock.json | 252 ++++++++++++++++++++-------- package.json | 2 +- src/storage/elasticsearch/common.ts | 13 +- src/storage/elasticsearch/query.ts | 15 +- 4 files changed, 200 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bf381d7..ebcfb9f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -420,95 +420,169 @@ } }, "@openstapps/core": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.42.0.tgz", - "integrity": "sha512-s9mDC3GoOj1NOsjJ4OzzUeqsQVDoqt84IYkG0Y69BJ+4qoZuOvOe5hSOp3L8Nkj1P82jp/q0qjO/63cMphp2yw==", + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.44.0.tgz", + "integrity": "sha512-yR3ZltDRgeU0JJVPpVcwzQCXnmH2ZmWNGnXEFV/Qz+XHR7Ki8nf0YE/GohTG59AFT5GwPwsIPB+PUZ4u5v3qqQ==", "requires": { - "@openstapps/core-tools": "0.17.0", + "@openstapps/core-tools": "0.19.0", "@types/geojson": "1.0.6", "@types/json-patch": "0.0.30", "@types/json-schema": "7.0.7", - "@types/node": "10.17.44", + "@types/node": "14.14.37", "fast-clone": "1.5.13", "fast-deep-equal": "3.1.3", "http-status-codes": "2.1.4", "json-patch": "0.7.0", - "json-schema": "0.2.5", + "json-schema": "0.3.0", "ts-optchain": "0.1.8" }, "dependencies": { "@openstapps/core-tools": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@openstapps/core-tools/-/core-tools-0.17.0.tgz", - "integrity": "sha512-YL0++bjhBEVb5qMHYdzCUgUb23ZGbqgkpCIHMUY5CuEZb2TUvP5HO1s1/7s/VpVVzE8lSqFqPGmeSBpHgs0K3g==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@openstapps/core-tools/-/core-tools-0.19.0.tgz", + "integrity": "sha512-IJYa38e6FPgKd/YrmvP3Bubsc61yvC66X4vW/V+1ZsxG5PlUiMngXJ7eEVkl355ICQIeGp1VUhQkEJfOpaG1WQ==", "requires": { "@krlwlfrt/async-pool": "0.3.0", - "@openstapps/logger": "0.5.0", - "@types/glob": "7.1.1", - "@types/got": "9.6.9", - "@types/json-schema": "7.0.6", - "@types/mustache": "4.0.0", - "@types/node": "10.17.21", - "ajv": "6.11.0", - "better-ajv-errors": "0.6.7", - "chai": "4.2.0", + "@openstapps/logger": "0.6.0", + "@types/glob": "7.1.3", + "@types/got": "9.6.11", + "@types/json-schema": "7.0.7", + "@types/mustache": "4.1.1", + "@types/node": "14.14.37", + "ajv": "6.12.6", + "better-ajv-errors": "0.7.0", + "chai": "4.3.4", "commander": "4.1.1", "deepmerge": "4.2.2", "del": "5.1.0", - "flatted": "2.0.1", + "flatted": "2.0.2", "glob": "7.1.6", - "got": "10.5.5", + "got": "10.7.0", "humanize-string": "2.1.0", - "json-schema": "0.2.5", - "mustache": "4.0.0", + "json-schema": "0.3.0", + "mustache": "4.2.0", "plantuml-encoder": "1.4.0", "toposort": "2.0.2", - "ts-json-schema-generator": "0.60.0", - "ts-node": "8.6.2", + "ts-json-schema-generator": "0.70.2", + "ts-node": "8.10.2", "typedoc": "0.18.0", "typescript": "3.8.3" + } + }, + "@openstapps/logger": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@openstapps/logger/-/logger-0.6.0.tgz", + "integrity": "sha512-l/ILWPOSxhawcdDxn9vkdzib4xlRTnFmG4YygX8l8z0m9cocitMMZGw/DquZ0x6zGt2suOwSVRckYiSlk/6Erw==", + "requires": { + "@types/node": "14.14.37", + "@types/nodemailer": "6.4.1", + "chalk": "4.1.0", + "flatted": "3.1.1", + "moment": "2.29.1", + "nodemailer": "6.5.0" }, "dependencies": { - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" - }, - "@types/node": { - "version": "10.17.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", - "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==" + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" } } }, - "@types/got": { - "version": "9.6.9", - "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.9.tgz", - "integrity": "sha512-w+ZE+Ovp6fM+1sHwJB7RN3f3pTJHZkyABuULqbtknqezQyWadFEp5BzOXaZzRqAw2md6/d3ybxQJt+BNgpvzOg==", + "@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" + "@types/minimatch": "*", + "@types/node": "*" } }, - "@types/node": { - "version": "10.17.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", - "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + "@types/mustache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.1.1.tgz", + "integrity": "sha512-Sm0NWeLhS2QL7NNGsXvO+Fgp7e3JLHCO6RS3RCnfjAnkw6Y1bsji/AGfISdQZDIR/AeOyzkrxRk9jBkl55zdJw==" }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, + "better-ajv-errors": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-0.7.0.tgz", + "integrity": "sha512-6GtJQ/AwVSo1pI1MDQU/yg8O86gMsrt5RKtELo08Epa2zWJPCOK85v/O8/U5A9JkWmwRkE16JpSgssKSx6moog==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/runtime": "^7.0.0", + "chalk": "^2.4.1", + "core-js": "^3.2.1", + "json-to-ast": "^2.0.3", + "jsonpointer": "^4.0.1", + "leven": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -522,12 +596,17 @@ "mimic-response": "^2.0.0" } }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, "got": { - "version": "10.5.5", - "resolved": "https://registry.npmjs.org/got/-/got-10.5.5.tgz", - "integrity": "sha512-B13HHkCkTA7KxyxTrFoZfrurBX1fZxjMTKpmIfoVzh0Xfs9aZV7xEfI6EKuERQOIPbomh5LE4xDkfK6o2VXksw==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", "requires": { - "@sindresorhus/is": "^1.0.0", + "@sindresorhus/is": "^2.0.0", "@szmarczak/http-timer": "^4.0.0", "@types/cacheable-request": "^6.0.1", "cacheable-lookup": "^2.0.0", @@ -536,25 +615,57 @@ "duplexer3": "^0.1.4", "get-stream": "^5.0.0", "lowercase-keys": "^2.0.0", - "mimic-response": "^2.0.0", + "mimic-response": "^2.1.0", "p-cancelable": "^2.0.0", "p-event": "^4.0.0", "responselike": "^2.0.0", "to-readable-stream": "^2.0.0", - "type-fest": "^0.9.0" + "type-fest": "^0.10.0" } }, - "ts-node": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", - "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "json-schema": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.3.0.tgz", + "integrity": "sha512-TYfxx36xfl52Rf1LU9HyWSLGPdYLL+SQ8/E/0yVyKG8wCCDaSrhPap0vEdlsZWRaS6tnKKLPGiEJGiREVC8kxQ==" + }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + }, + "ts-json-schema-generator": { + "version": "0.70.2", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.70.2.tgz", + "integrity": "sha512-4miuxRyxYvwzCGGzxGvN39fwlY7HDlj1KRpZq8Hi3IegeAnguc9q4gDvcqMaDKoRiNNnV5fwplRWZFhRrtvr4Q==", "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" + "@types/json-schema": "^7.0.5", + "commander": "~5.1.0", + "glob": "~7.1.6", + "json-stable-stringify": "^1.0.1", + "typescript": "~3.9.5" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "typescript": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", + "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==" + } } + }, + "type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" } } }, @@ -898,7 +1009,6 @@ "version": "9.6.11", "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.11.tgz", "integrity": "sha512-dr3IiDNg5TDesGyuwTrN77E1Cd7DCdmCFtEfSGqr83jMMtcwhf/SGPbN2goY4JUWQfvxwY56+e5tjfi+oXeSdA==", - "dev": true, "requires": { "@types/node": "*", "@types/tough-cookie": "*", @@ -1001,7 +1111,6 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.1.tgz", "integrity": "sha512-8081UY/0XTTDpuGqCnDc8IY+Q3DSg604wB3dBH0CaZlj4nZWHWuxtZ3NRZ9c9WUrz1Vfm6wioAUnqL3bsh49uQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -1512,7 +1621,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", diff --git a/package.json b/package.json index 62e1eb11..4a118e1d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ }, "dependencies": { "@elastic/elasticsearch": "5.6.22", - "@openstapps/core": "0.42.0", + "@openstapps/core": "0.44.0", "@openstapps/core-tools": "0.18.0", "@openstapps/logger": "0.5.0", "@types/node": "14.14.37", diff --git a/src/storage/elasticsearch/common.ts b/src/storage/elasticsearch/common.ts index 47bfcd12..83e47c60 100644 --- a/src/storage/elasticsearch/common.ts +++ b/src/storage/elasticsearch/common.ts @@ -274,14 +274,21 @@ export interface ElasticsearchConfig { /** * An elasticsearch term filter */ -export interface ESTermFilter { +export type ESTermFilter = { /** * Definition of a term to match */ term: { [fieldName: string]: string; }; -} +} | { + /** + * Definition of terms to match (or) + */ + terms: { + [fieldName: string]: string[]; + }; +}; export interface ESGenericRange { /** @@ -381,7 +388,7 @@ export interface ESGeoDistanceFilterArguments { [fieldName: string]: { /** - * Latitute + * Latitude */ lat: number; diff --git a/src/storage/elasticsearch/query.ts b/src/storage/elasticsearch/query.ts index 07bffb12..79411dea 100644 --- a/src/storage/elasticsearch/query.ts +++ b/src/storage/elasticsearch/query.ts @@ -99,11 +99,14 @@ export function buildFilter(filter: SCSearchFilter): switch (filter.type) { case 'value': - const filterObj: { [field: string]: string; } = {}; - filterObj[`${filter.arguments.field}.raw`] = filter.arguments.value; - - return { - term: filterObj, + return Array.isArray(filter.arguments.value) ? { + terms: { + [`${filter.arguments.field}.raw`]: filter.arguments.value, + }, + } : { + term: { + [`${filter.arguments.field}.raw`]: filter.arguments.value, + }, }; case 'availability': const startRangeFilter: { @@ -220,7 +223,7 @@ export function buildFilter(filter: SCSearchFilter): } /** - * Builds scorings functions from boosting config + * Builds scoring functions from boosting config * @param boostings Backend boosting configuration for contexts and types * @param context The context of the app from where the search was initiated */