UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

60 lines (59 loc) 2.12 kB
"use strict"; 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