diff options
Diffstat (limited to 'src/mongo/db/query')
-rw-r--r-- | src/mongo/db/query/get_executor_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/query/index_entry.h | 6 | ||||
-rw-r--r-- | src/mongo/db/query/projection_parser.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/query/projection_policies.h | 33 | ||||
-rw-r--r-- | src/mongo/db/query/query_planner.cpp | 2 |
5 files changed, 35 insertions, 10 deletions
diff --git a/src/mongo/db/query/get_executor_test.cpp b/src/mongo/db/query/get_executor_test.cpp index aca45d23026..431430259e8 100644 --- a/src/mongo/db/query/get_executor_test.cpp +++ b/src/mongo/db/query/get_executor_test.cpp @@ -37,9 +37,9 @@ #include <string> #include "mongo/bson/simple_bsonobj_comparator.h" +#include "mongo/db/exec/index_path_projection.h" #include "mongo/db/exec/projection_executor.h" #include "mongo/db/exec/projection_executor_builder.h" -#include "mongo/db/exec/wildcard_projection.h" #include "mongo/db/json.h" #include "mongo/db/pipeline/expression_context_for_test.h" #include "mongo/db/query/projection_parser.h" diff --git a/src/mongo/db/query/index_entry.h b/src/mongo/db/query/index_entry.h index 6f69d388c9d..40313fdfed6 100644 --- a/src/mongo/db/query/index_entry.h +++ b/src/mongo/db/query/index_entry.h @@ -43,7 +43,8 @@ namespace mongo { class CollatorInterface; class MatchExpression; -class WildcardProjection; +class IndexPathProjection; +using WildcardProjection = IndexPathProjection; /** * A CoreIndexInfo is a representation of an index in the catalog with parsed information which is @@ -69,6 +70,7 @@ struct CoreIndexInfo { collator(ci), wildcardProjection(wildcardProj) { // We always expect a projection executor for $** indexes, and none otherwise. + // TODO SERVER-67140: Add columnstoreProjection and invariant invariant((type == IndexType::INDEX_WILDCARD) == (wildcardProjection != nullptr)); } @@ -262,7 +264,7 @@ struct ColumnIndexEntry { std::string catalogName; - // TODO SERVER-63123: Projection, probably need some kind of disambiguator. + // TODO SERVER-67140: Projection, probably need some kind of disambiguator. }; std::ostream& operator<<(std::ostream& stream, const IndexEntry::Identifier& ident); diff --git a/src/mongo/db/query/projection_parser.cpp b/src/mongo/db/query/projection_parser.cpp index 7110775621d..e093d840d9f 100644 --- a/src/mongo/db/query/projection_parser.cpp +++ b/src/mongo/db/query/projection_parser.cpp @@ -592,7 +592,7 @@ Projection parseAndAnalyze(boost::intrusive_ptr<ExpressionContext> expCtx, const BSONObj& queryObj, ProjectionPolicies policies, bool shouldOptimize) { - if (!policies.findOnlyFeaturesAllowed()) { + if (!policies.emptyProjectionAllowed()) { // In agg-style syntax it is illegal to have an empty projection specification. uassert(51272, "projection specification must have at least one field", !obj.isEmpty()); } 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 diff --git a/src/mongo/db/query/query_planner.cpp b/src/mongo/db/query/query_planner.cpp index 6f37288e733..83cc6617d44 100644 --- a/src/mongo/db/query/query_planner.cpp +++ b/src/mongo/db/query/query_planner.cpp @@ -218,7 +218,7 @@ void tryToAddColumnScan(const QueryPlannerParams& params, return; } - // TODO SERVER-63123: Check if the columnar index actually provides the fields we need. + // TODO SERVER-67140: Check if the columnar index actually provides the fields we need. std::unique_ptr<MatchExpression> residualPredicate; StringMap<std::unique_ptr<MatchExpression>> filterSplitByColumn; if (params.options & QueryPlannerParams::GENERATE_PER_COLUMN_FILTERS) { |