diff --git a/lerna.json b/lerna.json index bbfee8c831..4ce65aa2a1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 2445c7e1d3..44235b98e5 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,7 +20,7 @@ "test:watch": "jest --watchAll" }, "dependencies": { - "@budibase/types": "^1.0.212-alpha.4", + "@budibase/types": "^1.0.212-alpha.5", "@techpass/passport-openidconnect": "0.3.2", "aws-sdk": "2.1030.0", "bcrypt": "5.0.1", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 42e43245df..8a56f69038 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "^1.2.1", - "@budibase/string-templates": "^1.0.212-alpha.4", + "@budibase/string-templates": "^1.0.212-alpha.5", "@spectrum-css/actionbutton": "^1.0.1", "@spectrum-css/actiongroup": "^1.0.1", "@spectrum-css/avatar": "^3.0.2", diff --git a/packages/builder/package.json b/packages/builder/package.json index aeee93348b..50af271547 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "license": "GPL-3.0", "private": true, "scripts": { @@ -69,10 +69,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.212-alpha.4", - "@budibase/client": "^1.0.212-alpha.4", - "@budibase/frontend-core": "^1.0.212-alpha.4", - "@budibase/string-templates": "^1.0.212-alpha.4", + "@budibase/bbui": "^1.0.212-alpha.5", + "@budibase/client": "^1.0.212-alpha.5", + "@budibase/frontend-core": "^1.0.212-alpha.5", + "@budibase/string-templates": "^1.0.212-alpha.5", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index c20523e908..f178315a7e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 22611e0dbd..3632db66ba 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.212-alpha.4", - "@budibase/frontend-core": "^1.0.212-alpha.4", - "@budibase/string-templates": "^1.0.212-alpha.4", + "@budibase/bbui": "^1.0.212-alpha.5", + "@budibase/frontend-core": "^1.0.212-alpha.5", + "@budibase/string-templates": "^1.0.212-alpha.5", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 463720f80b..bbab2b2639 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "^1.0.212-alpha.4", + "@budibase/bbui": "^1.0.212-alpha.5", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index 9ca47de23f..f69590f720 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -42,6 +42,10 @@ export const OperatorOptions = { value: "notEqual", label: "Does Not Contain", }, + In: { + value: "oneOf", + label: "Is in", + }, } // Cookie names diff --git a/packages/frontend-core/src/utils/lucene.js b/packages/frontend-core/src/utils/lucene.js index 8f59a2bd9d..1001ec26a8 100644 --- a/packages/frontend-core/src/utils/lucene.js +++ b/packages/frontend-core/src/utils/lucene.js @@ -14,6 +14,7 @@ export const getValidOperatorsForType = type => { Op.Like, Op.Empty, Op.NotEmpty, + Op.In, ] const numOps = [ Op.Equals, @@ -22,6 +23,7 @@ export const getValidOperatorsForType = type => { Op.LessThan, Op.Empty, Op.NotEmpty, + Op.In, ] if (type === "string") { return stringOps @@ -91,6 +93,7 @@ export const buildLuceneQuery = filter => { notEmpty: {}, contains: {}, notContains: {}, + oneOf: {}, } if (Array.isArray(filter)) { filter.forEach(expression => { @@ -99,8 +102,12 @@ export const buildLuceneQuery = filter => { if (type === "datetime" && value) { value = new Date(value).toISOString() } - if (type === "number") { - value = parseFloat(value) + if (type === "number" && !Array.isArray(value)) { + if (operator === "oneOf") { + value = value.split(",").map(item => parseFloat(item)) + } else { + value = parseFloat(value) + } } if (type === "boolean") { value = `${value}`?.toLowerCase() === "true" @@ -139,7 +146,6 @@ export const buildLuceneQuery = filter => { } }) } - return query } @@ -211,6 +217,17 @@ export const runLuceneQuery = (docs, query) => { return docValue == null || docValue === "" }) + // Process an includes match (fails if the value is not included) + const oneOf = match("oneOf", (docValue, testValue) => { + if (typeof testValue === "string") { + testValue = testValue.split(",") + if (typeof docValue === "number") { + testValue = testValue.map(item => parseFloat(item)) + } + } + return !testValue?.includes(docValue) + }) + // Match a document against all criteria const docMatch = doc => { return ( @@ -220,7 +237,8 @@ export const runLuceneQuery = (docs, query) => { equalMatch(doc) && notEqualMatch(doc) && emptyMatch(doc) && - notEmptyMatch(doc) + notEmptyMatch(doc) && + oneOf(doc) ) } diff --git a/packages/server/package.json b/packages/server/package.json index 00bdf33ac5..2e91d5cfbe 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -77,11 +77,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "^1.0.212-alpha.4", - "@budibase/client": "^1.0.212-alpha.4", - "@budibase/pro": "1.0.212-alpha.4", - "@budibase/string-templates": "^1.0.212-alpha.4", - "@budibase/types": "^1.0.212-alpha.4", + "@budibase/backend-core": "^1.0.212-alpha.5", + "@budibase/client": "^1.0.212-alpha.5", + "@budibase/pro": "1.0.212-alpha.5", + "@budibase/string-templates": "^1.0.212-alpha.5", + "@budibase/types": "^1.0.212-alpha.5", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/server/src/api/controllers/row/internalSearch.js b/packages/server/src/api/controllers/row/internalSearch.js index d6c6860332..d262592d3b 100644 --- a/packages/server/src/api/controllers/row/internalSearch.js +++ b/packages/server/src/api/controllers/row/internalSearch.js @@ -17,6 +17,7 @@ class QueryBuilder { notEqual: {}, empty: {}, notEmpty: {}, + oneOf: {}, ...base, } this.limit = 50 @@ -112,6 +113,11 @@ class QueryBuilder { return this } + addOneOf(key, value) { + this.query.oneOf[key] = value + return this + } + /** * Preprocesses a value before going into a lucene search. * Transforms strings to lowercase and wraps strings and bools in quotes. @@ -220,6 +226,28 @@ class QueryBuilder { if (this.query.notEmpty) { build(this.query.notEmpty, key => `${key}:["" TO *]`) } + if (this.query.oneOf) { + build(this.query.oneOf, (key, value) => { + if (!Array.isArray(value)) { + if (typeof value === "string") { + value = value.split(",") + } else { + return "" + } + } + let orStatement = `${builder.preprocess( + value[0], + allPreProcessingOpts + )}` + for (let i = 1; i < value.length; i++) { + orStatement += ` OR ${builder.preprocess( + value[i], + allPreProcessingOpts + )}` + } + return `${key}:(${orStatement})` + }) + } return query } diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 44780a6896..00ea407ea2 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index 21146c91dc..0753ac2798 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 4501d3045b..101f43c596 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.212-alpha.4", + "version": "1.0.212-alpha.5", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -34,10 +34,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "^1.0.212-alpha.4", - "@budibase/pro": "1.0.212-alpha.4", - "@budibase/string-templates": "^1.0.212-alpha.4", - "@budibase/types": "^1.0.212-alpha.4", + "@budibase/backend-core": "^1.0.212-alpha.5", + "@budibase/pro": "1.0.212-alpha.5", + "@budibase/string-templates": "^1.0.212-alpha.5", + "@budibase/types": "^1.0.212-alpha.5", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2",