diff options
author | Spencer Jackson <spencer.jackson@mongodb.com> | 2017-08-11 14:30:40 -0400 |
---|---|---|
committer | Spencer Jackson <spencer.jackson@mongodb.com> | 2017-11-20 19:03:55 -0500 |
commit | 51e4c2a68701fb00b51beb15c8cf8868c057f035 (patch) | |
tree | 0888e17bcc559c3136d0c9e8106054410379e183 /jstests | |
parent | 350505ac345aaacfad5049040464d814276d34a0 (diff) | |
download | mongo-51e4c2a68701fb00b51beb15c8cf8868c057f035.tar.gz |
SERVER-30009: Allow JS functions to be terminated with ';'
(cherry picked from commit 8024561b6a73b5b0b56200bdfa3233219ff7fb18)
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/core/function_string_representations.js | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/jstests/core/function_string_representations.js b/jstests/core/function_string_representations.js new file mode 100644 index 00000000000..af66e9160a9 --- /dev/null +++ b/jstests/core/function_string_representations.js @@ -0,0 +1,38 @@ +/** Demonstrate that mapReduce can accept functions represented by strings. + * Some drivers do not have a type which represents a Javascript function. These languages represent + * the arguments to mapReduce as strings. + */ + +(function() { + "use strict"; + + var col = db.function_string_representations; + col.drop(); + assert.writeOK(col.insert({ + _id: "abc123", + ord_date: new Date("Oct 04, 2012"), + status: 'A', + price: 25, + items: [{sku: "mmm", qty: 5, price: 2.5}, {sku: "nnn", qty: 5, price: 2.5}] + })); + + var mapFunction = "function() {emit(this._id, this.price);}"; + var reduceFunction = "function(keyCustId, valuesPrices) {return Array.sum(valuesPrices);}"; + assert.commandWorked(col.mapReduce(mapFunction, reduceFunction, {out: "map_reduce_example"})); + + // Provided strings may end with semicolons and/or whitespace + mapFunction += " ; "; + reduceFunction += " ; "; + assert.commandWorked(col.mapReduce(mapFunction, reduceFunction, {out: "map_reduce_example"})); + + // $where exhibits the same behavior + var whereFunction = "function() {return this.price === 25;}"; + assert.eq(1, col.find({$where: whereFunction}).itcount()); + + whereFunction += ";"; + assert.eq(1, col.find({$where: whereFunction}).itcount()); + + // db.eval does not need to be tested, as it accepts code fragments, not functions. + // system.js does not need to be tested, as its contents types' are preserved, and + // strings are not promoted into functions. +})(); |