UNPKG

query.js

Version:

query.js is an abstract query language which can be mapped to different query language implementation.

111 lines (98 loc) 3.15 kB
(define = typeof define != "undefined" ? define : function (deps, factory) { var undefined; module.exports = factory(exports, require("../..").Query); define = undefined; }); define(["exports", "Query"], function (exports, Query) { var QuerytoMongoMap = { "lt": "$lt", "le": "$lte", "gt": "$gt", "ge": "$gte", "in": "$in", "ne": "$ne", "not": "$not", "all": "$all", "regex": "$regex" }; var MongoComposer = { /** * * @param {Query} query * @return {Object} */ compose: function (query) { var hash = query.toObject(), ret = {}; if (hash.sort) { ret.sort = this.translateSort(hash.sort); } if (hash.where) { ret.where = this.translateOperator(hash.where); } return ret; }, /*** * * @param {Array} sort * @return {Object} */ translateSort: function (sort) { var ret = {}; sort = sort || []; for (var i = 0; i < sort.length; i++) { var sortElement = sort[i]; ret[sortElement.field] = sortElement.direction; } return ret; }, /*** * * @param {Object} operator * @return {Object} */ translateOperator: function (operator) { var name = operator.operator, ret = {}, field; if (name === "and" || name === "or") { ret["$" + name] = this.translateExpressions(operator.expressions); } else if (name === "eql") { field = operator.field; ret[field] = operator.value; } else if (QuerytoMongoMap.hasOwnProperty(name)) { field = operator.field; ret[field] = {}; ret[field][QuerytoMongoMap[name]] = operator.value; } else if (name === "between") { field = operator.field; ret[field].$gt = operator.value[0]; ret[field].$lt = operator.value[1]; } else { throw new Error("Query Operator '" + name + "' is not supported!"); } return ret; }, /*** * * @param {Array} expressions * @return {Array} */ translateExpressions: function (expressions) { var ret = []; for (var i = 0; i < expressions.length; i++) { var expression = expressions[i]; if (expression.operator) { ret.push(this.translateOperator(expression)); } else if (expression instanceof Array) { ret.push(this.translateExpressions(expression)); } else { ret.push(expression); } } return ret; } }; exports.MongoQueryComposer = MongoComposer; return exports; });