CoerceToBoolExpression.js 1.6 KB

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