CompareExpression.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. "use strict";
  2. var assert = require("assert"),
  3. Expression = require("../../../../lib/pipeline/expressions/Expression"),
  4. CompareExpression = require("../../../../lib/pipeline/expressions/CompareExpression"),
  5. FieldRangeExpression = require("../../../../lib/pipeline/expressions/FieldRangeExpression"),
  6. VariablesParseState = require("../../../../Lib/pipeline/expressions/VariablesParseState"),
  7. VariablesIdGenerator = require("../../../../Lib/pipeline/expressions/VariablesIdGenerator"),
  8. ConstantExpression = require("../../../../Lib/pipeline/expressions/ConstantExpression");
  9. module.exports = {
  10. "CompareExpression": {
  11. "constructor()": {
  12. "should throw Error if no args": function testConstructor() {
  13. assert.throws(function() {
  14. new CompareExpression();
  15. });
  16. }
  17. },
  18. "#getOpName()": {
  19. "should return the correct op name; $eq, $ne, $gt, $gte, $lt, $lte, $cmp": function testOpName() {
  20. assert.equal((new CompareExpression(CompareExpression.EQ)).getOpName(), "$eq");
  21. assert.equal((new CompareExpression(CompareExpression.NE)).getOpName(), "$ne");
  22. assert.equal((new CompareExpression(CompareExpression.GT)).getOpName(), "$gt");
  23. assert.equal((new CompareExpression(CompareExpression.GTE)).getOpName(), "$gte");
  24. assert.equal((new CompareExpression(CompareExpression.LT)).getOpName(), "$lt");
  25. assert.equal((new CompareExpression(CompareExpression.LTE)).getOpName(), "$lte");
  26. assert.equal((new CompareExpression(CompareExpression.CMP)).getOpName(), "$cmp");
  27. }
  28. },
  29. "#evaluateInternal()": {
  30. "$eq": {
  31. "should return false if first < second; {$eq:[1,2]}": function testEqLt() {
  32. //debugger;
  33. var idGenerator = new VariablesIdGenerator();
  34. var vps = new VariablesParseState(idGenerator);
  35. var parseOp = Expression.parseOperand({
  36. $eq: [{
  37. $const: 1
  38. }, {
  39. $const: 2
  40. }]
  41. }, vps);
  42. var result = parseOp.evaluateInternal({});
  43. //assert.equal(new CompareExpression( CompareExpression.EQ).evaluateInternal({"$eq":[1,2]}), false);
  44. assert.equal(result, false);
  45. },
  46. "should return true if first == second; {$eq:[1,1]}": function testEqEq() {
  47. var idGenerator = new VariablesIdGenerator();
  48. var vps = new VariablesParseState(idGenerator);
  49. assert.equal(Expression.parseOperand({
  50. $eq: [1, 1]
  51. }, vps).evaluateInternal({}), true);
  52. },
  53. "should return false if first > second {$eq:[1,0]}": function testEqGt() {
  54. var idGenerator = new VariablesIdGenerator();
  55. var vps = new VariablesParseState(idGenerator);
  56. assert.equal(Expression.parseOperand({
  57. $eq: [1, 0]
  58. }).evaluateInternal({}), false);
  59. },
  60. "should return false if first and second are different types {$eq:[null,0]}": function testEqGt() {
  61. var idGenerator = new VariablesIdGenerator();
  62. var vps = new VariablesParseState(idGenerator);
  63. assert.equal(Expression.parseOperand({
  64. $eq: [null, 0]
  65. }, vps).evaluateInternal({}), false);
  66. },
  67. "should return false if first and second are different types {$eq:[undefined,0]}": function testEqGt() {
  68. var idGenerator = new VariablesIdGenerator();
  69. var vps = new VariablesParseState(idGenerator);
  70. assert.equal(Expression.parseOperand({
  71. $eq: [undefined, 0]
  72. }, vps).evaluateInternal({}), false);
  73. },
  74. "should return false if first and second are different arrays {$eq:[[1],[null]]}": function testEqGt() {
  75. var idGenerator = new VariablesIdGenerator();
  76. var vps = new VariablesParseState(idGenerator);
  77. assert.equal(Expression.parseOperand({
  78. $eq: [
  79. [1],
  80. [null]
  81. ]
  82. }, vps).evaluateInternal({}), false);
  83. },
  84. "should return false if first and second are different arrays {$eq:[[1],[]]}": function testEqGt() {
  85. assert.equal(Expression.parseOperand({
  86. $eq: [
  87. [1],
  88. []
  89. ]
  90. }, vps).evaluateInternal({}), false);
  91. var idGenerator = new VariablesIdGenerator();
  92. var vps = new VariablesParseState(idGenerator);
  93. },
  94. "should return true if first and second are the same arrays {$eq:[[1],[1]]}": function testEqGt() {
  95. var idGenerator = new VariablesIdGenerator();
  96. var vps = new VariablesParseState(idGenerator);
  97. assert.equal(Expression.parseOperand({
  98. $eq: [
  99. [1],
  100. [1]
  101. ]
  102. }, vps).evaluateInternal({}), true);
  103. }
  104. },
  105. // "$ne": {
  106. // "should return true if first < second; {$ne:[1,2]}": function testNeLt(){
  107. // assert.equal(Expression.parseOperand({$ne:[1,2]}).evaluateInternal({}), true);
  108. // },
  109. // "should return false if first == second; {$ne:[1,1]}": function testNeLt(){
  110. // assert.equal(Expression.parseOperand({$ne:[1,1]}).evaluateInternal({}), false);
  111. // },
  112. // "should return true if first > second; {$ne:[1,0]}": function testNeGt(){
  113. // assert.equal(Expression.parseOperand({$ne:[1,0]}).evaluateInternal({}), true);
  114. // }
  115. // },
  116. // "$gt": {
  117. // "should return false if first < second; {$gt:[1,2]}": function testGtLt(){
  118. // assert.equal(Expression.parseOperand({$gt:[1,2]}).evaluateInternal({}), false);
  119. // },
  120. // "should return false if first == second; {$gt:[1,1]}": function testGtLt(){
  121. // assert.equal(Expression.parseOperand({$gt:[1,1]}).evaluateInternal({}), false);
  122. // },
  123. // "should return true if first > second; {$gt:[1,0]}": function testGtGt(){
  124. // assert.equal(Expression.parseOperand({$gt:[1,0]}).evaluateInternal({}), true);
  125. // }
  126. // },
  127. // "$gte": {
  128. // "should return false if first < second; {$gte:[1,2]}": function testGteLt(){
  129. // assert.equal(Expression.parseOperand({$gte:[1,2]}).evaluateInternal({}), false);
  130. // },
  131. // "should return true if first == second; {$gte:[1,1]}": function testGteLt(){
  132. // assert.equal(Expression.parseOperand({$gte:[1,1]}).evaluateInternal({}), true);
  133. // },
  134. // "should return true if first > second; {$gte:[1,0]}": function testGteGt(){
  135. // assert.equal(Expression.parseOperand({$gte:[1,0]}).evaluateInternal({}), true);
  136. // }
  137. // },
  138. // "$lt": {
  139. // "should return true if first < second; {$lt:[1,2]}": function testLtLt(){
  140. // assert.equal(Expression.parseOperand({$lt:[1,2]}).evaluateInternal({}), true);
  141. // },
  142. // "should return false if first == second; {$lt:[1,1]}": function testLtLt(){
  143. // assert.equal(Expression.parseOperand({$lt:[1,1]}).evaluateInternal({}), false);
  144. // },
  145. // "should return false if first > second; {$lt:[1,0]}": function testLtGt(){
  146. // assert.equal(Expression.parseOperand({$lt:[1,0]}).evaluateInternal({}), false);
  147. // }
  148. // },
  149. // "$lte": {
  150. // "should return true if first < second; {$lte:[1,2]}": function testLteLt(){
  151. // assert.equal(Expression.parseOperand({$lte:[1,2]}).evaluateInternal({}), true);
  152. // },
  153. // "should return true if first == second; {$lte:[1,1]}": function testLteLt(){
  154. // assert.equal(Expression.parseOperand({$lte:[1,1]}).evaluateInternal({}), true);
  155. // },
  156. // "should return false if first > second; {$lte:[1,0]}": function testLteGt(){
  157. // assert.equal(Expression.parseOperand({$lte:[1,0]}).evaluateInternal({}), false);
  158. // }
  159. // },
  160. // "$cmp": {
  161. // "should return -1 if first < second; {$cmp:[1,2]}": function testCmpLt(){
  162. // assert.equal(Expression.parseOperand({$cmp:[1,2]}).evaluateInternal({}), -1);
  163. // },
  164. // "should return 0 if first < second; {$cmp:[1,1]}": function testCmpLt(){
  165. // assert.equal(Expression.parseOperand({$cmp:[1,1]}).evaluateInternal({}), 0);
  166. // },
  167. // "should return 1 if first < second; {$cmp:[1,0]}": function testCmpLt(){
  168. // assert.equal(Expression.parseOperand({$cmp:[1,0]}).evaluateInternal({}), 1);
  169. // },
  170. // "should return 1 even if comparison is larger; {$cmp:['z','a']}": function testCmpBracketed(){
  171. // assert.equal(Expression.parseOperand({$cmp:['z','a']}).evaluateInternal({}), 1);
  172. // }
  173. // },
  174. // "should throw Error": {
  175. // "if zero operands are provided; {$ne:[]}": function testZeroOperands(){
  176. // assert.throws(function(){
  177. // Expression.parseOperand({$ne:[]}).evaluateInternal({});
  178. // });
  179. // },
  180. // "if one operand is provided; {$eq:[1]}": function testOneOperand(){
  181. // assert.throws(function(){
  182. // Expression.parseOperand({$eq:[1]}).evaluateInternal({});
  183. // });
  184. // },
  185. // "if three operands are provided; {$gt:[2,3,4]}": function testThreeOperands(){
  186. // assert.throws(function(){
  187. // Expression.parseOperand({$gt:[2,3,4]}).evaluateInternal({});
  188. // });
  189. // }
  190. // }
  191. // },
  192. // "#optimize()": {
  193. // "should optimize constants; {$eq:[1,1]}": function testOptimizeConstants(){
  194. // assert.deepEqual(Expression.parseOperand({$eq:[1,1]}).optimize().toJSON(true), {$const:true});
  195. // },
  196. // "should not optimize if $cmp op; {$cmp:[1,'$a']}": function testNoOptimizeCmp(){
  197. // assert.deepEqual(Expression.parseOperand({$cmp:[1,'$a']}).optimize().toJSON(), {$cmp:[1,'$a']});
  198. // },
  199. // "should not optimize if $ne op; {$ne:[1,'$a']}": function testNoOptimizeNe(){
  200. // assert.deepEqual(Expression.parseOperand({$ne:[1,'$a']}).optimize().toJSON(), {$ne:[1,'$a']});
  201. // },
  202. // "should not optimize if no constants; {$ne:['$a','$b']}": function testNoOptimizeNoConstant(){
  203. // assert.deepEqual(Expression.parseOperand({$ne:['$a','$b']}).optimize().toJSON(), {$ne:['$a','$b']});
  204. // },
  205. // "should not optimize without an immediate field path;": {
  206. // "{$eq:[{$and:['$a']},1]}": function testNoOptimizeWithoutFieldPath(){
  207. // assert.deepEqual(Expression.parseOperand({$eq:[{$and:['$a']},1]}).optimize().toJSON(), {$eq:[{$and:['$a']},1]});
  208. // },
  209. // "(reversed); {$eq:[1,{$and:['$a']}]}": function testNoOptimizeWithoutFieldPathReverse(){
  210. // assert.deepEqual(Expression.parseOperand({$eq:[1,{$and:['$a']}]}).optimize().toJSON(), {$eq:[1,{$and:['$a']}]});
  211. // }
  212. // },
  213. // "should optimize $eq expressions;": {
  214. // "{$eq:['$a',1]}": function testOptimizeEq(){
  215. // var expr = Expression.parseOperand({$eq:['$a',1]}).optimize();
  216. // assert(expr instanceof FieldRangeExpression, "not optimized");
  217. // assert.deepEqual(expr.toJSON(), {$eq:['$a',1]});
  218. // },
  219. // "{$eq:[1,'$a']} (reversed)": function testOptimizeEqReverse(){
  220. // var expr = Expression.parseOperand({$eq:[1,'$a']}).optimize();
  221. // assert(expr instanceof FieldRangeExpression, "not optimized");
  222. // assert.deepEqual(expr.toJSON(), {$eq:['$a',1]});
  223. // }
  224. // },
  225. // "should optimize $lt expressions;": {
  226. // "{$lt:['$a',1]}": function testOptimizeLt(){
  227. // var expr = Expression.parseOperand({$lt:['$a',1]}).optimize();
  228. // assert(expr instanceof FieldRangeExpression, "not optimized");
  229. // assert.deepEqual(expr.toJSON(), {$lt:['$a',1]});
  230. // },
  231. // "{$lt:[1,'$a']} (reversed)": function testOptimizeLtReverse(){
  232. // var expr = Expression.parseOperand({$lt:[1,'$a']}).optimize();
  233. // assert(expr instanceof FieldRangeExpression, "not optimized");
  234. // assert.deepEqual(expr.toJSON(), {$gt:['$a',1]});
  235. // }
  236. // },
  237. // "should optimize $lte expressions;": {
  238. // "{$lte:['$b',2]}": function testOptimizeLte(){
  239. // var expr = Expression.parseOperand({$lte:['$b',2]}).optimize();
  240. // assert(expr instanceof FieldRangeExpression, "not optimized");
  241. // assert.deepEqual(expr.toJSON(), {$lte:['$b',2]});
  242. // },
  243. // "{$lte:[2,'$b']} (reversed)": function testOptimizeLteReverse(){
  244. // var expr = Expression.parseOperand({$lte:[2,'$b']}).optimize();
  245. // assert(expr instanceof FieldRangeExpression, "not optimized");
  246. // assert.deepEqual(expr.toJSON(), {$gte:['$b',2]});
  247. // }
  248. // },
  249. // "should optimize $gt expressions;": {
  250. // "{$gt:['$b',2]}": function testOptimizeGt(){
  251. // var expr = Expression.parseOperand({$gt:['$b',2]}).optimize();
  252. // assert(expr instanceof FieldRangeExpression, "not optimized");
  253. // assert.deepEqual(expr.toJSON(), {$gt:['$b',2]});
  254. // },
  255. // "{$gt:[2,'$b']} (reversed)": function testOptimizeGtReverse(){
  256. // var expr = Expression.parseOperand({$gt:[2,'$b']}).optimize();
  257. // assert(expr instanceof FieldRangeExpression, "not optimized");
  258. // assert.deepEqual(expr.toJSON(), {$lt:['$b',2]});
  259. // }
  260. // },
  261. // "should optimize $gte expressions;": {
  262. // "{$gte:['$b',2]}": function testOptimizeGte(){
  263. // var expr = Expression.parseOperand({$gte:['$b',2]}).optimize();
  264. // assert(expr instanceof FieldRangeExpression, "not optimized");
  265. // assert.deepEqual(expr.toJSON(), {$gte:['$b',2]});
  266. // },
  267. // "{$gte:[2,'$b']} (reversed)": function testOptimizeGteReverse(){
  268. // var expr = Expression.parseOperand({$gte:[2,'$b']}).optimize();
  269. // assert(expr instanceof FieldRangeExpression, "not optimized");
  270. // assert.deepEqual(expr.toJSON(), {$lte:['$b',2]});
  271. // }
  272. // },
  273. }
  274. }
  275. };
  276. if (!module.parent)(new(require("mocha"))()).ui("exports").reporter("spec").addFile(__filename).run(process.exit);