@Test public void testRangeQueryWithUnsupportedType() { try { queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( new Object() ).to( new Object() ) .createFacetingRequest(); fail( "Unsupported range faceting type" ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000269" ) ); } }
@Test public void testDateRangeFaceting() throws Exception { final String facetingName = "albumYearFaceting"; final String fieldName = "releaseYear"; final DateFormat formatter = new SimpleDateFormat( "yyyy", Locale.ROOT ); FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( facetingName ) .onField( fieldName ) .range() .below( formatter.parse( "1970" ) ).excludeLimit() .from( formatter.parse( "1970" ) ).to( formatter.parse( "1979" ) ) .from( formatter.parse( "1980" ) ).to( formatter.parse( "1989" ) ) .from( formatter.parse( "1990" ) ).to( formatter.parse( "1999" ) ) .above( formatter.parse( "2000" ) ).excludeLimit() .orderedBy( FacetSortOrder.RANGE_DEFINITION_ORDER ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( facetingName ); assertFacetCounts( facets, new int[] { 1, 2, 2, 5 } ); facetManager.getFacetGroup( facetingName ).selectFacets( facets.get( 3 ) ); facets = facetManager.getFacets( facetingName ); assertFacetCounts( facets, new int[] { 5 } ); }
@Test public void testRangeQueryWithNullToAndFrom() { try { queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( null ).to( null ) .createFacetingRequest(); fail( "Unsupported range faceting type" ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000270" ) ); } }
@Test public void testRangeBelow() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5 } ); }
@Test public void testRangeAboveExcludeLimit() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .above( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5 } ); }
@Test public void testRangeAbove() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .above( 1500 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 8 } ); }
@Test public void testRangeBelowExcludeLimit() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 2 } ); }
@Test public void testUnsupportedRangeParameterTypeThrowsException() { FacetingRequest rangeRequest = queryBuilder( Fruit.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( "0.00" ).to( "1.00" ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); try { query.getFacetManager().getFacets( priceRange ); fail( "Trying to so a range query using string as parameter should fail." ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000266" ) ); } }
@Test public void testRangeQueryForDoubleWithoutZeroCount() { 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( false ) .orderedBy( FacetSortOrder.COUNT_ASC ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = query.getFacetManager().getFacets( priceRange ); assertFacetCounts( facets, new int[] { 2, 3, 5 } ); assertEquals( "[0.0, 1.0]", facets.get( 0 ).getValue() ); assertEquals( "[1.01, 1.5]", facets.get( 1 ).getValue() ); assertEquals( "[1.51, 3.0]", facets.get( 2 ).getValue() ); }
@Test public void testRangeAboveBelow() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ) .above( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5, 5 } ); }
@Test public void testRangeQueryRangeDefOrderHigherMaxCount() { 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( false ) .orderedBy( FacetSortOrder.RANGE_DEFINITION_ORDER ) .maxFacetCount( 5 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = query.getFacetManager().getFacets( priceRange ); assertFacetCounts( facets, new int[] { 2, 3, 5 } ); assertEquals( "[0.0, 1.0]", facets.get( 0 ).getValue() ); assertEquals( "[1.01, 1.5]", facets.get( 1 ).getValue() ); assertEquals( "[1.51, 3.0]", facets.get( 2 ).getValue() ); }
@Test @TestForIssue(jiraKey = "HSEARCH-770") public void testRangeBelowWithFacetSelection() { final String facetingName = "truckHorsePowerFaceting"; FacetingRequest rangeRequest = queryBuilder( Truck.class ).facet() .name( facetingName ) .onField( "horsePower" ) .range() .below( 1000 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Truck.class ); FacetManager facetManager = query.getFacetManager(); query.getFacetManager().enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( facetingName ); // OK facets = facetManager.getFacets( facetingName ); // Still OK assertFacetCounts( facets, new int[] { 4 } ); facetManager.getFacetGroup( facetingName ).selectFacets( facets.get( 0 ) ); // narrow search on facet facets = facetManager.getFacets( facetingName ); // Exception... assertFacetCounts( facets, new int[] { 4 } ); }
@Test public void testRangeBelowMiddleAbove() { final String facetingName = "cdPriceFaceting"; FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( facetingName ) .onField( indexFieldName ) .range() .below( 1000 ) .from( 1001 ).to( 1500 ) .above( 1501 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); query.getFacetManager().enableFaceting( rangeRequest ); List<Facet> facets = query.getFacetManager().getFacets( facetingName ); assertFacetCounts( facets, new int[] { 5, 3, 2 } ); }
@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 } ); }
@Test @Ignore // HSEARCH-1927 : Range faceting on multiple numeric values does not work public void numberArray() throws Exception { NumberArrayFacetEntity entity = new NumberArrayFacetEntity( 1L ); helper.add( entity ); entity = new NumberArrayFacetEntity( 1L, 42 ); helper.add( entity ); entity = new NumberArrayFacetEntity( 2L, 43, 442 ); helper.add( entity ); HSQuery hsQuery = sfHolder.getSearchFactory().createHSQuery( new MatchAllDocsQuery(), NumberArrayFacetEntity.class ); QueryBuilder builder = sfHolder.getSearchFactory().buildQueryBuilder().forEntity( NumberArrayFacetEntity.class ).get(); FacetingRequest facetReq = builder.facet() .name( "someFacet" ) .onField( "facet" ) .range() .from( 0.0f ).to( 100.0f ).excludeLimit() .from( 100.0f ).to( 500.0f ).excludeLimit() .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 ), "[0.0, 100.0)", 2 ); assertFacet( facets.get( 1 ), "[100.0, 500.0)", 1 ); }
@Test @Ignore // HSEARCH-1927 : Range faceting on multiple numeric values does not work public void numberMap() throws Exception { NumberMapFacetEntity entity = new NumberMapFacetEntity( 1L ); helper.add( entity ); entity = new NumberMapFacetEntity( 1L, 42.2f ); helper.add( entity ); entity = new NumberMapFacetEntity( 2L, 42.3f, 442.2f ); helper.add( entity ); HSQuery hsQuery = sfHolder.getSearchFactory().createHSQuery( new MatchAllDocsQuery(), NumberMapFacetEntity.class ); QueryBuilder builder = sfHolder.getSearchFactory().buildQueryBuilder().forEntity( NumberMapFacetEntity.class ).get(); FacetingRequest facetReq = builder.facet() .name( "someFacet" ) .onField( "facet" ) .range() .from( 0.0f ).to( 100.0f ).excludeLimit() .from( 100.0f ).to( 500.0f ).excludeLimit() .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 ), "[0.0, 100.0)", 2 ); assertFacet( facets.get( 1 ), "[100.0, 500.0)", 1 ); }
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(); }