private static SearchProjectsWsResponse.Builder addFacets(SearchResults searchResults, SearchProjectsWsResponse.Builder wsResponse) { Facets esFacets = searchResults.facets; EsToWsFacet esToWsFacet = new EsToWsFacet(); searchResults.query.getLanguages().ifPresent(languages -> addMandatoryValuesToFacet(esFacets, FILTER_LANGUAGES, languages)); searchResults.query.getTags().ifPresent(tags -> addMandatoryValuesToFacet(esFacets, FILTER_TAGS, tags)); Common.Facets wsFacets = esFacets.getAll().entrySet().stream() .map(esToWsFacet) .collect(Collector.of( Common.Facets::newBuilder, Common.Facets.Builder::addFacets, (result1, result2) -> { throw new IllegalStateException("Parallel execution forbidden"); }, Common.Facets.Builder::build)); wsResponse.setFacets(wsFacets); return wsResponse; }
/** * Facet with no filters at all */ @Test public void sticky_facets_no_filters() { setupStickyFacets(); OrganizationDto organization = db.organizations().insert(); RuleQuery query = new RuleQuery().setOrganization(organization); SearchIdResult result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS, FACET_TYPES))); Map<String, LinkedHashMap<String, Long>> facets = result.getFacets().getAll(); assertThat(facets).hasSize(4); assertThat(facets.get(FACET_LANGUAGES).keySet()).containsOnly("cpp", "java", "cobol"); assertThat(facets.get(FACET_REPOSITORIES).keySet()).containsExactly("xoo", "foo"); assertThat(facets.get(FACET_TAGS).keySet()).containsOnly("T1", "T2", "T3", "T4"); assertThat(facets.get(FACET_TYPES).keySet()).containsOnly("BUG", "CODE_SMELL", "VULNERABILITY"); }
/** * Facet with a language filter * -- lang facet should still have all language */ @Test public void sticky_facets_with_1_filter() { setupStickyFacets(); OrganizationDto organization = db.organizations().insert(); RuleQuery query = new RuleQuery().setOrganization(organization).setLanguages(ImmutableList.of("cpp")); SearchIdResult result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS))); assertThat(result.getIds()).hasSize(3); assertThat(result.getFacets().getAll()).hasSize(3); assertThat(result.getFacets().get(FACET_LANGUAGES).keySet()).containsOnly("cpp", "java", "cobol"); assertThat(result.getFacets().get(FACET_REPOSITORIES).keySet()).containsOnly("foo"); assertThat(result.getFacets().get(FACET_TAGS).keySet()).containsOnly("T2", "T3"); }
/** * Facet with 2 filters * -- lang facet for tag T2 * -- tag facet for lang cpp * -- repository for cpp & T2 */ @Test public void sticky_facets_with_2_filters() { setupStickyFacets(); RuleQuery query = new RuleQuery() .setOrganization(db.getDefaultOrganization()) .setLanguages(ImmutableList.of("cpp")) .setTags(ImmutableList.of("T2")); SearchIdResult result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS))); assertThat(result.getIds()).hasSize(1); Facets facets = result.getFacets(); assertThat(facets.getAll()).hasSize(3); assertThat(facets.get(FACET_LANGUAGES).keySet()).containsOnly("cpp", "java"); assertThat(facets.get(FACET_REPOSITORIES).keySet()).containsOnly("foo"); assertThat(facets.get(FACET_TAGS).keySet()).containsOnly("T2", "T3"); }
/** * Facet with 3 filters * -- lang facet for tag T2 * -- tag facet for lang cpp & java * -- repository for (cpp || java) & T2 * -- type */ @Test public void sticky_facets_with_3_filters() { setupStickyFacets(); RuleQuery query = new RuleQuery() .setOrganization(db.getDefaultOrganization()) .setLanguages(ImmutableList.of("cpp", "java")) .setTags(ImmutableList.of("T2")) .setTypes(asList(BUG, CODE_SMELL)); SearchIdResult result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS, FACET_TYPES))); assertThat(result.getIds()).hasSize(2); assertThat(result.getFacets().getAll()).hasSize(4); assertThat(result.getFacets().get(FACET_LANGUAGES).keySet()).containsOnly("cpp", "java"); assertThat(result.getFacets().get(FACET_REPOSITORIES).keySet()).containsOnly("foo", "xoo"); assertThat(result.getFacets().get(FACET_TAGS).keySet()).containsOnly("T1", "T2", "T3"); assertThat(result.getFacets().get(FACET_TYPES).keySet()).containsOnly("CODE_SMELL"); }
@Test public void does_not_return_facet_when_no_facets_in_options() { index( newDoc(PROJECT1, NCLOC, 10d, COVERAGE_KEY, 30d, MAINTAINABILITY_RATING, 3d) .setQualityGateStatus(OK.name())); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getFacets(); assertThat(facets.getAll()).isEmpty(); }
@Test public void global_facet_on_repositories_and_tags() { OrganizationDto organization = db.organizations().insert(); createRule(setRepositoryKey("php"), setSystemTags("sysTag")); RuleDefinitionDto rule1 = createRule(setRepositoryKey("php"), setSystemTags()); createRuleMetadata(rule1, organization, setTags("tag1")); RuleDefinitionDto rule2 = createRule(setRepositoryKey("javascript"), setSystemTags()); createRuleMetadata(rule2, organization, setTags("tag1", "tag2")); index(); // should not have any facet! RuleQuery query = new RuleQuery().setOrganization(organization); SearchIdResult result1 = underTest.search(query, new SearchOptions()); assertThat(result1.getFacets().getAll()).isEmpty(); // should not have any facet on non matching query! SearchIdResult result2 = underTest.search(new RuleQuery().setQueryText("aeiou"), new SearchOptions().addFacets(singletonList("repositories"))); assertThat(result2.getFacets().getAll()).hasSize(1); assertThat(result2.getFacets().getAll().get("repositories")).isEmpty(); // Repositories Facet is preset SearchIdResult result3 = underTest.search(query, new SearchOptions().addFacets(asList("repositories", "tags"))); assertThat(result3.getFacets()).isNotNull(); // Verify the value of a given facet Map<String, Long> repoFacets = result3.getFacets().get("repositories"); assertThat(repoFacets).containsOnly(entry("php", 2L), entry("javascript", 1L)); // Check that tag facet has both Tags and SystemTags values Map<String, Long> tagFacets = result3.getFacets().get("tags"); assertThat(tagFacets).containsOnly(entry("tag1", 2L), entry("sysTag", 1L), entry("tag2", 1L)); // Check that there are no other facets assertThat(result3.getFacets().getAll()).hasSize(2); }
private static SearchProjectsWsResponse.Builder addFacets(SearchResults searchResults, SearchProjectsWsResponse.Builder wsResponse) { Facets esFacets = searchResults.facets; EsToWsFacet esToWsFacet = new EsToWsFacet(); searchResults.query.getLanguages().ifPresent(languages -> addMandatoryValuesToFacet(esFacets, FILTER_LANGUAGES, languages)); searchResults.query.getTags().ifPresent(tags -> addMandatoryValuesToFacet(esFacets, FILTER_TAGS, tags)); Common.Facets wsFacets = esFacets.getAll().entrySet().stream() .map(esToWsFacet) .collect(Collector.of( Common.Facets::newBuilder, Common.Facets.Builder::addFacets, (result1, result2) -> { throw new IllegalStateException("Parallel execution forbidden"); }, Common.Facets.Builder::build)); wsResponse.setFacets(wsFacets); return wsResponse; }
private void formatFacets(Facets facets, SearchWsResponse.Builder wsSearch) { Common.Facets.Builder wsFacets = Common.Facets.newBuilder(); Common.Facet.Builder wsFacet = Common.Facet.newBuilder(); for (Map.Entry<String, LinkedHashMap<String, Long>> facet : facets.getAll().entrySet()) { wsFacet.clear(); wsFacet.setProperty(facet.getKey()); LinkedHashMap<String, Long> buckets = facet.getValue(); if (buckets != null) { for (Map.Entry<String, Long> bucket : buckets.entrySet()) { Common.FacetValue.Builder valueBuilder = wsFacet.addValuesBuilder(); valueBuilder.setVal(bucket.getKey()); valueBuilder.setCount(bucket.getValue()); valueBuilder.build(); } } else { wsFacet.addAllValues(Collections.emptyList()); } wsFacets.addFacets(wsFacet); } wsSearch.setFacets(wsFacets); } }