MCPcopy Create free account
hub / github.com/TanStack/db / analyzeJoinExpressions

Function analyzeJoinExpressions

packages/db/src/query/compiler/joins.ts:351–426  ·  view source on GitHub ↗

* Analyzes join expressions to determine which refers to which source * and returns them in the correct order (available source expression first, joined source expression second)

(
  left: BasicExpression,
  right: BasicExpression,
  allAvailableSourceAliases: Array<string>,
  joinedSource: string,
  allowResultFields: boolean = false,
)

Source from the content-addressed store, hash-verified

349 * and returns them in the correct order (available source expression first, joined source expression second)
350 */
351function analyzeJoinExpressions(
352 left: BasicExpression,
353 right: BasicExpression,
354 allAvailableSourceAliases: Array<string>,
355 joinedSource: string,
356 allowResultFields: boolean = false,
357): { mainExpr: BasicExpression; joinedExpr: BasicExpression } {
358 // Filter out the joined source alias from the available source aliases
359 const availableSources = allAvailableSourceAliases.filter(
360 (alias) => alias !== joinedSource,
361 )
362
363 const leftSourceAliases = getSourceAliasesFromExpression(left)
364 const rightSourceAliases = getSourceAliasesFromExpression(right)
365 const leftReferencesJoined = leftSourceAliases.has(joinedSource)
366 const rightReferencesJoined = rightSourceAliases.has(joinedSource)
367 const leftAvailableAliases = [...leftSourceAliases].filter(
368 (alias) =>
369 availableSources.includes(alias) ||
370 (allowResultFields && alias !== joinedSource),
371 )
372 const rightAvailableAliases = [...rightSourceAliases].filter(
373 (alias) =>
374 availableSources.includes(alias) ||
375 (allowResultFields && alias !== joinedSource),
376 )
377
378 // If left expression refers to an available source and right refers to joined source, keep as is
379 if (
380 leftAvailableAliases.length > 0 &&
381 !leftReferencesJoined &&
382 rightReferencesJoined &&
383 rightAvailableAliases.length === 0
384 ) {
385 return { mainExpr: left, joinedExpr: right }
386 }
387
388 // If left expression refers to joined source and right refers to an available source, swap them
389 if (
390 leftReferencesJoined &&
391 leftAvailableAliases.length === 0 &&
392 rightAvailableAliases.length > 0 &&
393 !rightReferencesJoined
394 ) {
395 return { mainExpr: right, joinedExpr: left }
396 }
397
398 // If one expression doesn't refer to any source, this is an invalid join
399 if (leftSourceAliases.size === 0 || rightSourceAliases.size === 0) {
400 throw new InvalidJoinConditionSourceMismatchError()
401 }
402
403 // If both expressions refer to the same alias, this is an invalid join
404 if (
405 leftSourceAliases.size === 1 &&
406 rightSourceAliases.size === 1 &&
407 [...leftSourceAliases][0] === [...rightSourceAliases][0]
408 ) {

Callers 1

processJoinFunction · 0.85

Calls 3

filterMethod · 0.80
hasMethod · 0.45

Tested by

no test coverage detected