diff --git a/core/lib/server/pub-filters.ts b/core/lib/server/pub-filters.ts index b11e7f517..8fe6da386 100644 --- a/core/lib/server/pub-filters.ts +++ b/core/lib/server/pub-filters.ts @@ -150,6 +150,14 @@ const filterMap = { export const isNonRecursiveFilter = ( filter: BaseFilter[string] ): filter is Exclude => { + // 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; } @@ -194,6 +202,38 @@ export function applyFilters>( } 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)}`); } @@ -226,13 +266,6 @@ export function applyFilters>( ); }), ]); - - // 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; diff --git a/core/log.txt b/core/log.txt new file mode 100644 index 000000000..3a31b3af8 --- /dev/null +++ b/core/log.txt @@ -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