@Override public boolean equals(Object o) { return o != null && o instanceof FilterExpression && expression().equals(((FilterExpression) o).expression()); } }
private static <T> List<FilterExpression<T>> verbFilter(final SearchModel<T> model, final String verb) { return singletonList(FilterExpression.of(model.attributePath() + ":" + verb)); } }
@Override public boolean equals(Object o) { return o != null && o instanceof FilterExpression && toSphereFilter().equals(((FilterExpression) o).toSphereFilter()); } }
@Test public void buildsTermFilterExpression() throws Exception { final FilterExpression<Object> filter = FilterExpression.of(ATTRIBUTE_PATH + TERM_VALUE); assertThat(filter.expression()).isEqualTo(ATTRIBUTE_PATH + TERM_VALUE); assertThat(filter.attributePath()).isEqualTo(ATTRIBUTE_PATH); assertThat(filter.value()).isEqualTo(TERM_VALUE); }
@Test public void buildsTermFilterExpression() throws Exception { final List<FilterExpression<Object>> filters = TermFilterSearchModel.of(ATTRIBUTE_PATH, ofString()).isIn(TERMS); assertThat(filters).hasSize(1); final FilterExpression<Object> filter = filters.get(0); assertThat(filter.expression()).isEqualTo(ATTRIBUTE_PATH + TERM_VALUE); assertThat(filter.attributePath()).isEqualTo(ATTRIBUTE_PATH); assertThat(filter.value()).isEqualTo(TERM_VALUE); }
@Test public void buildsRangeFilterExpression() throws Exception { final FilterExpression<Object> filter = FilterExpression.of(ATTRIBUTE_PATH + RANGE_VALUE); assertThat(filter.expression()).isEqualTo(ATTRIBUTE_PATH + RANGE_VALUE); assertThat(filter.attributePath()).isEqualTo(ATTRIBUTE_PATH); assertThat(filter.value()).isEqualTo(RANGE_VALUE); }
@Test public void buildsRangeFilterExpression() throws Exception { final List<FilterExpression<Object>> filters = RangeTermFilterSearchModel.of(ATTRIBUTE_PATH, ofNumber()).isBetweenAny(FILTER_RANGES); assertThat(filters).hasSize(1); final FilterExpression<Object> filter = filters.get(0); assertThat(filter.expression()).isEqualTo(ATTRIBUTE_PATH + RANGE_VALUE); assertThat(filter.attributePath()).isEqualTo(ATTRIBUTE_PATH); assertThat(filter.value()).isEqualTo(RANGE_VALUE); }
@Override public boolean equals(Object o) { return o != null && o instanceof FilterExpression && expression().equals(((FilterExpression) o).expression()); } }
@Test public void simpleFilterByRange() throws Exception { final FilterExpression<ProductProjection> filterExpr = FilterExpression.of("variants.attributes." + ATTR_NAME_SIZE + ":range(44 to *)"); final ProductProjectionSearch search = ProductProjectionSearch.ofStaged().plusQueryFilters(singletonList(filterExpr)); testResultIds(search, resultIds -> assertThat(resultIds).containsOnly(product1.getId(), product2.getId())); }
@Override public boolean equals(Object o) { return o != null && o instanceof FilterExpression && toSphereFilter().equals(((FilterExpression) o).toSphereFilter()); } }
private <T> void testExpression(List<FilterExpression<T>> filterExpr, Consumer<List<String>> test) { final List<String> expressions = filterExpr.stream() .map(expr -> expr.expression()) .collect(toList()); test.accept(expressions); } }
private String queryParametersToString(final boolean urlEncoded) { final UrlQueryBuilder builder = UrlQueryBuilder.of(); text().ifPresent(t -> builder.add(SearchParameterKeys.TEXT + "." + t.getLocale().getLanguage(), t.getText(), urlEncoded)); facets().forEach(f -> builder.add(SearchParameterKeys.FACET, f.toSphereFacet(), urlEncoded)); filterResults().forEach(f -> builder.add(SearchParameterKeys.FILTER, f.toSphereFilter(), urlEncoded)); filterQueries().forEach(f -> builder.add(SearchParameterKeys.FILTER_QUERY, f.toSphereFilter(), urlEncoded)); filterFacets().forEach(f -> builder.add(SearchParameterKeys.FILTER_FACETS, f.toSphereFilter(), urlEncoded)); sort().forEach(s -> builder.add(SearchParameterKeys.SORT, s.toSphereSort(), urlEncoded)); limit().ifPresent(l -> builder.add(SearchParameterKeys.LIMIT, l.toString(), urlEncoded)); offset().ifPresent(o -> builder.add(SearchParameterKeys.OFFSET, o.toString(), urlEncoded)); additionalQueryParameters().forEach(p -> builder.add(p.getKey(), p.getValue(), urlEncoded)); return "?" + builder.toString(); }
String queryParametersToString(final boolean urlEncoded) { final UrlQueryBuilder builder = UrlQueryBuilder.of(); Optional.ofNullable(text()).ifPresent(t -> builder.add(TEXT + "." + t.getLocale().toLanguageTag(), t.getValue(), urlEncoded)); facets().forEach(f -> builder.add(FACET, f.expression(), urlEncoded)); Optional.ofNullable(isFuzzy()).ifPresent(b -> builder.add(FUZZY, b.toString(), urlEncoded)); Optional.ofNullable(fuzzyLevel()).ifPresent(b -> builder.add(FUZZY_LEVEL, b.toString(), urlEncoded)); resultFilters().forEach(f -> builder.add(FILTER_RESULTS, f.expression(), urlEncoded)); queryFilters().forEach(f -> builder.add(FILTER_QUERY, f.expression(), urlEncoded)); facetFilters().forEach(f -> builder.add(FILTER_FACETS, f.expression(), urlEncoded)); facetedSearch().forEach(f -> { builder.add(FACET, f.facetExpression().expression(), urlEncoded); f.filterExpressions().forEach(filter -> { builder.add(FILTER_RESULTS, filter.expression(), urlEncoded); builder.add(FILTER_FACETS, filter.expression(), urlEncoded); }); }); sort().forEach(s -> builder.add(SORT, s.expression(), urlEncoded)); if (!facets().isEmpty() || !facetedSearch().isEmpty()) { builder.add("formatBooleanFacet", Boolean.TRUE.toString(), urlEncoded); } Optional.ofNullable(limit()).ifPresent(l -> builder.add(LIMIT, l.toString(), urlEncoded)); Optional.ofNullable(offset()).ifPresent(o -> builder.add(OFFSET, o.toString(), urlEncoded)); expansionPaths().forEach(path -> builder.add(EXPAND, path.toSphereExpand(), urlEncoded)); additionalQueryParameters().forEach(p -> builder.add(p.getName(), p.getValue(), urlEncoded)); return builder.build(); }
@Test public void categorySubtree() { final List<String> expressionsWithoutSubtrees = ProductProjectionSearch.ofStaged().withQueryFilters(m -> m.categories().id().isIn(asList("id1", "id2"))).queryFilters().stream().map(e -> e.expression()).collect(Collectors.toList()); assertThat(expressionsWithoutSubtrees.get(0)).isEqualTo("categories.id:\"id1\",\"id2\""); final List<FilterExpression<ProductProjection>> filterExpressions = ProductProjectionSearch.ofStaged().withQueryFilters(m -> m.categories().id().isInSubtreeOrInCategory(asList("id1", "id2"), asList("id3", "id4"))).queryFilters(); final List<String> collect = filterExpressions.stream().map(e -> e.expression()).collect(Collectors.toList()); final String expected = "categories.id:subtree(\"id1\"),subtree(\"id2\"),\"id3\",\"id4\""; assertThat(collect).hasSize(1); assertThat(collect.get(0)).isEqualTo(expected); }