private FullTextQuery buildQuery() { Query query; try { query = prepareQuery(); } catch (ParseException e) { throw new IllegalStateException("Invalid query", e); } FullTextQuery fullTextQuery = getFullTextSession().createFullTextQuery(query, getType()); fullTextQuery.enableFullTextFilter("termsFilterFactory").setParameter("includeTerms", includeTerms) .setParameter("excludeTerms", excludeTerms); fullTextQuery.setFilter(termsFilter); adjustFullTextQuery(fullTextQuery); return fullTextQuery; }
@Test public void testFilterDefinedOnSuperClass() { TermQuery query = new TermQuery( new Term( "employer", "Red Hat" ) ); FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Employee.class ); ftQuery.enableFullTextFilter( "roleFilter" ) .setParameter( "role", Role.ADMINISTRATOR ); assertEquals( "Should find the filter defined in the super class", 1, ftQuery.getResultSize() ); }
@Test public void testFilterDefinedOnSuperClass() { TermQuery query = new TermQuery( new Term( "employer", "Red Hat" ) ); FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Employee.class ); ftQuery.enableFullTextFilter( "roleFilter" ) .setParameter( "role", Role.ADMINISTRATOR ); assertEquals( "Should find the filter defined in the super class", 1, ftQuery.getResultSize() ); }
@Test @Category(SkipOnElasticsearch.class) // The Elasticsearch backend does not support custom Lucene filters. public void testEmptyFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); TermQuery termQuery = new TermQuery( new Term( "name", "liz" ) ); Filter termFilter = new QueryWrapperFilter( termQuery ); ftQuery.setFilter( termFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "empty" ); assertEquals( "two filters, one is empty, should not match anything", 0, ftQuery.getResultSize() ); }
@Test @Category(SkipOnElasticsearch.class) // The Elasticsearch backend does not support custom Lucene filters. public void testEmptyFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); TermQuery termQuery = new TermQuery( new Term( "name", "liz" ) ); Filter termFilter = new QueryWrapperFilter( termQuery ); ftQuery.setFilter( termFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "emptyWithDeprecatedFilterType" ); assertEquals( "two filters, one is empty, should not match anything", 0, ftQuery.getResultSize() ); }
@TestForIssue(jiraKey = "HSEARCH-1513") @Test @Category(SkipOnElasticsearch.class) // The Elasticsearch backend does not support custom Lucene filters. public void testCachedEmptyFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); Calendar calendar = GregorianCalendar.getInstance( TimeZone.getTimeZone( "GMT" ), Locale.ROOT ); calendar.set( Calendar.YEAR, 2001 ); long from = DateTools.round( calendar.getTime().getTime(), DateTools.Resolution.YEAR ); calendar.set( Calendar.YEAR, 2005 ); long to = DateTools.round( calendar.getTime().getTime(), DateTools.Resolution.YEAR ); Filter dateFilter = NumericRangeFilter.newLongRange( "delivery", from, to, true, true ); ftQuery.setFilter( dateFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "cached_empty" ); assertEquals( "two filters, one is empty, should not match anything", 0, ftQuery.getResultSize() ); }
@TestForIssue(jiraKey = "HSEARCH-1513") @Test @Category(SkipOnElasticsearch.class) // The Elasticsearch backend does not support custom Lucene filters. public void testCachedEmptyFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); Calendar calendar = GregorianCalendar.getInstance( TimeZone.getTimeZone( "GMT" ), Locale.ROOT ); calendar.set( Calendar.YEAR, 2001 ); long from = DateTools.round( calendar.getTime().getTime(), DateTools.Resolution.YEAR ); calendar.set( Calendar.YEAR, 2005 ); long to = DateTools.round( calendar.getTime().getTime(), DateTools.Resolution.YEAR ); Filter dateFilter = NumericRangeFilter.newLongRange( "delivery", from, to, true, true ); ftQuery.setFilter( dateFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "cached_empty" ); assertEquals( "two filters, one is empty, should not match anything", 0, ftQuery.getResultSize() ); }
@Test public void testMixedFilters() { Session s = openSession(); FullTextSession fullTextSession = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); FullTextQuery ftQuery = fullTextSession.createFullTextQuery( ElasticsearchQueries.fromJson( "{ 'query': { 'match_all': {} } }" ), Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "fieldConstraintFilter-1" ) .setParameter( "field", "teacher" ) .setParameter( "value", "andre" ); assertThat( ftQuery.list() ).extracting( "name" ).containsExactlyInAnyOrder( "Emmanuel" ); tx.commit(); s.close(); }
@Test public void testElasticsearchFilterWithParameters() { Session s = openSession(); FullTextSession fullTextSession = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); FullTextQuery ftQuery = fullTextSession.createFullTextQuery( ElasticsearchQueries.fromJson( "{ 'query': { 'match_all': {} } }" ), Driver.class ); ftQuery.enableFullTextFilter( "namedDriver" ) .setParameter( "name", "liz" ); assertThat( ftQuery.list() ).extracting( "name" ).containsExactlyInAnyOrder( "Liz" ); tx.commit(); s.close(); }
@Test public void testElasticsearchFilter() { Session s = openSession(); FullTextSession fullTextSession = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); FullTextQuery ftQuery = fullTextSession.createFullTextQuery( ElasticsearchQueries.fromJson( "{ 'query': { 'match_all': {} } }" ), Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); assertThat( ftQuery.list() ).extracting( "name" ).containsExactlyInAnyOrder( "Liz", "Emmanuel" ); TermQuery termQuery = new TermQuery( new Term( "name", "liz" ) ); Filter termFilter = new QueryWrapperFilter( termQuery ); ftQuery.setFilter( termFilter ); assertThat( ftQuery.list() ).extracting( "name" ).containsExactlyInAnyOrder( "Liz" ); tx.commit(); s.close(); }
@Test public void testMultipleFiltersOfSameTypeWithDifferentParameters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "fieldConstraintFilter-1" ) .setParameter( "field", "teacher" ) .setParameter( "value", "andre" ); ftQuery.enableFullTextFilter( "fieldConstraintFilter-2" ) .setParameter( "field", "teacher" ) .setParameter( "value", "aaron" ); assertEquals( "Should apply both filters resulting in 0 results", 0, ftQuery.getResultSize() ); }
@Test public void testMultipleFiltersOfSameTypeWithDifferentParameters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "fieldConstraintFilter-1" ) .setParameter( "field", "teacher" ) .setParameter( "value", "andre" ); ftQuery.enableFullTextFilter( "fieldConstraintFilter-2" ) .setParameter( "field", "teacher" ) .setParameter( "value", "aaron" ); assertEquals( "Should apply both filters resulting in 0 results", 0, ftQuery.getResultSize() ); }
@Test public void testStraightFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); TermQuery termQuery = new TermQuery( new Term( "name", "liz" ) ); Filter termFilter = new QueryWrapperFilter( termQuery ); ftQuery.setFilter( termFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.setFilter( termFilter ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); ftQuery.disableFullTextFilter( "security" ); ftQuery.disableFullTextFilter( "bestDriver" ); ftQuery.setFilter( null ); assertEquals( "Should not filter anymore", 3, ftQuery.getResultSize() ); }
@Test public void testStraightFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); TermQuery termQuery = new TermQuery( new Term( "name", "liz" ) ); Filter termFilter = new QueryWrapperFilter( termQuery ); ftQuery.setFilter( termFilter ); assertEquals( "Should select only liz", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.setFilter( termFilter ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); ftQuery.disableFullTextFilter( "security" ); ftQuery.disableFullTextFilter( "bestDriver" ); ftQuery.setFilter( null ); assertEquals( "Should not filter anymore", 3, ftQuery.getResultSize() ); }
@Test public void testNamedFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); assertEquals( "No filter should happen", 3, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.disableFullTextFilter( "bestDriver" ); //was not enabled, but should be harmless ftQuery.enableFullTextFilter( "bestDriver" ); assertEquals( "Should filter out Gavin", 2, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); assertEquals( "Should filter to limit to Emmanuel", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); ftQuery.disableFullTextFilter( "security" ); ftQuery.disableFullTextFilter( "bestDriver" ); assertEquals( "Should not filter anymore", 3, ftQuery.getResultSize() ); }
@Test public void testNamedFilters() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); assertEquals( "No filter should happen", 3, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.disableFullTextFilter( "bestDriver" ); //was not enabled, but should be harmless ftQuery.enableFullTextFilter( "bestDriver" ); assertEquals( "Should filter out Gavin", 2, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); assertEquals( "Should filter to limit to Emmanuel", 1, ftQuery.getResultSize() ); ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); ftQuery.enableFullTextFilter( "bestDriver" ); ftQuery.enableFullTextFilter( "security" ).setParameter( "login", "andre" ); ftQuery.disableFullTextFilter( "security" ); ftQuery.disableFullTextFilter( "bestDriver" ); assertEquals( "Should not filter anymore", 3, ftQuery.getResultSize() ); }
@Test public void testUnknownFilterNameThrowsException() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); try { ftQuery.enableFullTextFilter( "foo" ); fail( "Retrieving an unknown filter should throw a SearchException" ); } catch (SearchException e) { assertEquals( "Wrong message", "HSEARCH000115: Unknown @FullTextFilter: 'foo'", e.getMessage() ); } }
@Test public void testUnknownFilterNameThrowsException() { FullTextQuery ftQuery = fullTextSession.createFullTextQuery( query, Driver.class ); try { ftQuery.enableFullTextFilter( "foo" ); fail( "Retrieving an unknown filter should throw a SearchException" ); } catch (SearchException e) { assertEquals( "Wrong message", "HSEARCH000115: Unknown @FullTextFilter: 'foo'", e.getMessage() ); } }
ftQuery.enableFullTextFilter( "cacheresultstest" ); assertEquals( "Should filter out all", 0, ftQuery.getResultSize() ); ftQuery.enableFullTextFilter( "cacheresultstest" ); try { ftQuery.getResultSize(); ftQuery.enableFullTextFilter( "cacheinstancetest" ); InstanceBasedExcludeAllFilterFactory.assertInstancesCreated( 0 ); assertEquals( "Should filter out all", 0, ftQuery.getResultSize() ); ftQuery.enableFullTextFilter( "cacheinstancetest" ); ftQuery.getResultSize(); InstanceBasedExcludeAllFilterFactory.assertInstancesCreated( 1 );
ftQuery.enableFullTextFilter( "cacheresultstest" ); assertEquals( "Should filter out all", 0, ftQuery.getResultSize() ); ftQuery.enableFullTextFilter( "cacheresultstest" ); try { ftQuery.getResultSize(); ftQuery.enableFullTextFilter( "cacheinstancetest" ); InstanceBasedExcludeAllFilter.assertConstructorInvoked( 1 ); assertEquals( "Should filter out all", 0, ftQuery.getResultSize() ); ftQuery.enableFullTextFilter( "cacheinstancetest" ); ftQuery.getResultSize(); InstanceBasedExcludeAllFilter.assertConstructorInvoked( 2 );