Status CanonicalQuery::init(LiteParsedQuery* lpq, const ExtensionsCallback& extensionsCallback, MatchExpression* root) { _pq.reset(lpq); _hasNoopExtensions = extensionsCallback.hasNoopExtensions(); _isIsolated = LiteParsedQuery::isQueryIsolated(lpq->getFilter()); // Normalize, sort and validate tree. root = normalizeTree(root); sortTree(root); _root.reset(root); Status validStatus = isValid(root, *_pq); if (!validStatus.isOK()) { return validStatus; } // Validate the projection if there is one. if (!_pq->getProj().isEmpty()) { ParsedProjection* pp; Status projStatus = ParsedProjection::make(_pq->getProj(), _root.get(), &pp, extensionsCallback); if (!projStatus.isOK()) { return projStatus; } _proj.reset(pp); } if (_proj && _proj->wantSortKey() && _pq->getSort().isEmpty()) { return Status(ErrorCodes::BadValue, "cannot use sortKey $meta projection without a sort"); } return Status::OK(); }
Status CanonicalQuery::init(std::unique_ptr<QueryRequest> qr, const ExtensionsCallback& extensionsCallback, MatchExpression* root, std::unique_ptr<CollatorInterface> collator) { _qr = std::move(qr); _collator = std::move(collator); _hasNoopExtensions = extensionsCallback.hasNoopExtensions(); _isIsolated = QueryRequest::isQueryIsolated(_qr->getFilter()); // Normalize, sort and validate tree. root = normalizeTree(root); sortTree(root); _root.reset(root); Status validStatus = isValid(root, *_qr); if (!validStatus.isOK()) { return validStatus; } // Validate the projection if there is one. if (!_qr->getProj().isEmpty()) { ParsedProjection* pp; Status projStatus = ParsedProjection::make(_qr->getProj(), _root.get(), &pp, extensionsCallback); if (!projStatus.isOK()) { return projStatus; } _proj.reset(pp); } if (_proj && _proj->wantSortKey() && _qr->getSort().isEmpty()) { return Status(ErrorCodes::BadValue, "cannot use sortKey $meta projection without a sort"); } return Status::OK(); }