summaryrefslogtreecommitdiff
path: root/src/mongo/db/ops/parsed_delete.h
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2014-12-02 20:10:01 -0500
committerDavid Storch <david.storch@10gen.com>2014-12-04 17:41:11 -0500
commit367810995073e01ee58159deb1bb5b878882632f (patch)
tree3074960c42a7b63e4e3be337e44f33a036a6679f /src/mongo/db/ops/parsed_delete.h
parent5080932a79ce0152535169ec3b42edde2951bdcd (diff)
downloadmongo-367810995073e01ee58159deb1bb5b878882632f.tar.gz
SERVER-16101 replace DeleteExecutor with ParsedDelete
Diffstat (limited to 'src/mongo/db/ops/parsed_delete.h')
-rw-r--r--src/mongo/db/ops/parsed_delete.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/mongo/db/ops/parsed_delete.h b/src/mongo/db/ops/parsed_delete.h
new file mode 100644
index 00000000000..c117db28cb7
--- /dev/null
+++ b/src/mongo/db/ops/parsed_delete.h
@@ -0,0 +1,109 @@
+/**
+ * Copyright (C) 2014 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 "mongo/base/disallow_copying.h"
+#include "mongo/base/status.h"
+#include "mongo/db/query/plan_executor.h"
+
+namespace mongo {
+
+ class CanonicalQuery;
+ class Database;
+ class DeleteRequest;
+ class OperationContext;
+
+ /**
+ * This class takes a pointer to a DeleteRequest, and converts that request into a parsed form
+ * via the parseRequest() method. A ParsedDelete can then be used to retrieve a PlanExecutor
+ * capable of executing the delete.
+ *
+ * A delete request is parsed to a CanonicalQuery, so this class is a thin, delete-specific
+ * wrapper around canonicalization.
+ *
+ * No locks need to be held during parsing.
+ */
+ class ParsedDelete {
+ MONGO_DISALLOW_COPYING(ParsedDelete);
+ public:
+ /**
+ * Constructs a parsed delete.
+ *
+ * The object pointed to by "request" must stay in scope for the life of the constructed
+ * ParsedDelete.
+ */
+ ParsedDelete(OperationContext* txn, const DeleteRequest* request);
+
+ /**
+ * Parses the delete request to a canonical query. On success, the parsed delete can be
+ * used to create a PlanExecutor capable of executing this delete.
+ */
+ Status parseRequest();
+
+ /**
+ * As an optimization, we do not create a canonical query if the predicate is a simple
+ * _id equality. This method can be used to force full parsing to a canonical query,
+ * as a fallback if the idhack path is not available (e.g. no _id index).
+ */
+ Status parseQueryToCQ();
+
+ /**
+ * Get the raw request.
+ */
+ const DeleteRequest* getRequest() const;
+
+ /**
+ * Is this delete allowed to yield?
+ */
+ bool canYield() const;
+
+ /**
+ * As an optimization, we don't create a canonical query for updates with simple _id
+ * queries. Use this method to determine whether or not we actually parsed the query.
+ */
+ bool hasParsedQuery() const;
+
+ /**
+ * Releases ownership of the canonical query to the caller.
+ */
+ CanonicalQuery* releaseParsedQuery();
+
+ private:
+ // Transactional context. Not owned by us.
+ OperationContext* _txn;
+
+ // Unowned pointer to the request object that this executor will process.
+ const DeleteRequest* const _request;
+
+ // Parsed query object, or NULL if the query proves to be an id hack query.
+ std::auto_ptr<CanonicalQuery> _canonicalQuery;
+
+ };
+
+} // namespace mongo