Skip to content

Commit 991441d

Browse files
authored
Merge pull request #6236 from neo4j/6224-subscriptions-filters-not-working-when-using-new-operators
fix new operators on subscription filters
2 parents 4c5e58e + ae85b00 commit 991441d

29 files changed

+9428
-1183
lines changed

.changeset/wicked-cars-switch.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@neo4j/graphql": patch
3+
---
4+
5+
Fix bug with some filters not properly working on subscriptions.

packages/graphql/src/schema/resolvers/subscriptions/where/filters/filter-by-properties.ts

+20-4
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,20 @@ export function filterByProperties<T>({
5959
return false;
6060
}
6161
const fieldMeta = attributes.get(fieldName);
62-
const checkFilterPasses = getFilteringFn(operator, operatorMapOverrides);
62+
if (operator) {
63+
// Deprecated operators
64+
const checkFilterPasses = getFilteringFn(operator, operatorMapOverrides);
6365

64-
if (!checkFilterPasses(receivedValue, v, fieldMeta)) {
65-
return false;
66+
if (!checkFilterPasses(receivedValue, v, fieldMeta)) {
67+
return false;
68+
}
69+
} else {
70+
for (const [op, value] of Object.entries(v as Record<string, any>)) {
71+
const checkFilterPasses = getFilteringFn(op, operatorMapOverrides);
72+
if (!checkFilterPasses(receivedValue, value, fieldMeta)) {
73+
return false;
74+
}
75+
}
6676
}
6777
}
6878
}
@@ -86,7 +96,7 @@ function shouldParseAsInt(attributeAdapter: AttributeAdapter | undefined, value:
8696
return false;
8797
}
8898

89-
const operatorMapOverrides = {
99+
let operatorMapOverrides: Record<string, (received: any, filtered: any, fieldMeta?: any) => boolean> = {
90100
INCLUDES: (received: [string | number], filtered: string | number, fieldMeta: AttributeAdapter | undefined) => {
91101
if (shouldParseAsInt(fieldMeta, filtered)) {
92102
const filteredAsNeo4jInteger = int(filtered);
@@ -116,3 +126,9 @@ const operatorMapOverrides = {
116126
return !filtered.some((v) => v === received);
117127
},
118128
};
129+
130+
operatorMapOverrides = {
131+
...operatorMapOverrides,
132+
includes: operatorMapOverrides.INCLUDES!,
133+
in: operatorMapOverrides.IN!,
134+
};

packages/graphql/src/schema/resolvers/subscriptions/where/utils/get-filtering-fn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import type { AttributeAdapter } from "../../../../../schema-model/attribute/model-adapters/AttributeAdapter";
2121

22-
type ComparatorFn<T> = (received: T, filtered: T, fieldMeta?: AttributeAdapter | undefined) => boolean;
22+
type ComparatorFn<T> = (received: T, filtered: T, fieldMeta?: AttributeAdapter) => boolean;
2323

2424
const legacyOperatorCheckMap = {
2525
EQ: (received: string, filtered: string) => received == filtered,

packages/graphql/src/schema/resolvers/subscriptions/where/utils/parse-filter-property.ts

-7
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,5 @@ export function parseFilterProperty(key: string): { fieldName: string; operator:
2323
// eslint-disable-next-line prefer-const
2424
let { fieldName, operator } = parseWhereField(key);
2525

26-
// These conversions are only temporary necessary until the the _NOT operator exists, after that we can just return the output of parseWhereField
27-
if (operator === "EQ") {
28-
operator = undefined;
29-
}
30-
3126
return { fieldName, operator };
3227
}
33-
34-

packages/graphql/src/schema/resolvers/subscriptions/where/where.test.ts

-89
This file was deleted.

0 commit comments

Comments
 (0)