@SuppressWarnings("unchecked") private static <T> List<T> doSearch(Session session, Class<T> clazz, Integer entityId) { FullTextSession fullTextSession = Search.getFullTextSession( session ); Transaction tx = fullTextSession.beginTransaction(); FullTextQuery query = fullTextSession.createFullTextQuery( new TermQuery( new Term( "id", entityId.toString() ) ), clazz ); List<T> result = query.list(); tx.commit(); return result; } }
/** * Creates a full-text query on Locations entities and checks the term is found exactly * the expected number of times (or fails the test) */ private void assertFoundLocations(FullTextSession fullTextSession, String locationGroupName, int expectedFoundLocations) { final Transaction transaction = fullTextSession.beginTransaction(); TermQuery luceneQuery = new TermQuery( new Term( "locationGroup.name", locationGroupName ) ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Location.class ); int resultSize = fullTextQuery.getResultSize(); transaction.commit(); Assert.assertEquals( expectedFoundLocations, resultSize ); }
@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 testTargetNumericEncodedFieldWithStringQueryThrowsException() { TermQuery query = new TermQuery( new Term( "value", "bar" ) ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( query, B.class ); try { fullTextQuery.list(); fail(); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000233" ) ); } }
@Test public void testObjectTypeFilteringSingleClass() throws Exception { Session session = openSession(); Transaction tx = session.beginTransaction(); FullTextSession fullTextSession = Search.getFullTextSession( session ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Music.class ); List result = fullTextQuery.list(); assertEquals( "Should match the music only", 1, result.size() ); tx.commit(); fullTextSession.close(); }
@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 testTargetStringEncodedFieldWithNumericRangeQueryThrowsException() { Query query = NumericFieldUtils.createNumericRangeQuery( "value", 1, 1, true, true ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( query, A.class ); try { fullTextQuery.list(); fail(); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000232" ) ); } }
@Test public void testImplicitObjectTypeFiltering() throws Exception { Session session = openSession(); Transaction tx = session.beginTransaction(); FullTextSession fullTextSession = Search.getFullTextSession( session ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery ); List result = fullTextQuery.list(); assertEquals( "Should match all types", 3, result.size() ); tx.commit(); fullTextSession.close(); }
@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 testObjectTypeFilteringTwoClasses() throws Exception { Session session = openSession(); Transaction tx = session.beginTransaction(); FullTextSession fullTextSession = Search.getFullTextSession( session ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Author.class, Music.class ); List result = fullTextQuery.list(); assertEquals( "Should match the author and music only", 2, result.size() ); tx.commit(); fullTextSession.close(); }
@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 testObjectTypeFilteringThreeClasses() throws Exception { Session session = openSession(); Transaction tx = session.beginTransaction(); FullTextSession fullTextSession = Search.getFullTextSession( session ); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, Author.class, Music.class, Book.class ); List result = fullTextQuery.list(); assertEquals( "Should match the author, music and book", 3, result.size() ); fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery ); result = fullTextQuery.list(); assertEquals( "Should match all types", 3, result.size() ); tx.commit(); fullTextSession.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 testBooleanProperty() throws Exception { Session s = openSession(); FullTextSession session = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); QueryDescriptor query = ElasticsearchQueries.fromJson( "{ 'query': { 'term' : { 'active' : 'true' } } }" ); List<?> result = session.createFullTextQuery( query, GolfPlayer.class ) .setProjection( ElasticsearchProjectionConstants.ID ) .list(); assertThat( result ).hasSize( 1 ); Object[] projection = (Object[]) result.iterator().next(); assertThat( projection[0] ).isEqualTo( 1L ); 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 testDynamicShardsAreTargetingInQuery() throws Exception { insert( elephant, spider, bear ); Session session = openSession(); Transaction tx = session.beginTransaction(); FullTextSession fts = Search.getFullTextSession( session ); QueryParser parser = new QueryParser( "id", TestConstants.stopAnalyzer ); List results = fts.createFullTextQuery( parser.parse( "name:bear OR name:elephant OR name:spider" ) ).list(); assertEquals( "Either double insert, single update, or query fails with shards", 3, results.size() ); tx.commit(); session.close(); }
@Test public void testStringMappedNumericProperty() throws Exception { Session s = openSession(); FullTextSession session = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); QueryDescriptor query = ElasticsearchQueries.fromJson( "{ 'query': { 'match' : { 'puttingStrength' : '2.5' } } }" ); List<?> result = session.createFullTextQuery( query, GolfPlayer.class ) .setProjection( ElasticsearchProjectionConstants.ID, "puttingStrength" ) .list(); assertThat( result ).hasSize( 1 ); Object[] projection = (Object[]) result.iterator().next(); assertThat( projection[0] ).isEqualTo( 1L ); assertThat( projection[1] ).isEqualTo( 2.5D ); tx.commit(); s.close(); }
@Test public void testNumericFieldQuery() throws Exception { Session s = openSession(); FullTextSession session = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); QueryDescriptor query = ElasticsearchQueries.fromJson( "{ 'query': { 'range' : { 'wordCount' : { 'gte' : 8, 'lt' : 10 } } } }" ); List<?> result = session.createFullTextQuery( query ).list(); assertThat( result ).extracting( "title" ).containsExactlyInAnyOrder( "Latest in ORM", "ORM for beginners" ); tx.commit(); s.close(); }
@Test public void testAutomaticIndexUpdatesAreProhibitedByInterceptor() throws Exception { indexTestData(); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( new MatchAllDocsQuery() ); assertEquals( "There should be no indexed entities, since automatic indexing is disabled via interceptor", 0, fullTextQuery.list().size() ); }
@Test public void testGetResultSize() throws Exception { Session s = openSession(); FullTextSession session = Search.getFullTextSession( s ); Transaction tx = s.beginTransaction(); QueryDescriptor query = ElasticsearchQueries.fromJson( "{ 'query': { 'match' : { 'abstract' : 'Hibernate' } } }" ); FullTextQuery fullTextQuery = session.createFullTextQuery( query, ScientificArticle.class ); assertThat( fullTextQuery.getResultSize() ).isEqualTo( 4 ); tx.commit(); s.close(); }