From 5cf80c371b8893d02480e60751f3e46a093510df Mon Sep 17 00:00:00 2001 From: Julian Mundhahs Date: Wed, 12 Feb 2025 11:24:22 +0100 Subject: [PATCH] initial sonarcloud --- src/engine/SPARQLProtocol.h | 14 ++--- src/engine/Server.cpp | 111 +++++++++++++++++------------------- 2 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/engine/SPARQLProtocol.h b/src/engine/SPARQLProtocol.h index b8342bcc66..67006bbd2f 100644 --- a/src/engine/SPARQLProtocol.h +++ b/src/engine/SPARQLProtocol.h @@ -57,8 +57,7 @@ class SPARQLProtocol { if (isContainedExactlyOnce("graph") && isContainedExactlyOnce("default")) { throw std::runtime_error( - "Parameters \"graph\" and \"default\" must " - "not be set at the same time."); + R"(Parameters "graph" and "default" must not be set at the same time.)"); } AD_CORRECTNESS_CHECK( std::holds_alternative(parsedRequest.operation_)); @@ -78,12 +77,11 @@ class SPARQLProtocol { auto checkUnsupportedGraphStoreContentType = [&isGraphStoreOperation](std::string_view contentType, std::string_view unsupportedType) { - if (isGraphStoreOperation()) { - if (contentType.starts_with(unsupportedType)) { - throw std::runtime_error( - absl::StrCat("Unsupported Content type \"", contentType, - "\" for Graph Store protocol.")); - } + if (isGraphStoreOperation() && + contentType.starts_with(unsupportedType)) { + throw std::runtime_error( + absl::StrCat("Unsupported Content type \"", contentType, + "\" for Graph Store protocol.")); } }; auto addToDatasetClausesIfOperationIs = diff --git a/src/engine/Server.cpp b/src/engine/Server.cpp index d5c4959f96..5bfae3780a 100644 --- a/src/engine/Server.cpp +++ b/src/engine/Server.cpp @@ -397,34 +397,32 @@ Awaitable Server::process( const Operation& op, auto opFieldString, std::function pred, std::string msg) -> Awaitable { - if (auto timeLimit = co_await verifyUserSubmittedQueryTimeout( - checkParameter("timeout", std::nullopt), accessTokenOk, request, - send)) { - ad_utility::websocket::MessageSender messageSender = createMessageSender( - queryHub_, request, std::invoke(opFieldString, op)); - auto [parsedOperation, qec, cancellationHandle, - cancelTimeoutOnDestruction] = - parseOperation(messageSender, parameters, op, timeLimit.value()); - if (pred(parsedOperation)) { - throw std::runtime_error( - absl::StrCat(msg, parsedOperation._originalString)); - } - if constexpr (std::is_same_v) { - co_return co_await processQuery(parameters, std::move(parsedOperation), - requestTimer, cancellationHandle, qec, - std::move(request), send, - timeLimit.value()); - } else { - static_assert(std::is_same_v); - co_return co_await processUpdate( - std::move(parsedOperation), requestTimer, cancellationHandle, qec, - std::move(request), send, timeLimit.value()); - } - } else { + auto timeLimit = co_await verifyUserSubmittedQueryTimeout( + checkParameter("timeout", std::nullopt), accessTokenOk, request, send); + if (!timeLimit.has_value()) { // If the optional is empty, this indicates an error response has been // sent to the client already. We can stop here. co_return; } + ad_utility::websocket::MessageSender messageSender = + createMessageSender(queryHub_, request, std::invoke(opFieldString, op)); + auto [parsedOperation, qec, cancellationHandle, + cancelTimeoutOnDestruction] = + parseOperation(messageSender, parameters, op, timeLimit.value()); + if (pred(parsedOperation)) { + throw std::runtime_error( + absl::StrCat(msg, parsedOperation._originalString)); + } + if constexpr (std::is_same_v) { + co_return co_await processQuery( + parameters, std::move(parsedOperation), requestTimer, + cancellationHandle, qec, std::move(request), send, timeLimit.value()); + } else { + static_assert(std::is_same_v); + co_return co_await processUpdate( + std::move(parsedOperation), requestTimer, cancellationHandle, qec, + std::move(request), send, timeLimit.value()); + } }; auto visitQuery = [&visitOperation](const Query& query) -> Awaitable { return visitOperation( @@ -444,44 +442,41 @@ Awaitable Server::process( [&send, &request, &checkParameter, &accessTokenOk, ¶meters, &requireValidAccessToken, this, &requestTimer](const GraphStoreOperation& operation) -> Awaitable { - if (auto timeLimit = co_await verifyUserSubmittedQueryTimeout( - checkParameter("timeout", std::nullopt), accessTokenOk, request, - send)) { - // TODO: verify that an empty string here results in a random id - ad_utility::websocket::MessageSender messageSender = - createMessageSender(queryHub_, request, ""); - auto [cancellationHandle, cancelTimeoutOnDestruction] = - setupCancellationHandle(messageSender.getQueryId(), - timeLimit.value()); - auto [pinSubtrees, pinResult] = determineResultPinning(parameters); - LOG(INFO) << "Processing a SPARQL Graph Store HTTP request:" - << (pinResult ? " [pin result]" : "") - << (pinSubtrees ? " [pin subresults]" : "") << std::endl; - QueryExecutionContext qec( - index_, &cache_, allocator_, sortPerformanceEstimator_, - std::ref(messageSender), pinSubtrees, pinResult); - ParsedQuery parsedOperation = - GraphStoreProtocol::transformGraphStoreProtocol(operation, request); - - if (parsedOperation.hasUpdateClause()) { - requireValidAccessToken("SPARQL Update"); - - co_return co_await processUpdate( - std::move(parsedOperation), requestTimer, cancellationHandle, qec, - std::move(request), send, timeLimit.value()); - - } else { - co_return co_await processQuery(parameters, std::move(parsedOperation), - requestTimer, cancellationHandle, qec, - std::move(request), send, - timeLimit.value()); - } - } else { - // TODO: comment from last PR + auto timeLimit = co_await verifyUserSubmittedQueryTimeout( + checkParameter("timeout", std::nullopt), accessTokenOk, request, send); + if (!timeLimit.has_value()) { // If the optional is empty, this indicates an error response has been // sent to the client already. We can stop here. co_return; } + + // TODO: verify that an empty string here results in a random id + ad_utility::websocket::MessageSender messageSender = + createMessageSender(queryHub_, request, ""); + auto [cancellationHandle, cancelTimeoutOnDestruction] = + setupCancellationHandle(messageSender.getQueryId(), timeLimit.value()); + auto [pinSubtrees, pinResult] = determineResultPinning(parameters); + LOG(INFO) << "Processing a SPARQL Graph Store HTTP request:" + << (pinResult ? " [pin result]" : "") + << (pinSubtrees ? " [pin subresults]" : "") << std::endl; + QueryExecutionContext qec(index_, &cache_, allocator_, + sortPerformanceEstimator_, + std::ref(messageSender), pinSubtrees, pinResult); + ParsedQuery parsedOperation = + GraphStoreProtocol::transformGraphStoreProtocol(operation, request); + + if (parsedOperation.hasUpdateClause()) { + requireValidAccessToken("SPARQL Update"); + + co_return co_await processUpdate( + std::move(parsedOperation), requestTimer, cancellationHandle, qec, + std::move(request), send, timeLimit.value()); + + } else { + co_return co_await processQuery( + parameters, std::move(parsedOperation), requestTimer, + cancellationHandle, qec, std::move(request), send, timeLimit.value()); + } }; auto visitNone = [&response, &send, &request](const None&) -> Awaitable {