From 4904644464bbe5e4fea88e9de3435422b7504f43 Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Wed, 4 Oct 2023 09:43:15 +0200 Subject: [PATCH] = semantics --- plug-api/lib/query.ts | 10 ++++++---- website/Live Queries.md | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/plug-api/lib/query.ts b/plug-api/lib/query.ts index 81d68ad..e37af6f 100644 --- a/plug-api/lib/query.ts +++ b/plug-api/lib/query.ts @@ -82,8 +82,9 @@ export function evalQueryExpression( // Record property is an array, and value is a scalar: find the value in the array return val1.includes(val2); } else if (Array.isArray(val1) && Array.isArray(val2)) { - // Record property is an array, and value is an array: find the value in the array - return val1.some((v) => val2.includes(v)); + // Record property is an array, and value is an array: compare the arrays + return val1.length === val2.length && + val1.every((v) => val2.includes(v)); } return val1 == val2; } @@ -92,8 +93,9 @@ export function evalQueryExpression( // Record property is an array, and value is a scalar: find the value in the array return !val1.includes(val2); } else if (Array.isArray(val1) && Array.isArray(val2)) { - // Record property is an array, and value is an array: find the value in the array - return !val1.some((v) => val2.includes(v)); + // Record property is an array, and value is an array: compare the arrays + return !(val1.length === val2.length && + val1.every((v) => val2.includes(v))); } return val1 !== val2; } diff --git a/website/Live Queries.md b/website/Live Queries.md index e38cbb7..86552d4 100644 --- a/website/Live Queries.md +++ b/website/Live Queries.md @@ -83,15 +83,18 @@ Logical expressions: * or: `name = "this" or age > 10` Binary expressions: -- `=` equals, e.g. `name = "Pete"` -- `!=` not equals, e.g. `name != "Pete"` -- `<` less than, e.g. `age < 10` -- `<=` less than or equals, e.g. `age <= 10` -- `>` greater than, e.g. `age > 10` -- `>=` greater than or equals, e.g. `age >= 10` -- `=~` to match against a regular expression, e.g. `name =~ /^template\//` -- `!=~` to not match a regular expression, e.g. `name !=~ /^template\//` -- `in` member of a list (e.g. `prop in ["foo", "bar"]`) +* `=` equals. + * For scalar values this performance an equivalence tests (e.g. `10 = 10`) + * If the left operand is an array and the right operand is _not_, this will will check if the right operand is _included_ in the left operand’s value, e.g. `[1, 2, 3] = 2` will be true. + * If both operands are arrays, they will be compared for equivalence ignoring order, so this will be true: `[1, 2, 3] = [3, 2, 1]` +* `!=` the exact inverse of the meaning of `=`, e.g. `name != "Pete"` +* `<` less than, e.g. `age < 10` +* `<=` less than or equals, e.g. `age <= 10` +* `>` greater than, e.g. `age > 10` +* `>=` greater than or equals, e.g. `age >= 10` +* `=~` to match against a regular expression, e.g. `name =~ /^template\//` +* `!=~` to not match a regular expression, e.g. `name !=~ /^template\//` +* `in` member of a list (e.g. `prop in ["foo", "bar"]`) * `+` addition (can also concatenate strings), e.g. `10 + 12` or `name + "!!!"` * `-` subtraction, e.g. `10 - 12` * `/` addition, e.g. `10 / 12`