summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/bucket_unpacker_test.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
commit959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch)
treeacc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/exec/bucket_unpacker_test.cpp
parent76588293975fc059cf076779e4283e6ffaf8afff (diff)
New upstream version 6.0.20upstream
Diffstat (limited to 'src/mongo/db/exec/bucket_unpacker_test.cpp')
-rw-r--r--src/mongo/db/exec/bucket_unpacker_test.cpp238
1 files changed, 163 insertions, 75 deletions
diff --git a/src/mongo/db/exec/bucket_unpacker_test.cpp b/src/mongo/db/exec/bucket_unpacker_test.cpp
index 9eecea624c5..4a638467bea 100644
--- a/src/mongo/db/exec/bucket_unpacker_test.cpp
+++ b/src/mongo/db/exec/bucket_unpacker_test.cpp
@@ -170,6 +170,11 @@ public:
}
return root.obj();
}
+
+ bool computedMetaProjFieldsContainsField(std::set<std::string>& computedMetaProjFields,
+ std::string field) {
+ return computedMetaProjFields.find(field) != computedMetaProjFields.end();
+ }
};
TEST_F(BucketUnpackerTest, UnpackBasicIncludeAllMeasurementFields) {
@@ -178,7 +183,7 @@ TEST_F(BucketUnpackerTest, UnpackBasicIncludeAllMeasurementFields) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto unpacker = makeBucketUnpacker(std::move(fields),
@@ -188,11 +193,12 @@ TEST_F(BucketUnpackerTest, UnpackBasicIncludeAllMeasurementFields) {
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")});
ASSERT_FALSE(unpacker.hasNext());
}
@@ -201,7 +207,7 @@ TEST_F(BucketUnpackerTest, ExcludeASingleField) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto test = [&](BSONObj bucket) {
@@ -211,12 +217,14 @@ TEST_F(BucketUnpackerTest, ExcludeASingleField) {
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a: 2}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a: 2}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -229,7 +237,7 @@ TEST_F(BucketUnpackerTest, EmptyIncludeGetsEmptyMeasurements) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto test = [&](BSONObj bucket) {
@@ -255,7 +263,7 @@ TEST_F(BucketUnpackerTest, EmptyExcludeMaterializesAllFields) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto test = [&](BSONObj bucket) {
@@ -264,13 +272,14 @@ TEST_F(BucketUnpackerTest, EmptyExcludeMaterializesAllFields) {
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(
unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")});
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -283,7 +292,7 @@ TEST_F(BucketUnpackerTest, SparseColumnsWhereOneColumnIsExhaustedBeforeTheOther)
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1}, b:{'1':1}}}");
auto test = [&](BSONObj bucket) {
@@ -292,11 +301,13 @@ TEST_F(BucketUnpackerTest, SparseColumnsWhereOneColumnIsExhaustedBeforeTheOther)
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, b: 1}")});
+ assertGetNext(
+ unpacker,
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, b: 1}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -310,7 +321,7 @@ TEST_F(BucketUnpackerTest, UnpackBasicIncludeWithDollarPrefix) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"$a:{'0':1, '1':2}, b:{'1':1}}}");
auto test = [&](BSONObj bucket) {
@@ -319,13 +330,14 @@ TEST_F(BucketUnpackerTest, UnpackBasicIncludeWithDollarPrefix) {
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, $a: 1}")});
-
- ASSERT_TRUE(unpacker.hasNext());
assertGetNext(
unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, $a: 2, b: 1}")});
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, $a: 1}")});
+
+ ASSERT_TRUE(unpacker.hasNext());
+ assertGetNext(unpacker,
+ Document{fromjson(
+ "{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, $a: 2, b: 1}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -338,7 +350,7 @@ TEST_F(BucketUnpackerTest, BucketsWithMetadataOnly) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}}}");
+ "time: {'0':Date(1), '1':Date(2)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -347,10 +359,10 @@ TEST_F(BucketUnpackerTest, BucketsWithMetadataOnly) {
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1}")});
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1}")});
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2}")});
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -363,8 +375,8 @@ TEST_F(BucketUnpackerTest, UnorderedRowKeysDoesntAffectMaterialization) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'1':1, '0':2, '2': "
- "3}, time: {'1':1, '0': 2, "
- "'2': 3}}}");
+ "3}, time: {'1':Date(1), '0': Date(2), "
+ "'2': Date(3)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -373,15 +385,15 @@ TEST_F(BucketUnpackerTest, UnorderedRowKeysDoesntAffectMaterialization) {
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1}")});
+ Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1}")});
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2}")});
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2}")});
ASSERT_TRUE(unpacker.hasNext());
assertGetNext(unpacker,
- Document{fromjson("{time: 3, myMeta: {m1: 999, m2: 9999}, _id: 3}")});
+ Document{fromjson("{time: Date(3), myMeta: {m1: 999, m2: 9999}, _id: 3}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -393,8 +405,9 @@ TEST_F(BucketUnpackerTest, MissingMetaFieldDoesntMaterializeMetadata) {
std::set<std::string> fields{};
auto bucket = fromjson(
- "{control: {'version': 1}, data: {_id: {'0':1, '1':2, '2': 3}, time: {'0':1, '1': 2, '2': "
- "3}}}");
+ "{control: {'version': 1}, data: {_id: {'0':1, '1':2, '2': 3}, time: {'0':Date(1), '1': "
+ "Date(2), '2': "
+ "Date(3)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -402,13 +415,13 @@ TEST_F(BucketUnpackerTest, MissingMetaFieldDoesntMaterializeMetadata) {
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 1, _id: 1}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(1), _id: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 2, _id: 2}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(2), _id: 2}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 3, _id: 3}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(3), _id: 3}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -420,8 +433,9 @@ TEST_F(BucketUnpackerTest, MissingMetaFieldDoesntMaterializeMetadataUnorderedKey
std::set<std::string> fields{};
auto bucket = fromjson(
- "{control: {'version': 1}, data: {_id: {'1':1, '0':2, '2': 3}, time: {'1':1, '0': 2, '2': "
- "3}}}");
+ "{control: {'version': 1}, data: {_id: {'1':1, '0':2, '2': 3}, time: {'1':Date(1), '0': "
+ "Date(2), '2': "
+ "Date(3)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -429,13 +443,13 @@ TEST_F(BucketUnpackerTest, MissingMetaFieldDoesntMaterializeMetadataUnorderedKey
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 1, _id: 1}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(1), _id: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 2, _id: 2}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(2), _id: 2}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 3, _id: 3}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(3), _id: 3}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -448,8 +462,8 @@ TEST_F(BucketUnpackerTest, ExcludedMetaFieldDoesntMaterializeMetadataWhenBucketH
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2, '2': "
- "3}, time: {'0':1, '1': 2, "
- "'2': 3}}}");
+ "3}, time: {'0':Date(1), '1': Date(2), "
+ "'2': Date(3)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -457,13 +471,13 @@ TEST_F(BucketUnpackerTest, ExcludedMetaFieldDoesntMaterializeMetadataWhenBucketH
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 1, _id: 1}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(1), _id: 1}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 2, _id: 2}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(2), _id: 2}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 3, _id: 3}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(3), _id: 3}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -476,7 +490,7 @@ TEST_F(BucketUnpackerTest, UnpackerResetThrowsOnUndefinedMeta) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: undefined, data: {_id: {'0':1, '1':2, '2': 3}, time: "
- "{'0':1, '1': 2, '2': 3}}}");
+ "{'0':Date(1), '1': Date(2), '2': Date(3)}}}");
auto test = [&](BSONObj bucket) {
assertUnpackerThrowsCode(fields,
@@ -495,8 +509,8 @@ TEST_F(BucketUnpackerTest, UnpackerResetThrowsOnUnexpectedMeta) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2, '2': "
- "3}, time: {'0':1, '1': 2, "
- "'2': 3}}}");
+ "3}, time: {'0':Date(1), '1': Date(2), "
+ "'2': Date(3)}}}");
auto test = [&](BSONObj bucket) {
assertUnpackerThrowsCode(fields,
@@ -514,8 +528,9 @@ TEST_F(BucketUnpackerTest, NullMetaInBucketMaterializesAsNull) {
std::set<std::string> fields{};
auto bucket = fromjson(
- "{control: {'version': 1}, meta: null, data: {_id: {'0':4, '1':5, '2':6}, time: {'0':4, "
- "'1': 5, '2': 6}}}");
+ "{control: {'version': 1}, meta: null, data: {_id: {'0':4, '1':5, '2':6}, time: "
+ "{'0':Date(4), "
+ "'1': Date(5), '2': Date(6)}}}");
auto test = [&](BSONObj bucket) {
auto unpacker = makeBucketUnpacker(fields,
@@ -523,13 +538,13 @@ TEST_F(BucketUnpackerTest, NullMetaInBucketMaterializesAsNull) {
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 4, myMeta: null, _id: 4}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(4), myMeta: null, _id: 4}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 5, myMeta: null, _id: 5}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(5), myMeta: null, _id: 5}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 6, myMeta: null, _id: 6}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(6), myMeta: null, _id: 6}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -545,7 +560,7 @@ TEST_F(BucketUnpackerTest, GetNextHandlesMissingMetaInBucket) {
control: {version: 1},
data: {
_id: {'0':4, '1':5, '2':6},
- time: {'0':4, '1': 5, '2': 6}
+ time: {'0':Date(4), '1': Date(5), '2': Date(6)}
}
})");
@@ -555,13 +570,13 @@ TEST_F(BucketUnpackerTest, GetNextHandlesMissingMetaInBucket) {
std::move(bucket),
kUserDefinedMetaName.toString());
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 4, _id: 4}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(4), _id: 4}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 5, _id: 5}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(5), _id: 5}")});
ASSERT_TRUE(unpacker.hasNext());
- assertGetNext(unpacker, Document{fromjson("{time: 6, _id: 6}")});
+ assertGetNext(unpacker, Document{fromjson("{time: Date(6), _id: 6}")});
ASSERT_FALSE(unpacker.hasNext());
};
@@ -606,7 +621,7 @@ TEST_F(BucketUnpackerTest, EraseMetaFromFieldSetAndDetermineIncludeMeta) {
control: {version: 1},
data: {
_id: {'0':4, '1':5, '2':6},
- time: {'0':4, '1': 5, '2': 6}
+ time: {'0':Date(4), '1': Date(5), '2': Date(6)}
}
})");
auto unpacker = makeBucketUnpacker(empFields,
@@ -659,13 +674,83 @@ TEST_F(BucketUnpackerTest, EraseMetaFromFieldSetAndDetermineIncludeMeta) {
ASSERT_FALSE(unpacker.includeMetaField());
}
+TEST_F(BucketUnpackerTest, EraseUnneededComputedMetaProjFieldsWithInclusiveProject) {
+ auto bucket = fromjson(R"(
+{
+ control: {version: 1},
+ data: {
+ _id: {'0':4, '1':5, '2':6},
+ time: {'0':Date(4), '1': Date(5), '2': Date(6)}
+ }
+})");
+ std::set<std::string> unpackerFields{kUserDefinedTimeName.toString()};
+ auto unpacker = makeBucketUnpacker(unpackerFields,
+ BucketSpec::Behavior::kInclude,
+ std::move(bucket),
+ kUserDefinedMetaName.toString());
+
+ // Add fields to '_computedMetaProjFields'.
+ unpacker.addComputedMetaProjFields({"hello"_sd, "bye"_sd});
+ auto computedMetaProjFields = unpacker.bucketSpec().computedMetaProjFields();
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "hello"));
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "bye"));
+
+ auto spec = unpacker.bucketSpec();
+ std::set<std::string> includeFields{kUserDefinedTimeName.toString(), "bye"};
+ spec.setFieldSet(includeFields);
+ spec.setBehavior(BucketSpec::Behavior::kInclude);
+
+ // This calls eraseUnneededComputedMetaProjFields().
+ unpacker.setBucketSpec(std::move(spec));
+ computedMetaProjFields = unpacker.bucketSpec().computedMetaProjFields();
+ // As "hello" was not in the includes, it should be removed.
+ ASSERT_FALSE(computedMetaProjFieldsContainsField(computedMetaProjFields, "hello"));
+ // As "bye" was in the includes, it should still be in '_computedMetaProjFields'.
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "bye"));
+}
+
+TEST_F(BucketUnpackerTest, EraseUnneededComputedMetaProjFieldsWithExclusiveProject) {
+ auto bucket = fromjson(R"(
+{
+ control: {version: 1},
+ data: {
+ _id: {'0':4, '1':5, '2':6},
+ time: {'0':Date(4), '1': Date(5), '2': Date(6)}
+ }
+})");
+ std::set<std::string> unpackerFields{kUserDefinedTimeName.toString()};
+ auto unpacker = makeBucketUnpacker(unpackerFields,
+ BucketSpec::Behavior::kInclude,
+ std::move(bucket),
+ kUserDefinedMetaName.toString());
+
+ // Add fields to '_computedMetaProjFields'.
+ unpacker.addComputedMetaProjFields({"hello"_sd, "bye"_sd});
+ auto computedMetaProjFields = unpacker.bucketSpec().computedMetaProjFields();
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "hello"));
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "bye"));
+
+ auto spec = unpacker.bucketSpec();
+ std::set<std::string> excludeFields{kUserDefinedTimeName.toString(), "bye"};
+ spec.setFieldSet(excludeFields);
+ spec.setBehavior(BucketSpec::Behavior::kExclude);
+
+ // This calls eraseUnneededComputedMetaProjFields().
+ unpacker.setBucketSpec(std::move(spec));
+ computedMetaProjFields = unpacker.bucketSpec().computedMetaProjFields();
+ // As "hello" was not excluded, it should still exist.
+ ASSERT_TRUE(computedMetaProjFieldsContainsField(computedMetaProjFields, "hello"));
+ // As "bye" was in the excludes, it should be removed from '_computedMetaProjFields'.
+ ASSERT_FALSE(computedMetaProjFieldsContainsField(computedMetaProjFields, "bye"));
+}
+
TEST_F(BucketUnpackerTest, DetermineIncludeTimeField) {
auto bucket = fromjson(R"(
{
control: {version: 1},
data: {
_id: {'0':4, '1':5, '2':6},
- time: {'0':4, '1': 5, '2': 6}
+ time: {'0':Date(4), '1': Date(5), '2': Date(6)}
}
})");
std::set<std::string> unpackerFields{kUserDefinedTimeName.toString()};
@@ -900,7 +985,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountLess) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto compressedBucket =
@@ -913,8 +998,9 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountLess) {
std::move(modifiedCompressedBucket),
kUserDefinedMetaName.toString());
- auto doc0 = Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
- auto doc1 = Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
+ auto doc0 = Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
+ auto doc1 =
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
// 1 is reported when asking for numberOfMeasurements()
ASSERT_EQ(unpacker.numberOfMeasurements(), 1);
@@ -935,7 +1021,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountMore) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto compressedBucket =
@@ -948,8 +1034,9 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountMore) {
std::move(modifiedCompressedBucket),
kUserDefinedMetaName.toString());
- auto doc0 = Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
- auto doc1 = Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
+ auto doc0 = Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
+ auto doc1 =
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
ASSERT_EQ(unpacker.numberOfMeasurements(), 3);
ASSERT_DOCUMENT_EQ(unpacker.extractSingleMeasurement(0), doc0);
@@ -970,7 +1057,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountMissing) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto compressedBucket =
@@ -983,8 +1070,9 @@ TEST_F(BucketUnpackerTest, TamperedCompressedCountMissing) {
std::move(modifiedCompressedBucket),
kUserDefinedMetaName.toString());
- auto doc0 = Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
- auto doc1 = Document{fromjson("{time: 2, myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
+ auto doc0 = Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
+ auto doc1 =
+ Document{fromjson("{time: Date(2), myMeta: {m1: 999, m2: 9999}, _id: 2, a :2, b: 1}")};
// Missing count field will make the unpacker measure the number of time fields for an accurate
// count
@@ -1006,7 +1094,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedElementMismatchDataField) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto compressedBucket =
@@ -1020,7 +1108,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedElementMismatchDataField) {
std::move(modifiedCompressedBucket),
kUserDefinedMetaName.toString());
- auto doc0 = Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
+ auto doc0 = Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
ASSERT_EQ(unpacker.numberOfMeasurements(), 2);
ASSERT_DOCUMENT_EQ(unpacker.extractSingleMeasurement(0), doc0);
@@ -1041,7 +1129,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedElementMismatchTimeField) {
auto bucket = fromjson(
"{control: {'version': 1}, meta: {'m1': 999, 'm2': 9999}, data: {_id: {'0':1, '1':2}, "
- "time: {'0':1, '1':2}, "
+ "time: {'0':Date(1), '1':Date(2)}, "
"a:{'0':1, '1':2}, b:{'1':1}}}");
auto compressedBucket =
@@ -1055,7 +1143,7 @@ TEST_F(BucketUnpackerTest, TamperedCompressedElementMismatchTimeField) {
std::move(modifiedCompressedBucket),
kUserDefinedMetaName.toString());
- auto doc0 = Document{fromjson("{time: 1, myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
+ auto doc0 = Document{fromjson("{time: Date(1), myMeta: {m1: 999, m2: 9999}, _id: 1, a: 1}")};
ASSERT_EQ(unpacker.numberOfMeasurements(), 2);
ASSERT_DOCUMENT_EQ(unpacker.extractSingleMeasurement(0), doc0);