mongo/jstests/libs/query/block_processing_test_cases.js

1909 lines
72 KiB
JavaScript

/*
* Test cases and common TS queries that use block processing.
*/
export function generateMetaVals() {
const metaVals = ["foo", {region: "us", series: 123}, {region: "eu", series: 456}];
return metaVals;
}
export function blockProcessingTestCases(
timeFieldName,
metaFieldName,
datePrefix,
dateUpperBound,
dateLowerBound,
featureFlagsAllowBlockHashAgg,
sbeFullEnabled,
) {
const dateMidPoint = new Date((dateLowerBound.getTime() + dateUpperBound.getTime()) / 2);
const dollarPrefixedTime = "$" + timeFieldName;
const dollarPrefixedMeta = "$" + metaFieldName;
const metaDotRegion = dollarPrefixedMeta + ".region";
const metaDotNonExistent = dollarPrefixedMeta + ".NON_EXISTENT";
const metaDotSeries = dollarPrefixedMeta + ".series";
return [
{
name: "GroupByNull",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: null}}, {$project: {_id: 1}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "Count",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$count: "count"},
{$project: {_id: 1, count: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "Count_FilterHalf",
pipeline: [
{
$match: {
[timeFieldName]: {
$lt: new Date((dateLowerBound.getTime() + dateUpperBound.getTime()) / 2),
},
},
},
{$count: "count"},
{$project: {_id: 1, count: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinWithoutIdAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$min: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_Min",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: null, a: {$min: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MaxWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$max: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MaxWithoutIdAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$max: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_Max",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: null, a: {$max: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinAndMaxWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: "$y"}, b: {$max: "$y"}}},
{$project: {_id: 0, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinAndMaxWithoutIdAllPass",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$min: "$y"}, b: {$max: "$y"}}},
{$project: {_id: 0, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinAndMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$min: "$y"}, b: {$max: "$y"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$min: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Min",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: "$x", a: {$min: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MaxWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$max: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Max",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: "$x", a: {$max: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinAndMaxWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$min: "$y"}, b: {$max: "$y"}}},
{$project: {_id: 0, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinAndMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$min: "$y"}, b: {$max: "$y"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTrunc_MinAndMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {$dateTrunc: {date: dollarPrefixedTime, unit: "hour"}},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateAdd_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateAdd: {startDate: dollarPrefixedTime, unit: "millisecond", amount: 100},
},
a: {$min: "$y"},
},
},
{$project: {_id: 1, a: "$a"}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateAddAndDateDiff_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateAdd: {
startDate: ISODate("2024-01-01T00:00:00"),
unit: "millisecond",
amount: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
},
a: {$min: "$y"},
},
},
{$project: {_id: 1, a: "$a"}},
],
usesBlockProcessing: false,
},
{
name: "GroupByDateSubtract_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateSubtract: {startDate: dollarPrefixedTime, unit: "millisecond", amount: 100},
},
a: {$min: "$y"},
},
},
{$project: {_id: 1, a: "$a"}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateSubtractAndDateDiff_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateSubtract: {
startDate: ISODate("2024-01-01T00:00:00"),
unit: "millisecond",
amount: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
},
a: {$min: "$y"},
},
},
{$project: {_id: 1, a: "$a"}},
],
usesBlockProcessing: false,
},
{
name: "GroupByNull_MaxAndMinOfDateDiff",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
b: {
$max: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
c: {
$min: {
$dateDiff: {
startDate: dollarPrefixedTime,
endDate: new Date(datePrefix),
unit: "millisecond",
},
},
},
d: {
$max: {
$dateDiff: {
startDate: dollarPrefixedTime,
endDate: new Date(datePrefix),
unit: "millisecond",
},
},
},
},
},
{$project: {_id: 0, a: 1, b: 1, c: 1, d: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MaxAndMinOfDateAddDateSubtractDateTrunc",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: null,
a: {
$min: {
$dateAdd: {
startDate: dollarPrefixedTime,
unit: "millisecond",
amount: 100,
},
},
},
b: {
$max: {
$dateSubtract: {
startDate: dollarPrefixedTime,
unit: "millisecond",
amount: 100,
},
},
},
c: {$max: {$dateTrunc: {date: dollarPrefixedTime, unit: "second"}}},
},
},
{$project: {_id: 0, a: 1, b: 1, c: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTruncAndDateAdd_MinAndMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateTrunc: {
date: {
$dateAdd: {
startDate: dollarPrefixedTime,
unit: "millisecond",
amount: 100,
},
},
unit: "hour",
},
},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTruncAndDateSubtract_MinAndMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateTrunc: {
date: {
$dateSubtract: {
startDate: dollarPrefixedTime,
unit: "millisecond",
amount: 100,
},
},
unit: "hour",
},
},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateDiffAndDateAdd_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: {
$dateAdd: {
startDate: dollarPrefixedTime,
unit: "millisecond",
amount: 100,
},
},
unit: "millisecond",
},
},
a: {$min: "$y"},
},
},
{$project: {_id: 1, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinOfDateDiff_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: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_MinOfDateAdd_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: "GroupByDateDiff_MinPlusMax",
pipeline: [
{$match: {[timeFieldName]: {$lte: dateUpperBound}}},
{
$group: {
_id: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{
$project: {
_id: 1,
a: {
$cond: [{$and: [{$isNumber: "$a"}, {$isNumber: "$b"}]}, {$add: ["$a", "$b"]}, null],
},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByFilteredComputedDateDiff_MinPlusMax",
pipeline: [
{$match: {[timeFieldName]: {$lte: new Date(datePrefix + 300)}}},
{
$addFields: {
msDiff: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
},
{$match: {msDiff: {$gte: 300}}},
{$group: {_id: "$msDiff", a: {$min: "$y"}, b: {$max: "$y"}}},
{
$project: {
_id: 1,
a: {
$cond: [{$and: [{$isNumber: "$a"}, {$isNumber: "$b"}]}, {$add: ["$a", "$b"]}, null],
},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinWithoutId_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$min: "$y"}}}, {$project: {_id: 0, a: 1}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Min_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$min: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MaxWithoutId_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$max: "$y"}}}, {$project: {_id: 0, a: 1}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Max_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$max: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinAndMaxWithoutId_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$min: "$y"}, b: {$max: "$y"}}}, {$project: {_id: 0, a: 1, b: 1}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MinAndMax_NoFilter",
pipeline: [{$group: {_id: "$x", a: {$min: "$y"}, b: {$max: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTrunc_MinAndMax_NoFilter",
pipeline: [
{
$group: {
_id: {"$dateTrunc": {date: dollarPrefixedTime, unit: "minute", binSize: 1}},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTruncAndDateDiff_MinAndMax_NoFilter",
pipeline: [
{
$group: {
_id: {
date: {
$dateTrunc: {date: dollarPrefixedTime, unit: "millisecond", binSize: 200},
},
delta: {
$dateDiff: {
startDate: new Date(datePrefix),
endDate: dollarPrefixedTime,
unit: "millisecond",
},
},
},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByDateTruncAndMeta_MinAndMax_NoFilter",
pipeline: [
{
$group: {
_id: {
date: {
$dateTrunc: {date: dollarPrefixedTime, unit: "minute", binSize: 1},
},
symbol: dollarPrefixedMeta,
},
a: {$min: "$y"},
b: {$max: "$y"},
},
},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMeta_MinAndMax_NoFilter",
pipeline: [
{$group: {_id: dollarPrefixedMeta, a: {$min: "$y"}, b: {$max: "$y"}}},
{$project: {_id: 1, a: 1, b: 1}},
],
usesBlockProcessing: false,
},
{
name: "GroupByXAndY_MinWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$min: "$z"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_Min",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$min: "$z"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_MaxWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$max: "$z"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_Max",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$max: "$z"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_MultipleMinsAndMaxs",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$min: "$z"},
b: {$max: "$z"},
c: {$min: "$p"},
d: {$max: "$q"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaIndexKey_MinWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {$meta: "indexKey"}, a: {$min: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
{
name: "GroupByX_MinOfMetaIndexKeyWithoutId",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$min: {$meta: "indexKey"}}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
//
// $sum tests //////////////////////////////////////////////////////////////////////////////
//
{
name: "GroupByNull_Sum",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: null, a: {$sum: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "DateUpper_GroupByNull_Sum_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$sum: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "DateLower_GroupByNull_Sum_Project",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$sum: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Sum",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: "$x", a: {$sum: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Sum_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$sum: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MultipleSums",
pipeline: [{$group: {_id: "$x", a: {$sum: "$x"}, b: {$sum: "$y"}, c: {$sum: "$z"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_Sum_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$sum: "$z"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSortKey_Sum_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {$meta: "sortKey"}, a: {$sum: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
{
name: "GroupByX_SumOfMetaSortKey_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$sum: {$meta: "sortKey"}}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
//
// $avg tests //////////////////////////////////////////////////////////////////////////////
//
{
name: "GroupByNull_Avg",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: null, a: {$avg: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "DateUpper_GroupByNull_Avg_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, a: {$avg: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "DateLower_GroupByNull_Avg_Project",
pipeline: [
{$match: {[timeFieldName]: {$gt: dateLowerBound}}},
{$group: {_id: null, a: {$avg: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Avg",
pipeline: [{$match: {[timeFieldName]: {$lt: dateUpperBound}}}, {$group: {_id: "$x", a: {$avg: "$y"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_Avg_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$avg: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_MultipleAvgs",
pipeline: [{$group: {_id: "$x", a: {$avg: "$x"}, b: {$avg: "$y"}, c: {$avg: "$z"}}}],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_Avg_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {x: "$x", y: "$y"}, a: {$avg: "$z"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSortKey_Avg_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: {$meta: "sortKey"}, a: {$avg: "$y"}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
{
name: "GroupByX_AvgOfMetaSortKey_Project",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: "$x", a: {$avg: {$meta: "sortKey"}}}},
{$project: {_id: 0, a: 1}},
],
usesBlockProcessing: false,
},
//
// Projected-out field tests ///////////////////////////////////////////////////////////////
//
{
name: "MatchMetaGroupWithProjectedOutFieldInAccumulator",
pipeline: [
{$project: {_id: 0}},
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: null, minY: {$min: "$y"}}},
],
usesBlockProcessing: sbeFullEnabled,
},
{
name: "MatchTimeGroupWithProjectedOutFieldInAccumulator",
pipeline: [
{$project: {_id: 0}},
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{$group: {_id: null, minY: {$min: "$y"}}},
],
usesBlockProcessing: sbeFullEnabled,
},
{
name: "GroupWithProjectedOutFieldInGb",
pipeline: [
{$project: {_id: 0}},
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: "$y", a: {$min: "$x"}}},
],
usesBlockProcessing: sbeFullEnabled,
},
{
name: "GroupWithMixOfProjectedOutField",
pipeline: [
{$project: {_id: 0, x: 1}}, // y not included
{$match: {[metaFieldName]: "foo"}},
{$group: {_id: "$y", a: {$min: "$x"}}},
],
usesBlockProcessing: false,
},
{
name: "ProjectedOutCompoundGroupKeys",
pipeline: [
{$project: {t: "$t"}},
{$project: {m: "$m"}},
{$group: {_id: {t: "$t", m: "$m"}, gb: {$min: "$a"}}},
],
usesBlockProcessing: sbeFullEnabled,
},
{
name: "GroupByNull_TopAndBottomSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1, w: -1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1, w: -1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1, w: -1}, output: "$w"}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: "$w"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZAndW_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: "$w", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZAndW_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
b: {$bottom: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZAndW_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: ["$w", "$z"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {p: -1, q: 1}, output: "$p"}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: "$p"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopAndBottomSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByNull_TopNAndBottomNSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: null,
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {p: -1, q: 1}, output: "$p"}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: "$p"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopAndBottomSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByX_TopNAndBottomNSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: "$x",
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {p: -1, q: 1}, output: "$p"}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: "$p"}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByPAndQ_OutputVariable",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: "$p", n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByPAndQ_OutputOneElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopAndBottomSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$top: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
b: {$bottom: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByPAndQ_OutputTwoElemArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
b: {$bottomN: {sortBy: {p: -1, q: 1}, output: ["$p", "$q"], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZ_OutputEmptyArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1}, output: [], n: 3}},
b: {$bottomN: {sortBy: {z: 1}, output: [], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAndY_TopNAndBottomNSortByZAndW_OutputEmptyArray",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateUpperBound}}},
{
$group: {
_id: {x: "$x", y: "$y"},
a: {$topN: {sortBy: {z: 1, w: -1}, output: [], n: 3}},
b: {$bottomN: {sortBy: {z: 1, w: -1}, output: [], n: 3}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSubField",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: metaDotRegion, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSubFields",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: {region: metaDotRegion, series: metaDotSeries}, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaMultipleSubFields",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: {region: metaDotRegion, series: metaDotSeries}, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSubFieldExpression",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {region: {$ifNull: [metaDotRegion, "foo"]}, series: metaDotSeries},
a: {$min: "$x"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByIfNullAlwaysNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {gb: {$ifNull: ["$x", "$z", null]}, series: metaDotSeries},
a: {$sum: "$y"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByIfNullDifferentFinalType",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {gb: {$ifNull: ["$x", "$z", NumberDecimal(37)]}, series: metaDotSeries},
a: {$sum: "$y"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByIfNullNeverNull",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {gb: {$ifNull: ["$p", "$q", "$z"]}, series: metaDotSeries},
a: {$max: "$x"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByAccumulateIfNullSum",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: {gb: metaDotRegion}, a: {$sum: {$ifNull: ["$z", "$y", "$p"]}}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByAccumulateIfNullMinMax",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {gb: metaDotRegion},
a: {$min: {$ifNull: ["$z", 6]}},
b: {$max: {$ifNull: ["$y", "$missing", -4]}},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByAccumulateIfNullManyArgs",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {gb: metaDotRegion},
a: {
$min: {
$ifNull: [
"$z",
"$missing1",
null,
"$missing2",
"$missing3",
"$y",
"$missing1",
[1, 2, 3],
],
},
},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaNonExistent",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: metaDotNonExistent, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByExpressionOnMetaNonExistent",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: {$toLower: metaDotNonExistent}, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaAndMeasurement",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: {region: metaDotRegion, y: "$y"}, a: {$min: "$x"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByMetaSubFieldAndTime",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {
region: metaDotRegion,
time: {$dateTrunc: {date: dollarPrefixedTime, unit: "hour"}},
},
a: {$min: "$x"},
b: {$max: "$y"},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXMinOfMeta",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: "$x", a: {$min: dollarPrefixedMeta}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXMinOfMetaSubField",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: "$x", a: {$min: metaDotSeries}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXMinOfExpressionOfMeta",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: "$x", a: {$min: {$toLower: metaDotSeries}}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAvgOfMeta",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: "$x", a: {$avg: dollarPrefixedMeta}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByXAvgOfMetaSubField",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{$group: {_id: "$x", a: {$avg: metaDotSeries}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByComputedField",
pipeline: [
{
$addFields: {
computedField: {
$cond: [{$and: [{$isNumber: "$a"}, {$isNumber: "$b"}]}, {$add: ["$a", "$b"]}, null],
},
},
},
{$match: {[timeFieldName]: {$lt: dateMidPoint}, computedField: 999}},
{$group: {_id: "$computedField", a: {$min: "$y"}}},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
{
name: "GroupByWithComplexIdExpr",
pipeline: [
{$match: {[timeFieldName]: {$lt: dateMidPoint}}},
{
$group: {
_id: {$lt: [29336, {$mod: ["$b", 1.0]}]},
},
},
],
usesBlockProcessing: featureFlagsAllowBlockHashAgg,
},
];
}