@tanstack/optimistic
Version:
Core optimistic updates library
147 lines (146 loc) • 4.52 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const extractors = require("./extractors.cjs");
const utils = require("./utils.cjs");
function evaluateConditionOnNestedRow(nestedRow, condition, mainTableAlias, joinedTableAlias) {
if (condition.length === 3 && !Array.isArray(condition[0])) {
const [left, comparator, right] = condition;
return evaluateSimpleConditionOnNestedRow(
nestedRow,
left,
comparator,
right,
mainTableAlias,
joinedTableAlias
);
}
if (condition.length > 3 && !Array.isArray(condition[0]) && typeof condition[1] === `string` && ![`and`, `or`].includes(condition[1])) {
let result = evaluateSimpleConditionOnNestedRow(
nestedRow,
condition[0],
condition[1],
condition[2],
mainTableAlias,
joinedTableAlias
);
for (let i = 3; i < condition.length; i += 4) {
const logicalOp = condition[i];
if (i + 3 <= condition.length) {
const nextResult = evaluateSimpleConditionOnNestedRow(
nestedRow,
condition[i + 1],
condition[i + 2],
condition[i + 3],
mainTableAlias,
joinedTableAlias
);
if (logicalOp === `and`) {
result = result && nextResult;
} else {
result = result || nextResult;
}
}
}
return result;
}
if (condition.length > 0 && Array.isArray(condition[0])) {
let result = evaluateConditionOnNestedRow(
nestedRow,
condition[0],
mainTableAlias,
joinedTableAlias
);
for (let i = 1; i < condition.length; i += 2) {
if (i + 1 >= condition.length) break;
const operator = condition[i];
const nextCondition = condition[i + 1];
if (operator === `and`) {
result = result && evaluateConditionOnNestedRow(
nestedRow,
nextCondition,
mainTableAlias,
joinedTableAlias
);
} else {
result = result || evaluateConditionOnNestedRow(
nestedRow,
nextCondition,
mainTableAlias,
joinedTableAlias
);
}
}
return result;
}
return true;
}
function evaluateSimpleConditionOnNestedRow(nestedRow, left, comparator, right, mainTableAlias, joinedTableAlias) {
const leftValue = extractors.evaluateOperandOnNestedRow(
nestedRow,
left,
mainTableAlias,
joinedTableAlias
);
const rightValue = extractors.evaluateOperandOnNestedRow(
nestedRow,
right,
mainTableAlias,
joinedTableAlias
);
switch (comparator) {
case `=`:
return leftValue === rightValue;
case `!=`:
return leftValue !== rightValue;
case `<`:
return utils.compareValues(leftValue, rightValue, `<`);
case `<=`:
return utils.compareValues(leftValue, rightValue, `<=`);
case `>`:
return utils.compareValues(leftValue, rightValue, `>`);
case `>=`:
return utils.compareValues(leftValue, rightValue, `>=`);
case `like`:
case `not like`:
if (typeof leftValue === `string` && typeof rightValue === `string`) {
const pattern = utils.convertLikeToRegex(rightValue);
const matches = new RegExp(`^${pattern}$`, `i`).test(leftValue);
return comparator === `like` ? matches : !matches;
}
return comparator === `like` ? false : true;
case `in`:
if (!Array.isArray(rightValue)) {
return false;
}
if (rightValue.length === 0) {
return false;
}
if (Array.isArray(leftValue)) {
return leftValue.some((item) => utils.isValueInArray(item, rightValue));
}
return utils.isValueInArray(leftValue, rightValue);
case `not in`:
if (!Array.isArray(rightValue)) {
return true;
}
if (rightValue.length === 0) {
return true;
}
if (Array.isArray(leftValue)) {
return !leftValue.some((item) => utils.isValueInArray(item, rightValue));
}
return !utils.isValueInArray(leftValue, rightValue);
case `is`:
return leftValue === rightValue;
case `is not`:
if (rightValue === null) {
return leftValue !== null && leftValue !== void 0;
}
return leftValue !== rightValue;
default:
return false;
}
}
exports.evaluateConditionOnNestedRow = evaluateConditionOnNestedRow;
exports.evaluateSimpleConditionOnNestedRow = evaluateSimpleConditionOnNestedRow;
//# sourceMappingURL=evaluators.cjs.map