diff --git a/src/main/java/io/phasetwo/service/model/OrganizationProvider.java b/src/main/java/io/phasetwo/service/model/OrganizationProvider.java index 645a02c..ca8b025 100644 --- a/src/main/java/io/phasetwo/service/model/OrganizationProvider.java +++ b/src/main/java/io/phasetwo/service/model/OrganizationProvider.java @@ -30,7 +30,7 @@ Stream searchForOrganizationStream( Integer maxResults, Optional member); - Long getOrganizationsCount(RealmModel realm, String search); + Long getOrganizationsCount(RealmModel realm, String search, Map attributes); boolean removeOrganization(RealmModel realm, String id); diff --git a/src/main/java/io/phasetwo/service/model/jpa/JpaOrganizationProvider.java b/src/main/java/io/phasetwo/service/model/jpa/JpaOrganizationProvider.java index a5c65f9..db43e6f 100644 --- a/src/main/java/io/phasetwo/service/model/jpa/JpaOrganizationProvider.java +++ b/src/main/java/io/phasetwo/service/model/jpa/JpaOrganizationProvider.java @@ -157,11 +157,25 @@ public Stream searchForOrganizationStream( } @Override - public Long getOrganizationsCount(RealmModel realm, String search) { - TypedQuery query = em.createNamedQuery("countOrganizationsByRealmIdAndName", Long.class); - query.setParameter("realmId", realm.getId()); - search = createSearchString(search); - query.setParameter("search", search); + public Long getOrganizationsCount(RealmModel realm, String search, Map attributes) { + if (attributes == null) { + attributes = ImmutableMap.of(); + } + + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery queryBuilder = builder.createQuery(Long.class); + Root root = queryBuilder.from(ExtOrganizationEntity.class); + + List predicates = attributePredicates(attributes, root); + predicates.add(builder.equal(root.get("realmId"), realm.getId())); + + if (search != null && !search.trim().isEmpty()) { + String searchPattern = "%" + search.toLowerCase() + "%"; + predicates.add(builder.like(builder.lower(root.get("name")), searchPattern)); + } + + queryBuilder.select(builder.count(root)).where(predicates.toArray(new Predicate[0])); + TypedQuery query = em.createQuery(queryBuilder); return query.getSingleResult(); } diff --git a/src/main/java/io/phasetwo/service/resource/OrganizationsResource.java b/src/main/java/io/phasetwo/service/resource/OrganizationsResource.java index 377e958..1e68fc2 100644 --- a/src/main/java/io/phasetwo/service/resource/OrganizationsResource.java +++ b/src/main/java/io/phasetwo/service/resource/OrganizationsResource.java @@ -128,12 +128,24 @@ public Stream listOrgs( @GET @Path("count") @Produces(MediaType.APPLICATION_JSON) - public Long countOrgs(@QueryParam("search") String searchQuery) { - log.debugf("countOrgs %s %s", realm.getName(), searchQuery); + public Long countOrgs( + @QueryParam("search") String searchQuery, + @QueryParam("q") String searchAttributes) { + + log.debugf("countOrgs realm: %s, search: %s, query: %s", realm.getName(), searchQuery, searchAttributes); + if (!auth.hasViewOrgs()) { throw new NotAuthorizedException("Insufficient permission to count organizations."); } - return orgs.getOrganizationsCount(realm, searchQuery); + + Map attributes = + (searchAttributes == null) ? Maps.newHashMap() : SearchQueryUtils.getFields(searchAttributes); + + if (searchQuery != null) { + attributes.put("name", searchQuery.trim()); + } + + return orgs.getOrganizationsCount(realm, searchQuery, attributes); } @POST diff --git a/src/test/java/io/phasetwo/service/resource/OrganizationResourceTest.java b/src/test/java/io/phasetwo/service/resource/OrganizationResourceTest.java index 9d13b2d..f431054 100644 --- a/src/test/java/io/phasetwo/service/resource/OrganizationResourceTest.java +++ b/src/test/java/io/phasetwo/service/resource/OrganizationResourceTest.java @@ -272,6 +272,18 @@ void testSearchOrganizations() throws IOException { assertThat(orgs, notNullValue()); assertThat(cnt, is(6L)); + // orgs count with attribute filter + response = givenSpec("orgs", "count").when().queryParam("q", "foo:bar").get().andReturn(); + assertThat(response.statusCode(), is(Status.OK.getStatusCode())); + cnt = objectMapper().readValue(response.getBody().asString(), Long.class); + assertThat(cnt, is(2L)); + + // orgs count with name + attribute filter + response = givenSpec("orgs", "count").when().queryParam("search", "qu").queryParam("q", "foo:bar").get().andReturn(); + assertThat(response.statusCode(), is(Status.OK.getStatusCode())); + cnt = objectMapper().readValue(response.getBody().asString(), Long.class); + assertThat(cnt, is(1L)); + for (String id : ids) { deleteOrganization(id); }