Browse Source

AMBARI-5981 Hosts API should provide count of filtered hosts. Additional Patch. (dsen)

Dmitry Sen 11 years ago
parent
commit
e37f9657ed

+ 30 - 11
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java

@@ -534,6 +534,23 @@ public class ClusterControllerImpl implements ClusterController {
     return propertyProviders.get(type);
   }
 
+  /**
+   * Evaluate the predicate and create a list of filtered resources
+   *
+   * @param resourceIterable @ResourceIterable
+   * @return @NavigableSet of filtered resources
+   */
+  private LinkedList<Resource> getEvaluatedResources(ResourceIterable
+                                              resourceIterable) {
+    LinkedList<Resource> resources = new LinkedList<Resource>();
+    if (resourceIterable != null) {
+      for (Resource resource : resourceIterable) {
+        resources.add(resource);
+      }
+    }
+    return resources;
+  }
+
   /**
    * Get one page of resources from the given set of resources starting at the given offset.
    *
@@ -549,10 +566,12 @@ public class ClusterControllerImpl implements ClusterController {
                                          Predicate predicate,
                                          ResourcePredicateEvaluator evaluator) {
 
-    int                currentOffset = 0;
-    Resource           previous      = null;
-    Set<Resource>      pageResources = new LinkedHashSet<Resource>();
-    Iterator<Resource> iterator      = resources.iterator();
+    int currentOffset = 0;
+    Resource previous      = null;
+    Set<Resource> pageResources = new LinkedHashSet<Resource>();
+    LinkedList<Resource> filteredResources =
+      getEvaluatedResources(new ResourceIterable(resources, predicate, evaluator));
+    Iterator<Resource> iterator = filteredResources.iterator();
 
     // skip till offset
     while (currentOffset < offset && iterator.hasNext()) {
@@ -565,12 +584,11 @@ public class ClusterControllerImpl implements ClusterController {
       pageResources.add(iterator.next());
     }
 
-    return new PageResponseImpl(new ResourceIterable(pageResources,
-        predicate, evaluator),
+    return new PageResponseImpl(pageResources,
         currentOffset,
         previous,
         iterator.hasNext() ? iterator.next() : null,
-        resources.size()
+        filteredResources.size()
       );
   }
 
@@ -592,7 +610,9 @@ public class ClusterControllerImpl implements ClusterController {
     int                currentOffset = resources.size() - 1;
     Resource           next          = null;
     List<Resource>     pageResources = new LinkedList<Resource>();
-    Iterator<Resource> iterator      = resources.descendingIterator();
+    LinkedList<Resource> filteredResources =
+      getEvaluatedResources(new ResourceIterable(resources, predicate, evaluator));
+    Iterator<Resource> iterator = filteredResources.descendingIterator();
 
     if (offset != -1) {
       // skip till offset
@@ -608,12 +628,11 @@ public class ClusterControllerImpl implements ClusterController {
       --currentOffset;
     }
 
-    return new PageResponseImpl(new ResourceIterable(new
-        LinkedHashSet<Resource>(pageResources), predicate, evaluator),
+    return new PageResponseImpl(pageResources,
         currentOffset + 1,
         iterator.hasNext() ? iterator.next() : null,
         next,
-        resources.size()
+        filteredResources.size()
       );
   }
 

+ 67 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java

@@ -151,6 +151,8 @@ public class ClusterControllerImplTest {
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
     Assert.assertEquals("host:1", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
+    //total hosts created in TestHostResourceProvider, not only on this page
+    Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue());
 
     // get the first three
     pageRequest = new PageRequestImpl(PageRequest.StartingPoint.Beginning, 3, 0, null, null);
@@ -169,6 +171,8 @@ public class ClusterControllerImplTest {
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
     Assert.assertEquals("host:2", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(2).getType());
+    //total hosts created in TestHostResourceProvider, not only on this page
+    Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue());
   }
 
   @Test
@@ -287,6 +291,8 @@ public class ClusterControllerImplTest {
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
     Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
+    //total hosts created in TestHostResourceProvider, not only on this page
+    Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue());
 
     // get the last three (0 - 2)
     pageRequest = new PageRequestImpl(PageRequest.StartingPoint.OffsetStart, 3, 0, null, null);
@@ -336,6 +342,8 @@ public class ClusterControllerImplTest {
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
     Assert.assertEquals("host:3", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
+    //total hosts created in TestHostResourceProvider, not only on this page
+    Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue());
 
     // get the last three
     pageRequest = new PageRequestImpl(PageRequest.StartingPoint.End, 3, 0, null, null);
@@ -373,6 +381,8 @@ public class ClusterControllerImplTest {
     Assert.assertEquals(1, pageResponse.getOffset());
     Assert.assertEquals("host:0", pageResponse.getPreviousResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals("host:3", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    //total hosts created in TestHostResourceProvider, not only on this page
+    Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue());
 
     Iterable<Resource> iterable = pageResponse.getIterable();
     List<Resource> list = new LinkedList<Resource>();
@@ -526,6 +536,63 @@ public class ClusterControllerImplTest {
     }
   }
 
+  @Test
+  public void testGetResourcesSortedWithPredicateWithItemsTotal() throws Exception{
+
+    ClusterControllerImpl controller =
+      new ClusterControllerImpl(new TestProviderModule());
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+
+    Predicate predicate =
+      new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
+    List<SortRequestProperty> sortRequestProperties = Collections.singletonList(
+      new SortRequestProperty("Hosts/host_name", SortRequest.Order.DESC));
+    SortRequest sortRequest = new SortRequestImpl(sortRequestProperties);
+
+    // get the first one
+    PageRequest pageRequest =
+      new PageRequestImpl(PageRequest.StartingPoint.Beginning, 1, 0, null, null);
+    PageResponse pageResponse =
+      controller.getResources(Resource.Type.Host, request, predicate, pageRequest, sortRequest);
+
+    Iterable<Resource> iterable = pageResponse.getIterable();
+    List<Resource> list = new LinkedList<Resource>();
+
+    for (Resource resource : iterable) {
+      list.add(resource);
+    }
+    Assert.assertEquals(1, list.size());
+    //total hosts after applying the filter, not only on this page
+    Assert.assertEquals(2, pageResponse.getTotalResourceCount().intValue());
+    // DESC sorted
+    Assert.assertEquals("host:3", (String) list.get(0).getPropertyValue(
+      PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
+
+    pageRequest =
+      new PageRequestImpl(PageRequest.StartingPoint.OffsetStart, 1, 1, null, null);
+    pageResponse = controller.getResources(
+      Resource.Type.Host, request, predicate, pageRequest, sortRequest);
+
+    iterable = pageResponse.getIterable();
+    list.clear();
+
+    for (Resource resource : iterable) {
+      list.add(resource);
+    }
+    Assert.assertEquals(1, list.size());
+    //total hosts after applying the filter, not only on this page
+    Assert.assertEquals(2, pageResponse.getTotalResourceCount().intValue());
+    // DESC sorted
+    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(
+      PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
+
+  }
+
   @Test
   public void testCreateResources() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();