mirror of https://github.com/mongodb/mongo
71 lines
2.8 KiB
JavaScript
71 lines
2.8 KiB
JavaScript
// SERVER-10176: Add $abs aggregation expression.
|
|
|
|
import "jstests/libs/query/sbe_assert_error_override.js";
|
|
|
|
import {assertErrorCode} from "jstests/aggregation/extras/utils.js";
|
|
|
|
let coll = db.abs_expr;
|
|
coll.drop();
|
|
|
|
// Valid types (numeric and null):
|
|
assert.commandWorked(coll.insert({_id: 0, a: 5}));
|
|
assert.commandWorked(coll.insert({_id: 1, a: -5}));
|
|
assert.commandWorked(coll.insert({_id: 2, a: 5.5}));
|
|
assert.commandWorked(coll.insert({_id: 3, a: -5.5}));
|
|
assert.commandWorked(coll.insert({_id: 4, a: NumberInt("5")}));
|
|
assert.commandWorked(coll.insert({_id: 5, a: NumberInt("-5")}));
|
|
assert.commandWorked(coll.insert({_id: 6, a: NumberLong("5")}));
|
|
assert.commandWorked(coll.insert({_id: 7, a: NumberLong("-5")}));
|
|
assert.commandWorked(coll.insert({_id: 8, a: 0.0}));
|
|
assert.commandWorked(coll.insert({_id: 9, a: -0.0}));
|
|
assert.commandWorked(coll.insert({_id: 10, a: NumberInt("0")}));
|
|
// INT_MIN is -(2 ^ 31).
|
|
assert.commandWorked(coll.insert({_id: 11, a: NumberInt(-Math.pow(2, 31))}));
|
|
assert.commandWorked(coll.insert({_id: 12, a: -Math.pow(2, 31)}));
|
|
// 1152921504606846977 is 2^60 + 1, an integer that can't be represented precisely as a double.
|
|
assert.commandWorked(coll.insert({_id: 13, a: NumberLong("1152921504606846977")}));
|
|
assert.commandWorked(coll.insert({_id: 14, a: NumberLong("-1152921504606846977")}));
|
|
assert.commandWorked(coll.insert({_id: 15, a: null}));
|
|
assert.commandWorked(coll.insert({_id: 16, a: undefined}));
|
|
assert.commandWorked(coll.insert({_id: 17, a: NaN}));
|
|
assert.commandWorked(coll.insert({_id: 18}));
|
|
|
|
let results = coll.aggregate([{$project: {a: {$abs: "$a"}}}, {$sort: {_id: 1}}]).toArray();
|
|
assert.eq(results, [
|
|
{_id: 0, a: 5},
|
|
{_id: 1, a: 5},
|
|
{_id: 2, a: 5.5},
|
|
{_id: 3, a: 5.5},
|
|
{_id: 4, a: 5},
|
|
{_id: 5, a: 5},
|
|
{_id: 6, a: NumberLong("5")},
|
|
{_id: 7, a: NumberLong("5")},
|
|
{_id: 8, a: 0},
|
|
{_id: 9, a: 0},
|
|
{_id: 10, a: 0},
|
|
{_id: 11, a: NumberLong(Math.pow(2, 31))},
|
|
{_id: 12, a: Math.pow(2, 31)},
|
|
{_id: 13, a: NumberLong("1152921504606846977")},
|
|
{_id: 14, a: NumberLong("1152921504606846977")},
|
|
{_id: 15, a: null},
|
|
{_id: 16, a: null},
|
|
{_id: 17, a: NaN},
|
|
{_id: 18, a: null},
|
|
]);
|
|
|
|
// Using $abs on a string literal expression.
|
|
assertErrorCode(coll, [{$project: {a: {$abs: "string"}}}], 28765);
|
|
|
|
// Using $abs on LLONG_MIN (-2 ^ 63) as a literal expression.
|
|
assertErrorCode(coll, [{$project: {a: {$abs: NumberLong("-9223372036854775808")}}}], 28680);
|
|
|
|
// Using $abs on a string value.
|
|
assert(coll.drop());
|
|
assert.commandWorked(coll.insert({_id: 0, a: "string"}));
|
|
assertErrorCode(coll, [{$project: {a: {$abs: "$a"}}}], 28765);
|
|
|
|
// Using $abs on LLONG_MIN (-2 ^ 63) as a value.
|
|
assert(coll.drop());
|
|
assert.commandWorked(coll.insert({_id: 0, a: NumberLong("-9223372036854775808")}));
|
|
assertErrorCode(coll, [{$project: {a: {$abs: "$a"}}}], 28680);
|