rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
104 lines (102 loc) • 3.63 kB
JavaScript
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