@tanstack/db
Version:
A reactive client store for building super fast apps on sync
60 lines (59 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const dbIvm = require("@tanstack/db-ivm");
const comparison = require("../../utils/comparison.cjs");
const evaluators = require("./evaluators.cjs");
function processOrderBy(pipeline, orderByClause, limit, offset) {
const compiledOrderBy = orderByClause.map((clause) => ({
compiledExpression: evaluators.compileExpression(clause.expression),
direction: clause.direction
}));
const valueExtractor = (row) => {
const orderByContext = { ...row };
if (row.__select_results) {
Object.assign(orderByContext, row.__select_results);
}
if (orderByClause.length > 1) {
return compiledOrderBy.map(
(compiled) => compiled.compiledExpression(orderByContext)
);
} else if (orderByClause.length === 1) {
const compiled = compiledOrderBy[0];
return compiled.compiledExpression(orderByContext);
}
return null;
};
const makeComparator = () => {
return (a, b) => {
if (orderByClause.length > 1) {
const arrayA = a;
const arrayB = b;
for (let i = 0; i < orderByClause.length; i++) {
const direction = orderByClause[i].direction;
const compareFn = direction === `desc` ? comparison.descComparator : comparison.ascComparator;
const result = compareFn(arrayA[i], arrayB[i]);
if (result !== 0) {
return result;
}
}
return arrayA.length - arrayB.length;
}
if (orderByClause.length === 1) {
const direction = orderByClause[0].direction;
return direction === `desc` ? comparison.descComparator(a, b) : comparison.ascComparator(a, b);
}
return comparison.ascComparator(a, b);
};
};
const comparator = makeComparator();
return pipeline.pipe(
dbIvm.orderByWithFractionalIndex(valueExtractor, {
limit,
offset,
comparator
})
// orderByWithFractionalIndex returns [key, [value, index]] - we keep this format
);
}
exports.processOrderBy = processOrderBy;
//# sourceMappingURL=order-by.cjs.map