Files
mongo/jstests/libs/block_processing_test_cases.js
Matthew Boros 6d277c6ca0 SERVER-86691 Test block groupby with all BSON data types
GitOrigin-RevId: 30af339d0cfb89c0e630a289373e94d00f4d3765
2024-03-13 21:12:11 +00:00

653 lines
23 KiB
JavaScript

/*
* Test cases and common TS queries that use block processing.
*/
export function blockProcessingTestCases(
timeFieldName, metaFieldName, datePrefix, dateUpperBound, dateLowerBound) {
return [
{
name: "GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null}},
{$project: {_id: 1}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByNullAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$min: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "Max_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$max: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "Max_GroupByNullAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$max: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MaxWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$max: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMin_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 0, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMin_GroupByNullAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 0, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MinAndMaxWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: '$y'}, b: {$max: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "Max_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$max: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MaxWithId_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$max: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMin_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 0, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MinAndMaxWithId_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTrunc",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {$dateTrunc: {date: "$time", unit: "hour"}},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByDateAdd",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {$dateAdd: {startDate: "$time", unit: "millisecond", amount: 100}},
a: {$min: '$y'}
}
},
{$project: {_id: 1, a: '$a'}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByDateAddAndDateDiff",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateAdd: {
startDate: ISODate("2024-01-01T00:00:00"),
unit: "millisecond",
amount: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
}
},
a: {$min: '$y'}
}
},
{$project: {_id: 1, a: '$a'}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByDateSubtract",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id:
{$dateSubtract: {startDate: "$time", unit: "millisecond", amount: 100}},
a: {$min: '$y'}
}
},
{$project: {_id: 1, a: '$a'}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByDateSubtractAndDateDiff",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateSubtract: {
startDate: ISODate("2024-01-01T00:00:00"),
unit: "millisecond",
amount: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
}
},
a: {$min: '$y'}
}
},
{$project: {_id: 1, a: '$a'}}
],
usesBlockProcessing: false
},
{
name: "MaxAndMinOfDateDiffWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
},
b: {
$max: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
},
c: {
$min: {
$dateDiff: {
startDate: "$time",
endDate: new Date(datePrefix),
unit: "millisecond"
}
}
},
d: {
$max: {
$dateDiff: {
startDate: "$time",
endDate: new Date(datePrefix),
unit: "millisecond"
}
}
},
}
},
{$project: {_id: 0, a: 1, b: 1, c: 1, d: 1}}
],
usesBlockProcessing: false
},
{
name: "MaxAndMinOfDateAddDateSubtractDateTruncWithId_GroupByNull",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {$dateAdd: {startDate: "$time", unit: "millisecond", amount: 100}}
},
b: {
$max: {
$dateSubtract:
{startDate: "$time", unit: "millisecond", amount: 100}
}
},
c: {$max: {$dateTrunc: {date: "$time", unit: "second"}}},
}
},
{$project: {_id: 0, a: 1, b: 1, c: 1}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTruncAndDateAdd",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateTrunc: {
date: {
$dateAdd: {startDate: "$time", unit: "millisecond", amount: 100}
},
unit: "hour"
}
},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTruncAndDateSubtract",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateTrunc: {
date: {
$dateSubtract:
{startDate: "$time", unit: "millisecond", amount: 100}
},
unit: "hour"
}
},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByDateDiffAndDateAdd",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: {
$dateAdd: {startDate: "$time", unit: "millisecond", amount: 100}
},
unit: "millisecond"
}
},
a: {$min: '$y'},
}
},
{$project: {_id: 1, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MinOfDateDiffWithId_GroupByNull_InvalidDate",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$y",
unit: "millisecond"
}
}
},
}
},
{$project: {_id: 0, a: 1}}
],
expectedErrorCode: 7157922,
usesBlockProcessing: false
},
{
name: "MinOfDateAddWithId_GroupByNull_MissingAmount",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {
$dateAdd: {
startDate: new Date(datePrefix),
unit: "millisecond",
amount: "$k"
}
}
},
}
},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MaxPlusMinWithId_GroupByDateDiff",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$add: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxPlusMinWithId_GroupByFilteredComputedDateDiff",
pipeline: [
{$match: {[timeFieldName]: {$lte: new Date(datePrefix + 300)}}},
{
$addFields: {
msDiff: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
}
},
{$match: {msDiff: {$gte: 300}}},
{$group: {_id: "$msDiff", a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 1, a: {$add: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByX_NoFilter",
pipeline: [{$group: {_id: '$x', a: {$min: '$y'}}}, {$project: {_id: 0, a: 1}}],
usesBlockProcessing: false
},
{
name: "MinWithId_GroupByX_NoFilter",
pipeline: [{$group: {_id: '$x', a: {$min: '$y'}}}],
usesBlockProcessing: false
},
{
name: "Max_GroupByX_NoFilter",
pipeline: [{$group: {_id: '$x', a: {$max: '$y'}}}, {$project: {_id: 0, a: 1}}],
usesBlockProcessing: false
},
{
name: "MaxWithId_GroupByX_NoFilter",
pipeline: [{$group: {_id: '$x', a: {$max: '$y'}}}],
usesBlockProcessing: false
},
{
name: "MaxMinusMin_GroupByX_NoFilter",
pipeline: [
{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 0, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByX_NoFilter",
pipeline: [
{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MinAndMaxWithId_GroupByX_NoFilter",
pipeline: [{$group: {_id: '$x', a: {$min: '$y'}, b: {$max: '$y'}}}],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTrunc_NoFilter",
pipeline: [
{
$group: {
_id: {"$dateTrunc": {date: "$time", unit: "minute", binSize: 1}},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTruncAndDateDiff_NoFilter",
pipeline: [
{
$group: {
_id: {
date: {$dateTrunc: {date: "$time", unit: "millisecond", binSize: 200}},
delta: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: "$time",
unit: "millisecond"
}
}
},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByDateTruncAndMeta_NoFilter",
pipeline: [
{
$group: {
_id: {
date: {$dateTrunc: {date: "$time", unit: "minute", binSize: 1}},
symbol: "$measurement"
},
a: {$min: '$y'},
b: {$max: '$y'}
}
},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "MaxMinusMinWithId_GroupByMeta_NoFilter",
pipeline: [
{$group: {_id: "$measurement", a: {$min: '$y'}, b: {$max: '$y'}}},
{$project: {_id: 1, a: {$subtract: ['$b', '$a']}}}
],
usesBlockProcessing: false
},
{
name: "Avg_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$avg: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByXAndY",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: '$x', y: '$y'}, a: {$min: '$z'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "Min_GroupByMetaSortKey",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {$meta: 'sortKey'}, a: {$min: '$y'}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "MinOfMetaSortKey_GroupByX",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: '$x', a: {$min: {$meta: 'sortKey'}}}},
{$project: {_id: 0, a: 1}}
],
usesBlockProcessing: false
},
{
name: "GroupWithProjectedOutFieldInAccumulator",
pipeline: [
{$project: {_id: 0}},
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: null, minY: {$min: "$y"}}},
],
usesBlockProcessing: false,
},
{
name: "GroupWithProjectedOutFieldInGb",
pipeline: [
{$project: {_id: 0}},
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: "$y", a: {$min: "$x"}}},
],
usesBlockProcessing: false,
},
{
name: "GroupWithMixOfProjectedOutField",
pipeline: [
{$project: {_id: 0, x: 1 /* y not included */}},
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: "$y", a: {$min: "$x"}}},
],
usesBlockProcessing: false,
}
];
}