* Extracts collection-specific WHERE clauses from a query for index optimization. * This analyzes the original query to identify single-source WHERE clauses that * reference collection sources (not subqueries), including joined collections. * * For outer joins, clauses referencing the nullable s
( query: QueryIR, )
| 245 | * @returns Map of source aliases to their WHERE clauses |
| 246 | */ |
| 247 | function extractSourceWhereClauses( |
| 248 | query: QueryIR, |
| 249 | ): Map<string, BasicExpression<boolean>> { |
| 250 | const sourceWhereClauses = new Map<string, BasicExpression<boolean>>() |
| 251 | |
| 252 | // Only analyze queries that have WHERE clauses |
| 253 | if (!query.where || query.where.length === 0) { |
| 254 | return sourceWhereClauses |
| 255 | } |
| 256 | |
| 257 | // Split all AND clauses at the root level for granular analysis |
| 258 | const splitWhereClauses = splitAndClauses(query.where) |
| 259 | |
| 260 | // Analyze each WHERE clause to determine which sources it touches |
| 261 | const analyzedClauses = splitWhereClauses.map((clause) => |
| 262 | analyzeWhereClause(clause), |
| 263 | ) |
| 264 | |
| 265 | // Group clauses by single-source vs multi-source |
| 266 | const groupedClauses = groupWhereClauses(analyzedClauses) |
| 267 | |
| 268 | // Determine which source aliases are on the nullable side of outer joins. |
| 269 | // WHERE clauses for these sources must not be used for index optimization |
| 270 | // because they should filter the final joined result, not the input data. |
| 271 | const nullableSources = getNullableJoinSources(query) |
| 272 | |
| 273 | // Only include single-source clauses that reference collections directly |
| 274 | // and are not on the nullable side of an outer join |
| 275 | for (const [sourceAlias, whereClause] of groupedClauses.singleSource) { |
| 276 | // Check if this source alias corresponds to a collection reference |
| 277 | if ( |
| 278 | isCollectionReference(query, sourceAlias) && |
| 279 | !nullableSources.has(sourceAlias) |
| 280 | ) { |
| 281 | sourceWhereClauses.set(sourceAlias, whereClause) |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | return sourceWhereClauses |
| 286 | } |
| 287 | |
| 288 | /** |
| 289 | * Determines if a source alias refers to a collection reference (not a subquery). |
no test coverage detected