summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/parsed_projection.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/parsed_projection.h')
-rw-r--r--src/mongo/db/query/parsed_projection.h198
1 files changed, 0 insertions, 198 deletions
diff --git a/src/mongo/db/query/parsed_projection.h b/src/mongo/db/query/parsed_projection.h
deleted file mode 100644
index 1d9063acf05..00000000000
--- a/src/mongo/db/query/parsed_projection.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * Copyright (C) 2018-present MongoDB, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the Server Side Public License, version 1,
- * as published by MongoDB, Inc.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * Server Side Public License for more details.
- *
- * You should have received a copy of the Server Side Public License
- * along with this program. If not, see
- * <http://www.mongodb.com/licensing/server-side-public-license>.
- *
- * As a special exception, the copyright holders give permission to link the
- * code of portions of this program with the OpenSSL library under certain
- * conditions as described in each individual source file and distribute
- * linked combinations including the program with the OpenSSL library. You
- * must comply with the Server Side Public License in all respects for
- * all of the code used other than as permitted herein. If you modify file(s)
- * with this exception, you may extend this exception to your version of the
- * file(s), but you are not obligated to do so. If you do not wish to do so,
- * delete this exception statement from your version. If you delete this
- * exception statement from all source files in the program, then also delete
- * it in the license file.
- */
-
-#pragma once
-
-#include "mongo/db/jsobj.h"
-#include "mongo/db/matcher/expression_parser.h"
-#include "mongo/util/str.h"
-
-namespace mongo {
-
-class ParsedProjection {
-public:
- // TODO: this is duplicated in here and in the proj exec code. When we have
- // ProjectionExpression we can remove dups.
- enum ArrayOpType { ARRAY_OP_NORMAL = 0, ARRAY_OP_ELEM_MATCH, ARRAY_OP_POSITIONAL };
-
- /**
- * Parses the projection 'spec' and checks its validity with respect to the query 'query'.
- * Puts covering information into 'out'.
- *
- * Returns Status::OK() if it's a valid spec.
- * Returns a Status indicating how it's invalid otherwise.
- */
- static Status make(OperationContext* opCtx,
- const BSONObj& spec,
- const MatchExpression* const query,
- ParsedProjection** out);
-
- /**
- * Returns true if the projection requires match details from the query,
- * and false otherwise.
- */
- bool requiresMatchDetails() const {
- return _requiresMatchDetails;
- }
-
- /**
- * Is the full document required to compute this projection?
- */
- bool requiresDocument() const {
- return _requiresDocument;
- }
-
- /**
- * If requiresDocument() == false, what fields are required to compute
- * the projection?
- *
- * Returned StringDatas are owned by, and have the lifetime of, the ParsedProjection.
- */
- const std::vector<StringData>& getRequiredFields() const {
- return _requiredFields;
- }
-
- /**
- * Get the raw BSONObj proj spec obj
- */
- const BSONObj& getProjObj() const {
- return _source;
- }
-
- bool wantTextScore() const {
- return _wantTextScore;
- }
-
- /**
- * Does the projection want geoNear metadata? If so any geoNear stage should include them.
- */
- bool wantGeoNearDistance() const {
- return _wantGeoNearDistance;
- }
-
- bool wantGeoNearPoint() const {
- return _wantGeoNearPoint;
- }
-
- bool wantSortKey() const {
- return _wantSortKey;
- }
-
- /**
- * Returns true if the element at 'path' is preserved entirely after this projection is applied,
- * and false otherwise. For example, the projection {a: 1} will preserve the element located at
- * 'a.b', and the projection {'a.b': 0} will not preserve the element located at 'a'.
- */
- bool isFieldRetainedExactly(StringData path) const;
-
- /**
- * Returns true if the project contains any paths with multiple path pieces (e.g. returns true
- * for {_id: 0, "a.b": 1} and returns false for {_id: 0, a: 1, b: 1}).
- */
- bool hasDottedFieldPath() const {
- return _hasDottedFieldPath;
- }
-
-private:
- /**
- * Must go through ::make
- */
- ParsedProjection() = default;
-
- /**
- * Returns true if field name refers to a positional projection.
- */
- static bool _isPositionalOperator(const char* fieldName);
-
- /**
- * Returns true if the MatchExpression 'query' queries against
- * the field named by 'matchfield'. This deeply traverses logical
- * nodes in the matchfield and returns true if any of the children
- * have the field (so if 'query' is {$and: [{a: 1}, {b: 1}]} and
- * 'matchfield' is "b", the return value is true).
- *
- * Does not take ownership of 'query'.
- */
- static bool _hasPositionalOperatorMatch(const MatchExpression* const query,
- StringData matchfield);
-
- // Track fields needed by the projection so that the query planner can perform projection
- // analysis and possibly give us a covered projection.
- //
- // StringDatas are owned by the ParsedProjection.
- //
- // The order of the fields is the order they were in the projection object.
- std::vector<StringData> _requiredFields;
-
- // _hasId determines whether the _id field of the input is included in the output.
- bool _hasId = false;
-
- // Tracks the fields that have been explicitly included and excluded, respectively, in this
- // projection.
- //
- // StringDatas are owned by the ParsedProjection.
- //
- // The ordering of the paths is the order that they appeared within the projection, and should
- // be maintained.
- std::vector<StringData> _includedFields;
- std::vector<StringData> _excludedFields;
-
- // Tracks fields referenced within the projection that are meta or array projections,
- // respectively.
- //
- // StringDatas are owned by the ParsedProjection.
- //
- // The order of the fields is not significant.
- std::vector<StringData> _metaFields;
- std::vector<StringData> _arrayFields;
-
- // Tracks whether this projection is an inclusion projection, i.e., {a: 1}, or an exclusion
- // projection, i.e., {a: 0}. The projection {_id: 0} is ambiguous but will result in this field
- // being set to false.
- bool _isInclusionProjection = false;
-
- bool _requiresMatchDetails = false;
-
- bool _requiresDocument = true;
-
- BSONObj _source;
-
- bool _wantTextScore = false;
-
- bool _wantGeoNearDistance = false;
-
- bool _wantGeoNearPoint = false;
-
- // Whether this projection includes a sortKey meta-projection.
- bool _wantSortKey = false;
-
- bool _hasDottedFieldPath = false;
-};
-
-} // namespace mongo