You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by ra...@apache.org on 2015/10/09 06:17:23 UTC
[18/50] [abbrv] lens git commit: LENS-753: Queue number for queries
in submitted queue
LENS-753: Queue number for queries in submitted queue
Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/4addd7b6
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/4addd7b6
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/4addd7b6
Branch: refs/heads/current-release-line
Commit: 4addd7b62ed1db8fe1af498a6baf55ee35ad692a
Parents: 3563aac
Author: Akshay Goyal <ak...@gmail.com>
Authored: Tue Sep 15 16:29:32 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Tue Sep 15 16:29:32 2015 +0530
----------------------------------------------------------------------
.../org/apache/lens/api/query/QueryStatus.java | 38 +++++++++++++++----
.../lens/cli/commands/LensQueryCommands.java | 18 +--------
.../server/api/driver/DriverQueryStatus.java | 7 ++--
.../server/api/query/FinishedLensQuery.java | 2 +-
.../lens/server/api/query/QueryContext.java | 2 +-
.../query/collect/ImmutableQueryCollection.java | 6 +++
.../server/query/QueryExecutionServiceImpl.java | 26 ++++++++-----
.../DefaultEstimatedQueryCollection.java | 5 +++
.../query/collect/DefaultQueryCollection.java | 36 ++++++++++++++++--
.../ThreadSafeEstimatedQueryCollection.java | 5 +++
.../collect/ThreadSafeQueryCollection.java | 5 +++
.../collect/DefaultQueryCollectionTest.java | 34 ++++++++++++++++-
.../server/query/collect/QueryCollectUtil.java | 39 +++++++++++++++++++-
13 files changed, 178 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-api/src/main/java/org/apache/lens/api/query/QueryStatus.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/query/QueryStatus.java b/lens-api/src/main/java/org/apache/lens/api/query/QueryStatus.java
index 9614caa..3c8531f 100644
--- a/lens-api/src/main/java/org/apache/lens/api/query/QueryStatus.java
+++ b/lens-api/src/main/java/org/apache/lens/api/query/QueryStatus.java
@@ -39,6 +39,8 @@ import lombok.*;
*
* @param progress
* the progress
+ * @param queueNumber
+ * the queue number
* @param status
* the status
* @param statusMessage
@@ -121,6 +123,13 @@ public class QueryStatus implements Serializable {
private double progress;
/**
+ * Queue number of a query when it is in waiting state.
+ */
+ @Getter
+ @Setter
+ private Integer queueNumber;
+
+ /**
* The status.
*/
@XmlElement
@@ -165,20 +174,33 @@ public class QueryStatus implements Serializable {
*/
@Override
public String toString() {
- StringBuilder str = new StringBuilder(status.toString()).append(':').append(statusMessage);
- if (status.equals(Status.RUNNING)) {
- str.append(" - Progress:").append(progress).append(":").append(progressMessage);
+
+ StringBuilder str = new StringBuilder(" Status : ").append(status.toString()).append("\n");
+ if (statusMessage != null) {
+ str.append(" Message : ").append(statusMessage).append("\n");
+ }
+
+ str.append(" Progress : ").append(progress).append("\n");
+ if (progressMessage != null) {
+ str.append(" Progress Message : ").append(progressMessage).append("\n");
}
+
+ if (queueNumber != null) {
+ str.append(" Position in queue : ").append(queueNumber).append("\n");
+ }
+
+ if (errorMessage != null) {
+ str.append(" Error : ").append(errorMessage).append("\n");
+ }
+
if (status.equals(Status.SUCCESSFUL)) {
if (isResultSetAvailable) {
- str.append(" - Result Available");
+ str.append(" Result Available");
} else {
- str.append(" - Result Not Available");
+ str.append(" Result Not Available");
}
}
- if (status.equals(Status.FAILED)) {
- str.append(" - Cause:").append(errorMessage);
- }
+
return str.toString();
}
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java
index 44c0c62..006eaed 100644
--- a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java
+++ b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java
@@ -156,26 +156,10 @@ public class LensQueryCommands extends BaseLensCommand {
public String getStatus(
@CliOption(key = {"", "query_handle"}, mandatory = true, help = "<query_handle>") String qh) {
QueryStatus status = getClient().getQueryStatus(new QueryHandle(UUID.fromString(qh)));
- StringBuilder sb = new StringBuilder();
if (status == null) {
return "Unable to find status for " + qh;
}
- sb.append("Status : ").append(status.getStatus()).append("\n");
- if (status.getStatusMessage() != null) {
- sb.append("Message : ").append(status.getStatusMessage()).append("\n");
- }
- if (status.getProgress() != 0) {
- sb.append("Progress : ").append(status.getProgress()).append("\n");
- if (status.getProgressMessage() != null) {
- sb.append("Progress Message : ").append(status.getProgressMessage()).append("\n");
- }
- }
-
- if (status.getErrorMessage() != null) {
- sb.append("Error : ").append(status.getErrorMessage()).append("\n");
- }
-
- return sb.toString();
+ return status.toString();
}
/**
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server-api/src/main/java/org/apache/lens/server/api/driver/DriverQueryStatus.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/driver/DriverQueryStatus.java b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/DriverQueryStatus.java
index f78b7c3..79d8bf1 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/driver/DriverQueryStatus.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/DriverQueryStatus.java
@@ -167,7 +167,8 @@ public class DriverQueryStatus implements Serializable {
break;
}
- return new QueryStatus(progress, qstate, statusMessage, isResultSetAvailable, progressMessage, errorMessage, null);
+ return new QueryStatus(progress, null, qstate, statusMessage, isResultSetAvailable, progressMessage,
+ errorMessage, null);
}
/**
@@ -178,8 +179,8 @@ public class DriverQueryStatus implements Serializable {
* @return the query status
*/
public static QueryStatus createQueryStatus(QueryStatus.Status state, DriverQueryStatus dstatus) {
- return new QueryStatus(dstatus.progress, state, dstatus.statusMessage, dstatus.isResultSetAvailable,
- dstatus.progressMessage, dstatus.errorMessage, null);
+ return new QueryStatus(dstatus.progress, null, state, dstatus.statusMessage,
+ dstatus.isResultSetAvailable, dstatus.progressMessage, dstatus.errorMessage, null);
}
/*
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server-api/src/main/java/org/apache/lens/server/api/query/FinishedLensQuery.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/FinishedLensQuery.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/FinishedLensQuery.java
index 6cecf7e..d8c04db 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/FinishedLensQuery.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/FinishedLensQuery.java
@@ -204,7 +204,7 @@ public class FinishedLensQuery {
qctx.setQueryHandle(QueryHandle.fromString(handle));
qctx.setLaunchTime(this.startTime);
qctx.setEndTime(getEndTime());
- qctx.setStatusSkippingTransitionTest(new QueryStatus(0.0, QueryStatus.Status.valueOf(getStatus()),
+ qctx.setStatusSkippingTransitionTest(new QueryStatus(0.0, null, QueryStatus.Status.valueOf(getStatus()),
getErrorMessage() == null ? "" : getErrorMessage(), getResult() != null, null, null, null));
qctx.getDriverStatus().setDriverStartTime(getDriverStartTime());
qctx.getDriverStatus().setDriverFinishTime(getDriverEndTime());
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
index beaa72f..12de0a5 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
@@ -217,7 +217,7 @@ public class QueryContext extends AbstractQueryContext {
super(userQuery, user, qconf, conf, drivers, mergeDriverConf);
this.submissionTime = submissionTime;
this.queryHandle = new QueryHandle(UUID.randomUUID());
- this.status = new QueryStatus(0.0f, Status.NEW, "Query just got created", false, null, null, null);
+ this.status = new QueryStatus(0.0f, null, Status.NEW, "Query just got created", false, null, null, null);
this.priority = Priority.NORMAL;
this.lensConf = qconf;
this.conf = conf;
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server-api/src/main/java/org/apache/lens/server/api/query/collect/ImmutableQueryCollection.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/collect/ImmutableQueryCollection.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/collect/ImmutableQueryCollection.java
index 344ff10..0dcf367 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/collect/ImmutableQueryCollection.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/collect/ImmutableQueryCollection.java
@@ -50,4 +50,10 @@ public interface ImmutableQueryCollection {
* @return Count of existing queries
*/
int getQueriesCount();
+
+ /**
+ *
+ * @return Index of a query within collection
+ */
+ Integer getQueryIndex(final QueryContext query);
}
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
index 23cc748..9e27dd4 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
@@ -615,8 +615,8 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
checkEstimatedQueriesState(query);
QueryStatus oldStatus = query.getStatus();
- QueryStatus newStatus = new QueryStatus(query.getStatus().getProgress(), QueryStatus.Status.LAUNCHED,
- "Query is launched on driver", false, null, null, null);
+ QueryStatus newStatus = new QueryStatus(query.getStatus().getProgress(), null,
+ QueryStatus.Status.LAUNCHED, "Query is launched on driver", false, null, null, null);
query.validateTransition(newStatus);
// Check if we need to pass session's effective resources to selected driver
@@ -717,7 +717,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
throws LensException {
QueryStatus before = ctx.getStatus();
- ctx.setStatus(new QueryStatus(0.0f, FAILED, statusMsg, false, null, reason, lensErrorTO));
+ ctx.setStatus(new QueryStatus(0.0f, null, FAILED, statusMsg, false, null, reason, lensErrorTO));
updateFinishedQuery(ctx, before);
fireStatusChangeEvent(ctx, ctx.getStatus(), before);
}
@@ -731,7 +731,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
*/
private void setCancelledStatus(QueryContext ctx, String statusMsg) throws LensException {
QueryStatus before = ctx.getStatus();
- ctx.setStatus(new QueryStatus(0.0f, CANCELED, statusMsg, false, null, null, null));
+ ctx.setStatus(new QueryStatus(0.0f, null, CANCELED, statusMsg, false, null, null, null));
updateFinishedQuery(ctx, before);
fireStatusChangeEvent(ctx, ctx.getStatus(), before);
}
@@ -765,7 +765,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
void setSuccessState(QueryContext ctx) throws LensException {
QueryStatus before = ctx.getStatus();
- ctx.setStatus(new QueryStatus(1.0f, SUCCESSFUL, "Query is successful!", ctx
+ ctx.setStatus(new QueryStatus(1.0f, null, SUCCESSFUL, "Query is successful!", ctx
.isResultAvailableInDriver(), null, null, null));
updateFinishedQuery(ctx, before);
fireStatusChangeEvent(ctx, ctx.getStatus(), before);
@@ -807,6 +807,14 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
fireStatusChangeEvent(ctx, ctx.getStatus(), before);
}
}
+ if (ctx.queued()) {
+ Integer queryIndex = waitingQueries.getQueryIndex(ctx);
+ // Query index could be null when the query status is queued but
+ // query is present in priorityblocking queue for processing
+ if (queryIndex != null) {
+ ctx.getStatus().setQueueNumber(queryIndex);
+ }
+ }
}
}
}
@@ -946,7 +954,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
resultSets.remove(finished.getCtx().getQueryHandle());
}
fireStatusChangeEvent(finished.getCtx(),
- new QueryStatus(1f, CLOSED, "Query purged", false, null, null, null), finished.getCtx().getStatus());
+ new QueryStatus(1f, null, CLOSED, "Query purged", false, null, null, null), finished.getCtx().getStatus());
log.info("Query purged: {}", finished.getCtx().getQueryHandle());
} catch (LensException e) {
@@ -1006,8 +1014,8 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
this.launchedQueries
= new ThreadSafeEstimatedQueryCollection(new DefaultEstimatedQueryCollection(new DefaultQueryCollection()));
- this.waitingQueries
- = new ThreadSafeEstimatedQueryCollection(new DefaultEstimatedQueryCollection(new DefaultQueryCollection()));
+ this.waitingQueries = new ThreadSafeEstimatedQueryCollection(new DefaultEstimatedQueryCollection(
+ new DefaultQueryCollection(new TreeSet<QueryContext>(new QueryContextPriorityComparator()))));
ImmutableSet<QueryLaunchingConstraint> queryConstraints = getImplementations(
QUERY_LAUNCHING_CONSTRAINT_FACTORIES_KEY, hiveConf);
@@ -1696,7 +1704,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
private QueryHandle submitQuery(final QueryContext ctx) throws LensException {
QueryStatus before = ctx.getStatus();
- ctx.setStatus(new QueryStatus(0.0, QUEUED, "Query is queued", false, null, null, null));
+ ctx.setStatus(new QueryStatus(0.0, null, QUEUED, "Query is queued", false, null, null, null));
queuedQueries.add(ctx);
log.debug("Added to Queued Queries:{}", ctx.getQueryHandleString());
allQueries.put(ctx.getQueryHandle(), ctx);
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultEstimatedQueryCollection.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultEstimatedQueryCollection.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultEstimatedQueryCollection.java
index e3505bb..908b86f 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultEstimatedQueryCollection.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultEstimatedQueryCollection.java
@@ -138,6 +138,11 @@ public class DefaultEstimatedQueryCollection implements EstimatedQueryCollection
return this.queries.getQueriesCount();
}
+ @Override
+ public Integer getQueryIndex(QueryContext query) {
+ return this.queries.getQueryIndex(query);
+ }
+
@VisibleForTesting
void checkState(final QueryContext query) {
Preconditions.checkState(query.getSelectedDriver() != null);
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultQueryCollection.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultQueryCollection.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultQueryCollection.java
index f9e7701..844237a 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultQueryCollection.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/collect/DefaultQueryCollection.java
@@ -26,7 +26,6 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.map.MultiValueMap;
import com.google.common.collect.Sets;
-import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@@ -36,17 +35,28 @@ import lombok.extern.slf4j.Slf4j;
*
* @see QueryCollection
*/
-@NoArgsConstructor
@Slf4j
public class DefaultQueryCollection implements QueryCollection {
- private final Set<QueryContext> queries = Sets.newLinkedHashSet();
+ private final Set<QueryContext> queries;
private final MultiValueMap queriesByUser = MultiValueMap.decorate(new HashMap(), LinkedHashSet.class);
+ public DefaultQueryCollection() {
+ this.queries = Sets.newLinkedHashSet();
+ }
+
public DefaultQueryCollection(@NonNull final Set<QueryContext> queries) {
+ this();
addAll(queries);
}
+ public DefaultQueryCollection(final TreeSet<QueryContext> treeSet) {
+ this.queries = treeSet;
+ for (QueryContext query : treeSet) {
+ queriesByUser.put(query.getSubmittedUser(), query);
+ }
+ }
+
@Override
public boolean add(final QueryContext query) {
@@ -96,6 +106,26 @@ public class DefaultQueryCollection implements QueryCollection {
return queries.size();
}
+
+ /**
+ * Since the collection is a linkedHashSet, the order of queries is always maintained.
+ * @param query
+ * @return
+ */
+ @Override
+ public Integer getQueryIndex(QueryContext query) {
+ Iterator iterator = queries.iterator();
+ int index = 1;
+ while (iterator.hasNext()) {
+ QueryContext queuedQuery = (QueryContext) iterator.next();
+ if (queuedQuery.getQueryHandle().equals(query.getQueryHandle())) {
+ return index;
+ }
+ index += 1;
+ }
+ return null;
+ }
+
private Collection<QueryContext> getQueriesCollectionForUser(final String user) {
final Collection<QueryContext> userQueries = queriesByUser.getCollection(user);
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeEstimatedQueryCollection.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeEstimatedQueryCollection.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeEstimatedQueryCollection.java
index cdbd2ad..5d24379 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeEstimatedQueryCollection.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeEstimatedQueryCollection.java
@@ -70,6 +70,11 @@ public class ThreadSafeEstimatedQueryCollection implements EstimatedQueryCollect
}
@Override
+ public synchronized Integer getQueryIndex(QueryContext query) {
+ return this.estimatedQueries.getQueryIndex(query);
+ }
+
+ @Override
public synchronized boolean add(QueryContext query) {
return this.estimatedQueries.add(query);
}
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeQueryCollection.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeQueryCollection.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeQueryCollection.java
index 7b43a38..a49c7de 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeQueryCollection.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/collect/ThreadSafeQueryCollection.java
@@ -72,4 +72,9 @@ public class ThreadSafeQueryCollection implements QueryCollection {
public synchronized int getQueriesCount() {
return this.queries.getQueriesCount();
}
+
+ @Override
+ public synchronized Integer getQueryIndex(QueryContext query) {
+ return this.queries.getQueryIndex(query);
+ }
}
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/test/java/org/apache/lens/server/query/collect/DefaultQueryCollectionTest.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/collect/DefaultQueryCollectionTest.java b/lens-server/src/test/java/org/apache/lens/server/query/collect/DefaultQueryCollectionTest.java
index 7a81e83..d4b6bdf 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/collect/DefaultQueryCollectionTest.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/collect/DefaultQueryCollectionTest.java
@@ -29,17 +29,25 @@ import java.util.Set;
import org.apache.lens.server.api.query.QueryContext;
+import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DefaultQueryCollectionTest {
private static final String MOCK_USER = "MockUserEmail";
+ private static final String MOCK_HANDLE = "0-0-0-0-";
+
+ @DataProvider
+ public Object[][] dpQueryCosts() {
+ return new Object[][]{{new double[]{20.0, 50.0, 10.0, 80.0, 40.0, }, }, };
+
+ }
/* Note: Since verification of addition/removal required calling get methods,
hence methods getQueriesCount and getQueries(user) are indirectly getting tested in these tests */
@Test
- public void testAddMethodAddsQueriesToAllViews(){
+ public void testAddMethodAddsQueriesToAllViews() {
/* Initialization */
final int noOfQueriesUsedInTest = 2;
@@ -75,6 +83,30 @@ public class DefaultQueryCollectionTest {
assertEquals(queries.getQueries(MOCK_USER).size(), 0);
}
+ @Test(dataProvider = "dpQueryCosts")
+ public void testRemoveMethodMustChangeQueryIndices(final double[] queryCosts) {
+
+ /* Initialization */
+ int numberOfQueries = queryCosts.length;
+ QueryCollection collection = createQueriesTreeSetWithQueryHandleAndCostStubbing(queryCosts, MOCK_HANDLE);
+
+ QueryContext completedQuery = getMockedQueryFromQueries(collection.getQueries(), MOCK_HANDLE, 1);
+ QueryContext queuedQuery = getMockedQueryFromQueries(collection.getQueries(), MOCK_HANDLE, 5);
+
+ /* Verification 1: Verifies that all queries were added into the collection*/
+ assertEquals(collection.getQueriesCount(), numberOfQueries);
+
+ /* Execution */
+ collection.remove(completedQuery);
+
+ /* Verification 2: Verifies that queries were removed from the collection */
+ assertEquals(collection.getQueriesCount(), numberOfQueries - 1);
+
+ /* Verification 3: Verifies that query index is decreased after removal of queries which were present before
+ them in the queries list */
+ assertEquals(collection.getQueryIndex(queuedQuery).intValue(), 2);
+ }
+
@Test
public void testGetQueriesMustReturnCopyOfUnderlyingCollection() {
http://git-wip-us.apache.org/repos/asf/lens/blob/4addd7b6/lens-server/src/test/java/org/apache/lens/server/query/collect/QueryCollectUtil.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/collect/QueryCollectUtil.java b/lens-server/src/test/java/org/apache/lens/server/query/collect/QueryCollectUtil.java
index 51fcf00..7789a4c 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/collect/QueryCollectUtil.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/collect/QueryCollectUtil.java
@@ -22,14 +22,19 @@ package org.apache.lens.server.query.collect;
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isSynchronized;
+import org.apache.lens.api.query.QueryHandle;
+import org.apache.lens.server.api.query.QueryContext;
+import org.apache.lens.server.api.query.cost.FactPartitionBasedQueryCost;
+import org.apache.lens.server.query.QueryContextPriorityComparator;
+
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertTrue;
import java.lang.reflect.Method;
+import java.util.Iterator;
import java.util.Set;
-
-import org.apache.lens.server.api.query.QueryContext;
+import java.util.TreeSet;
import com.google.common.collect.Sets;
@@ -77,6 +82,36 @@ public class QueryCollectUtil {
return new DefaultQueryCollection(mockQueries);
}
+ public static QueryCollection createQueriesTreeSetWithQueryHandleAndCostStubbing(final double[] queryCosts,
+ final String handlePrefix) {
+
+ TreeSet<QueryContext> mockQueries = new TreeSet<>(new QueryContextPriorityComparator());
+
+ for (int index = 1; index <= queryCosts.length; ++index) {
+ mockQueries.add(createQueryInstanceWithQueryHandleAndCostStubbing(handlePrefix, index, queryCosts[index - 1]));
+ }
+ return new DefaultQueryCollection(mockQueries);
+ }
+
+ public static QueryContext createQueryInstanceWithQueryHandleAndCostStubbing(String handlePrefix, int index,
+ double queryCost) {
+ QueryContext mockQuery = mock(QueryContext.class);
+ when(mockQuery.getQueryHandle()).thenReturn(QueryHandle.fromString(handlePrefix + index));
+ when(mockQuery.getSelectedDriverQueryCost()).thenReturn(new FactPartitionBasedQueryCost(queryCost));
+ return mockQuery;
+ }
+
+ public static QueryContext getMockedQueryFromQueries(Set<QueryContext> queries, String mockHandle, int index) {
+ Iterator iterator = queries.iterator();
+ while (iterator.hasNext()) {
+ QueryContext queuedQuery = (QueryContext) iterator.next();
+ if (queuedQuery.getQueryHandle().equals(QueryHandle.fromString(mockHandle + index))) {
+ return queuedQuery;
+ }
+ }
+ return null;
+ }
+
public static QueryCollection stubMockQueryAndCreateQueriesInstance(final QueryContext mockQuery,
final String mockUser) {