You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by pr...@apache.org on 2015/09/23 14:09:56 UTC

lens git commit: LENS-777: Fix: Waiting query selector change from intersecting to union

Repository: lens
Updated Branches:
  refs/heads/master 66f164b47 -> 7ad12ed73


LENS-777: Fix: Waiting query selector change from intersecting to union


Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/7ad12ed7
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/7ad12ed7
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/7ad12ed7

Branch: refs/heads/master
Commit: 7ad12ed738abbf14d0b5bfe29dd45de209d32167
Parents: 66f164b
Author: Akshay Goyal <ak...@gmail.com>
Authored: Wed Sep 23 17:39:34 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Wed Sep 23 17:39:34 2015 +0530

----------------------------------------------------------------------
 .../server/query/QueryExecutionServiceImpl.java |   2 +-
 .../IntersectingWaitingQueriesSelector.java     | 107 -----------
 .../collect/UnioningWaitingQueriesSelector.java |  93 ++++++++++
 .../IntersectingWaitingQueriesSelectorTest.java | 185 -------------------
 .../UnioningWaitingQueriesSelectorTest.java     | 135 ++++++++++++++
 5 files changed, 229 insertions(+), 293 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/7ad12ed7/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 2ba54e0..3bc9a4a 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
@@ -1026,7 +1026,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
     ImmutableSet<WaitingQueriesSelectionPolicy> selectionPolicies = getImplementations(
       WAITING_QUERIES_SELECTION_POLICY_FACTORIES_KEY, hiveConf);
 
