12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- var CoerceToBoolExpression = module.exports = (function(){
- // CONSTRUCTOR
- /**
- * internal expression for coercing things to booleans
- *
- * @class CoerceToBoolExpression
- * @namespace munge.pipeline.expressions
- * @module munge
- * @constructor
- **/
- var klass = module.exports = function CoerceToBoolExpression(expression){
- if(arguments.length !== 1) throw new Error("args expected: expression");
- this.expression = expression;
- base.call(this);
- }, base = require("./Expression"), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
- // DEPENDENCIES
- var Value = require("../Value"),
- AndExpression = require("./AndExpression"),
- OrExpression = require("./OrExpression"),
- NotExpression = require("./NotExpression");
- // PROTOTYPE MEMBERS
- proto.evaluate = function evaluate(doc){
- var result = this.expression.evaluate(doc);
- return Value.coerceToBool(result);
- };
- proto.optimize = function optimize() {
- this.expression = this.expression.optimize(); // optimize the operand
- // if the operand already produces a boolean, then we don't need this
- // LATER - Expression to support a "typeof" query?
- var expr = this.expression;
- if(expr instanceof AndExpression ||
- expr instanceof OrExpression ||
- expr instanceof NotExpression ||
- expr instanceof CoerceToBoolExpression)
- return expr;
- return this;
- };
- proto.addDependencies = function addDependencies(deps, path) {
- return this.expression.addDependencies(deps);
- };
- proto.toJson = function toJson() {
- // Serializing as an $and expression which will become a CoerceToBool
- return {$and:[this.expression.toJson()]};
- };
- //TODO: proto.addToBsonObj --- may be required for $project to work
- //TODO: proto.addToBsonArray
- return klass;
- })();
|