mirror of https://github.com/mongodb/mongo
107 lines
2.9 KiB
JavaScript
107 lines
2.9 KiB
JavaScript
// Verify that bitwise agg expressions work as expected.
|
|
// @tags: [
|
|
// requires_fcv_63,
|
|
// featureFlagBitwiseAggOperators,
|
|
// ]
|
|
import {assertArrayEq} from "jstests/aggregation/extras/utils.js";
|
|
|
|
const collName = jsTestName();
|
|
const coll = db[collName];
|
|
coll.drop();
|
|
|
|
assert.commandWorked(
|
|
coll.insert([
|
|
{_id: 0, a: NumberInt(0), b: NumberInt(127), c: [NumberInt(0), NumberInt(127)]},
|
|
{_id: 1, a: NumberInt(1), b: NumberInt(2), c: [NumberInt(1), NumberInt(2)]},
|
|
{_id: 2, a: NumberInt(2), b: NumberInt(3), c: [NumberInt(2), NumberInt(3)]},
|
|
{_id: 3, a: NumberInt(3), b: NumberInt(5), c: [NumberInt(3), NumberInt(5)]},
|
|
]),
|
|
);
|
|
|
|
function runAndAssert(expression, expectedResult) {
|
|
assertArrayEq({
|
|
actual: coll
|
|
.aggregate([{$project: {r: {[expression]: ["$a", "$b"]}}}])
|
|
.toArray()
|
|
.map((doc) => doc.r),
|
|
expected: expectedResult,
|
|
});
|
|
}
|
|
|
|
runAndAssert("$bitAnd", [0, 0, 2, 1]);
|
|
runAndAssert("$bitOr", [127, 3, 3, 7]);
|
|
runAndAssert("$bitXor", [127, 3, 1, 6]);
|
|
|
|
for (const operator of ["$bitAnd", "$bitOr", "$bitXor"]) {
|
|
for (const operand of [Number(12.0), NumberDecimal("12"), "$c", ["$c"], [[NumberInt(1), NumberInt(2)]]]) {
|
|
assert.commandFailedWithCode(
|
|
coll.runCommand({
|
|
aggregate: collName,
|
|
cursor: {},
|
|
pipeline: [
|
|
{
|
|
$project: {
|
|
r: {[operator]: ["$a", operand]},
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
ErrorCodes.TypeMismatch,
|
|
);
|
|
}
|
|
for (const argument of ["$c", ["$c"], [[NumberInt(1), NumberInt(2)]]]) {
|
|
assert.commandFailedWithCode(
|
|
coll.runCommand({
|
|
aggregate: collName,
|
|
cursor: {},
|
|
pipeline: [
|
|
{
|
|
$project: {
|
|
r: {[operator]: argument},
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
ErrorCodes.TypeMismatch,
|
|
);
|
|
}
|
|
}
|
|
|
|
assertArrayEq({
|
|
actual: coll
|
|
.aggregate([{$project: {r: {$bitNot: "$a"}}}])
|
|
.toArray()
|
|
.map((doc) => doc.r),
|
|
expected: [-1, -2, -3, -4],
|
|
});
|
|
|
|
assert.commandFailedWithCode(
|
|
coll.runCommand({
|
|
aggregate: collName,
|
|
cursor: {},
|
|
pipeline: [
|
|
{
|
|
$project: {
|
|
r: {$bitNot: 12.5},
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
ErrorCodes.TypeMismatch,
|
|
);
|
|
|
|
assert.commandFailedWithCode(
|
|
coll.runCommand({
|
|
aggregate: collName,
|
|
cursor: {},
|
|
pipeline: [
|
|
{
|
|
$project: {
|
|
r: {$bitNot: ["$a", "$b"]},
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
16020,
|
|
); // Error for incorrect number of arguments.
|