-    this.waitingQueriesSelector = new IntersectingWaitingQueriesSelector(selectionPolicies);
+    this.waitingQueriesSelector = new UnioningWaitingQueriesSelector(selectionPolicies);
 
     try {
       this.userQueryToCubeQueryRewriter = new UserQueryToCubeQueryRewriter(conf);

http://git-wip-us.apache.org/repos/asf/lens/blob/7ad12ed7/lens-server/src/main/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelector.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelector.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelector.java
deleted file mode 100644
index fee4120..0000000
--- a/lens-server/src/main/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelector.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * 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.lens.server.query.collect;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.lens.server.api.query.FinishedLensQuery;
-import org.apache.lens.server.api.query.QueryContext;
-import org.apache.lens.server.api.query.collect.EstimatedImmutableQueryCollection;
-import org.apache.lens.server.api.query.collect.WaitingQueriesSelectionPolicy;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import lombok.NonNull;
-
-/**
- * Selects queries eligible by all {@link WaitingQueriesSelectionPolicy} to move them out of waiting state.
- *
- */
-public class IntersectingWaitingQueriesSelector implements WaitingQueriesSelector {
-
-  private final ImmutableSet<WaitingQueriesSelectionPolicy> selectionPolicies;
-
-  public IntersectingWaitingQueriesSelector(
-      @NonNull final ImmutableSet<WaitingQueriesSelectionPolicy> selectionPolicies) {
-    this.selectionPolicies = selectionPolicies;
-  }
-
-  /**
-   * Selects queries eligible by all {@link WaitingQueriesSelectionPolicy} to move them out of waiting state.
-   *
-   * @see WaitingQueriesSelector#selectQueries(FinishedLensQuery, EstimatedImmutableQueryCollection)
-   *
-   * @param finishedQuery
-   * @param waitingQueries
-   * @return
-   */
-  @Override
-  public Set<QueryContext> selectQueries(final FinishedLensQuery finishedQuery,
-      final EstimatedImmutableQueryCollection waitingQueries) {
-
-    Set<WaitingQueriesSelectionPolicy> allSelectionPolicies = prepareAllSelectionPolicies(finishedQuery);
-
-    List<Set<QueryContext>> candiateQueriesSets = getAllCandidateQueriesSets(finishedQuery, waitingQueries,
-        allSelectionPolicies);
-
-    return findCommonQueries(candiateQueriesSets);
-  }
-
-  @VisibleForTesting
-  Set<WaitingQueriesSelectionPolicy> prepareAllSelectionPolicies(final FinishedLensQuery finishedQuery) {
-
-    /* Get the selection policies of driver on which this query was run */
-    ImmutableSet<WaitingQueriesSelectionPolicy> driverSelectionPolicies = finishedQuery.getDriverSelectionPolicies();
-
-    return Sets.union(this.selectionPolicies, driverSelectionPolicies);
-  }
-
-  private List<Set<QueryContext>> getAllCandidateQueriesSets(
-      final FinishedLensQuery finishedQuery, final EstimatedImmutableQueryCollection waitingQueries,
-      final Set<WaitingQueriesSelectionPolicy> allSelectionPolicies) {
-
-    List<Set<QueryContext>> candidateQueriesSets = Lists.newLinkedList();
-
-    for (final WaitingQueriesSelectionPolicy selectionPolicy : allSelectionPolicies) {
-
-      Set<QueryContext> candiateQueries = selectionPolicy.selectQueries(finishedQuery, waitingQueries);
-      candidateQueriesSets.add(candiateQueries);
-    }
-    return candidateQueriesSets;
-  }
-
-  @VisibleForTesting
-  Set<QueryContext> findCommonQueries(final List<Set<QueryContext>> candiateQueriesSets) {
-
-    Set<QueryContext> commonQueries = Sets.newLinkedHashSet();
-
-    if (!candiateQueriesSets.isEmpty()) {
-      commonQueries = Iterables.get(candiateQueriesSets, 0);
-
-      for (Set<QueryContext> candidateEligibleQueries : candiateQueriesSets) {
-        commonQueries.retainAll(candidateEligibleQueries);
-      }
-    }
-    return commonQueries;
-  }
-}

http://git-wip-us.apache.org/repos/asf/lens/blob/7ad12ed7/lens-server/src/main/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelector.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelector.java b/lens-server/src/main/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelector.java
new file mode 100644
index 0000000..8db059e
--- /dev/null
+++ b/lens-server/src/main/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelector.java
@@ -0,0 +1,93 @@
+/**
+ * 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.lens.server.query.collect;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.lens.server.api.query.FinishedLensQuery;
+import org.apache.lens.server.api.query.QueryContext;
+import org.apache.lens.server.api.query.collect.EstimatedImmutableQueryCollection;
+import org.apache.lens.server.api.query.collect.WaitingQueriesSelectionPolicy;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import lombok.NonNull;
+
+/**
+ * Selects queries eligible by all {@link WaitingQueriesSelectionPolicy} to move them out of waiting state.
+ *
+ */
+public class UnioningWaitingQueriesSelector implements WaitingQueriesSelector {
+
+  private final ImmutableSet<WaitingQueriesSelectionPolicy> selectionPolicies;
+
+  public UnioningWaitingQueriesSelector(
+    @NonNull final ImmutableSet<WaitingQueriesSelectionPolicy> selectionPolicies) {
+    this.selectionPolicies = selectionPolicies;
+  }
+
+  /**
+   * Selects queries eligible by all {@link WaitingQueriesSelectionPolicy} to move them out of waiting state.
+   *
+   * @see WaitingQueriesSelector#selectQueries(FinishedLensQuery, EstimatedImmutableQueryCollection)
+   *
+   * @param finishedQuery
+   * @param waitingQueries
+   * @return
+   */
+  @Override
+  public Set<QueryContext> selectQueries(final FinishedLensQuery finishedQuery,
+      final EstimatedImmutableQueryCollection waitingQueries) {
+
+    Set<WaitingQueriesSelectionPolicy> allSelectionPolicies = prepareAllSelectionPolicies(finishedQuery);
+
+    List<Set<QueryContext>> candiateQueriesSets = getAllCandidateQueriesSets(finishedQuery, waitingQueries,
+        allSelectionPolicies);
+
+    return Sets.newHashSet(Iterables.concat(candiateQueriesSets));
+  }
+
+  @VisibleForTesting
+  Set<WaitingQueriesSelectionPolicy> prepareAllSelectionPolicies(final FinishedLensQuery finishedQuery) {
+
+    /* Get the selection policies of driver on which this query was run */
+    ImmutableSet<WaitingQueriesSelectionPolicy> driverSelectionPolicies = finishedQuery.getDriverSelectionPolicies();
+
+    return Sets.union(this.selectionPolicies, driverSelectionPolicies);
+  }
+
+  private List<Set<QueryContext>> getAllCandidateQueriesSets(
+      final FinishedLensQuery finishedQuery, final EstimatedImmutableQueryCollection waitingQueries,
+      final Set<WaitingQueriesSelectionPolicy> allSelectionPolicies) {
+
+    List<Set<QueryContext>> candidateQueriesSets = Lists.newLinkedList();
+
+    for (final WaitingQueriesSelectionPolicy selectionPolicy : allSelectionPolicies) {
+
+      Set<QueryContext> candiateQueries = selectionPolicy.selectQueries(finishedQuery, waitingQueries);
+      candidateQueriesSets.add(candiateQueries);
+    }
+    return candidateQueriesSets;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/7ad12ed7/lens-server/src/test/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelectorTest.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelectorTest.java b/lens-server/src/test/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelectorTest.java
deleted file mode 100644
index 62e371d..0000000
--- a/lens-server/src/test/java/org/apache/lens/server/query/collect/IntersectingWaitingQueriesSelectorTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * 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.lens.server.query.collect;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.lens.server.api.query.FinishedLensQuery;
-import org.apache.lens.server.api.query.QueryContext;
-import org.apache.lens.server.api.query.collect.EstimatedImmutableQueryCollection;
-import org.apache.lens.server.api.query.collect.WaitingQueriesSelectionPolicy;
-
-import org.testng.annotations.Test;
-import org.testng.collections.Sets;
-
-import com.beust.jcommander.internal.Lists;
-import com.google.common.collect.ImmutableSet;
-
-public class IntersectingWaitingQueriesSelectorTest {
-
-  @Test
-  public void testFindCommonQueriesWhenInputIsEmptyListOfSets() {
-
-    List<Set<QueryContext>> candidateQueriesSets = Lists.newArrayList();
-    Set<QueryContext> expectedEligibleQueries = Sets.newHashSet();
-
-    testFindCommonQueries(candidateQueriesSets, expectedEligibleQueries);
-  }
-
-  @Test
-  public void testFindCommonQueriesWhenNoCommonQueryIsPresent() {
-
-    QueryContext eligibleQuery1 = mock(QueryContext.class);
-    QueryContext eligibleQuery2 = mock(QueryContext.class);
-
-    Set<QueryContext> eligibleQueriesSetA = Sets.newHashSet(Arrays.asList(eligibleQuery1));
-    Set<QueryContext> eligibleQueriesSetB = Sets.newHashSet(Arrays.asList(eligibleQuery2));
-
-    List<Set<QueryContext>> candidateQueriesSets = Arrays.asList(eligibleQueriesSetA, eligibleQueriesSetB);
-    Set<QueryContext> expectedEligibleQueries = Sets.newHashSet();
-
-    testFindCommonQueries(candidateQueriesSets, expectedEligibleQueries);
-  }
-
-  @Test
-  public void testFindCommonQueriesWhenACommonQueryIsPresent() {
-
-    QueryContext eligibleQuery1 = mock(QueryContext.class);
-    QueryContext eligibleQuery2 = mock(QueryContext.class);
-    QueryContext eligibleQuery3 = mock(QueryContext.class);
-
-    Set<QueryContext> eligibleQueriesSetA = Sets.newHashSet(Arrays.asList(eligibleQuery1, eligibleQuery2));
-    Set<QueryContext> eligibleQueriesSetB = Sets.newHashSet(Arrays.asList(eligibleQuery1, eligibleQuery3));
-
-    List<Set<QueryContext>> candidateQueriesSets = Arrays.asList(eligibleQueriesSetA, eligibleQueriesSetB);
-    Set<QueryContext> expectedEligibleQueries = Sets.newHashSet(Arrays.asList(eligibleQuery1));
-
-    testFindCommonQueries(candidateQueriesSets, expectedEligibleQueries);
-  }
-
-  private void testFindCommonQueries(final List<Set<QueryContext>> queriesSets,
-      final Set<QueryContext> expectedEligibleQueries) {
-
-    IntersectingWaitingQueriesSelector selector = new IntersectingWaitingQueriesSelector(mock(ImmutableSet.class));
-
-    Set<QueryContext> actualCommonQueries = selector.findCommonQueries(queriesSets);
-    assertEquals(actualCommonQueries, expectedEligibleQueries);
-  }
-
-  @Test
-  public void testPrepareAllSelectionPolicies() {
-
-    WaitingQueriesSelectionPolicy p1 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy p2 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy dp1 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy dp2 = mock(WaitingQueriesSelectionPolicy.class);
-
-    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
-    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.of(dp1, dp2));
-
-    IntersectingWaitingQueriesSelector selector = new IntersectingWaitingQueriesSelector(ImmutableSet.of(p1, p2));
-    assertEquals(selector.prepareAllSelectionPolicies(mockFinishedQuery), ImmutableSet.of(p1, p2, dp1, dp2));
-  }
-
-  @Test
-  public void testPrepareAllSelectionPoliciesWithNoDriverSelectionPolicy() {
-
-    WaitingQueriesSelectionPolicy p1 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy p2 = mock(WaitingQueriesSelectionPolicy.class);
-
-    final ImmutableSet<WaitingQueriesSelectionPolicy> emptySet = ImmutableSet.copyOf(
-        Sets.<WaitingQueriesSelectionPolicy>newHashSet());
-
-    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
-    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(emptySet);
-
-    IntersectingWaitingQueriesSelector selector = new IntersectingWaitingQueriesSelector(ImmutableSet.of(p1, p2));
-
-    assertEquals(selector.prepareAllSelectionPolicies(mockFinishedQuery), ImmutableSet.of(p1, p2));
-  }
-
-  @Test
-  public void testSelectQueriesCommonBetweenAllSelectionPolicies(){
-
-    QueryContext q1 = mock(QueryContext.class);
-    QueryContext q2 = mock(QueryContext.class);
-    QueryContext q3 = mock(QueryContext.class);
-
-    /* eligibleQueriesSet1, eligibleQueriesSet2, eligibleQueriesSet3 have q1 in common */
-    Set<QueryContext> eligibleQueriesSet1 = Sets.newHashSet(Arrays.asList(q1, q2));
-    Set<QueryContext> eligibleQueriesSet2 = Sets.newHashSet(Arrays.asList(q1, q3));
-    Set<QueryContext> eligibleQueriesSet3 = Sets.newHashSet(Arrays.asList(q1, q2));
-
-    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
-    EstimatedImmutableQueryCollection mockWaitingQueries = mock(EstimatedImmutableQueryCollection.class);
-    WaitingQueriesSelectionPolicy policy1 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy policy2 = mock(WaitingQueriesSelectionPolicy.class);
-    WaitingQueriesSelectionPolicy driverSelectionPolicy = mock(WaitingQueriesSelectionPolicy.class);
-
-    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.of(driverSelectionPolicy));
-
-    /* selection policy1 will return eligibleQueriesSet1 */
-    when(policy1.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet1);
-
-    /* selection policy2 will return eligibleQueriesSet2 */
-    when(policy2.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet2);
-
-    /* driver selection policy will return eligibleQueriesSet3 */
-    when(driverSelectionPolicy.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet3);
-
-    WaitingQueriesSelector selector = new IntersectingWaitingQueriesSelector(ImmutableSet.of(policy1, policy2));
-
-    /* selector should return only eligibleQuery1, as this is the only common eligible waiting query returned
-    * by both selection policies */
-    Set<QueryContext> actualEligibleQueries = selector.selectQueries(mockFinishedQuery, mockWaitingQueries);
-    Set<QueryContext> expectedEligibleQueries = Sets.newHashSet(Arrays.asList(q1));
-
-    assertEquals(actualEligibleQueries, expectedEligibleQueries);
-  }
-
-  @Test(expectedExceptions = NullPointerException.class)
-  public void testSelectorMustNotAcceptNullAsSelectionPolicies() {
-    new IntersectingWaitingQueriesSelector(null);
-  }
-
-  @Test
-  public void testSelectQueriesWithNoSelectionPolicies(){
-
-    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
-    EstimatedImmutableQueryCollection mockWaitingQueries = mock(EstimatedImmutableQueryCollection.class);
-    Set<WaitingQueriesSelectionPolicy> emptySetOfPolicies = Sets.newHashSet();
-
-    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.copyOf(emptySetOfPolicies));
-
-    WaitingQueriesSelector selector = new IntersectingWaitingQueriesSelector(ImmutableSet.copyOf(emptySetOfPolicies));
-
-    /* selector should return an empty set as no selection policy is available */
-    Set<QueryContext> actualEligibleQueries = selector.selectQueries(mockFinishedQuery, mockWaitingQueries);
-
-    assertTrue(actualEligibleQueries.isEmpty());
-  }
-}

