/** * Copyright (C) 2013 10gen 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 . */ #include "mongo/db/query/canonical_query.h" #include "mongo/db/jsobj.h" #include "mongo/db/matcher/expression_parser.h" namespace mongo { // static Status CanonicalQuery::canonicalize(const QueryMessage& qm, CanonicalQuery** out) { LiteParsedQuery* lpq; Status parseStatus = LiteParsedQuery::make(qm, &lpq); if (!parseStatus.isOK()) { return parseStatus; } auto_ptr cq(new CanonicalQuery()); Status initStatus = cq->init(lpq); if (!initStatus.isOK()) { return initStatus; } *out = cq.release(); return Status::OK(); } // static Status CanonicalQuery::canonicalize(const string& ns, const BSONObj& query, CanonicalQuery** out) { LiteParsedQuery* lpq; // Pass empty sort and projection. BSONObj emptyObj; Status parseStatus = LiteParsedQuery::make(ns, 0, 0, 0, query, emptyObj, emptyObj, &lpq); if (!parseStatus.isOK()) { return parseStatus; } auto_ptr cq(new CanonicalQuery()); Status initStatus = cq->init(lpq); if (!initStatus.isOK()) { return initStatus; } *out = cq.release(); return Status::OK(); } Status CanonicalQuery::init(LiteParsedQuery* lpq) { _pq.reset(lpq); // Build a parse tree from the BSONObj in the parsed query. StatusWithMatchExpression swme = MatchExpressionParser::parse(_pq->getFilter()); if (!swme.isOK()) { return swme.getStatus(); } _root.reset(swme.getValue()); return Status::OK(); } string CanonicalQuery::toString() const { return "Tree: " + _root->toString(); } } // namespace mongo