diff --git a/presto-main/src/main/java/com/facebook/presto/server/BasicQueryInfo.java b/presto-main/src/main/java/com/facebook/presto/server/BasicQueryInfo.java index 04bde6d41167..f397642e8526 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/BasicQueryInfo.java +++ b/presto-main/src/main/java/com/facebook/presto/server/BasicQueryInfo.java @@ -16,27 +16,24 @@ import com.facebook.presto.SessionRepresentation; import com.facebook.presto.execution.QueryInfo; import com.facebook.presto.execution.QueryState; -import com.facebook.presto.operator.BlockedReason; import com.facebook.presto.spi.ErrorCode; import com.facebook.presto.spi.ErrorType; import com.facebook.presto.spi.QueryId; import com.facebook.presto.spi.memory.MemoryPoolId; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.collect.ImmutableSet; -import io.airlift.units.DataSize; -import io.airlift.units.Duration; -import org.joda.time.DateTime; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import java.net.URI; -import java.util.Set; import static com.google.common.base.MoreObjects.toStringHelper; -import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; +/** + * Lightweight version of QueryInfo. Parts of the web UI depend on the fields + * being named consistently across these classes. + */ @Immutable public class BasicQueryInfo { @@ -44,50 +41,24 @@ public class BasicQueryInfo private final SessionRepresentation session; private final QueryState state; private final MemoryPoolId memoryPool; - private final ErrorType errorType; - private final ErrorCode errorCode; private final boolean scheduled; - private final boolean fullyBlocked; - private final Set blockedReasons; private final URI self; private final String query; - private final Duration elapsedTime; - private final Duration executionTime; - private final Duration cpuTime; - private final DateTime endTime; - private final DateTime createTime; - private final DataSize currentMemory; - private final DataSize peakMemory; - private final double cumulativeMemory; - private final int runningDrivers; - private final int queuedDrivers; - private final int completedDrivers; - private final int totalDrivers; + private final BasicQueryStats queryStats; + private final ErrorType errorType; + private final ErrorCode errorCode; public BasicQueryInfo( QueryId queryId, SessionRepresentation session, QueryState state, MemoryPoolId memoryPool, - ErrorType errorType, - ErrorCode errorCode, boolean scheduled, - boolean fullyBlocked, - Set blockedReasons, URI self, String query, - Duration elapsedTime, - Duration executionTime, - Duration cpuTime, - DateTime endTime, - DateTime createTime, - DataSize currentMemory, - DataSize peakMemory, - double cumulativeMemory, - int runningDrivers, - int queuedDrivers, - int completedDrivers, - int totalDrivers) + BasicQueryStats queryStats, + ErrorType errorType, + ErrorCode errorCode) { this.queryId = requireNonNull(queryId, "queryId is null"); this.session = requireNonNull(session, "session is null"); @@ -96,27 +67,9 @@ public BasicQueryInfo( this.errorType = errorType; this.errorCode = errorCode; this.scheduled = scheduled; - this.fullyBlocked = fullyBlocked; - this.blockedReasons = ImmutableSet.copyOf(requireNonNull(blockedReasons, "blockedReasons is null")); this.self = requireNonNull(self, "self is null"); this.query = requireNonNull(query, "query is null"); - this.elapsedTime = elapsedTime; - this.executionTime = executionTime; - this.cpuTime = cpuTime; - this.endTime = endTime; - this.createTime = createTime; - this.currentMemory = currentMemory; - this.peakMemory = peakMemory; - this.cumulativeMemory = cumulativeMemory; - - checkArgument(runningDrivers >= 0, "runningDrivers is less than zero"); - this.runningDrivers = runningDrivers; - checkArgument(queuedDrivers >= 0, "queuedDrivers is less than zero"); - this.queuedDrivers = queuedDrivers; - checkArgument(completedDrivers >= 0, "completedDrivers is less than zero"); - this.completedDrivers = completedDrivers; - checkArgument(totalDrivers >= 0, "totalDrivers is less than zero"); - this.totalDrivers = totalDrivers; + this.queryStats = requireNonNull(queryStats, "queryStats is null"); } public BasicQueryInfo(QueryInfo queryInfo) @@ -125,25 +78,12 @@ public BasicQueryInfo(QueryInfo queryInfo) queryInfo.getSession(), queryInfo.getState(), queryInfo.getMemoryPool(), - queryInfo.getErrorType(), - queryInfo.getErrorCode(), queryInfo.isScheduled(), - queryInfo.getQueryStats().isFullyBlocked(), - queryInfo.getQueryStats().getBlockedReasons(), queryInfo.getSelf(), queryInfo.getQuery(), - queryInfo.getQueryStats().getElapsedTime(), - queryInfo.getQueryStats().getExecutionTime(), - queryInfo.getQueryStats().getTotalCpuTime(), - queryInfo.getQueryStats().getEndTime(), - queryInfo.getQueryStats().getCreateTime(), - queryInfo.getQueryStats().getTotalMemoryReservation(), - queryInfo.getQueryStats().getPeakMemoryReservation(), - queryInfo.getQueryStats().getCumulativeMemory(), - queryInfo.getQueryStats().getRunningDrivers(), - queryInfo.getQueryStats().getQueuedDrivers(), - queryInfo.getQueryStats().getCompletedDrivers(), - queryInfo.getQueryStats().getTotalDrivers()); + new BasicQueryStats(queryInfo.getQueryStats()), + queryInfo.getErrorType(), + queryInfo.getErrorCode()); } @JsonProperty @@ -170,38 +110,12 @@ public MemoryPoolId getMemoryPool() return memoryPool; } - @Nullable - @JsonProperty - public ErrorType getErrorType() - { - return errorType; - } - - @Nullable - @JsonProperty - public ErrorCode getErrorCode() - { - return errorCode; - } - @JsonProperty public boolean isScheduled() { return scheduled; } - @JsonProperty - public boolean isFullyBlocked() - { - return fullyBlocked; - } - - @JsonProperty - public Set getBlockedReasons() - { - return blockedReasons; - } - @JsonProperty public URI getSelf() { @@ -215,75 +129,23 @@ public String getQuery() } @JsonProperty - public long getExecutionTimeMillis() - { - return executionTime.toMillis(); - } - - @JsonProperty - public long getCpuTimeMillis() - { - return cpuTime.toMillis(); - } - - @JsonProperty - public long getElapsedTimeMillis() - { - return elapsedTime.toMillis(); - } - - @JsonProperty - public DateTime getEndTime() - { - return endTime; - } - - @JsonProperty - public int getRunningDrivers() - { - return runningDrivers; - } - - @JsonProperty - public int getQueuedDrivers() - { - return queuedDrivers; - } - - @JsonProperty - public int getTotalDrivers() + public BasicQueryStats getQueryStats() { - return totalDrivers; - } - - @JsonProperty - public int getCompletedDrivers() - { - return completedDrivers; - } - - @JsonProperty - public DateTime getCreateTime() - { - return createTime; - } - - @JsonProperty - public double getCumulativeMemory() - { - return cumulativeMemory; + return queryStats; } + @Nullable @JsonProperty - public long getCurrentMemoryBytes() + public ErrorType getErrorType() { - return currentMemory.toBytes(); + return errorType; } + @Nullable @JsonProperty - public long getPeakMemoryBytes() + public ErrorCode getErrorCode() { - return peakMemory.toBytes(); + return errorCode; } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/server/BasicQueryStats.java b/presto-main/src/main/java/com/facebook/presto/server/BasicQueryStats.java new file mode 100644 index 000000000000..59c85b4dc908 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/server/BasicQueryStats.java @@ -0,0 +1,199 @@ +/* + * Licensed 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 com.facebook.presto.server; + +import com.facebook.presto.execution.QueryStats; +import com.facebook.presto.operator.BlockedReason; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableSet; +import io.airlift.units.DataSize; +import io.airlift.units.Duration; +import org.joda.time.DateTime; + +import javax.annotation.concurrent.Immutable; + +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + +/** + * Lightweight version of QueryStats. Parts of the web UI depend on the fields + * being named consistently across these classes. + */ +@Immutable +public class BasicQueryStats +{ + private final DateTime createTime; + private final DateTime endTime; + + private final Duration elapsedTime; + private final Duration executionTime; + + private final int totalDrivers; + private final int queuedDrivers; + private final int runningDrivers; + private final int completedDrivers; + + private final double cumulativeMemory; + private final DataSize totalMemoryReservation; + private final DataSize peakMemoryReservation; + private final Duration totalCpuTime; + + private final boolean fullyBlocked; + private final Set blockedReasons; + + public BasicQueryStats( + DateTime createTime, + DateTime endTime, + Duration elapsedTime, + Duration executionTime, + int totalDrivers, + int queuedDrivers, + int runningDrivers, + int completedDrivers, + double cumulativeMemory, + DataSize totalMemoryReservation, + DataSize peakMemoryReservation, + Duration totalCpuTime, + boolean fullyBlocked, + Set blockedReasons) + { + this.createTime = createTime; + this.endTime = endTime; + + this.elapsedTime = elapsedTime; + this.executionTime = executionTime; + + checkArgument(totalDrivers >= 0, "totalDrivers is negative"); + this.totalDrivers = totalDrivers; + checkArgument(queuedDrivers >= 0, "queuedDrivers is negative"); + this.queuedDrivers = queuedDrivers; + checkArgument(runningDrivers >= 0, "runningDrivers is negative"); + this.runningDrivers = runningDrivers; + checkArgument(completedDrivers >= 0, "completedDrivers is negative"); + this.completedDrivers = completedDrivers; + + this.cumulativeMemory = cumulativeMemory; + this.totalMemoryReservation = totalMemoryReservation; + this.peakMemoryReservation = peakMemoryReservation; + this.totalCpuTime = totalCpuTime; + + this.fullyBlocked = fullyBlocked; + this.blockedReasons = ImmutableSet.copyOf(requireNonNull(blockedReasons, "blockedReasons is null")); + } + + public BasicQueryStats(QueryStats queryStats) + { + this(queryStats.getCreateTime(), + queryStats.getEndTime(), + queryStats.getElapsedTime(), + queryStats.getExecutionTime(), + queryStats.getTotalDrivers(), + queryStats.getQueuedDrivers(), + queryStats.getRunningDrivers(), + queryStats.getCompletedDrivers(), + queryStats.getCumulativeMemory(), + queryStats.getTotalMemoryReservation(), + queryStats.getPeakMemoryReservation(), + queryStats.getTotalCpuTime(), + queryStats.isFullyBlocked(), + queryStats.getBlockedReasons()); + } + + @JsonProperty + public DateTime getCreateTime() + { + return createTime; + } + + @JsonProperty + public DateTime getEndTime() + { + return endTime; + } + + @JsonProperty + public Duration getElapsedTime() + { + return elapsedTime; + } + + @JsonProperty + public Duration getExecutionTime() + { + return executionTime; + } + + @JsonProperty + public int getTotalDrivers() + { + return totalDrivers; + } + + @JsonProperty + public int getQueuedDrivers() + { + return queuedDrivers; + } + + @JsonProperty + public int getRunningDrivers() + { + return runningDrivers; + } + + @JsonProperty + public int getCompletedDrivers() + { + return completedDrivers; + } + + @JsonProperty + public double getCumulativeMemory() + { + return cumulativeMemory; + } + + @JsonProperty + public DataSize getTotalMemoryReservation() + { + return totalMemoryReservation; + } + + @JsonProperty + public DataSize getPeakMemoryReservation() + { + return peakMemoryReservation; + } + + @JsonProperty + public Duration getTotalCpuTime() + { + return totalCpuTime; + } + + @JsonProperty + public boolean isFullyBlocked() + { + return fullyBlocked; + } + + @JsonProperty + public Set getBlockedReasons() + { + return blockedReasons; + } +} diff --git a/presto-main/src/main/resources/webapp/assets/query-list.js b/presto-main/src/main/resources/webapp/assets/query-list.js index ba2de7eeb9dd..8c473be37c81 100644 --- a/presto-main/src/main/resources/webapp/assets/query-list.js +++ b/presto-main/src/main/resources/webapp/assets/query-list.js @@ -52,57 +52,21 @@ render: function() { var query = this.props.query; - var summary = query.state; - var progress = 0; - - var completedDrivers = query.completedDrivers; - var runningDrivers = query.runningDrivers; - var queuedDrivers = query.queuedDrivers; - - // construct query summary and compute progress - switch (query.state) { - case "FAILED": - progress = 100; - summary = getReadableErrorCode(query.errorType, query.errorCode); - runningDrivers = 0; - queuedDrivers = 0; - break; - case "RUNNING": - progress = query.totalDrivers == 0 ? 0 : Math.round((completedDrivers * 100) / query.totalDrivers); - if (query.isFullyBlocked) { - summary = "BLOCKED"; - if (query.blockedReasons.length > 0) { - summary += " (" + query.blockedReasons.join() + ")"; - } - } - else { - summary = (progress == 0 ? summary : summary + " (" + progress + "%" + ")"); - } - if (query.memoryPool == "reserved") { - summary += " (RESERVED mem pool)"; - } - break; - case "FINISHED": - progress = 100; - runningDrivers = 0; - queuedDrivers = 0; - break; - } - var progressBarStyle = { width: (progress == 0 ? 100 : progress) + "%", backgroundColor: getQueryStateColor(query.state, query.errorType, query.errorCode) }; + var progressBarStyle = { width: getProgressBarPercentage(query) + "%", backgroundColor: getQueryStateColor(query) }; var splitDetails = (
   - { completedDrivers } + { query.queryStats.completedDrivers }    - { runningDrivers } + { (query.state == "FINISHED" || query.state == "FAILED") ? 0 : query.queryStats.runningDrivers }    - { queuedDrivers } + { (query.state == "FINISHED" || query.state == "FAILED") ? 0 : query.queryStats.queuedDrivers }
); @@ -110,15 +74,15 @@
   - { formatDuration(query.executionTimeMillis) } + { query.queryStats.executionTime }    - { formatDuration(query.elapsedTimeMillis) } + { query.queryStats.elapsedTime }    - { formatDuration(query.cpuTimeMillis) } + { query.queryStats.totalCpuTime }
); @@ -126,15 +90,15 @@
   - { formatDataSize(query.currentMemoryBytes) } + { query.queryStats.totalMemoryReservation }    - { formatDataSize(query.peakMemoryBytes) } + { query.queryStats.peakMemoryReservation }    - { formatDataSizeBytes(query.cumulativeMemory) } + { formatDataSizeBytes(query.queryStats.cumulativeMemory) }
); @@ -154,7 +118,7 @@ { query.queryId }
- { formatShortTime(new Date(Date.parse(query.createTime))) } + { formatShortTime(new Date(Date.parse(query.queryStats.createTime))) }
@@ -187,8 +151,8 @@
-
- { summary } +
+ { getProgressBarTitle(query) }
@@ -232,12 +196,12 @@ var FILTER_TYPE = { }; var SORT_TYPE = { - CREATED: function(query) {return Date.parse(query.createTime)}, - ELAPSED: function(query) {return query.elapsedTimeMillis}, - EXECUTION: function(query) {return query.executionTimeMillis}, - CPU: function(query) {return query.cpuTimeMillis}, - CUMULATIVE_MEMORY: function(query) {return query.cumulativeMemory}, - CURRENT_MEMORY: function(query) {return query.currentMemoryBytes}, + CREATED: function(query) {return Date.parse(query.queryStats.createTime)}, + ELAPSED: function(query) {return parseDuration(query.queryStats.elapsedTime)}, + EXECUTION: function(query) {return parseDuration(query.queryStats.executionTime)}, + CPU: function(query) {return parseDuration(query.queryStats.totalCpuTime)}, + CUMULATIVE_MEMORY: function(query) {return query.queryStats.cumulativeMemory}, + CURRENT_MEMORY: function(query) {return parseDataSize(query.queryStats.totalMemoryReservation)}, }; var SORT_ORDER = { diff --git a/presto-main/src/main/resources/webapp/assets/query.js b/presto-main/src/main/resources/webapp/assets/query.js index c652c6422b65..2e8a963ac32e 100644 --- a/presto-main/src/main/resources/webapp/assets/query.js +++ b/presto-main/src/main/resources/webapp/assets/query.js @@ -802,33 +802,12 @@ var QueryDetail = React.createClass({ }, renderProgressBar: function() { var query = this.state.query; - var summary = query.state; - var progress = 100; - - // construct query summary and compute progress - switch (query.state) { - case "FAILED": - summary = getReadableErrorCode(query.errorType, query.errorCode); - break; - case "RUNNING": - progress = query.queryStats.totalDrivers == 0 ? 0 : Math.round((query.queryStats.completedDrivers * 100) / query.queryStats.totalDrivers); - if (query.queryStats.fullyBlocked) { - summary = "BLOCKED"; - if (query.queryStats.blockedReasons.length > 0) { - summary += " (" + query.queryStats.blockedReasons.join() + ")"; - } - } - else { - summary = (progress == 0 ? summary : summary + " (" + progress + "%" + ")"); - } - break; - } - var progressBarStyle = {width: (progress == 0 ? 100 : progress) + "%", backgroundColor: getQueryStateColor(query.state, query.errorType, query.errorCode)}; + var progressBarStyle = { width: getProgressBarPercentage(query) + "%", backgroundColor: getQueryStateColor(query) }; return (
-
- { summary } +
+ { getProgressBarTitle(query) }
) diff --git a/presto-main/src/main/resources/webapp/assets/utils.js b/presto-main/src/main/resources/webapp/assets/utils.js index a1da2a3bb70f..e8c73019ac1f 100644 --- a/presto-main/src/main/resources/webapp/assets/utils.js +++ b/presto-main/src/main/resources/webapp/assets/utils.js @@ -31,31 +31,9 @@ var QUERY_STATE_COLOR_MAP = { UNKNOWN_ERROR: '#943524' }; -function getReadableErrorCode(errorType, errorCode) +function getQueryStateColor(query) { - if (typeof errorType === 'undefined') { - return "UNKNOWN ERROR"; - } - - switch (errorType) { - case "USER_ERROR": - if (errorCode.name === 'USER_CANCELED') { - return "USER CANCELED"; - } - return "USER ERROR"; - case "INTERNAL_ERROR": - return "INTERNAL ERROR"; - case "INSUFFICIENT_RESOURCES": - return "INSUFFICIENT RESOURCES"; - case "EXTERNAL": - return "EXTERNAL ERROR"; - } - return errorType; -} - -function getQueryStateColor(state, errorType, errorCode) -{ - switch (state) { + switch (query.state) { case "QUEUED": return QUERY_STATE_COLOR_MAP.QUEUED; case "PLANNING": @@ -65,9 +43,9 @@ function getQueryStateColor(state, errorType, errorCode) case "FINISHING": return QUERY_STATE_COLOR_MAP.RUNNING; case "FAILED": - switch (errorType) { + switch (query.errorType) { case "USER_ERROR": - if (errorCode.name === 'USER_CANCELED') { + if (query.errorCode.name === 'USER_CANCELED') { return QUERY_STATE_COLOR_MAP.USER_CANCELED; } return QUERY_STATE_COLOR_MAP.USER_ERROR; @@ -85,6 +63,67 @@ function getQueryStateColor(state, errorType, errorCode) } }; +// This relies on the fact that BasicQueryInfo and QueryInfo have all the fields +// necessary to compute this string, and that these fields are consistently named. +function getHumanReadableState(query) +{ + if (query.state == "RUNNING") { + if (query.scheduled && query.queryStats.totalDrivers > 0 && query.queryStats.runningDrivers >= 0) { + return "RUNNING"; + } + + if (query.queryStats.fullyBlocked) { + return "BLOCKED (" + query.queryStats.blockedReasons.join(", ") + ")"; + } + + if (query.memoryPool === "reserved") { + return "RUNNING (RESERVED)"; + } + } + + if (query.state == "FAILED") { + switch (query.errorType) { + case "USER_ERROR": + if (query.errorCode.name === "USER_CANCELED") { + return "USER CANCELED"; + } + return "USER ERROR"; + case "INTERNAL_ERROR": + return "INTERNAL ERROR"; + case "INSUFFICIENT_RESOURCES": + return "INSUFFICIENT RESOURCES"; + case "EXTERNAL": + return "EXTERNAL ERROR"; + } + } + + return query.state; +} + +function isProgressMeaningful(query) +{ + return query.scheduled && query.state == "RUNNING" && query.queryStats.totalDrivers > 0 && query.queryStats.completedDrivers > 0; +} + +function getProgressBarPercentage(query) +{ + if (isProgressMeaningful(query)) { + return Math.round((query.queryStats.completedDrivers * 100.0) / query.queryStats.totalDrivers); + } + + // progress bars should appear 'full' when query progress is not meaningful + return 100; +} + +function getProgressBarTitle(query) +{ + if (isProgressMeaningful(query)) { + return getHumanReadableState(query) + " (" + getProgressBarPercentage(query) + "%)" + } + + return getHumanReadableState(query) +} + // Sparkline-related functions // =========================== diff --git a/presto-main/src/test/java/com/facebook/presto/server/TestBasicQueryInfo.java b/presto-main/src/test/java/com/facebook/presto/server/TestBasicQueryInfo.java new file mode 100644 index 000000000000..3be861c09c0e --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/server/TestBasicQueryInfo.java @@ -0,0 +1,127 @@ +/* + * Licensed 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 com.facebook.presto.server; + +import com.facebook.presto.execution.QueryInfo; +import com.facebook.presto.execution.QueryStats; +import com.facebook.presto.operator.BlockedReason; +import com.facebook.presto.spi.QueryId; +import com.facebook.presto.spi.StandardErrorCode; +import com.facebook.presto.spi.memory.MemoryPoolId; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import io.airlift.units.DataSize; +import io.airlift.units.Duration; +import org.joda.time.DateTime; +import org.testng.annotations.Test; + +import java.net.URI; +import java.util.Optional; + +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; +import static com.facebook.presto.execution.QueryState.RUNNING; +import static org.testng.Assert.assertEquals; + +public class TestBasicQueryInfo +{ + @Test + public void testConstructor() + { + BasicQueryInfo basicInfo = new BasicQueryInfo( + new QueryInfo( + new QueryId("0"), + TEST_SESSION.toSessionRepresentation(), + RUNNING, + new MemoryPoolId("reserved"), + false, + URI.create("1"), + ImmutableList.of("2", "3"), + "SELECT 4", + new QueryStats( + DateTime.parse("1991-09-06T05:00-05:30"), + DateTime.parse("1991-09-06T05:01-05:30"), + DateTime.parse("1991-09-06T05:02-05:30"), + DateTime.parse("1991-09-06T06:00-05:30"), + Duration.valueOf("8m"), + Duration.valueOf("7m"), + Duration.valueOf("9m"), + Duration.valueOf("10m"), + Duration.valueOf("11m"), + Duration.valueOf("12m"), + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20.0, + DataSize.valueOf("21GB"), + DataSize.valueOf("22GB"), + Duration.valueOf("23m"), + Duration.valueOf("24m"), + Duration.valueOf("25m"), + Duration.valueOf("26m"), + true, + ImmutableSet.of(BlockedReason.WAITING_FOR_MEMORY), + DataSize.valueOf("27GB"), + 28, + DataSize.valueOf("29GB"), + 30, + DataSize.valueOf("31GB"), + 32), + ImmutableMap.of(), + ImmutableSet.of(), + ImmutableMap.of(), + ImmutableSet.of(), + Optional.empty(), + false, + "33", + Optional.empty(), + null, + StandardErrorCode.ABANDONED_QUERY.toErrorCode(), + ImmutableSet.of(), + Optional.empty(), + false)); + + assertEquals(basicInfo.getQueryId().getId(), "0"); + assertEquals(basicInfo.getState(), RUNNING); + assertEquals(basicInfo.getMemoryPool().getId(), "reserved"); + assertEquals(basicInfo.isScheduled(), false); + assertEquals(basicInfo.getQuery(), "SELECT 4"); + + assertEquals(basicInfo.getQueryStats().getCreateTime(), DateTime.parse("1991-09-06T05:00-05:30")); + assertEquals(basicInfo.getQueryStats().getEndTime(), DateTime.parse("1991-09-06T06:00-05:30")); + assertEquals(basicInfo.getQueryStats().getElapsedTime(), Duration.valueOf("8m")); + assertEquals(basicInfo.getQueryStats().getExecutionTime(), Duration.valueOf("1m")); + + assertEquals(basicInfo.getQueryStats().getTotalDrivers(), 16); + assertEquals(basicInfo.getQueryStats().getQueuedDrivers(), 17); + assertEquals(basicInfo.getQueryStats().getRunningDrivers(), 18); + assertEquals(basicInfo.getQueryStats().getCompletedDrivers(), 19); + + assertEquals(basicInfo.getQueryStats().getCumulativeMemory(), 20.0); + assertEquals(basicInfo.getQueryStats().getTotalMemoryReservation(), DataSize.valueOf("21GB")); + assertEquals(basicInfo.getQueryStats().getPeakMemoryReservation(), DataSize.valueOf("22GB")); + assertEquals(basicInfo.getQueryStats().getTotalCpuTime(), Duration.valueOf("24m")); + + assertEquals(basicInfo.getQueryStats().isFullyBlocked(), true); + assertEquals(basicInfo.getQueryStats().getBlockedReasons(), ImmutableSet.of(BlockedReason.WAITING_FOR_MEMORY)); + + assertEquals(basicInfo.getErrorCode(), StandardErrorCode.ABANDONED_QUERY.toErrorCode()); + assertEquals(basicInfo.getErrorType(), StandardErrorCode.ABANDONED_QUERY.toErrorCode().getType()); + } +}