summaryrefslogtreecommitdiff
path: root/src/mongo/db/query
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query')
-rw-r--r--src/mongo/db/query/get_executor_test.cpp2
-rw-r--r--src/mongo/db/query/index_entry.h6
-rw-r--r--src/mongo/db/query/projection_parser.cpp2
-rw-r--r--src/mongo/db/query/projection_policies.h33
-rw-r--r--src/mongo/db/query/query_planner.cpp2
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) {