Skip to content

Commit

Permalink
fix: actually make logical filters work correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
tefkah committed Feb 26, 2025
1 parent 59e33f9 commit 44eebdb
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 7 deletions.
47 changes: 40 additions & 7 deletions core/lib/server/pub-filters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,14 @@ const filterMap = {
export const isNonRecursiveFilter = (
filter: BaseFilter[string]
): filter is Exclude<BaseFilter[string], Filter> => {
// Check if this is a logical operator within a field filter
if (filter && typeof filter === "object" && !Array.isArray(filter)) {
const keys = Object.keys(filter);
if (keys.some((k) => logicalOperators.includes(k as LogicalOperator))) {
return false;
}
}

if (Object.keys(filter).every((k) => k.startsWith("$"))) {
return true;
}
Expand Down Expand Up @@ -194,6 +202,38 @@ export function applyFilters<K extends ExpressionBuilder<any, any>>(
}

if (!isNonRecursiveFilter(val)) {
// Handle logical operators within field filters
const logicalOps = Object.entries(val).filter(([key]) =>
logicalOperators.includes(key as LogicalOperator)
);

if (logicalOps.length > 0) {
const [op, subFilters] = logicalOps[0] as [LogicalOperator, Filter[]];

if (op === "$or") {
// Transform field-level $or into top-level $or with field constraints
return eb.or(
subFilters.map((subFilter) => {
// Create a new filter with the field and subfilter
const newFilter = { [field]: subFilter };
return applyFilters(eb, newFilter);
})
);
} else if (op === "$and") {
// Transform field-level $and into top-level $and with field constraints
return eb.and(
subFilters.map((subFilter) => {
const newFilter = { [field]: subFilter };
return applyFilters(eb, newFilter);
})
);
} else if (op === "$not") {
// Handle $not operator
const newFilter = { [field]: subFilters };
return eb.not(applyFilters(eb, newFilter));
}
}

throw new Error(`Unknown filter: ${JSON.stringify(filter)}`);
}

Expand Down Expand Up @@ -226,13 +266,6 @@ export function applyFilters<K extends ExpressionBuilder<any, any>>(
);
}),
]);

// const validOperators = getValidOperatorsForSchema(getJsonSchemaByCoreSchemaType(field));
// // naive check

// if (!validOperators.includes(operator)) {
// throw new Error(`Operator ${operator} is not valid for schema type ${field}`);
// }
});

return eb.and(conditions) as ExpressionWrapped<K>;
Expand Down
56 changes: 56 additions & 0 deletions core/log.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
Base

127.14 real 210.20 user 32.80 sys

Parallel traces
93.87 real 157.80 user 28.09 sys
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
0.57 real 0.47 user 0.07 sys

Worker only
102.50 real 183.38 user 31.65 sys

Main - preconstruct
118.19 real 198.11 user 32.31 sys

Parallel traces -preconstruct
85.63 real 152.23 user 26.83 sys
84.88 real 154.92 user 26.42 sys

Parallel traces +preconstruct
84.87 real 157.53 user 26.99 sys
85.96 real 151.66 user 26.79 sys

Parallel traces +sentry update
84.15 real 148.79 user 26.30 sys
83.87 real 148.66 user 26.21 sys

Parallel traces +sentry update +sentry plugin disable
82.49 real 145.19 user 26.07 sys

Parallel traces +sentry update +sentry plugin disable +otel reuse
81.94 real 143.09 user 25.82 sys
88.20 real 152.83 user 26.53 sys

Parallel traces +sentry update +webpack freeze
76.65 real 107.46 user 16.51 sys
75.88 real 107.77 user 16.19 sys


Parallel traces +sentry update -webpack freeze + custom webpack config
90.16 real 153.39 user 26.37 sys


Parallel traces +sentry update -webpack freeze -custom webpack config
89.74 real 153.69 user 25.84 sys


Parallel traces +webpack freeze +swcTraceProfiling
90.16 real 153.39 user 26.37 sys
77.43 real 113.78 user 17.20 sys
74.43 real 111.62 user 17.38 sys

Parallel traces +webpack freeze +workerThreads 58.92 real 121.60 user 16.89 sys
74.22 real 166.89 user 27.58 sys

0 comments on commit 44eebdb

Please sign in to comment.