UNPKG

@tanstack/optimistic

Version:

Core optimistic updates library

156 lines (155 loc) 5.36 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const d2ts = require("@electric-sql/d2ts"); const evaluators = require("./evaluators.cjs"); const extractors = require("./extractors.cjs"); function processJoinClause(pipeline, query, tables, mainTableAlias, allInputs) { if (!query.join) return pipeline; const input = allInputs[query.from]; for (const joinClause of query.join) { const joinedTableAlias = joinClause.as || joinClause.from; const joinType = joinClause.type === `cross` ? `inner` : joinClause.type; const mainPipeline = pipeline.pipe( d2ts.map((nestedRow) => { const mainRow = nestedRow[mainTableAlias]; const keyValue = extractors.extractJoinKey( mainRow, joinClause.on[0], mainTableAlias ); return [keyValue, nestedRow]; }) ); let joinedTableInput; if (allInputs[joinClause.from]) { joinedTableInput = allInputs[joinClause.from]; } else { joinedTableInput = input.graph.newInput(); } tables[joinedTableAlias] = joinedTableInput; const joinedPipeline = joinedTableInput.pipe( d2ts.map((row) => { const nestedRow = { [joinedTableAlias]: row }; const keyValue = extractors.extractJoinKey(row, joinClause.on[2], joinedTableAlias); return [keyValue, nestedRow]; }) ); switch (joinType) { case `inner`: pipeline = mainPipeline.pipe( d2ts.join(joinedPipeline, `inner`), d2ts.consolidate(), processJoinResults(mainTableAlias, joinedTableAlias, joinClause) ); break; case `left`: pipeline = mainPipeline.pipe( d2ts.join(joinedPipeline, `left`), d2ts.consolidate(), processJoinResults(mainTableAlias, joinedTableAlias, joinClause) ); break; case `right`: pipeline = mainPipeline.pipe( d2ts.join(joinedPipeline, `right`), d2ts.consolidate(), processJoinResults(mainTableAlias, joinedTableAlias, joinClause) ); break; case `full`: pipeline = mainPipeline.pipe( d2ts.join(joinedPipeline, `full`), d2ts.consolidate(), processJoinResults(mainTableAlias, joinedTableAlias, joinClause) ); break; default: pipeline = mainPipeline.pipe( d2ts.join(joinedPipeline, `inner`), d2ts.consolidate(), processJoinResults(mainTableAlias, joinedTableAlias, joinClause) ); } } return pipeline; } function processJoinResults(mainTableAlias, joinedTableAlias, joinClause) { return function(pipeline) { return pipeline.pipe( // Process the join result and handle nulls in the same step d2ts.map((result) => { const [_key, [mainNestedRow, joinedNestedRow]] = result; if (joinClause.type === `inner` || joinClause.type === `cross`) { if (!mainNestedRow || !joinedNestedRow) { return void 0; } } if (joinClause.type === `left` && !mainNestedRow) { return void 0; } if (joinClause.type === `right` && !joinedNestedRow) { return void 0; } const mergedNestedRow = {}; if (mainNestedRow) { Object.entries(mainNestedRow).forEach(([tableAlias, tableData]) => { mergedNestedRow[tableAlias] = tableData; }); } if (joinedNestedRow) { Object.entries(joinedNestedRow).forEach(([tableAlias, tableData]) => { mergedNestedRow[tableAlias] = tableData; }); } else if (joinClause.type === `left` || joinClause.type === `full`) { mergedNestedRow[joinedTableAlias] = null; } if (!mainNestedRow && (joinClause.type === `right` || joinClause.type === `full`)) { mergedNestedRow[mainTableAlias] = null; } return mergedNestedRow; }), // Filter out undefined results d2ts.filter( (value) => value !== void 0 ), // Process the ON condition d2ts.filter((nestedRow) => { if (!joinClause.on || joinClause.type === `cross`) { return true; } if (joinClause.type === `left` && nestedRow[joinedTableAlias] === null) { return true; } if (joinClause.type === `right` && nestedRow[mainTableAlias] === null) { return true; } if (joinClause.type === `full` && (nestedRow[mainTableAlias] === null || nestedRow[joinedTableAlias] === null)) { return true; } const result = evaluators.evaluateConditionOnNestedRow( nestedRow, joinClause.on, mainTableAlias, joinedTableAlias ); return result; }), // Process the WHERE clause for the join if it exists d2ts.filter((nestedRow) => { if (!joinClause.where) { return true; } const result = evaluators.evaluateConditionOnNestedRow( nestedRow, joinClause.where, mainTableAlias, joinedTableAlias ); return result; }) ); }; } exports.processJoinClause = processJoinClause; exports.processJoinResults = processJoinResults; //# sourceMappingURL=joins.cjs.map