diff options
Diffstat (limited to 'src/mongo/db/exec/projection_exec.h')
-rw-r--r-- | src/mongo/db/exec/projection_exec.h | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/src/mongo/db/exec/projection_exec.h b/src/mongo/db/exec/projection_exec.h deleted file mode 100644 index 784fe2fb209..00000000000 --- a/src/mongo/db/exec/projection_exec.h +++ /dev/null @@ -1,261 +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 "boost/optional.hpp" - -#include "mongo/db/exec/document_value/value.h" -#include "mongo/db/exec/working_set.h" -#include "mongo/db/jsobj.h" -#include "mongo/db/matcher/expression.h" -#include "mongo/db/matcher/expression_parser.h" -#include "mongo/util/string_map.h" - -namespace mongo { - -class CollatorInterface; - -/** - * A fully-featured executor for find projection. - */ -class ProjectionExec { -public: - /** - * A .find() projection can have an array operation, either an elemMatch or positional (or - * neither). - */ - enum ArrayOpType { ARRAY_OP_NORMAL = 0, ARRAY_OP_ELEM_MATCH, ARRAY_OP_POSITIONAL }; - - /** - * Projections based on data computed while answering a query, or other metadata about a - * document / query. - */ - enum MetaProjection { - META_GEONEAR_DIST, - META_GEONEAR_POINT, - META_RECORDID, - META_SORT_KEY, - META_TEXT_SCORE, - }; - - /** - * TODO: document why we like StringMap so much here - */ - typedef StringMap<ProjectionExec*> FieldMap; - typedef StringMap<MatchExpression*> Matchers; - typedef StringMap<MetaProjection> MetaMap; - - ProjectionExec(OperationContext* opCtx, - const BSONObj& spec, - const MatchExpression* queryExpression, - const CollatorInterface* collator); - - ~ProjectionExec(); - - /** - * Indicates whether 'sortKey' must be provided for 'computeReturnKeyProjection()' or - * 'project()'. - */ - bool needsSortKey() const { - return _needsSortKey; - } - - /** - * Indicates whether 'geoDistance' must be provided for 'project()'. - */ - bool needsGeoNearDistance() const { - return _needsGeoNearDistance; - } - - /** - * Indicates whether 'geoNearPoint' must be provided for 'project()'. - */ - bool needsGeoNearPoint() const { - return _needsGeoNearPoint; - } - - /** - * Indicates whether 'textScore' is going to be used in 'project()'. - */ - bool needsTextScore() const { - return _needsTextScore; - } - - /** - * Returns false if there are no meta fields to project. - */ - bool hasMetaFields() const { - return !_meta.empty(); - } - - /** - * Performs a projection given a BSONObj source. Meta fields must be provided if necessary. - * Their necessity can be queried via the 'needs*' functions. - */ - StatusWith<BSONObj> project(const BSONObj& in, - const boost::optional<const double> geoDistance = boost::none, - Value geoNearPoint = Value{}, - const BSONObj& sortKey = BSONObj(), - const boost::optional<const double> textScore = boost::none, - const int64_t recordId = 0) const; - - /** - * Performs a projection given index 'KeyData' to directly retrieve results. This function - * handles projections which do not qualify for the ProjectionNodeCovered fast-path but are - * still covered by indices. - */ - StatusWith<BSONObj> projectCovered( - const std::vector<IndexKeyDatum>& keyData, - const boost::optional<const double> geoDistance = boost::none, - Value geoNearPoint = Value{}, - const BSONObj& sortKey = BSONObj(), - const boost::optional<const double> textScore = boost::none, - const int64_t recordId = 0) const; - - /** - * Determines if calls to the project method require that this object was created with the full - * query expression. We may need it for MatchDetails. - */ - bool projectRequiresQueryExpression() const { - return ARRAY_OP_POSITIONAL == _arrayOpType; - } - - -private: - /** - * Adds meta fields to the end of a projection. - */ - BSONObj addMeta(BSONObjBuilder bob, - const boost::optional<const double> geoDistance, - Value geoNearPoint, - const BSONObj& sortKey, - const boost::optional<const double> textScore, - const int64_t recordId) const; - - // - // Initialization - // - - ProjectionExec() = default; - - /** - * Add 'field' as a field name that is included or excluded as part of the projection. - */ - void add(const std::string& field, bool include); - - /** - * Add 'field' as a field name that is sliced as part of the projection. - */ - void add(const std::string& field, int skip, int limit); - - // - // Execution - // - - /** - * Apply the projection that 'this' represents to the object 'in'. 'details' is the result - * of a match evaluation of the full query on the object 'in'. This is only required - * if the projection is positional. - * - * If the projection is successfully computed, returns Status::OK() and stuff the result in - * 'bob'. - * Otherwise, returns error. - */ - Status projectHelper(const BSONObj& in, - BSONObjBuilder* bob, - const MatchDetails* details = nullptr) const; - - /** - * Appends the element 'e' to the builder 'bob', possibly descending into sub-fields of 'e' - * if needed. - */ - Status append(BSONObjBuilder* bob, - const BSONElement& elt, - const MatchDetails* details = nullptr, - const ArrayOpType arrayOpType = ARRAY_OP_NORMAL) const; - - /** - * Like append, but for arrays. - * Deals with slice and calls appendArray to preserve the array-ness. - */ - void appendArray(BSONObjBuilder* bob, const BSONObj& array, bool nested = false) const; - - // True if default at this level is to include. - bool _include = true; - - // True if this level can't be skipped or included without recursing. - bool _special = false; - - // We must group projections with common prefixes together. - // TODO: benchmark std::vector<pair> vs map - // - // Projection is a rooted tree. If we have {a.b: 1, a.c: 1} we don't want to - // double-traverse the document when we're projecting it. Instead, we have an entry in - // _fields for 'a' with two sub projections: b:1 and c:1. - FieldMap _fields; - - // The raw projection spec. that is passed into init(...) - BSONObj _source; - - // Should we include the _id field? - bool _includeID = true; - - // Arguments from the $slice operator. - int _skip = 0; - int _limit = -1; - - // Used for $elemMatch and positional operator ($) - Matchers _matchers; - - // The matchers above point into BSONObjs and this is where those objs live. - std::vector<BSONObj> _elemMatchObjs; - - ArrayOpType _arrayOpType = ARRAY_OP_NORMAL; - - // The full query expression. Used when we need MatchDetails. - const MatchExpression* _queryExpression = nullptr; - - // Projections that aren't sourced from the document or index keys. - MetaMap _meta; - - // After parsing in the constructor, these fields will indicate the neccesity of metadata - // for $meta projection. - bool _needsSortKey = false; - bool _needsGeoNearDistance = false; - bool _needsGeoNearPoint = false; - bool _needsTextScore = false; - - // The collator this projection should use to compare strings. Needed for projection operators - // that perform matching (e.g. elemMatch projection). If null, the collation is a simple binary - // compare. - const CollatorInterface* _collator = nullptr; -}; - -} // namespace mongo |