UNPKG

rxdb

Version:

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

104 lines (102 loc) 3.63 kB
import { calculateActionName, runAction } from 'event-reduce-js'; import { rxChangeEventToEventReduceChangeEvent } from "./rx-change-event.js"; import { clone, ensureNotFalsy, getFromMapOrCreate } from "./plugins/utils/index.js"; import { getQueryMatcher, getSortComparator, normalizeMangoQuery } from "./rx-query-helper.js"; export function getSortFieldsOfQuery(primaryKey, query) { if (!query.sort || query.sort.length === 0) { return [primaryKey]; } else { return query.sort.map(part => Object.keys(part)[0]); } } export var RXQUERY_QUERY_PARAMS_CACHE = new WeakMap(); export function getQueryParams(rxQuery) { return getFromMapOrCreate(RXQUERY_QUERY_PARAMS_CACHE, rxQuery, () => { var collection = rxQuery.collection; var normalizedMangoQuery = normalizeMangoQuery(collection.storageInstance.schema, 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 = 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 = 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; }); } export function calculateNewResults(rxQuery, rxChangeEvents) { if (!rxQuery.collection.database.eventReduce) { return { runFullQueryAgain: true }; } var queryParams = getQueryParams(rxQuery); var previousResults = ensureNotFalsy(rxQuery._result).docsData.slice(0); var previousResultsMap = ensureNotFalsy(rxQuery._result).docsDataMap; var changed = false; var eventReduceEvents = []; for (var index = 0; index < rxChangeEvents.length; index++) { var cE = rxChangeEvents[index]; var eventReduceEvent = rxChangeEventToEventReduceChangeEvent(cE); if (eventReduceEvent) { eventReduceEvents.push(eventReduceEvent); } } var foundNonOptimizeable = eventReduceEvents.find(eventReduceEvent => { var stateResolveFunctionInput = { queryParams, changeEvent: eventReduceEvent, previousResults, keyDocumentMap: previousResultsMap }; var actionName = calculateActionName(stateResolveFunctionInput); if (actionName === 'runFullQueryAgain') { return true; } else if (actionName !== 'doNothing') { changed = true; 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