/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.solr.repository.query;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.collection.IsEmptyCollection.*;
import static org.hamcrest.number.IsCloseTo.*;
import static org.junit.Assert.*;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.solr.core.mapping.SimpleSolrMappingContext;
import org.springframework.data.solr.core.query.SpellcheckOptions;
import org.springframework.data.solr.repository.Facet;
import org.springframework.data.solr.repository.Highlight;
import org.springframework.data.solr.repository.Pivot;
import org.springframework.data.solr.repository.ProductBean;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SelectiveStats;
import org.springframework.data.solr.repository.Spellcheck;
import org.springframework.data.solr.repository.Stats;
import org.springframework.data.solr.repository.support.SolrEntityInformationCreatorImpl;
/**
* @author Christoph Strobl
* @author Andrey Paramonov
* @author Francisco Spaeth
* @author Oliver Gierke
*/
public class SolrQueryMethodTests {
SolrEntityInformationCreator creator;
@Before
public void setUp() {
creator = new SolrEntityInformationCreatorImpl(new SimpleSolrMappingContext());
}
@Test
public void testAnnotatedQueryUsage() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedQuery", String.class);
assertTrue(method.hasAnnotatedQuery());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFilterQuery());
assertEquals("name:?0", method.getAnnotatedQuery());
}
@Test
public void testAnnotatedQueryUsageWithoutExplicitAttribute() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedQueryWithoutExplicitAttribute", String.class);
assertTrue(method.hasAnnotatedQuery());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
assertEquals("name:?0", method.getAnnotatedQuery());
}
@Test
public void testAnnotatedNamedQueryNameUsage() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedNamedQueryName", String.class);
assertFalse(method.hasAnnotatedQuery());
assertTrue(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
assertEquals("ProductRepository.namedQuery-1", method.getAnnotatedNamedQueryName());
}
@Test
public void testWithoutAnnotation() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByName", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasFilterQuery());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.isHighlightQuery());
}
@Test
public void testWithSingleFieldProjection() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedQueryWithProjectionOnSingleField", String.class);
assertTrue(method.hasAnnotatedQuery());
assertTrue(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
assertEquals("name:?0", method.getAnnotatedQuery());
}
@Test
public void testWithMultipleFieldsProjection() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedQueryWithProjectionOnMultipleFields", String.class);
assertTrue(method.hasAnnotatedQuery());
assertTrue(method.hasProjectionFields());
assertFalse(method.hasFilterQuery());
assertEquals(2, method.getProjectionFields().size());
assertFalse(method.hasAnnotatedNamedQueryName());
assertEquals("name:?0", method.getAnnotatedQuery());
}
@Test
public void testWithSingleFieldFacet() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnPopularity", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertTrue(method.hasFacetFields());
assertFalse(method.hasFacetQueries());
assertFalse(method.hasFilterQuery());
assertEquals(1, method.getFacetFields().size());
assertEquals(Integer.valueOf(10), method.getFacetLimit());
assertEquals(Integer.valueOf(1), method.getFacetMinCount());
}
@Test
public void testWithMultipleFieldFacets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnPopularityAndPrice", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertTrue(method.hasFacetFields());
assertFalse(method.hasFacetQueries());
assertEquals(2, method.getFacetFields().size());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
}
@Test
public void testWithMultipleFieldFacetsLimitAndMinCount() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnPopularityAndPriceMinCount3Limit25", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertTrue(method.hasFacetFields());
assertFalse(method.hasFacetQueries());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
assertEquals(2, method.getFacetFields().size());
assertEquals(Integer.valueOf(25), method.getFacetLimit());
assertEquals(Integer.valueOf(3), method.getFacetMinCount());
}
@Test
public void testWithSingleFieldPivot() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNamePivotOnField1VsField2");
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFacetFields());
assertTrue(method.hasPivotFields());
assertFalse(method.hasFacetQueries());
assertFalse(method.hasFilterQuery());
assertEquals(1, method.getPivotFields().size());
assertEquals(Integer.valueOf(10), method.getFacetLimit());
assertEquals(Integer.valueOf(1), method.getFacetMinCount());
}
@Test
public void testWithMultipleFieldPivot() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNamePivotOnField1VsField2AndField2VsField3");
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertTrue(method.hasPivotFields());
assertFalse(method.hasFacetQueries());
assertEquals(2, method.getPivotFields().size());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
}
@Test // DATSOLR-155
public void testWithMultipleFieldPivotUsingPivotAnnotation() throws Exception {
SolrQueryMethod method = getQueryMethodByName(
"findByNamePivotOnField1VsField2AndField2VsField3UsingPivotAnnotation");
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertTrue(method.hasPivotFields());
assertFalse(method.hasFacetQueries());
assertEquals(2, method.getPivotFields().size());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
}
@Test // DATASOLR-155
public void testWithMultipleFieldPivotUsingOnlyPivotAnnotation() throws Exception {
SolrQueryMethod method = getQueryMethodByName(
"findByNamePivotOnField1VsField2AndField2VsField3UsingOnlyPivotAnnotation");
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertTrue(method.hasPivotFields());
assertFalse(method.hasFacetQueries());
assertEquals(2, method.getPivotFields().size());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
}
@Test
public void testWithMultipleFieldPivotsLimitAndMinCount() throws Exception {
SolrQueryMethod method = getQueryMethodByName(
"findByNamePivotOnField1VsField2AndField2VsField3AndLimitAndMinCount");
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertTrue(method.hasPivotFields());
assertFalse(method.hasFacetQueries());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFilterQuery());
assertEquals(2, method.getPivotFields().size());
assertEquals(Integer.valueOf(25), method.getFacetLimit());
assertEquals(Integer.valueOf(3), method.getFacetMinCount());
}
@Test
public void testWithSingleQueryFacet() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnPopularityQuery", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFacetFields());
assertTrue(method.hasFacetQueries());
assertFalse(method.hasFilterQuery());
assertEquals(0, method.getFacetFields().size());
assertEquals(1, method.getFacetQueries().size());
assertEquals(Integer.valueOf(10), method.getFacetLimit());
assertEquals(Integer.valueOf(1), method.getFacetMinCount());
assertEquals("popularity:[* TO 5]", method.getFacetQueries().get(0));
}
@Test
public void testWithMultipleQueryFacets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnAvailableQuery", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFacetFields());
assertTrue(method.hasFacetQueries());
assertFalse(method.hasFilterQuery());
assertEquals(0, method.getFacetFields().size());
assertEquals(2, method.getFacetQueries().size());
assertEquals(Integer.valueOf(10), method.getFacetLimit());
assertEquals(Integer.valueOf(1), method.getFacetMinCount());
assertEquals("inStock:true", method.getFacetQueries().get(0));
assertEquals("inStock:false", method.getFacetQueries().get(1));
}
@Test
public void testWithMultipleQueryFacetsLimitAndMinCount() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnAvailableQueryMinCount3Limit25", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertFalse(method.hasFacetFields());
assertTrue(method.hasFacetQueries());
assertFalse(method.hasFilterQuery());
assertEquals(0, method.getFacetFields().size());
assertEquals(2, method.getFacetQueries().size());
assertEquals(Integer.valueOf(25), method.getFacetLimit());
assertEquals(Integer.valueOf(3), method.getFacetMinCount());
assertEquals("inStock:true", method.getFacetQueries().get(0));
assertEquals("inStock:false", method.getFacetQueries().get(1));
}
@Test
public void testWithFacetPrefix() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findAllFacetOnNameWithPrefix");
assertEquals(1, method.getFacetFields().size());
assertEquals("ip", method.getFacetPrefix());
}
@Test
public void testWithoutFacetPrefix() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameFacetOnPopularity", String.class);
assertNull(method.getFacetPrefix());
}
@Test
public void testWithSigleFilter() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameStringWith", String.class);
assertFalse(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertTrue(method.hasFilterQuery());
assertEquals(1, method.getFilterQueries().size());
}
@Test
public void testWithMultipleFilters() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findAllFilterAvailableTrueAndPopularityLessThan5", String.class);
assertTrue(method.hasAnnotatedQuery());
assertFalse(method.hasProjectionFields());
assertFalse(method.hasFacetFields());
assertFalse(method.hasAnnotatedNamedQueryName());
assertTrue(method.hasFilterQuery());
assertEquals(2, method.getFilterQueries().size());
}
@Test
public void testWithoutQueryDefaultOperator() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameLike", String.class);
assertEquals(org.springframework.data.solr.core.query.Query.Operator.AND, method.getDefaultOperator());
}
@Test
public void testWithQueryDefaultOperator() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameStringWith", String.class);
assertEquals(org.springframework.data.solr.core.query.Query.Operator.NONE, method.getDefaultOperator());
}
@Test
public void testQueryWithPositiveTimeAllowed() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findAllWithPositiveTimeRestriction", String.class);
assertEquals(Integer.valueOf(250), method.getTimeAllowed());
}
@Test
public void testQueryWithNegativeTimeAllowed() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findAllWithNegativeTimeRestriction", String.class);
assertNull(method.getTimeAllowed());
}
@Test
public void testQueryWithDefType() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameEndingWith", String.class);
assertEquals("lucene", method.getDefType());
}
@Test
public void testQueryWithRequestHandler() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByText", String.class);
assertEquals("/instock", method.getRequestHandler());
}
@Test
public void testQueryWithEmptyHighlight() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextLike", String.class);
assertTrue(method.isHighlightQuery());
assertNull(method.getHighlightFormatter());
assertNull(method.getHighlightQuery());
assertNull(method.getHighlighSnipplets());
assertThat(method.getHighlightFieldNames(), empty());
assertNull(method.getHighlightFragsize());
assertNull(method.getHighlightPrefix());
assertNull(method.getHighlightPostfix());
}
@Test
public void testQueryWithHighlightSingleField() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightSingleField", String.class);
assertThat(Collections.singletonList("field_1"), equalTo(method.getHighlightFieldNames()));
}
@Test
public void testQueryWithHighlightMultipleFields() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightMultipleFields", String.class);
assertThat(Arrays.asList("field_1", "field_2", "field_3"), equalTo(method.getHighlightFieldNames()));
}
@Test
public void testQueryWithHighlightFormatter() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightFormatter", String.class);
assertEquals("simple", method.getHighlightFormatter());
}
@Test
public void testQueryWithHighlightQuery() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightQuery", String.class);
assertEquals("field_1:value*", method.getHighlightQuery());
}
@Test
public void testQueryWithHighlightSnipplets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightSnipplets", String.class);
assertEquals(Integer.valueOf(2), method.getHighlighSnipplets());
}
@Test
public void testQueryWithNegativeHighlightSnipplets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextNegativeHighlightSnipplets", String.class);
assertNull(method.getHighlighSnipplets());
}
@Test
public void testQueryWithHighlightFragsize() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightFragsize", String.class);
assertEquals(Integer.valueOf(3), method.getHighlightFragsize());
}
@Test
public void testQueryWithNegativeHighlightFragsize() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextNegativeHighlightFragsize", String.class);
assertNull(method.getHighlightFragsize());
}
@Test
public void testQueryWithHighlightPrefix() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightPrefix", String.class);
assertEquals("{prefix}", method.getHighlightPrefix());
}
@Test
public void testQueryWithHighlightPostfix() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByTextHighlightPostfix", String.class);
assertEquals("{postfix}", method.getHighlightPostfix());
}
@Test // DATASOLR-144
public void testDeleteAttrbiteOfAnnotatedQueryIsDiscoveredCorrectlty() throws Exception {
SolrQueryMethod method = getQueryMethodByName("removeByAnnotatedQuery");
assertTrue(method.isDeleteQuery());
}
@Test // DATASOLR-144
public void testDeleteAttrbiteOfAnnotatedQueryIsFalseByDefault() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByAnnotatedQuery", String.class);
assertFalse(method.isDeleteQuery());
}
@Test // DATASOLR-160
public void testStatsForField() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithFieldStats", String.class);
assertEquals(Collections.singletonList("field1"), method.getFieldStats());
}
@Test // DATASOLR-160
public void testStatsForFieldAndFacets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithFieldAndFacetStats", String.class);
assertEquals(Collections.singletonList("field1"), method.getFieldStats());
assertEquals(Collections.singletonList("field2"), method.getStatsFacets());
}
@Test // DATASOLR-160
public void testStatsForSelectiveFacets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithSelectiveFacetStats", String.class);
Map<String, String[]> statsSelectiveFacets = method.getStatsSelectiveFacets();
assertEquals(2, statsSelectiveFacets.size());
assertArrayEquals(new String[] { "field1_1", "field1_2" }, statsSelectiveFacets.get("field1"));
assertArrayEquals(new String[] { "field2_1", "field2_2" }, statsSelectiveFacets.get("field2"));
}
@Test // DATASOLR-160
public void testStatsForFieldAndFacetsAndSelectiveFacets() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithFieldStatsAndFacetsStatsAndSelectiveFacetStats",
String.class);
assertEquals(Collections.singletonList("field1"), method.getFieldStats());
assertEquals(Arrays.asList("field2", "field3"), method.getStatsFacets());
Map<String, String[]> statsSelectiveFacets = method.getStatsSelectiveFacets();
assertEquals(1, statsSelectiveFacets.size());
assertArrayEquals(new String[] { "field4_1", "field4_2" }, statsSelectiveFacets.get("field4"));
}
@Test // DATASOLR-160
public void testHasStatsDefinition() throws Exception {
assertFalse(getQueryMethodByName("findByNameWithEmptyStats", String.class).hasStatsDefinition());
assertTrue(getQueryMethodByName("findByNameWithFieldStats", String.class).hasStatsDefinition());
assertTrue(getQueryMethodByName("findByNameWithFieldAndFacetStats", String.class).hasStatsDefinition());
assertTrue(getQueryMethodByName("findByNameWithSelectiveFacetStats", String.class).hasStatsDefinition());
assertTrue(getQueryMethodByName("findByNameWithFieldStatsAndFacetsStatsAndSelectiveFacetStats", String.class)
.hasStatsDefinition());
}
/**
* DATASOLR-137
*/
@Test
public void shouldApplySpellcheckCorrectly() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithDefaultSpellcheck", String.class);
assertTrue(method.hasSpellcheck());
SpellcheckOptions options = method.getSpellcheckOptions();
assertThat(options.getDictionary(), is(nullValue()));
assertThat(options.getAccuracy(), is(nullValue()));
assertThat(options.getAlternativeTermCount(), is(nullValue()));
assertThat(options.getCollate(), is(false));
assertThat(options.getCollateExtendedResults(), is(false));
assertThat(options.getMaxCollationCollectDocs(), is(nullValue()));
assertThat(options.getCollateParams().size(), is(0));
assertThat(options.getCount(), is(nullValue()));
assertThat(options.getDictionary(), is(nullValue()));
assertThat(options.getMaxCollationEvaluations(), is(nullValue()));
assertThat(options.getMaxCollations(), is(nullValue()));
assertThat(options.getMaxResultsForSuggest(), is(nullValue()));
assertThat(options.getOnlyMorePopular(), is(false));
assertThat(options.getQuery(), is(nullValue()));
}
/**
* DATASOLR-137
*/
@Test
public void shouldApplySpellcheckWithOptionsCorrectly() throws Exception {
SolrQueryMethod method = getQueryMethodByName("findByNameWithSpellcheckOptions", String.class);
assertTrue(method.hasSpellcheck());
SpellcheckOptions options = method.getSpellcheckOptions();
assertThat(options.getAccuracy().doubleValue(), is(closeTo(0.5D, 0.0D)));
assertThat(options.getAlternativeTermCount(), is(10L));
assertThat(options.getCollate(), is(true));
assertThat(options.getCollateExtendedResults(), is(true));
assertThat(options.getMaxCollationCollectDocs(), is(10L));
assertThat(options.getCollateParams().size(), is(0));
assertThat(options.getCount(), is(100L));
assertThat(options.getDictionary(), is(equalTo(new String[] { "myDict" })));
assertThat(options.getMaxCollationEvaluations(), is(5L));
assertThat(options.getMaxCollations(), is(3L));
assertThat(options.getMaxResultsForSuggest(), is(7L));
assertThat(options.getOnlyMorePopular(), is(true));
assertThat(options.getQuery(), is(nullValue()));
assertThat(options.getExtendedResults(), is(true));
}
private SolrQueryMethod getQueryMethodByName(String name, Class<?>... parameters) throws Exception {
Method method = Repo1.class.getMethod(name, parameters);
return new SolrQueryMethod(method, new DefaultRepositoryMetadata(Repo1.class),
new SpelAwareProxyProjectionFactory(), creator);
}
interface Repo1 extends Repository<ProductBean, String> {
@Query(value = "name:?0")
List<ProductBean> findByAnnotatedQuery(String name);
@Query("name:?0")
List<ProductBean> findByAnnotatedQueryWithoutExplicitAttribute(String name);
@Query(name = "ProductRepository.namedQuery-1")
List<ProductBean> findByAnnotatedNamedQueryName(String name);
List<ProductBean> findByName(String name);
@Query(value = "name:?0", fields = "popularity")
List<ProductBean> findByAnnotatedQueryWithProjectionOnSingleField(String name);
@Query(value = "name:?0", fields = { "popularity", "price" })
List<ProductBean> findByAnnotatedQueryWithProjectionOnMultipleFields(String name);
@Facet(fields = { "popularity" })
List<ProductBean> findByNameFacetOnPopularity(String name);
@Facet(fields = { "popularity", "price" })
List<ProductBean> findByNameFacetOnPopularityAndPrice(String name);
@Facet(fields = { "popularity", "price" }, minCount = 3, limit = 25)
List<ProductBean> findByNameFacetOnPopularityAndPriceMinCount3Limit25(String name);
@Facet(queries = { "popularity:[* TO 5]" })
List<ProductBean> findByNameFacetOnPopularityQuery(String name);
@Facet(queries = { "inStock:true", "inStock:false" })
List<ProductBean> findByNameFacetOnAvailableQuery(String name);
@Facet(queries = { "inStock:true", "inStock:false" }, minCount = 3, limit = 25)
List<ProductBean> findByNameFacetOnAvailableQueryMinCount3Limit25(String name);
@Facet(fields = "name", prefix = "ip")
List<ProductBean> findAllFacetOnNameWithPrefix();
@Query(filters = { "inStock:true" })
List<ProductBean> findByNameStringWith(String name);
@Query(value = "*:*", filters = { "inStock:true", "popularity:[* TO 5]" })
List<ProductBean> findAllFilterAvailableTrueAndPopularityLessThan5(String name);
@Query(defaultOperator = org.springframework.data.solr.core.query.Query.Operator.AND)
List<ProductBean> findByNameLike(String prefix);
@Query(value = "*:*", timeAllowed = 250)
List<ProductBean> findAllWithPositiveTimeRestriction(String name);
@Query(value = "*:*", timeAllowed = -10)
List<ProductBean> findAllWithNegativeTimeRestriction(String name);
@Query(defType = "lucene")
List<ProductBean> findByNameEndingWith(String name);
@Query(requestHandler = "/instock")
List<ProductBean> findByText(String text);
@Query(value = "*:*", delete = true)
List<ProductBean> removeByAnnotatedQuery();
@Highlight
List<ProductBean> findByTextLike(String text);
@Highlight(fields = "field_1")
List<ProductBean> findByTextHighlightSingleField(String text);
@Highlight(fields = { "field_1", "field_2", "field_3" })
List<ProductBean> findByTextHighlightMultipleFields(String text);
@Highlight(formatter = "simple")
List<ProductBean> findByTextHighlightFormatter(String text);
@Highlight(query = "field_1:value*")
List<ProductBean> findByTextHighlightQuery(String text);
@Highlight(snipplets = 2)
List<ProductBean> findByTextHighlightSnipplets(String text);
@Highlight(snipplets = -2)
List<ProductBean> findByTextNegativeHighlightSnipplets(String text);
@Highlight(fragsize = 3)
List<ProductBean> findByTextHighlightFragsize(String text);
@Highlight(fragsize = -3)
List<ProductBean> findByTextNegativeHighlightFragsize(String text);
@Highlight(prefix = "{prefix}")
List<ProductBean> findByTextHighlightPrefix(String text);
@Highlight(postfix = "{postfix}")
List<ProductBean> findByTextHighlightPostfix(String text);
@Facet(pivots = { @Pivot({ "field1", "field2" }) })
List<ProductBean> findByNamePivotOnField1VsField2();
@Facet(pivots = { @Pivot({ "field1", "field2" }), @Pivot({ "field2", "field3" }) })
List<ProductBean> findByNamePivotOnField1VsField2AndField2VsField3();
@Facet(pivots = { @Pivot({ "field1", "field2" }), @Pivot({ "field2", "field3" }) }, minCount = 3, limit = 25)
List<ProductBean> findByNamePivotOnField1VsField2AndField2VsField3AndLimitAndMinCount();
@Facet(pivots = { @Pivot({ "field4", "field5" }), @Pivot({ "field5", "field6" }) })
List<ProductBean> findByNamePivotOnField1VsField2AndField2VsField3UsingPivotAnnotation();
@Facet(pivots = { @Pivot({ "field1", "field2" }), @Pivot({ "field2", "field3" }) })
List<ProductBean> findByNamePivotOnField1VsField2AndField2VsField3UsingOnlyPivotAnnotation();
@Stats("field1")
List<ProductBean> findByNameWithFieldStats(String name);
@Stats(value = "field1", facets = "field2")
List<ProductBean> findByNameWithFieldAndFacetStats(String name);
@Stats( //
selective = { @SelectiveStats(field = "field1", facets = { "field1_1", "field1_2" }), //
@SelectiveStats(field = "field2", facets = { "field2_1", "field2_2" }) //
}//
)
List<ProductBean> findByNameWithSelectiveFacetStats(String name);
@Stats(//
value = "field1", //
facets = { "field2", "field3" }, //
selective = @SelectiveStats(field = "field4", facets = { "field4_1", "field4_2" }) //
)
List<ProductBean> findByNameWithFieldStatsAndFacetsStatsAndSelectiveFacetStats(String name);
@Stats
List<ProductBean> findByNameWithEmptyStats(String name);
@Spellcheck
List<ProductBean> findByNameWithDefaultSpellcheck(String name);
@Spellcheck(accuracy = 0.5F, alternativeTermCount = 10, buildDictionary = true, collate = true,
collateExtendedResults = true, count = 100, dictionaries = "myDict", maxCollationEvaluations = 5,
maxCollationCollectDocs = 10, maxCollations = 3, maxCollationsTries = 9, maxResultsForSuggest = 7,
onlyMorePopular = true, extendedResults = true)
List<ProductBean> findByNameWithSpellcheckOptions(String name);
}
}