diff options
Diffstat (limited to 'jstests/aggregation/sources/densify/explicit_range.js')
| -rw-r--r-- | jstests/aggregation/sources/densify/explicit_range.js | 92 |
1 files changed, 30 insertions, 62 deletions
diff --git a/jstests/aggregation/sources/densify/explicit_range.js b/jstests/aggregation/sources/densify/explicit_range.js index a2c2edd92f7..842ae79d5bf 100644 --- a/jstests/aggregation/sources/densify/explicit_range.js +++ b/jstests/aggregation/sources/densify/explicit_range.js @@ -16,77 +16,66 @@ coll.drop(); // Run all tests for each date unit and on numeric values. for (let i = 0; i < densifyUnits.length; i++) { - coll.drop(); - const unit = densifyUnits[i]; + coll.drop(); const base = unit ? new ISODate("2021-01-01") : 0; const {add} = getArithmeticFunctionsForUnit(unit); - const getBounds = (lower, upper) => { - return [add(base, lower), add(base, upper)]; - }; + const runDensifyRangeTest = ({step, bounds}, msg) => testDensifyStage({ + field: "val", + range: {step, bounds: [add(base, bounds[0]), add(base, bounds[1])], unit: unit} + }, + coll, + msg); // Run all tests for different step values. for (let i = 0; i < interestingSteps.length; i++) { const step = interestingSteps[i]; - // Generate documents in an empty collection. - let stage = {field: "val", range: {step: step, bounds: getBounds(0, 10), unit: unit}}; - testDensifyStage(stage, coll); + runDensifyRangeTest({step, bounds: [0, 10]}); // Fill in some documents between existing docs. coll.drop(); coll.insert({val: base}); - coll.insert({val: add(base, 30)}); - // Checking that the upper bound is exclusive. - stage = {field: "val", range: {step: step, bounds: getBounds(10, 25), unit: unit}}; - testDensifyStage(stage, coll); + coll.insert({val: add(base, 99)}); + runDensifyRangeTest( + {step, bounds: [10, 25]}); // Checking that the upper bound is exclusive. // Fill in odd documents. coll.drop(); - insertDocumentsOnStep({base, min: 2, max: 11, step: 2, addFunc: add, coll: coll}); - - stage = {field: "val", range: {step: step, bounds: getBounds(1, 12), unit: unit}}; - testDensifyStage(stage, coll); - stage = {field: "val", range: {step: step, bounds: getBounds(1, 11), unit: unit}}; - testDensifyStage(stage, coll); - stage = {field: "val", range: {step: step, bounds: getBounds(1, 10), unit: unit}}; - testDensifyStage(stage, coll); + insertDocumentsOnStep({base, min: 2, max: 21, step: 2, addFunc: add, coll: coll}); + runDensifyRangeTest({step, bounds: [1, 22]}); + runDensifyRangeTest({step, bounds: [1, 21]}); + runDensifyRangeTest({step, bounds: [1, 20]}); // Negative numbers. coll.drop(); - insertDocumentsOnStep({base, min: -20, max: -1, step: 2, addFunc: add, coll: coll}); - stage = {field: "val", range: {step: step, bounds: getBounds(-10, -1), unit: unit}}; - testDensifyStage(stage, coll); - stage = {field: "val", range: {step: step, bounds: getBounds(-10, 0), unit: unit}}; - testDensifyStage(stage, coll); - stage = {field: "val", range: {step: step, bounds: getBounds(-10, -2), unit: unit}}; - testDensifyStage(stage, coll); + insertDocumentsOnStep({base, min: -100, max: -1, step: 2, addFunc: add, coll: coll}); + runDensifyRangeTest({step, bounds: [-40, -5]}); + runDensifyRangeTest({step, bounds: [-60, 0]}); + runDensifyRangeTest({step, bounds: [-40, -6]}); // Extend range past collection. coll.drop(); - insertDocumentsOnStep({base, min: 0, max: 10, step: 3, addFunc: add, coll: coll}); - stage = {field: "val", range: {step: step, bounds: getBounds(5, 15), unit: unit}}; - testDensifyStage(stage, coll); + insertDocumentsOnStep({base, min: 0, max: 50, step: 3, addFunc: add, coll: coll}); + runDensifyRangeTest({step, bounds: [30, 75]}); // Start range before collection. coll.drop(); - insertDocumentsOnStep({base, min: 20, max: 30, step: 2, addFunc: add, coll: coll}); - stage = {field: "val", range: {step: step, bounds: getBounds(10, 25), unit: unit}}; - testDensifyStage(stage, coll); + insertDocumentsOnStep({base, min: 20, max: 40, step: 2, addFunc: add, coll: coll}); + runDensifyRangeTest({step, bounds: [10, 25]}); // Extend range in both directions past collection bounds. coll.drop(); - insertDocumentsOnStep({base, min: 20, max: 30, step: 2, addFunc: add, coll: coll}); - stage = {field: "val", range: {step: step, bounds: getBounds(10, 35), unit: unit}}; - testDensifyStage(stage, coll); + insertDocumentsOnStep({base, min: 20, max: 40, step: 2, addFunc: add, coll: coll}); + runDensifyRangeTest({step, bounds: [10, 45]}); // Different off-step documents. coll.drop(); insertDocumentsOnPredicate( - {base, min: 0, max: 25, pred: i => i % 3 == 0 || i % 7 == 0, addFunc: add, coll: coll}); - stage = {field: "val", range: {step: step, bounds: getBounds(10, 20), unit: unit}}; - testDensifyStage(stage, coll); + {base, min: 0, max: 50, pred: i => i % 3 == 0 || i % 7 == 0, addFunc: add, coll: coll}); + + runDensifyRangeTest({step, bounds: [10, 45]}); // Lots of off-step documents with nulls sprinkled in to confirm that a null value is // treated the same as a missing value. @@ -107,33 +96,12 @@ for (let i = 0; i < densifyUnits.length; i++) { insertDocumentsOnPredicate({ base, min: 20, - max: 30, + max: 50, pred: i => i % 3 == 0 || i % 7 == 0, addFunc: add, coll: coll }); - stage = {field: "val", range: {step: step, bounds: getBounds(10, 25), unit: unit}}; - testDensifyStage(stage, coll); + runDensifyRangeTest({step, bounds: [10, 45]}); } } - -// Run a test where there are no documents in the range to ensure we don't generate anything before -// the range. -coll.drop(); -let documents = [ - {"date": ISODate("2022-10-29T23:00:00Z")}, -]; -coll.insert(documents); -let stage = { - field: "date", - range: { - step: 1, - unit: "month", - bounds: [ - ISODate("2022-10-31T23:00:00.000Z"), - ISODate("2022-11-30T23:00:00.000Z"), - ], - }, -}; -testDensifyStage(stage, coll, "Ensure no docs before range"); })(); |
