diff options
author | David Storch <david.storch@10gen.com> | 2014-12-02 20:10:01 -0500 |
---|---|---|
committer | David Storch <david.storch@10gen.com> | 2014-12-04 17:41:11 -0500 |
commit | 367810995073e01ee58159deb1bb5b878882632f (patch) | |
tree | 3074960c42a7b63e4e3be337e44f33a036a6679f /src/mongo/db/ops/parsed_delete.h | |
parent | 5080932a79ce0152535169ec3b42edde2951bdcd (diff) | |
download | mongo-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.h | 109 |
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 |