UNPKG

rxdb

Version:

A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/

113 lines (110 loc) 3.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RXQUERY_QUERY_PARAMS_CACHE = void 0; exports.calculateNewResults = calculateNewResults; exports.getQueryParams = getQueryParams; exports.getSortFieldsOfQuery = getSortFieldsOfQuery; var _eventReduceJs = require("event-reduce-js"); var _rxChangeEvent = require("./rx-change-event.js"); var _index = require("./plugins/utils/index.js"); var _rxQueryHelper = require("./rx-query-helper.js"); function getSortFieldsOfQuery(primaryKey, query) { if (!query.sort || query.sort.length === 0) { return [primaryKey]; } else { return query.sort.map(part => Object.keys(part)[0]); } } var RXQUERY_QUERY_PARAMS_CACHE = exports.RXQUERY_QUERY_PARAMS_CACHE = new WeakMap(); function getQueryParams(rxQuery) { return (0, _index.getFromMapOrCreate)(RXQUERY_QUERY_PARAMS_CACHE, rxQuery, () => { var collection = rxQuery.collection; var normalizedMangoQuery = (0, _rxQueryHelper.normalizeMangoQuery)(collection.storageInstance.schema, (0, _index.clone)(rxQuery.mangoQuery)); var primaryKey = collection.schema.primaryPath; /** * Create a custom sort comparator * that uses the hooks to ensure * we send for example compressed documents to be sorted by compressed queries. */ var sortComparator = (0, _rxQueryHelper.getSortComparator)(collection.schema.jsonSchema, normalizedMangoQuery); var useSortComparator = (docA, docB) => { var sortComparatorData = { docA, docB, rxQuery }; return sortComparator(sortComparatorData.docA, sortComparatorData.docB); }; /** * Create a custom query matcher * that uses the hooks to ensure * we send for example compressed documents to match compressed queries. */ var queryMatcher = (0, _rxQueryHelper.getQueryMatcher)(collection.schema.jsonSchema, normalizedMangoQuery); var useQueryMatcher = doc => { var queryMatcherData = { doc, rxQuery }; return queryMatcher(queryMatcherData.doc); }; var ret = { primaryKey: rxQuery.collection.schema.primaryPath, skip: normalizedMangoQuery.skip, limit: normalizedMangoQuery.limit, sortFields: getSortFieldsOfQuery(primaryKey, normalizedMangoQuery), sortComparator: useSortComparator, queryMatcher: useQueryMatcher }; return ret; }); } function calculateNewResults(rxQuery, rxChangeEvents) { if (!rxQuery.collection.database.eventReduce) { return { runFullQueryAgain: true }; } var queryParams = getQueryParams(rxQuery); var previousResults = (0, _index.ensureNotFalsy)(rxQuery._result).docsData.slice(0); var previousResultsMap = (0, _index.ensureNotFalsy)(rxQuery._result).docsDataMap; var changed = false; var eventReduceEvents = []; for (var index = 0; index < rxChangeEvents.length; index++) { var cE = rxChangeEvents[index]; var eventReduceEvent = (0, _rxChangeEvent.rxChangeEventToEventReduceChangeEvent)(cE); if (eventReduceEvent) { eventReduceEvents.push(eventReduceEvent); } } var foundNonOptimizeable = eventReduceEvents.find(eventReduceEvent => { var stateResolveFunctionInput = { queryParams, changeEvent: eventReduceEvent, previousResults, keyDocumentMap: previousResultsMap }; var actionName = (0, _eventReduceJs.calculateActionName)(stateResolveFunctionInput); if (actionName === 'runFullQueryAgain') { return true; } else if (actionName !== 'doNothing') { changed = true; (0, _eventReduceJs.runAction)(actionName, queryParams, eventReduceEvent, previousResults, previousResultsMap); return false; } }); if (foundNonOptimizeable) { return { runFullQueryAgain: true }; } else { return { runFullQueryAgain: false, changed, newResults: previousResults }; } } //# sourceMappingURL=event-reduce.js.map