diff --git a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/PageInformation.java b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/PageInformation.java new file mode 100644 index 000000000000..2754c52f1fe1 --- /dev/null +++ b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/PageInformation.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.druid.msq.sql.entity; + + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.annotation.Nullable; +import java.util.Objects; + +/** + * Contains information about a single page in the results. + */ +public class PageInformation +{ + @Nullable + private final Long numRows; + @Nullable + private final Long sizeInBytes; + private final long id; + + @JsonCreator + public PageInformation( + @JsonProperty("numRows") @Nullable Long numRows, + @JsonProperty("sizeInBytes") @Nullable Long sizeInBytes, + @JsonProperty("id") long id + ) + { + this.numRows = numRows; + this.sizeInBytes = sizeInBytes; + this.id = id; + } + + @JsonProperty + @Nullable + public Long getNumRows() + { + return numRows; + } + + @JsonProperty + @Nullable + public Long getSizeInBytes() + { + return sizeInBytes; + } + + @JsonProperty + public long getId() + { + return id; + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PageInformation that = (PageInformation) o; + return id == that.id && Objects.equals(numRows, that.numRows) && Objects.equals( + sizeInBytes, + that.sizeInBytes + ); + } + + @Override + public int hashCode() + { + return Objects.hash(numRows, sizeInBytes, id); + } + + @Override + public String toString() + { + return "PageInformation{" + + "numRows=" + numRows + + ", sizeInBytes=" + sizeInBytes + + ", id=" + id + + '}'; + } +} diff --git a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/ResultSetInformation.java b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/ResultSetInformation.java index 43201fdac6e0..e131fa85c737 100644 --- a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/ResultSetInformation.java +++ b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/entity/ResultSetInformation.java @@ -32,50 +32,50 @@ public class ResultSetInformation { @Nullable - private final Long numRows; + private final Long numTotalRows; @Nullable - private final Long sizeInBytes; - + private final Long totalSizeInBytes; @Nullable private final ResultFormat resultFormat; - @Nullable private final List records; - @Nullable private final String dataSource; + @Nullable + private final List pages; @JsonCreator public ResultSetInformation( + @JsonProperty("numTotalRows") @Nullable Long numTotalRows, + @JsonProperty("totalSizeInBytes") @Nullable Long totalSizeInBytes, @JsonProperty("resultFormat") @Nullable ResultFormat resultFormat, - @JsonProperty("numRows") @Nullable Long numRows, - @JsonProperty("sizeInBytes") @Nullable Long sizeInBytes, @JsonProperty("dataSource") @Nullable String dataSource, - @JsonProperty("sampleRecords") @Nullable - List records + @JsonProperty("sampleRecords") @Nullable List records, + @JsonProperty("pages") @Nullable List pages ) { - this.numRows = numRows; - this.sizeInBytes = sizeInBytes; + this.numTotalRows = numTotalRows; + this.totalSizeInBytes = totalSizeInBytes; this.resultFormat = resultFormat; this.dataSource = dataSource; this.records = records; + this.pages = pages; } - @Nullable @JsonProperty + @Nullable @JsonInclude(JsonInclude.Include.NON_NULL) - public Long getNumRows() + public Long getNumTotalRows() { - return numRows; + return numTotalRows; } - @Nullable @JsonProperty + @Nullable @JsonInclude(JsonInclude.Include.NON_NULL) - public Long getSizeInBytes() + public Long getTotalSizeInBytes() { - return sizeInBytes; + return totalSizeInBytes; } @JsonProperty @@ -94,14 +94,21 @@ public String getDataSource() return dataSource; } - @Nullable @JsonProperty("sampleRecords") + @Nullable @JsonInclude(JsonInclude.Include.NON_NULL) public List getRecords() { return records; } + @JsonProperty + @Nullable + @JsonInclude(JsonInclude.Include.NON_NULL) + public List getPages() + { + return pages; + } @Override public boolean equals(Object o) @@ -113,30 +120,31 @@ public boolean equals(Object o) return false; } ResultSetInformation that = (ResultSetInformation) o; - return Objects.equals(numRows, that.numRows) - && Objects.equals(sizeInBytes, that.sizeInBytes) - && resultFormat == that.resultFormat - && Objects.equals(records, that.records) - && Objects.equals(dataSource, that.dataSource); + return Objects.equals(numTotalRows, that.numTotalRows) && Objects.equals( + totalSizeInBytes, + that.totalSizeInBytes + ) && resultFormat == that.resultFormat && Objects.equals(records, that.records) && Objects.equals( + dataSource, + that.dataSource + ) && Objects.equals(pages, that.pages); } @Override public int hashCode() { - return Objects.hash(numRows, sizeInBytes, resultFormat, records, dataSource); + return Objects.hash(numTotalRows, totalSizeInBytes, resultFormat, records, dataSource, pages); } @Override public String toString() { return "ResultSetInformation{" + - "totalRows=" + numRows + - ", totalSize=" + sizeInBytes + + "numTotalRows=" + numTotalRows + + ", totalSizeInBytes=" + totalSizeInBytes + ", resultFormat=" + resultFormat + ", records=" + records + ", dataSource='" + dataSource + '\'' + + ", pages=" + pages + '}'; } - } - diff --git a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java index 6ce5c7800525..ce30284e5936 100644 --- a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java +++ b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.io.CountingOutputStream; import com.google.common.util.concurrent.ListenableFuture; @@ -46,6 +47,7 @@ import org.apache.druid.msq.sql.MSQTaskSqlEngine; import org.apache.druid.msq.sql.SqlStatementState; import org.apache.druid.msq.sql.entity.ColumnNameAndTypes; +import org.apache.druid.msq.sql.entity.PageInformation; import org.apache.druid.msq.sql.entity.ResultSetInformation; import org.apache.druid.msq.sql.entity.SqlStatementResult; import org.apache.druid.msq.util.SqlStatementResourceHelper; @@ -268,8 +270,7 @@ public Response doGetStatus( @Produces(MediaType.APPLICATION_JSON) public Response doGetResults( @PathParam("id") final String queryId, - @QueryParam("offset") Long offset, - @QueryParam("numRows") Long numberOfRows, + @QueryParam("page") Long page, @Context final HttpServletRequest req ) { @@ -284,28 +285,16 @@ public Response doGetResults( } final AuthenticationResult authenticationResult = AuthorizationUtils.authenticationResultFromRequest(req); - if (offset != null && offset < 0) { + if (page != null && page < 0) { return buildNonOkResponse( DruidException.forPersona(DruidException.Persona.USER) .ofCategory(DruidException.Category.INVALID_INPUT) .build( - "offset cannot be negative. Please pass a positive number." - ) - ); - } - if (numberOfRows != null && numberOfRows < 0) { - return buildNonOkResponse( - DruidException.forPersona(DruidException.Persona.USER) - .ofCategory(DruidException.Category.INVALID_INPUT) - .build( - "numRows cannot be negative. Please pass a positive number." + "Page cannot be negative. Please pass a positive number." ) ); } - final long start = offset == null ? 0 : offset; - final long last = SqlStatementResourceHelper.getLastIndex(numberOfRows, start); - TaskStatusResponse taskResponse = contactOverlord(overlordClient.taskStatus(queryId)); if (taskResponse == null) { return Response.status(Response.Status.NOT_FOUND).build(); @@ -343,8 +332,21 @@ public Response doGetResults( if (!signature.isPresent()) { return Response.ok().build(); } - Optional> results = SqlStatementResourceHelper.getResults(SqlStatementResourceHelper.getPayload( - contactOverlord(overlordClient.taskReportAsMap(queryId)))); + + if (page != null && page > 0) { + // Results from task report are only present as one page. + return buildNonOkResponse( + DruidException.forPersona(DruidException.Persona.USER) + .ofCategory(DruidException.Category.INVALID_INPUT) + .build("Page number is out of range of the results.") + ); + } + + Optional> results = SqlStatementResourceHelper.getResults( + SqlStatementResourceHelper.getPayload( + contactOverlord(overlordClient.taskReportAsMap(queryId)) + ) + ); return Response.ok((StreamingOutput) outputStream -> { CountingOutputStream os = new CountingOutputStream(outputStream); @@ -353,7 +355,7 @@ public Response doGetResults( List rowSignature = signature.get(); writer.writeResponseStart(); - for (long k = start; k < Math.min(last, results.get().size()); k++) { + for (long k = 0; k < results.get().size(); k++) { writer.writeRowStart(); for (int i = 0; i < rowSignature.size(); i++) { writer.writeRowField( @@ -575,13 +577,19 @@ private Optional getSampleResults( isSelectQuery ); return Optional.of(new ResultSetInformation( - null, - // since the rows can be sampled, get the number of rows from counters rowsAndSize.orElse(new Pair<>(null, null)).lhs, rowsAndSize.orElse(new Pair<>(null, null)).rhs, + null, dataSource, // only populate sample results in case a select query is successful - isSelectQuery ? SqlStatementResourceHelper.getResults(payload).orElse(null) : null + isSelectQuery ? SqlStatementResourceHelper.getResults(payload).orElse(null) : null, + ImmutableList.of( + new PageInformation( + rowsAndSize.orElse(new Pair<>(null, null)).lhs, + rowsAndSize.orElse(new Pair<>(null, null)).rhs, + 0 + ) + ) )); } else { return Optional.empty(); diff --git a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlMsqStatementResourcePostTest.java b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlMsqStatementResourcePostTest.java index ceae64dcf703..51e10a93b2d3 100644 --- a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlMsqStatementResourcePostTest.java +++ b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlMsqStatementResourcePostTest.java @@ -30,6 +30,7 @@ import org.apache.druid.msq.indexing.error.InsertCannotBeEmptyFault; import org.apache.druid.msq.indexing.error.MSQException; import org.apache.druid.msq.sql.entity.ColumnNameAndTypes; +import org.apache.druid.msq.sql.entity.PageInformation; import org.apache.druid.msq.sql.entity.ResultSetInformation; import org.apache.druid.msq.sql.entity.SqlStatementResult; import org.apache.druid.msq.sql.resources.SqlStatementResource; @@ -112,9 +113,9 @@ public void testMSQSelectQueryTest() throws IOException ), MSQTestOverlordServiceClient.DURATION, new ResultSetInformation( - null, 6L, 316L, + null, MSQControllerTask.DUMMY_DATASOURCE_FOR_SELECT, objectMapper.readValue( objectMapper.writeValueAsString( @@ -122,7 +123,8 @@ public void testMSQSelectQueryTest() throws IOException new TypeReference>() { } - ) + ), + ImmutableList.of(new PageInformation(6L, 316L, 0)) ), null ); diff --git a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlStatementResourceTest.java b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlStatementResourceTest.java index b5d5addecd78..6a19f3f792ef 100644 --- a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlStatementResourceTest.java +++ b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/SqlStatementResourceTest.java @@ -54,6 +54,7 @@ import org.apache.druid.msq.indexing.report.MSQTaskReportPayload; import org.apache.druid.msq.indexing.report.MSQTaskReportTest; import org.apache.druid.msq.sql.entity.ColumnNameAndTypes; +import org.apache.druid.msq.sql.entity.PageInformation; import org.apache.druid.msq.sql.entity.ResultSetInformation; import org.apache.druid.msq.sql.entity.SqlStatementResult; import org.apache.druid.msq.sql.resources.SqlStatementResource; @@ -650,7 +651,7 @@ public void testMSQSelectAcceptedQuery() ); assertExceptionMessage( - resource.doGetResults(ACCEPTED_SELECT_MSQ_QUERY, null, null, makeOkRequest()), + resource.doGetResults(ACCEPTED_SELECT_MSQ_QUERY, 0L, makeOkRequest()), StringUtils.format( "Query[%s] is currently in [%s] state. Please wait for it to complete.", ACCEPTED_SELECT_MSQ_QUERY, @@ -665,7 +666,6 @@ public void testMSQSelectAcceptedQuery() } @Test - public void testMSQSelectRunningQuery() { @@ -685,7 +685,7 @@ public void testMSQSelectRunningQuery() ); assertExceptionMessage( - resource.doGetResults(RUNNING_SELECT_MSQ_QUERY, null, null, makeOkRequest()), + resource.doGetResults(RUNNING_SELECT_MSQ_QUERY, 0L, makeOkRequest()), StringUtils.format( "Query[%s] is currently in [%s] state. Please wait for it to complete.", RUNNING_SELECT_MSQ_QUERY, @@ -717,12 +717,13 @@ public void testFinishedSelectMSQQuery() throws Exception MSQControllerTask.DUMMY_DATASOURCE_FOR_SELECT, RESULT_ROWS.stream() .map(Arrays::asList) - .collect(Collectors.toList()) + .collect(Collectors.toList()), + ImmutableList.of(new PageInformation(null, null, 0L)) ), null ), response.getEntity()); - Response resultsResponse = resource.doGetResults(FINISHED_SELECT_MSQ_QUERY, null, null, makeOkRequest()); + Response resultsResponse = resource.doGetResults(FINISHED_SELECT_MSQ_QUERY, 0L, makeOkRequest()); Assert.assertEquals(Response.Status.OK.getStatusCode(), resultsResponse.getStatus()); List> rows = new ArrayList<>(); @@ -737,42 +738,27 @@ public void testFinishedSelectMSQQuery() throws Exception ); Assert.assertEquals( - rows.subList(1, 2), - getResultRowsFromResponse(resource.doGetResults( - FINISHED_SELECT_MSQ_QUERY, - 1L, - null, - makeOkRequest() - )) - ); - Assert.assertEquals( - rows.subList(0, 1), + rows, getResultRowsFromResponse(resource.doGetResults( FINISHED_SELECT_MSQ_QUERY, 0L, - 1L, makeOkRequest() )) ); + Assert.assertEquals( rows, getResultRowsFromResponse(resource.doGetResults( FINISHED_SELECT_MSQ_QUERY, - 0L, - 3L, + null, makeOkRequest() )) ); Assert.assertEquals( Response.Status.BAD_REQUEST.getStatusCode(), - resource.doGetResults(FINISHED_SELECT_MSQ_QUERY, -1L, 3L, makeOkRequest()).getStatus() - ); - Assert.assertEquals( - Response.Status.BAD_REQUEST.getStatusCode(), - resource.doGetResults(FINISHED_SELECT_MSQ_QUERY, null, -1L, makeOkRequest()).getStatus() + resource.doGetResults(FINISHED_SELECT_MSQ_QUERY, -1L, makeOkRequest()).getStatus() ); - } @Test @@ -781,7 +767,7 @@ public void testFailedMSQQuery() for (String queryID : ImmutableList.of(ERRORED_SELECT_MSQ_QUERY, ERRORED_INSERT_MSQ_QUERY)) { assertExceptionMessage(resource.doGetStatus(queryID, makeOkRequest()), FAILURE_MSG, Response.Status.OK); assertExceptionMessage( - resource.doGetResults(queryID, null, null, makeOkRequest()), + resource.doGetResults(queryID, 0L, makeOkRequest()), StringUtils.format( "Query[%s] failed. Hit status api for more details.", queryID @@ -797,7 +783,7 @@ public void testFailedMSQQuery() } @Test - public void testFinishedInsertMSQQuery() throws Exception + public void testFinishedInsertMSQQuery() { Response response = resource.doGetStatus(FINISHED_INSERT_MSQ_QUERY, makeOkRequest()); Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -807,42 +793,17 @@ public void testFinishedInsertMSQQuery() throws Exception CREATED_TIME, null, 100L, - new ResultSetInformation(null, null, null, "test", null), + new ResultSetInformation(null, null, null, "test", null, ImmutableList.of(new PageInformation(null, null, 0))), null ), response.getEntity()); - Response resultsResponse = resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, null, null, makeOkRequest()); - Assert.assertEquals(Response.Status.OK.getStatusCode(), resultsResponse.getStatus()); - - - Assert.assertNull(getResultRowsFromResponse(resource.doGetResults( - FINISHED_INSERT_MSQ_QUERY, - 1L, - null, - makeOkRequest() - ))); - Assert.assertNull(getResultRowsFromResponse(resource.doGetResults( - FINISHED_INSERT_MSQ_QUERY, - 0L, - 1L, - makeOkRequest() - ))); - Assert.assertNull(getResultRowsFromResponse(resource.doGetResults( - FINISHED_INSERT_MSQ_QUERY, - 0L, - 3L, - makeOkRequest() - ))); + Assert.assertEquals(Response.Status.OK.getStatusCode(), resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, 0L, makeOkRequest()).getStatus()); + Assert.assertEquals(Response.Status.OK.getStatusCode(), resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, null, makeOkRequest()).getStatus()); Assert.assertEquals( Response.Status.BAD_REQUEST.getStatusCode(), - resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, -1L, 3L, makeOkRequest()).getStatus() - ); - Assert.assertEquals( - Response.Status.BAD_REQUEST.getStatusCode(), - resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, null, -1L, makeOkRequest()).getStatus() + resource.doGetResults(FINISHED_INSERT_MSQ_QUERY, -1L, makeOkRequest()).getStatus() ); - } @Test @@ -850,7 +811,7 @@ public void testNonMSQTasks() { for (String queryID : ImmutableList.of(RUNNING_NON_MSQ_TASK, FAILED_NON_MSQ_TASK, FINISHED_NON_MSQ_TASK)) { assertNullResponse(resource.doGetStatus(queryID, makeOkRequest()), Response.Status.NOT_FOUND); - assertNullResponse(resource.doGetResults(queryID, null, null, makeOkRequest()), Response.Status.NOT_FOUND); + assertNullResponse(resource.doGetResults(queryID, 0L, makeOkRequest()), Response.Status.NOT_FOUND); assertNullResponse(resource.deleteQuery(queryID, makeOkRequest()), Response.Status.NOT_FOUND); } } @@ -874,7 +835,7 @@ public void testMSQInsertAcceptedQuery() ); assertExceptionMessage( - resource.doGetResults(ACCEPTED_INSERT_MSQ_TASK, null, null, makeOkRequest()), + resource.doGetResults(ACCEPTED_INSERT_MSQ_TASK, 0L, makeOkRequest()), StringUtils.format( "Query[%s] is currently in [%s] state. Please wait for it to complete.", ACCEPTED_INSERT_MSQ_TASK, @@ -907,7 +868,7 @@ public void testMSQInsertRunningQuery() ); assertExceptionMessage( - resource.doGetResults(RUNNING_INSERT_MSQ_QUERY, null, null, makeOkRequest()), + resource.doGetResults(RUNNING_INSERT_MSQ_QUERY, 0L, makeOkRequest()), StringUtils.format( "Query[%s] is currently in [%s] state. Please wait for it to complete.", RUNNING_INSERT_MSQ_QUERY, @@ -924,15 +885,12 @@ public void testMSQInsertRunningQuery() @Test public void forbiddenTests() { - Assert.assertEquals(Response.Status.FORBIDDEN.getStatusCode(), resource.doGetStatus(RUNNING_SELECT_MSQ_QUERY, makeExpectedReq(CalciteTests.SUPER_USER_AUTH_RESULT)).getStatus()); - Assert.assertEquals(Response.Status.FORBIDDEN.getStatusCode(), resource.doGetResults(RUNNING_SELECT_MSQ_QUERY, - null, - null, + 1L, makeExpectedReq(CalciteTests.SUPER_USER_AUTH_RESULT)).getStatus()); Assert.assertEquals(Response.Status.FORBIDDEN.getStatusCode(), resource.deleteQuery(RUNNING_SELECT_MSQ_QUERY, diff --git a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/ResultSetInformationTest.java b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/ResultSetInformationTest.java index 14d04b1b76d5..8e40d8daf1a7 100644 --- a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/ResultSetInformationTest.java +++ b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/ResultSetInformationTest.java @@ -31,15 +31,19 @@ public class ResultSetInformationTest { public static final ObjectMapper MAPPER = new ObjectMapper(); - public static final ResultSetInformation RESULTS = new ResultSetInformation(ResultFormat.OBJECT, 1L, 1L, "ds", - ImmutableList.of( - ImmutableList.of("1"), - ImmutableList.of("2"), - ImmutableList.of("3") - ) + public static final ResultSetInformation RESULTS = new ResultSetInformation( + 1L, + 1L, + ResultFormat.OBJECT, + "ds", + ImmutableList.of( + ImmutableList.of("1"), + ImmutableList.of("2"), + ImmutableList.of("3") + ), + ImmutableList.of(new PageInformation(1L, 1L, 0)) ); - public static final String JSON_STRING = "{\"resultFormat\":\"object\",\"numRows\":1,\"sizeInBytes\":1,\"dataSource\":\"ds\",\"sampleRecords\":[[\"1\"],[\"2\"],[\"3\"]]}"; - + public static final String JSON_STRING = "{\"numTotalRows\":1,\"totalSizeInBytes\":1,\"resultFormat\":\"object\",\"dataSource\":\"ds\",\"sampleRecords\":[[\"1\"],[\"2\"],[\"3\"]],\"pages\":[{\"numRows\":1,\"sizeInBytes\":1,\"id\":0}]}"; @Test public void sanityTest() throws JsonProcessingException @@ -51,7 +55,7 @@ public void sanityTest() throws JsonProcessingException MAPPER.readValue(MAPPER.writeValueAsString(RESULTS), ResultSetInformation.class).hashCode() ); Assert.assertEquals( - "ResultSetInformation{totalRows=1, totalSize=1, resultFormat=object, records=[[1], [2], [3]], dataSource='ds'}", + "ResultSetInformation{numTotalRows=1, totalSizeInBytes=1, resultFormat=object, records=[[1], [2], [3]], dataSource='ds', pages=[PageInformation{numRows=1, sizeInBytes=1, id=0}]}", RESULTS.toString() ); } diff --git a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/SqlStatementResultTest.java b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/SqlStatementResultTest.java index a0be3afcf74a..1409450c6972 100644 --- a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/SqlStatementResultTest.java +++ b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/sql/entity/SqlStatementResultTest.java @@ -43,7 +43,7 @@ public class SqlStatementResultTest + "\"createdAt\":\"2023-05-31T12:00:00.000Z\"," + "\"schema\":[{\"name\":\"_time\",\"type\":\"TIMESTAMP\",\"nativeType\":\"LONG\"},{\"name\":\"alias\",\"type\":\"VARCHAR\",\"nativeType\":\"STRING\"},{\"name\":\"market\",\"type\":\"VARCHAR\",\"nativeType\":\"STRING\"}]," + "\"durationMs\":100," - + "\"result\":{\"resultFormat\":\"object\",\"numRows\":1,\"sizeInBytes\":1,\"dataSource\":\"ds\",\"sampleRecords\":[[\"1\"],[\"2\"],[\"3\"]]}," + + "\"result\":{\"numTotalRows\":1,\"totalSizeInBytes\":1,\"resultFormat\":\"object\",\"dataSource\":\"ds\",\"sampleRecords\":[[\"1\"],[\"2\"],[\"3\"]],\"pages\":[{\"numRows\":1,\"sizeInBytes\":1,\"id\":0}]}," + "\"errorDetails\":{\"error\":\"druidException\",\"errorCode\":\"QueryNotSupported\",\"persona\":\"USER\",\"category\":\"UNCATEGORIZED\",\"errorMessage\":\"QueryNotSupported\",\"context\":{}}}"; public static final SqlStatementResult SQL_STATEMENT_RESULT = new SqlStatementResult( @@ -87,7 +87,7 @@ public void sanityTest() throws JsonProcessingException + " createdAt=2023-05-31T12:00:00.000Z," + " sqlRowSignature=[ColumnNameAndTypes{colName='_time', sqlTypeName='TIMESTAMP', nativeTypeName='LONG'}, ColumnNameAndTypes{colName='alias', sqlTypeName='VARCHAR', nativeTypeName='STRING'}, ColumnNameAndTypes{colName='market', sqlTypeName='VARCHAR', nativeTypeName='STRING'}]," + " durationInMs=100," - + " resultSetInformation=ResultSetInformation{totalRows=1, totalSize=1, resultFormat=object, records=[[1], [2], [3]], dataSource='ds'}," + + " resultSetInformation=ResultSetInformation{numTotalRows=1, totalSizeInBytes=1, resultFormat=object, records=[[1], [2], [3]], dataSource='ds', pages=[PageInformation{numRows=1, sizeInBytes=1, id=0}]}," + " errorResponse={error=druidException, errorCode=QueryNotSupported, persona=USER, category=UNCATEGORIZED, errorMessage=QueryNotSupported, context={}}}", SQL_STATEMENT_RESULT.toString() );