http://git-wip-us.apache.org/repos/asf/lens/blob/7ad12ed7/lens-server/src/test/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelectorTest.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelectorTest.java b/lens-server/src/test/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelectorTest.java
new file mode 100644
index 0000000..98801de
--- /dev/null
+++ b/lens-server/src/test/java/org/apache/lens/server/query/collect/UnioningWaitingQueriesSelectorTest.java
@@ -0,0 +1,135 @@
+/*
+ * 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.lens.server.query.collect;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Set;
+
+import org.apache.lens.server.api.query.FinishedLensQuery;
+import org.apache.lens.server.api.query.QueryContext;
+import org.apache.lens.server.api.query.collect.EstimatedImmutableQueryCollection;
+import org.apache.lens.server.api.query.collect.WaitingQueriesSelectionPolicy;
+
+import org.testng.annotations.Test;
+import org.testng.collections.Sets;
+
+import com.google.common.collect.ImmutableSet;
+
+public class UnioningWaitingQueriesSelectorTest {
+
+  @Test
+  public void testPrepareAllSelectionPolicies() {
+
+    WaitingQueriesSelectionPolicy p1 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy p2 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy dp1 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy dp2 = mock(WaitingQueriesSelectionPolicy.class);
+
+    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
+    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.of(dp1, dp2));
+
+    UnioningWaitingQueriesSelector selector = new UnioningWaitingQueriesSelector(ImmutableSet.of(p1, p2));
+    assertEquals(selector.prepareAllSelectionPolicies(mockFinishedQuery), ImmutableSet.of(p1, p2, dp1, dp2));
+  }
+
+  @Test
+  public void testPrepareAllSelectionPoliciesWithNoDriverSelectionPolicy() {
+
+    WaitingQueriesSelectionPolicy p1 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy p2 = mock(WaitingQueriesSelectionPolicy.class);
+
+    final ImmutableSet<WaitingQueriesSelectionPolicy> emptySet = ImmutableSet.copyOf(
+      Sets.<WaitingQueriesSelectionPolicy>newHashSet());
+
+    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
+    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(emptySet);
+
+    UnioningWaitingQueriesSelector selector = new UnioningWaitingQueriesSelector(ImmutableSet.of(p1, p2));
+
+    assertEquals(selector.prepareAllSelectionPolicies(mockFinishedQuery), ImmutableSet.of(p1, p2));
+  }
+
+  @Test
+  public void testSelectQueriesWithAllSelectionPolicies(){
+
+    QueryContext q1 = mock(QueryContext.class);
+    QueryContext q2 = mock(QueryContext.class);
+    QueryContext q3 = mock(QueryContext.class);
+
+    /* eligibleQueriesSet1, eligibleQueriesSet2, eligibleQueriesSet3 have q1 in common */
+    Set<QueryContext> eligibleQueriesSet1 = Sets.newHashSet(Arrays.asList(q1, q2));
+    Set<QueryContext> eligibleQueriesSet2 = Sets.newHashSet(Arrays.asList(q1, q3));
+    Set<QueryContext> eligibleQueriesSet3 = Sets.newHashSet(Arrays.asList(q1, q2));
+
+    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
+    EstimatedImmutableQueryCollection mockWaitingQueries = mock(EstimatedImmutableQueryCollection.class);
+    WaitingQueriesSelectionPolicy policy1 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy policy2 = mock(WaitingQueriesSelectionPolicy.class);
+    WaitingQueriesSelectionPolicy driverSelectionPolicy = mock(WaitingQueriesSelectionPolicy.class);
+
+    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.of(driverSelectionPolicy));
+
+    /* selection policy1 will return eligibleQueriesSet1 */
+    when(policy1.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet1);
+
+    /* selection policy2 will return eligibleQueriesSet2 */
+    when(policy2.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet2);
+
+    /* driver selection policy will return eligibleQueriesSet3 */
+    when(driverSelectionPolicy.selectQueries(mockFinishedQuery, mockWaitingQueries)).thenReturn(eligibleQueriesSet3);
+
+    WaitingQueriesSelector selector = new UnioningWaitingQueriesSelector(ImmutableSet.of(policy1, policy2));
+
+    /* selector should return only eligibleQuery1, as this is the only common eligible waiting query returned
+    * by both selection policies */
+    Set<QueryContext> actualEligibleQueries = selector.selectQueries(mockFinishedQuery, mockWaitingQueries);
+    Set<QueryContext> expectedEligibleQueries = Sets.newHashSet(Arrays.asList(q1, q2, q3));
+
+    assertEquals(actualEligibleQueries, expectedEligibleQueries);
+  }
+
+  @Test(expectedExceptions = NullPointerException.class)
+  public void testSelectorMustNotAcceptNullAsSelectionPolicies() {
+    new UnioningWaitingQueriesSelector(null);
+  }
+
+  @Test
+  public void testSelectQueriesWithNoSelectionPolicies(){
+
+    FinishedLensQuery mockFinishedQuery = mock(FinishedLensQuery.class);
+    EstimatedImmutableQueryCollection mockWaitingQueries = mock(EstimatedImmutableQueryCollection.class);
+    Set<WaitingQueriesSelectionPolicy> emptySetOfPolicies = Sets.newHashSet();
+
+    when(mockFinishedQuery.getDriverSelectionPolicies()).thenReturn(ImmutableSet.copyOf(emptySetOfPolicies));
+
+    WaitingQueriesSelector selector = new UnioningWaitingQueriesSelector(ImmutableSet.copyOf(emptySetOfPolicies));
+
+    /* selector should return an empty set as no selection policy is available */
+    Set<QueryContext> actualEligibleQueries = selector.selectQueries(mockFinishedQuery, mockWaitingQueries);
+
+    assertTrue(actualEligibleQueries.isEmpty());
+  }
+
+}