@Test public void search_is_case_insensitive() { List<Criterion> criterion = FilterParser.parse("ncloc > 10 AnD coverage <= 80 AND debt = 10 AND issues = 20"); assertThat(criterion).hasSize(4); }
@CheckForNull private static Criterion tryParsingCriterionNotHavingValues(String criterion) { Matcher matcher = PATTERN.matcher(criterion); if (!matcher.find()) { return null; } Criterion.Builder builder = new Criterion.Builder(); builder.setKey(matcher.group(1)); String operatorValue = matcher.group(2); String value = matcher.group(3); if (!isNullOrEmpty(operatorValue) && !isNullOrEmpty(value)) { builder.setOperator(ProjectMeasuresQuery.Operator.getByValue(operatorValue)); builder.setValue(sanitizeValue(value)); } return builder.build(); }
private static Criterion parseCriterion(String rawCriterion) { try { Criterion criterion = tryParsingCriterionHavingValues(rawCriterion); if (criterion != null) { return criterion; } criterion = tryParsingCriterionNotHavingValues(rawCriterion); if (criterion != null) { return criterion; } throw new IllegalArgumentException("Criterion is invalid"); } catch (Exception e) { throw new IllegalArgumentException(String.format("Cannot parse '%s' : %s", rawCriterion, e.getMessage()), e); } }
@Test public void accept_empty_query() { List<Criterion> criterion = FilterParser.parse(""); assertThat(criterion).isEmpty(); }
private static Criterion parseCriterion(String rawCriterion) { try { Criterion criterion = tryParsingCriterionHavingValues(rawCriterion); if (criterion != null) { return criterion; } criterion = tryParsingCriterionNotHavingValues(rawCriterion); if (criterion != null) { return criterion; } throw new IllegalArgumentException("Criterion is invalid"); } catch (Exception e) { throw new IllegalArgumentException(String.format("Cannot parse '%s' : %s", rawCriterion, e.getMessage()), e); } }
@CheckForNull private static Criterion tryParsingCriterionNotHavingValues(String criterion) { Matcher matcher = PATTERN.matcher(criterion); if (!matcher.find()) { return null; } Criterion.Builder builder = new Criterion.Builder(); builder.setKey(matcher.group(1)); String operatorValue = matcher.group(2); String value = matcher.group(3); if (!isNullOrEmpty(operatorValue) && !isNullOrEmpty(value)) { builder.setOperator(Operator.getByValue(operatorValue)); builder.setValue(sanitizeValue(value)); } return builder.build(); }
@Test public void parse_filter_having_in_operator() { List<Criterion> criterion = FilterParser.parse("ncloc in (80,90)"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValues, Criterion::getValue) .containsOnly( tuple("ncloc", IN, asList("80", "90"), null)); }
@Test public void parse_filter_having_in_operator_ignores_white_spaces() { List<Criterion> criterion = FilterParser.parse(" ncloc in ( 80 , 90 ) "); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValues, Criterion::getValue) .containsOnly( tuple("ncloc", IN, asList("80", "90"), null)); }
@Test public void parse_filter_without_any_space_in_criteria() { List<Criterion> criterion = FilterParser.parse("ncloc>10 and coverage<=80 and tags in (java,platform)"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue, Criterion::getValues) .containsOnly( tuple("ncloc", GT, "10", emptyList()), tuple("coverage", LTE, "80", emptyList()), tuple("tags", IN, null, asList("java", "platform"))); }
@Test public void parse_filter_having_operator_and_value_ignores_white_spaces() { List<Criterion> criterion = FilterParser.parse(" ncloc > 10 "); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("ncloc", GT, "10")); }
@Test public void metric_key_with_and_string() { List<Criterion> criterion = FilterParser.parse("ncloc > 10 and operand = 5"); assertThat(criterion).hasSize(2).extracting(Criterion::getKey, Criterion::getValue).containsExactly(tuple("ncloc", "10"), tuple("operand", "5")); } }
@Test public void parse_filter_having_only_key() { List<Criterion> criterion = FilterParser.parse("isFavorite"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("isFavorite", null, null)); }
@Test public void parse_filter_having_only_key_ignores_white_spaces() { List<Criterion> criterion = FilterParser.parse(" isFavorite "); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("isFavorite", null, null)); }
@Test public void parse_filter_having_all_operators() { List<Criterion> criterion = FilterParser.parse("ncloc < 10 and coverage <= 80 and debt > 50 and duplication >= 56.5 and security_rating = 1 and language in (java,js)"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue, Criterion::getValues) .containsOnly( tuple("ncloc", LT, "10", emptyList()), tuple("coverage", LTE, "80", emptyList()), tuple("debt", GT, "50", emptyList()), tuple("duplication", GTE, "56.5", emptyList()), tuple("security_rating", EQ, "1", emptyList()), tuple("language", IN, null, asList("java", "js"))); }
@Test public void parse_filter_with_key_having_underscore() { List<Criterion> criterion = FilterParser.parse(" alert_status = OK"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("alert_status", EQ, "OK")); }
@Test public void accept_key_ending_by_in() { List<Criterion> criterion = FilterParser.parse("endingbyin > 10"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("endingbyin", GT, "10")); }
@Test public void parse_filter_starting_and_ending_with_double_quotes() { assertThat(FilterParser.parse("q = \"Sonar Qube\"")) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("q", EQ, "Sonar Qube")); assertThat(FilterParser.parse("q = \"Sonar\"Qube\"")) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("q", EQ, "Sonar\"Qube")); assertThat(FilterParser.parse("q = Sonar\"Qube")) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("q", EQ, "Sonar\"Qube")); assertThat(FilterParser.parse("q=\"Sonar Qube\"")) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("q", EQ, "Sonar Qube")); }
@Test public void parse_filter_having_operator_and_value() { List<Criterion> criterion = FilterParser.parse("ncloc > 10 and coverage <= 80"); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("ncloc", GT, "10"), tuple("coverage", LTE, "80")); }
private SearchResults searchData(DbSession dbSession, SearchProjectsRequest request, @Nullable OrganizationDto organization) { Set<String> favoriteProjectUuids = loadFavoriteProjectUuids(dbSession); List<Criterion> criteria = FilterParser.parse(firstNonNull(request.getFilter(), "")); ProjectMeasuresQuery query = newProjectMeasuresQuery(criteria, hasFavoriteFilter(criteria) ? favoriteProjectUuids : null) .setSort(request.getSort()) .setAsc(request.getAsc()); Optional.ofNullable(organization) .map(OrganizationDto::getUuid) .ifPresent(query::setOrganizationUuid); ProjectMeasuresQueryValidator.validate(query); SearchIdResult<String> esResults = index.search(query, new SearchOptions() .addFacets(request.getFacets()) .setPage(request.getPage(), request.getPageSize())); List<String> projectUuids = esResults.getIds(); Ordering<ComponentDto> ordering = Ordering.explicit(projectUuids).onResultOf(ComponentDto::uuid); List<ComponentDto> projects = ordering.immutableSortedCopy(dbClient.componentDao().selectByUuids(dbSession, projectUuids)); Map<String, SnapshotDto> analysisByProjectUuid = getSnapshots(dbSession, request, projectUuids); return new SearchResults(projects, favoriteProjectUuids, esResults, analysisByProjectUuid, query); }
@Test public void parse_filter_having_different_criterion_types() { List<Criterion> criterion = FilterParser.parse(" ncloc > 10 and coverage <= 80 and isFavorite "); assertThat(criterion) .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue) .containsOnly( tuple("ncloc", GT, "10"), tuple("coverage", LTE, "80"), tuple("isFavorite", null, null)); }