diff --git a/presto-druid/src/main/java/com/facebook/presto/druid/DruidClient.java b/presto-druid/src/main/java/com/facebook/presto/druid/DruidClient.java index 3394221fb6328..59c59d6d25ee8 100644 --- a/presto-druid/src/main/java/com/facebook/presto/druid/DruidClient.java +++ b/presto-druid/src/main/java/com/facebook/presto/druid/DruidClient.java @@ -29,10 +29,13 @@ import javax.inject.Inject; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URI; import java.util.List; +import java.util.stream.Collectors; import static com.facebook.airlift.http.client.HttpUriBuilder.uriBuilderFrom; import static com.facebook.airlift.http.client.JsonResponseHandler.createJsonResponseHandler; @@ -48,6 +51,7 @@ import static com.google.common.net.HttpHeaders.CONTENT_TYPE; import static com.google.common.net.MediaType.JSON_UTF_8; import static java.lang.String.format; +import static java.net.HttpURLConnection.HTTP_OK; import static java.util.Objects.requireNonNull; public class DruidClient @@ -175,6 +179,10 @@ public InputStream handleException(Request request, Exception exception) public InputStream handle(Request request, com.facebook.airlift.http.client.Response response) { try { + if (response.getStatusCode() != HTTP_OK) { + String result = new BufferedReader(new InputStreamReader(response.getInputStream())).lines().collect(Collectors.joining("\n")); + throw new PrestoException(DRUID_BROKER_RESULT_ERROR, result); + } if (APPLICATION_JSON.equals(response.getHeader(CONTENT_TYPE))) { return response.getInputStream(); } diff --git a/presto-druid/src/main/java/com/facebook/presto/druid/DruidQueryGeneratorContext.java b/presto-druid/src/main/java/com/facebook/presto/druid/DruidQueryGeneratorContext.java index 9a52d0d045018..bb6fd355fa189 100644 --- a/presto-druid/src/main/java/com/facebook/presto/druid/DruidQueryGeneratorContext.java +++ b/presto-druid/src/main/java/com/facebook/presto/druid/DruidQueryGeneratorContext.java @@ -30,6 +30,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import static com.facebook.presto.druid.DruidErrorCode.DRUID_PUSHDOWN_UNSUPPORTED_EXPRESSION; import static com.facebook.presto.druid.DruidErrorCode.DRUID_QUERY_GENERATOR_FAILURE; import static com.facebook.presto.druid.DruidPushdownUtils.DRUID_COUNT_DISTINCT_FUNCTION_NAME; import static com.google.common.base.MoreObjects.toStringHelper; @@ -104,7 +105,10 @@ private DruidQueryGeneratorContext( public DruidQueryGeneratorContext withFilter(String filter) { - checkState(!hasFilter(), "Druid doesn't support filters at multiple levels"); + if (hasAggregation()) { + throw new PrestoException(DRUID_PUSHDOWN_UNSUPPORTED_EXPRESSION, "Druid does not support filter on top of AggregationNode."); + } + checkState(!hasFilter(), "Druid doesn't support filters at multiple levels under AggregationNode"); return new DruidQueryGeneratorContext( selections, from,