FacetingRequest facetingRequest = queryBuilder.facet().name(facetField + FACET_NAME_SUFFIX).onField(facetField) .discrete().orderedBy(FacetSortOrder.COUNT_DESC).includeZeroCounts(false).maxFacetCount(facetCount) .createFacetingRequest(); facetManager.enableFaceting(facetingRequest);
FacetingRequest facetingRequest = queryBuilder.facet().name(facetField + FACET_NAME_SUFFIX).onField(facetField) .discrete().orderedBy(FacetSortOrder.COUNT_DESC).includeZeroCounts(false).maxFacetCount(facetCount) .createFacetingRequest(); facetManager.enableFaceting(facetingRequest);
@Test public void testAlphabeticalSortOrder() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.FIELD_VALUE ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); for ( int i = 1; i < facetList.size() - 1; i++ ) { String previousFacetValue = facetList.get( i - 1 ).getValue(); String currentFacetValue = facetList.get( i ).getValue(); assertTrue( "Wrong alphabetical sort order", previousFacetValue.compareTo( currentFacetValue ) < 0 ); } }
@Test @TestForIssue(jiraKey = "HSEARCH-809") public void testStringFaceting() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( "manufacturer" ) .onField( "make" ) .discrete() .includeZeroCounts( false ) .createFacetingRequest(); FullTextQuery query = matchAll( request ); List<Facet> facetList = query.getFacetManager().getFacets( "manufacturer" ); assertEquals( "Wrong number of facets", 5, facetList.size() ); assertFacet( facetList.get( 0 ), "Honda", 13 ); assertFacet( facetList.get( 1 ), "BMW", 12 ); assertFacet( facetList.get( 2 ), "Mercedes", 12 ); assertFacet( facetList.get( 3 ), "Toyota", 12 ); assertFacet( facetList.get( 4 ), "Ford", 1 ); }
@Test public void testAllIndexedManyToOneValuesGetCounted() throws Exception { FacetingRequest request = queryBuilder( Company.class ).facet() .name( facetName ) .onField( indexFieldName ) .discrete() .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = queryCompanyWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 2, facetList.size() ); // check count in facet Iterator<Facet> itr = facetList.iterator(); while ( itr.hasNext() ) { Facet item = itr.next(); assertEquals( "Wrong count of facet", 1, item.getCount() ); } }
@Test public void testRangeDefinitionSortOrderThrowsExceptionForDiscreteFaceting() { try { queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.RANGE_DEFINITION_ORDER ) .createFacetingRequest(); fail( "RANGE_DEFINITION_ODER not allowed on discrete faceting" ); } catch (SearchException e) { // success } }
@Test public void testFacetEmbeddedAndCollections() throws Exception { FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( new MatchAllDocsQuery(), Book.class ); QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( Book.class ).get(); FacetingRequest facetReq = builder.facet() .name( "someFacet" ) .onField( "authors.name_untokenized" ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( false ) .maxFacetCount( 10 ) .createFacetingRequest(); List<Facet> facets = fullTextQuery.getFacetManager().enableFaceting( facetReq ).getFacets( "someFacet" ); assertEquals( "There should be three facets", 3, facets.size() ); assertFacet( facets.get( 0 ), hugo, 3 ); assertFacet( facets.get( 1 ), moliere, 2 ); assertFacet( facets.get( 2 ), voltaire, 1 ); fullTextSession.close(); }
@Test @TestForIssue(jiraKey = "HSEARCH-776") public void testMaxFacetCounts() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .maxFacetCount( 1 ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "The number of facets should be restricted", 1, facetList.size() ); assertFacetCounts( facetList, new int[] { 5 } ); }
@Test public void testCountSortOrderAsc() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.COUNT_ASC ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertFacetCounts( facetList, new int[] { 4, 4, 5 } ); }
@Test public void testCountSortOrderDesc() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertFacetCounts( facetList, new int[] { 5, 4, 4 } ); }
@Test public void testZeroCountsExcluded() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( false ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertFacetCounts( facetList, new int[] { 5, 4, 4 } ); }
@Test public void testZeroCountsIncluded() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertFacetCounts( facetList, new int[] { 5, 4, 4, 0 } ); }
private void doDiscreteFacetingQuery() { QueryBuilder qb = helper.queryBuilder( FacetedEntity.class ); FacetingRequest request = qb.facet() .name( "myRequest" ) .onField( "stringField" ) .discrete() .includeZeroCounts( false ) .createFacetingRequest(); // Mainly, we're testing that executing the query with faceting enabled won't explode HSQuery hsQuery = helper.hsQuery( FacetedEntity.class ); hsQuery.getFacetManager().enableFaceting( request ); helper.assertThat( hsQuery ) .facets( "myRequest" ) .isEmpty(); }
@Test public void stringMap() throws Exception { StringMapFacetEntity entity = new StringMapFacetEntity( 1L ); helper.add( entity ); entity = new StringMapFacetEntity( 1L, "foo" ); helper.add( entity ); entity = new StringMapFacetEntity( 2L, "foo", "bar" ); helper.add( entity ); HSQuery hsQuery = sfHolder.getSearchFactory().createHSQuery( new MatchAllDocsQuery(), StringMapFacetEntity.class ); QueryBuilder builder = sfHolder.getSearchFactory().buildQueryBuilder().forEntity( StringMapFacetEntity.class ).get(); FacetingRequest facetReq = builder.facet() .name( "someFacet" ) .onField( "facet" ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( false ) .maxFacetCount( 10 ) .createFacetingRequest(); List<Facet> facets = hsQuery.getFacetManager().enableFaceting( facetReq ).getFacets( "someFacet" ); assertEquals( "There should be two facets", 2, facets.size() ); assertFacet( facets.get( 0 ), "foo", 2 ); assertFacet( facets.get( 1 ), "bar", 1 ); }
@Test public void stringCollection() throws Exception { StringCollectionFacetEntity entity = new StringCollectionFacetEntity( 1L ); helper.add( entity ); entity = new StringCollectionFacetEntity( 1L, "foo" ); helper.add( entity ); entity = new StringCollectionFacetEntity( 2L, "foo", "bar" ); helper.add( entity ); HSQuery hsQuery = sfHolder.getSearchFactory().createHSQuery( new MatchAllDocsQuery(), StringCollectionFacetEntity.class ); QueryBuilder builder = sfHolder.getSearchFactory().buildQueryBuilder().forEntity( StringCollectionFacetEntity.class ).get(); FacetingRequest facetReq = builder.facet() .name( "someFacet" ) .onField( "facet" ) .discrete() .orderedBy( FacetSortOrder.COUNT_DESC ) .includeZeroCounts( false ) .maxFacetCount( 10 ) .createFacetingRequest(); List<Facet> facets = hsQuery.getFacetManager().enableFaceting( facetReq ).getFacets( "someFacet" ); assertEquals( "There should be two facets", 2, facets.size() ); assertFacet( facets.get( 0 ), "foo", 2 ); assertFacet( facets.get( 1 ), "bar", 1 ); }
@Test public void testRangeFacetDrillDown() { final String indexFieldName = "price"; final String priceRange = "priceRange"; FacetingRequest rangeRequest = queryBuilder( Fruit.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( 0.00 ).to( 1.00 ) .from( 1.01 ).to( 1.50 ) .from( 1.51 ).to( 3.00 ) .from( 4.00 ).to( 5.00 ) .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); assertEquals( "Wrong number of query matches", 10, query.getResultSize() ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5, 3, 2, 0 } ); facetManager.getFacetGroup( priceRange ).selectFacets( facets.get( 2 ) ); assertEquals( "Wrong number of query matches", 2, query.list().size() ); List<Facet> newFacetList = facetManager.getFacets( priceRange ); assertFacetCounts( newFacetList, new int[] { 2, 0, 0, 0 } ); }
private void doIntegerRangeFacetingQuery() { QueryBuilder qb = helper.queryBuilder( FacetedEntity.class ); FacetingRequest request = qb.facet() .name( "myRequest" ) .onField( "integerField" ) .range() .from( 0 ).to( 1000 ) .from( 1001 ).to( 1500 ) .includeZeroCounts( true ) .createFacetingRequest(); // Mainly, we're testing that executing the query with faceting enabled won't explode HSQuery hsQuery = helper.hsQuery( FacetedEntity.class ); hsQuery.getFacetManager().enableFaceting( request ); helper.assertThat( hsQuery ) .facets( "myRequest" ) .includes( "[0, 1000]", 0 ) .includes( "[1001, 1500]", 0 ) .only(); }
@Test public void testRangeQueryForDoubleWithZeroCount() { FacetingRequest rangeRequest = queryBuilder( Fruit.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( 0.00 ).to( 1.00 ) .from( 1.01 ).to( 1.50 ) .from( 1.51 ).to( 3.00 ) .from( 4.00 ).to( 5.00 ) .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5, 3, 2, 0 } ); }
@Test public void testRangeQueryForInteger() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( 0 ).to( 1000 ) .from( 1001 ).to( 1500 ) .from( 1501 ).to( 3000 ) .from( 3001 ).to( 8000 ) .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5, 3, 2, 0 } ); }
private void doFloatRangeFacetingQuery() { QueryBuilder qb = helper.queryBuilder( FacetedEntity.class ); FacetingRequest request = qb.facet() .name( "myRequest" ) .onField( "floatField" ) .range() .from( 0.0f ).to( 1000.0f ).excludeLimit() .from( 1000.0f ).to( 1500.0f ).excludeLimit() .includeZeroCounts( true ) .createFacetingRequest(); // Mainly, we're testing that executing the query with faceting enabled won't explode HSQuery hsQuery = helper.hsQuery( FacetedEntity.class ); hsQuery.getFacetManager().enableFaceting( request ); helper.assertThat( hsQuery ) .facets( "myRequest" ) .includes( "[0.0, 1000.0)", 0 ) .includes( "[1000.0, 1500.0)", 0 ) .only(); }