@tanstack/optimistic
Version:
Core optimistic updates library
156 lines (155 loc) • 5.36 kB
JavaScript
;
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