AMBARI-5981. Hosts API should provide count of filtered hosts. (swagle)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0972cf07 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0972cf07 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0972cf07 Branch: refs/heads/trunk Commit: 0972cf07ebd0668de12336645ce47c50fdcfb93b Parents: 11dd9df Author: Siddharth Wagle <[email protected]> Authored: Fri May 30 23:19:24 2014 -0700 Committer: Siddharth Wagle <[email protected]> Committed: Sat May 31 10:54:53 2014 -0700 ---------------------------------------------------------------------- .../apache/ambari/server/api/query/QueryImpl.java | 1 + .../server/api/resources/BaseResourceDefinition.java | 1 - .../api/services/serializers/JsonSerializer.java | 15 ++++++++++++++- .../controller/internal/ClusterControllerImpl.java | 14 +++++++++++--- .../server/controller/internal/PageResponseImpl.java | 13 ++++++++++--- .../ambari/server/controller/spi/PageResponse.java | 6 ++++++ .../internal/ClusterControllerImplTest.java | 6 ++++++ .../controller/internal/PageResponseImplTest.java | 8 ++++---- 8 files changed, 52 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java index 73ad19a..63426cb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java @@ -674,6 +674,7 @@ public class QueryImpl implements Query, ResourceInstance { pageRequest, sortRequest ); iterResource = pageResponse.getIterable(); + tree.setProperty("count", pageResponse.getTotalResourceCount().toString()); } int count = 1; http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java index 1db8518..1642264 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java @@ -68,7 +68,6 @@ public abstract class BaseResourceDefinition implements ResourceDefinition { public List<PostProcessor> getPostProcessors() { List<PostProcessor> listProcessors = new ArrayList<PostProcessor>(); listProcessors.add(new BaseHrefPostProcessor()); - return listProcessors; } http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java index 35a9856..c9ec368 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java @@ -61,7 +61,8 @@ public class JsonSerializer implements ResultSerializer { return serializeError(result.getStatus()); } - processNode(result.getResultTree()); + TreeNode<Resource> treeNode = result.getResultTree(); + processNode(treeNode); m_generator.close(); return bytesOut.toString("UTF-8"); @@ -105,12 +106,14 @@ public class JsonSerializer implements ResultSerializer { m_generator.writeStartObject(); writeHref(node); + writeItemCount(node); Resource r = node.getObject(); if (r != null) { handleResourceProperties(getTreeProperties(r.getPropertiesMap())); } } + if (isArray(node)) { m_generator.writeArrayFieldStart(node.getName()); } @@ -122,6 +125,7 @@ public class JsonSerializer implements ResultSerializer { if (isArray(node)) { m_generator.writeEndArray(); } + if (isObject(node)) { m_generator.writeEndObject(); } @@ -210,4 +214,13 @@ public class JsonSerializer implements ResultSerializer { m_generator.writeStringField("href", hrefProp); } } + + private void writeItemCount(TreeNode<Resource> node) throws IOException { + String countProp = node.getProperty("count"); + if (countProp != null) { + m_generator.writeStringField("itemCount", countProp); + // Write once + node.setProperty("count", null); + } + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java index b057334..a54b303 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java @@ -175,6 +175,7 @@ public class ClusterControllerImpl implements ClusterController { ResourcePredicateEvaluator evaluator = provider instanceof ResourcePredicateEvaluator ? (ResourcePredicateEvaluator) provider : DEFAULT_RESOURCE_PREDICATE_EVALUATOR; + int totalCount = 0; if (!providerResources.isEmpty()) { Comparator<Resource> resourceComparator = comparator; if (sortRequest != null) { @@ -184,6 +185,7 @@ public class ClusterControllerImpl implements ClusterController { TreeSet<Resource> sortedResources = new TreeSet<Resource>(resourceComparator); sortedResources.addAll(providerResources); + totalCount = sortedResources.size(); if (pageRequest != null) { switch (pageRequest.getStartingPoint()) { @@ -207,9 +209,11 @@ public class ClusterControllerImpl implements ClusterController { resources = sortedResources; } else { resources = providerResources; + totalCount = providerResources.size(); } - return new PageResponseImpl(new ResourceIterable(resources, predicate, evaluator), 0, null, null); + return new PageResponseImpl(new ResourceIterable(resources, predicate, + evaluator), 0, null, null, totalCount); } /** @@ -565,7 +569,9 @@ public class ClusterControllerImpl implements ClusterController { predicate, evaluator), currentOffset, previous, - iterator.hasNext() ? iterator.next() : null); + iterator.hasNext() ? iterator.next() : null, + resources.size() + ); } /** @@ -606,7 +612,9 @@ public class ClusterControllerImpl implements ClusterController { LinkedHashSet<Resource>(pageResources), predicate, evaluator), currentOffset + 1, iterator.hasNext() ? iterator.next() : null, - next); + next, + resources.size() + ); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PageResponseImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PageResponseImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PageResponseImpl.java index f115ee2..544f612 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PageResponseImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PageResponseImpl.java @@ -25,18 +25,20 @@ import org.apache.ambari.server.controller.spi.Resource; * Basic page response implementation. */ public class PageResponseImpl implements PageResponse{ - - private final Iterable<Resource> iterable; private final int offset; private final Resource previousResource; private final Resource nextResource; + private final Integer totalResourceCount; - public PageResponseImpl(Iterable<Resource> iterable, int offset, Resource previousResource, Resource nextResource) { + public PageResponseImpl(Iterable<Resource> iterable, int offset, + Resource previousResource, Resource nextResource, + Integer totalResourceCount) { this.iterable = iterable; this.offset = offset; this.previousResource = previousResource; this.nextResource = nextResource; + this.totalResourceCount = totalResourceCount; } @Override @@ -58,4 +60,9 @@ public class PageResponseImpl implements PageResponse{ public Resource getNextResource() { return nextResource; } + + @Override + public Integer getTotalResourceCount() { + return totalResourceCount; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/PageResponse.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/PageResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/PageResponse.java index 1d67927..9e4d6ab 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/PageResponse.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/PageResponse.java @@ -49,4 +49,10 @@ public interface PageResponse { * @return the next resource after this page; null if this is the last page */ public Resource getNextResource(); + + /** + * Get the count of total resources without account for paging request. + * @return total count + */ + public Integer getTotalResourceCount(); } http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java index f2b1487..4458799 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java @@ -309,6 +309,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()); + // Check total count + Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue()); } @Test @@ -352,6 +354,8 @@ public class ClusterControllerImplTest { Assert.assertEquals(Resource.Type.Host, list.get(1).getType()); Assert.assertEquals("host:3", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name"))); Assert.assertEquals(Resource.Type.Host, list.get(2).getType()); + // Check total count + Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue()); } @Test @@ -403,6 +407,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()); + // Check total count + Assert.assertEquals(4, pageResponse.getTotalResourceCount().intValue()); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/0972cf07/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PageResponseImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PageResponseImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PageResponseImplTest.java index 3177e88..c6716d4 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PageResponseImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PageResponseImplTest.java @@ -36,7 +36,7 @@ public class PageResponseImplTest { Resource prev = new ResourceImpl(Resource.Type.Cluster); Resource next = new ResourceImpl(Resource.Type.Cluster); - PageResponse response = new PageResponseImpl(iterable, 99, prev, next); + PageResponse response = new PageResponseImpl(iterable, 99, prev, next, 0); Assert.assertEquals(iterable, response.getIterable()); } @@ -47,7 +47,7 @@ public class PageResponseImplTest { Resource prev = new ResourceImpl(Resource.Type.Cluster); Resource next = new ResourceImpl(Resource.Type.Cluster); - PageResponse response = new PageResponseImpl(iterable, 99, prev, next); + PageResponse response = new PageResponseImpl(iterable, 99, prev, next, 0); Assert.assertEquals(99, response.getOffset()); } @@ -58,7 +58,7 @@ public class PageResponseImplTest { Resource prev = new ResourceImpl(Resource.Type.Cluster); Resource next = new ResourceImpl(Resource.Type.Cluster); - PageResponse response = new PageResponseImpl(iterable, 99, prev, next); + PageResponse response = new PageResponseImpl(iterable, 99, prev, next, 0); Assert.assertEquals(prev, response.getPreviousResource()); } @@ -69,7 +69,7 @@ public class PageResponseImplTest { Resource prev = new ResourceImpl(Resource.Type.Cluster); Resource next = new ResourceImpl(Resource.Type.Cluster); - PageResponse response = new PageResponseImpl(iterable, 99, prev, next); + PageResponse response = new PageResponseImpl(iterable, 99, prev, next, 0); Assert.assertEquals(next, response.getNextResource()); }
