Files
mongo/jstests/libs/query/block_processing_test_cases.js
Nick Zolnierz 668a6f4e9e SERVER-94971 Add query ownership for files under jstests/libs (#27763)
GitOrigin-RevId: 1cd8a1cdb3d45876003ad3ccddd4d466cd9fb66c
2024-10-03 16:08:45 +00:00

1954 lines
73 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
},
];
}