diff --git a/src/engine/ExportQueryExecutionTrees.cpp b/src/engine/ExportQueryExecutionTrees.cpp index af1a0f8da5..437cf6d787 100644 --- a/src/engine/ExportQueryExecutionTrees.cpp +++ b/src/engine/ExportQueryExecutionTrees.cpp @@ -21,14 +21,15 @@ bool getResultForAsk(const std::shared_ptr& res) { } // _____________________________________________________________________________ -cppcoro::generator computeResultForAsk( - const ParsedQuery& parsedQuery, const QueryExecutionTree& qet, - ad_utility::MediaType mediaType, const ad_utility::Timer& requestTimer) { +ad_utility::streams::stream_generator computeResultForAsk( + [[maybe_unused]] const ParsedQuery& parsedQuery, + const QueryExecutionTree& qet, ad_utility::MediaType mediaType, + [[maybe_unused]] const ad_utility::Timer& requestTimer) { bool result = getResultForAsk(qet.getResult(true)); std::string xmlTemplate = R"( - + true )"; @@ -43,10 +44,15 @@ cppcoro::generator computeResultForAsk( } break; } + case sparqlJson: { + nlohmann::json j; + j["head"] = nlohmann::json::object_t{}; + j["boolean"] = result; + co_yield j.dump(); + } default: - throw std::runtime_error( - "ASK queries are currently only supported for XML and sparql-json " - "results"); + throw std::runtime_error{ + "ASK queries are not supported for TSV or CSV or binary format."}; } } @@ -771,22 +777,23 @@ cppcoro::generator ExportQueryExecutionTrees::computeResult( const ParsedQuery& parsedQuery, const QueryExecutionTree& qet, ad_utility::MediaType mediaType, const ad_utility::Timer& requestTimer, CancellationHandle cancellationHandle) { - if (parsedQuery.hasAskClause() && mediaType != MediaType::qleverJson) { - return computeResultForAsk(parsedQuery, qet, mediaType, requestTimer); - } auto compute = [&] { if constexpr (format == MediaType::qleverJson) { return computeResultAsQLeverJSON(parsedQuery, qet, requestTimer, std::move(cancellationHandle)); + } else { + if (parsedQuery.hasAskClause()) { + return computeResultForAsk(parsedQuery, qet, mediaType, requestTimer); + } + return parsedQuery.hasSelectClause() + ? selectQueryResultToStream( + qet, parsedQuery.selectClause(), + parsedQuery._limitOffset, std::move(cancellationHandle)) + : constructQueryResultToStream( + qet, parsedQuery.constructClause().triples_, + parsedQuery._limitOffset, qet.getResult(true), + std::move(cancellationHandle)); } - return parsedQuery.hasSelectClause() - ? selectQueryResultToStream( - qet, parsedQuery.selectClause(), parsedQuery._limitOffset, - std::move(cancellationHandle)) - : constructQueryResultToStream( - qet, parsedQuery.constructClause().triples_, - parsedQuery._limitOffset, qet.getResult(true), - std::move(cancellationHandle)); }; using enum MediaType; diff --git a/src/parser/ParsedQuery.h b/src/parser/ParsedQuery.h index f3d6fc3dfc..0b8564cfb7 100644 --- a/src/parser/ParsedQuery.h +++ b/src/parser/ParsedQuery.h @@ -105,8 +105,9 @@ class ParsedQuery { // explicit default initialisation because the constructor // of SelectClause is private - std::variant _clause{ - SelectClause{}}; + using HeaderClause = + std::variant; + HeaderClause _clause{SelectClause{}}; // The IRIs from the FROM and FROM NAMED clauses. DatasetClauses datasetClauses_;