69 lines
2.6 KiB
JavaScript
69 lines
2.6 KiB
JavaScript
define("dstore/QueryMethod", [], function () {
|
|
/*=====
|
|
var __QueryMethodArgs = {
|
|
// type: String
|
|
// The type of the query. This identifies the query's type in the query log
|
|
// and the name of the corresponding query engine method.
|
|
// normalizeArguments: Function?
|
|
// A function that normalizes arguments for consumption by a query engine
|
|
// applyQuery: Function?
|
|
// A function that takes the query's new subcollection and the query's log entry
|
|
// and applies it to the new subcollection. This is useful for collections that need
|
|
// to both declare and implement new query methods.
|
|
// querierFactory: Function?
|
|
// A factory function that provides a default querier implementation to use when
|
|
// a collection does not define its own querier factory method for this query type.
|
|
};
|
|
=====*/
|
|
return function QueryMethod(/*__QueryMethodArgs*/ kwArgs) {
|
|
// summary:
|
|
// The constructor for a dstore collection query method
|
|
// description:
|
|
// This is the constructor for a collection query method. It encapsulates the following:
|
|
// * Creating a new subcollection for the query results
|
|
// * Logging the query in the collection's `queryLog`
|
|
// * Normalizing query arguments
|
|
// * Applying the query engine
|
|
// kwArgs:
|
|
// The properties that define the query method
|
|
// returns: Function
|
|
// Returns a function that takes query arguments and returns a new collection with
|
|
// the query associated with it.
|
|
|
|
var type = kwArgs.type,
|
|
normalizeArguments = kwArgs.normalizeArguments,
|
|
applyQuery = kwArgs.applyQuery,
|
|
defaultQuerierFactory = kwArgs.querierFactory;
|
|
|
|
return function () {
|
|
// summary:
|
|
// A query method whose arguments are determined by the query type
|
|
// returns: dstore/Collection
|
|
// A collection representing the query results
|
|
|
|
var originalArguments = Array.prototype.slice.call(arguments),
|
|
normalizedArguments = normalizeArguments
|
|
? normalizeArguments.apply(this, originalArguments)
|
|
: originalArguments,
|
|
logEntry = {
|
|
type: type,
|
|
arguments: originalArguments,
|
|
normalizedArguments: normalizedArguments
|
|
},
|
|
querierFactory = this._getQuerierFactory(type) || defaultQuerierFactory;
|
|
|
|
if (querierFactory) {
|
|
// Call the query factory in store context to support things like
|
|
// mapping a filter query's string argument to a custom filter method on the collection
|
|
logEntry.querier = querierFactory.apply(this, normalizedArguments);
|
|
}
|
|
|
|
var newCollection = this._createSubCollection({
|
|
queryLog: this.queryLog.concat(logEntry)
|
|
});
|
|
|
|
return applyQuery ? applyQuery.call(this, newCollection, logEntry) : newCollection;
|
|
};
|
|
};
|
|
});
|