diff --git a/packages/filterparser/src/mongoParser.ts b/packages/filterparser/src/mongoParser.ts
index 55ae31bc9..79c67f43c 100644
--- a/packages/filterparser/src/mongoParser.ts
+++ b/packages/filterparser/src/mongoParser.ts
@@ -44,6 +44,10 @@ const testCondition = (operator, value) => () => ({
},
});
+const multiTestCondition = condition => () => ({
+ __placeholder__: condition,
+});
+
const compoudCondition = conditionType => conditions => {
if (conditions.length == 1) return conditions[0];
return {
@@ -85,7 +89,15 @@ const createParser = () => {
comma: () => word(','),
not: () => word('NOT'),
+ empty: () => word('EMPTY'),
+ array: () => word('ARRAY'),
notExists: r => r.not.then(r.exists).map(testCondition('$exists', false)),
+ notEmptyArray: r =>
+ r.not
+ .then(r.empty)
+ .then(r.array)
+ .map(multiTestCondition({ $exists: true, $type: 'array', $ne: [] })),
+ emptyArray: r => r.empty.then(r.array).map(multiTestCondition({ $exists: true, $eq: [] })),
exists: () => word('EXISTS').map(testCondition('$exists', true)),
true: () => word('TRUE').map(testCondition('$eq', true)),
false: () => word('FALSE').map(testCondition('$eq', false)),
@@ -117,6 +129,8 @@ const createParser = () => {
r.gt,
r.le,
r.ge,
+ r.notEmptyArray,
+ r.emptyArray,
r.startsWith,
r.endsWith,
r.contains,
diff --git a/packages/web/src/datagrid/CollectionDataGridCore.svelte b/packages/web/src/datagrid/CollectionDataGridCore.svelte
index 6f2bae2a0..2d25a7827 100644
--- a/packages/web/src/datagrid/CollectionDataGridCore.svelte
+++ b/packages/web/src/datagrid/CollectionDataGridCore.svelte
@@ -235,5 +235,6 @@
bind:loadedRows
bind:selectedCellsPublished
frameSelection={!!macroPreview}
+ onOpenQuery={openQuery}
{grider}
/>
diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte
index ebb7ef8ed..38e769859 100644
--- a/packages/web/src/datagrid/DataFilterControl.svelte
+++ b/packages/web/src/datagrid/DataFilterControl.svelte
@@ -168,6 +168,8 @@
{ onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' },
{ onClick: () => setFilter('EXISTS'), text: 'Field exists' },
{ onClick: () => setFilter('NOT EXISTS'), text: 'Field does not exist' },
+ { onClick: () => setFilter('NOT EMPTY ARRAY'), text: 'Array is not empty' },
+ { onClick: () => setFilter('EMPTY ARRAY'), text: 'Array is empty' },
{ onClick: () => openFilterWindow('>'), text: 'Greater Than...' },
{ onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' },
{ onClick: () => openFilterWindow('<'), text: 'Less Than...' },
diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte
index 15e4f998b..29adf299f 100644
--- a/packages/web/src/datagrid/DataGridCore.svelte
+++ b/packages/web/src/datagrid/DataGridCore.svelte
@@ -1634,6 +1634,9 @@
{#if grider.editable}