rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
97 lines (95 loc) • 3.49 kB
JavaScript
import { calculateActionName, runAction } from 'event-reduce-js';
import { rxChangeEventToEventReduceChangeEvent } from "./rx-change-event.js";
import { arrayFilterNotEmpty, 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 = rxChangeEvents.map(cE => rxChangeEventToEventReduceChangeEvent(cE)).filter(arrayFilterNotEmpty);
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