summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/projection_policies.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/projection_policies.h')
-rw-r--r--src/mongo/db/query/projection_policies.h33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/mongo/db/query/projection_policies.h b/src/mongo/db/query/projection_policies.h
index 09094227c86..1e9214f2515 100644
--- a/src/mongo/db/query/projection_policies.h
+++ b/src/mongo/db/query/projection_policies.h
@@ -55,6 +55,9 @@ struct ProjectionPolicies {
// Whether $elemMatch, find() $slice and positional projection are allowed.
enum class FindOnlyFeaturesPolicy { kBanFindOnlyFeatures, kAllowFindOnlyFeatures };
+ // Whether the empty projection, {}, is permitted.
+ enum class EmptyProjectionPolicy { kBanEmptyProjection, kAllowEmptyProjection };
+
static const DefaultIdPolicy kDefaultIdPolicyDefault = DefaultIdPolicy::kIncludeId;
static const ArrayRecursionPolicy kArrayRecursionPolicyDefault =
ArrayRecursionPolicy::kRecurseNestedArrays;
@@ -62,46 +65,66 @@ struct ProjectionPolicies {
ComputedFieldsPolicy::kAllowComputedFields;
static const FindOnlyFeaturesPolicy kFindOnlyFeaturesPolicyDefault =
FindOnlyFeaturesPolicy::kBanFindOnlyFeatures;
+ static const EmptyProjectionPolicy kEmptyProjectionPolicyDefault =
+ EmptyProjectionPolicy::kBanEmptyProjection;
static ProjectionPolicies findProjectionPolicies() {
return ProjectionPolicies{kDefaultIdPolicyDefault,
kArrayRecursionPolicyDefault,
kComputedFieldsPolicyDefault,
- FindOnlyFeaturesPolicy::kAllowFindOnlyFeatures};
+ FindOnlyFeaturesPolicy::kAllowFindOnlyFeatures,
+ EmptyProjectionPolicy::kAllowEmptyProjection};
}
static ProjectionPolicies aggregateProjectionPolicies() {
return ProjectionPolicies{kDefaultIdPolicyDefault,
kArrayRecursionPolicyDefault,
kComputedFieldsPolicyDefault,
- FindOnlyFeaturesPolicy::kBanFindOnlyFeatures};
+ FindOnlyFeaturesPolicy::kBanFindOnlyFeatures,
+ kEmptyProjectionPolicyDefault};
}
static ProjectionPolicies wildcardIndexSpecProjectionPolicies() {
return ProjectionPolicies{DefaultIdPolicy::kExcludeId,
ArrayRecursionPolicy::kDoNotRecurseNestedArrays,
ComputedFieldsPolicy::kBanComputedFields,
- FindOnlyFeaturesPolicy::kBanFindOnlyFeatures};
+ FindOnlyFeaturesPolicy::kBanFindOnlyFeatures,
+ kEmptyProjectionPolicyDefault};
+ }
+
+ static ProjectionPolicies columnStoreIndexSpecProjectionPolicies() {
+ return ProjectionPolicies{kDefaultIdPolicyDefault,
+ ArrayRecursionPolicy::kDoNotRecurseNestedArrays,
+ ComputedFieldsPolicy::kBanComputedFields,
+ FindOnlyFeaturesPolicy::kBanFindOnlyFeatures,
+ EmptyProjectionPolicy::kAllowEmptyProjection};
}
ProjectionPolicies(
DefaultIdPolicy idPolicy = kDefaultIdPolicyDefault,
ArrayRecursionPolicy arrayRecursionPolicy = kArrayRecursionPolicyDefault,
ComputedFieldsPolicy computedFieldsPolicy = kComputedFieldsPolicyDefault,
- FindOnlyFeaturesPolicy findOnlyFeaturesPolicy = kFindOnlyFeaturesPolicyDefault)
+ FindOnlyFeaturesPolicy findOnlyFeaturesPolicy = kFindOnlyFeaturesPolicyDefault,
+ EmptyProjectionPolicy emptyProjectionPolicy = kEmptyProjectionPolicyDefault)
: idPolicy(idPolicy),
arrayRecursionPolicy(arrayRecursionPolicy),
computedFieldsPolicy(computedFieldsPolicy),
- findOnlyFeaturesPolicy(findOnlyFeaturesPolicy) {}
+ findOnlyFeaturesPolicy(findOnlyFeaturesPolicy),
+ emptyProjectionPolicy(emptyProjectionPolicy) {}
const DefaultIdPolicy idPolicy;
const ArrayRecursionPolicy arrayRecursionPolicy;
const ComputedFieldsPolicy computedFieldsPolicy;
const FindOnlyFeaturesPolicy findOnlyFeaturesPolicy;
+ const EmptyProjectionPolicy emptyProjectionPolicy;
bool findOnlyFeaturesAllowed() const {
return findOnlyFeaturesPolicy == FindOnlyFeaturesPolicy::kAllowFindOnlyFeatures;
}
+
+ bool emptyProjectionAllowed() const {
+ return emptyProjectionPolicy == EmptyProjectionPolicy::kAllowEmptyProjection;
+ }
};
} // namespace mongo