CoerceToBoolExpression.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. var CoerceToBoolExpression = module.exports = (function(){
  2. // CONSTRUCTOR
  3. /**
  4. * internal expression for coercing things to booleans
  5. *
  6. * @class CoerceToBoolExpression
  7. * @namespace munge.pipeline.expressions
  8. * @module munge
  9. * @constructor
  10. **/
  11. var klass = module.exports = function CoerceToBoolExpression(expression){
  12. if(arguments.length !== 1) throw new Error("args expected: expression");
  13. this.expression = expression;
  14. base.call(this);
  15. }, base = require("./Expression"), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
  16. // DEPENDENCIES
  17. var Value = require("../Value"),
  18. AndExpression = require("./AndExpression"),
  19. OrExpression = require("./OrExpression"),
  20. NotExpression = require("./NotExpression");
  21. // PROTOTYPE MEMBERS
  22. proto.evaluate = function evaluate(doc){
  23. var result = this.expression.evaluate(doc);
  24. return Value.coerceToBool(result);
  25. };
  26. proto.optimize = function optimize() {
  27. this.expression = this.expression.optimize(); // optimize the operand
  28. // if the operand already produces a boolean, then we don't need this
  29. // LATER - Expression to support a "typeof" query?
  30. var expr = this.expression;
  31. if(expr instanceof AndExpression ||
  32. expr instanceof OrExpression ||
  33. expr instanceof NotExpression ||
  34. expr instanceof CoerceToBoolExpression)
  35. return expr;
  36. return this;
  37. };
  38. proto.addDependencies = function addDependencies(deps, path) {
  39. return this.expression.addDependencies(deps);
  40. };
  41. proto.toJson = function toJson() {
  42. // Serializing as an $and expression which will become a CoerceToBool
  43. return {$and:[this.expression.toJson()]};
  44. };
  45. //TODO: proto.addToBsonObj --- may be required for $project to work
  46. //TODO: proto.addToBsonArray
  47. return klass;
  48. })();