summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/mongo_process_interface.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/mongo_process_interface.h')
-rw-r--r--src/mongo/db/pipeline/mongo_process_interface.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/mongo_process_interface.h b/src/mongo/db/pipeline/mongo_process_interface.h
new file mode 100644
index 00000000000..d32e8276c63
--- /dev/null
+++ b/src/mongo/db/pipeline/mongo_process_interface.h
@@ -0,0 +1,210 @@
+/**
+ * Copyright (C) 2017 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * 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 GNU Affero General 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/intrusive_ptr.hpp>
+#include <boost/optional.hpp>
+#include <list>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "mongo/client/dbclientinterface.h"
+#include "mongo/db/collection_index_usage_tracker.h"
+#include "mongo/db/generic_cursor.h"
+#include "mongo/db/namespace_string.h"
+#include "mongo/db/pipeline/document.h"
+#include "mongo/db/pipeline/field_path.h"
+#include "mongo/db/pipeline/lite_parsed_document_source.h"
+#include "mongo/db/pipeline/value.h"
+#include "mongo/db/query/explain_options.h"
+
+namespace mongo {
+
+class ExpressionContext;
+class Pipeline;
+class PipelineDeleter;
+
+/**
+ * Any functionality needed by an aggregation stage that is either context specific to a mongod or
+ * mongos process, or is only compiled in to one of those two binaries must be accessed via this
+ * interface. This allows all DocumentSources to be parsed on either mongos or mongod, but only
+ * executable where it makes sense.
+ */
+class MongoProcessInterface {
+public:
+ enum class CurrentOpConnectionsMode { kIncludeIdle, kExcludeIdle };
+ enum class CurrentOpUserMode { kIncludeAll, kExcludeOthers };
+ enum class CurrentOpTruncateMode { kNoTruncation, kTruncateOps };
+
+ struct MakePipelineOptions {
+ MakePipelineOptions(){};
+
+ bool optimize = true;
+ bool attachCursorSource = true;
+ };
+
+ virtual ~MongoProcessInterface(){};
+
+ /**
+ * Sets the OperationContext of the DBDirectClient returned by directClient(). This method must
+ * be called after updating the 'opCtx' member of the ExpressionContext associated with the
+ * document source.
+ */
+ virtual void setOperationContext(OperationContext* opCtx) = 0;
+
+ /**
+ * Always returns a DBDirectClient. The return type in the function signature is a DBClientBase*
+ * because DBDirectClient isn't linked into mongos.
+ */
+ virtual DBClientBase* directClient() = 0;
+
+ /**
+ * Note that in some rare cases this could return a false negative but will never return a false
+ * positive. This method will be fixed in the future once it becomes possible to avoid false
+ * negatives.
+ */
+ virtual bool isSharded(OperationContext* opCtx, const NamespaceString& ns) = 0;
+
+ /**
+ * Inserts 'objs' into 'ns' and returns the "detailed" last error object.
+ */
+ virtual BSONObj insert(const boost::intrusive_ptr<ExpressionContext>& expCtx,
+ const NamespaceString& ns,
+ const std::vector<BSONObj>& objs) = 0;
+
+ virtual CollectionIndexUsageMap getIndexStats(OperationContext* opCtx,
+ const NamespaceString& ns) = 0;
+
+ /**
+ * Appends operation latency statistics for collection "nss" to "builder"
+ */
+ virtual void appendLatencyStats(OperationContext* opCtx,
+ const NamespaceString& nss,
+ bool includeHistograms,
+ BSONObjBuilder* builder) const = 0;
+
+ /**
+ * Appends storage statistics for collection "nss" to "builder"
+ */
+ virtual Status appendStorageStats(OperationContext* opCtx,
+ const NamespaceString& nss,
+ const BSONObj& param,
+ BSONObjBuilder* builder) const = 0;
+
+ /**
+ * Appends the record count for collection "nss" to "builder".
+ */
+ virtual Status appendRecordCount(OperationContext* opCtx,
+ const NamespaceString& nss,
+ BSONObjBuilder* builder) const = 0;
+
+ /**
+ * Gets the collection options for the collection given by 'nss'.
+ */
+ virtual BSONObj getCollectionOptions(const NamespaceString& nss) = 0;
+
+ /**
+ * Performs the given rename command if the collection given by 'targetNs' has the same options
+ * as specified in 'originalCollectionOptions', and has the same indexes as 'originalIndexes'.
+ */
+ virtual Status renameIfOptionsAndIndexesHaveNotChanged(
+ OperationContext* opCtx,
+ const BSONObj& renameCommandObj,
+ const NamespaceString& targetNs,
+ const BSONObj& originalCollectionOptions,
+ const std::list<BSONObj>& originalIndexes) = 0;
+
+ /**
+ * Parses a Pipeline from a vector of BSONObjs representing DocumentSources. The state of the
+ * returned pipeline will depend upon the supplied MakePipelineOptions:
+ * - The boolean opts.optimize determines whether the pipeline will be optimized.
+ * - If opts.attachCursorSource is false, the pipeline will be returned without attempting to
+ * add an initial cursor source.
+ *
+ * This function returns a non-OK status if parsing the pipeline failed.
+ */
+ virtual StatusWith<std::unique_ptr<Pipeline, PipelineDeleter>> makePipeline(
+ const std::vector<BSONObj>& rawPipeline,
+ const boost::intrusive_ptr<ExpressionContext>& expCtx,
+ const MakePipelineOptions opts = MakePipelineOptions{}) = 0;
+
+ /**
+ * Attaches a cursor source to the start of a pipeline. Performs no further optimization. This
+ * function asserts if the collection to be aggregated is sharded. NamespaceNotFound will be
+ * returned if ExpressionContext has a UUID and that UUID doesn't exist anymore. That should be
+ * the only case where NamespaceNotFound is returned.
+ */
+ virtual Status attachCursorSourceToPipeline(
+ const boost::intrusive_ptr<ExpressionContext>& expCtx, Pipeline* pipeline) = 0;
+
+ /**
+ * Returns a vector of owned BSONObjs, each of which contains details of an in-progress
+ * operation or, optionally, an idle connection. If userMode is kIncludeAllUsers, report
+ * operations for all authenticated users; otherwise, report only the current user's operations.
+ */
+ virtual std::vector<BSONObj> getCurrentOps(OperationContext* opCtx,
+ CurrentOpConnectionsMode connMode,
+ CurrentOpUserMode userMode,
+ CurrentOpTruncateMode) const = 0;
+
+ /**
+ * Returns the name of the local shard if sharding is enabled, or an empty string.
+ */
+ virtual std::string getShardName(OperationContext* opCtx) const = 0;
+
+ /**
+ * Returns the fields of the document key (in order) for the collection given by 'nss' and
+ * 'UUID', including the shard key and _id. If _id is not in the shard key, it is added last.
+ */
+ virtual std::vector<FieldPath> collectDocumentKeyFields(OperationContext* opCtx,
+ const NamespaceString& nss,
+ UUID uuid) const = 0;
+
+ /**
+ * Returns zero or one documents with the document key 'documentKey'. 'documentKey' is treated
+ * as a unique identifier of a document, and may include an _id or all fields from the shard key
+ * and an _id. Throws if more than one match was found. Returns boost::none if no matching
+ * documents were found, including cases where the given namespace does not exist.
+ */
+ virtual boost::optional<Document> lookupSingleDocument(
+ const boost::intrusive_ptr<ExpressionContext>& expCtx,
+ const NamespaceString& nss,
+ UUID,
+ const Document& documentKey,
+ boost::optional<BSONObj> readConcern) = 0;
+
+ /**
+ * Returns a vector of all local cursors.
+ */
+ virtual std::vector<GenericCursor> getCursors(
+ const boost::intrusive_ptr<ExpressionContext>& expCtx) const = 0;
+};
+
+} // namespace mongo