[hibernate-commits] Hibernate SVN: r20802 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/query and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Oct 11 11:00:05 EDT 2010


Author: hardy.ferentschik
Date: 2010-10-11 11:00:05 -0400 (Mon, 11 Oct 2010)
New Revision: 20802

Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java
Log:
HSEARCH-604 Added explicit '0' check in FullTextQueryImpl.calculateTopDocsRetrievalSize

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java	2010-10-11 12:22:35 UTC (rev 20801)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java	2010-10-11 15:00:05 UTC (rev 20802)
@@ -435,6 +435,9 @@
 				// don't return just Integer.MAX_VALUE due to a bug in Lucene - see HSEARCH-330
 				return Integer.MAX_VALUE - 1;
 			}
+			if (tmpMaxResult == 0) {
+				return 1; // Lucene enforces that at least one top doc will be retrieved. See also HSEARCH-604
+			}
 			else {
 				return ( int ) tmpMaxResult;
 			}

Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java	2010-10-11 12:22:35 UTC (rev 20801)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java	2010-10-11 15:00:05 UTC (rev 20802)
@@ -1,8 +1,7 @@
-/* $Id$
- * 
+/*
  * Hibernate, Relational Persistence for Idiomatic Java
  * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
+ * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as
  * indicated by the @author tags or express copyright attribution
  * statements applied by the authors.  All third-party contributions are
  * distributed under license by Red Hat, Inc.
@@ -29,6 +28,7 @@
 
 import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.search.Query;
+
 import org.hibernate.FetchMode;
 import org.hibernate.ScrollableResults;
 import org.hibernate.Transaction;
@@ -39,10 +39,10 @@
 import org.hibernate.search.util.HibernateHelper;
 import org.hibernate.stat.Statistics;
 
-
 /**
  * @author Emmanuel Bernard
  * @author John Griffin
+ * @author Hardy Ferentschik
  */
 public class LuceneQueryTest extends SearchTestCase {
 
@@ -53,7 +53,11 @@
 		s.save( clock );
 		clock = new Clock( 2, "Festina" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
 		s.save( book );
@@ -85,7 +89,7 @@
 		result = hibQuery.list();
 		assertNotNull( result );
 		assertEquals( "Query with no class filter", 2, result.size() );
-		for (Object element : result) {
+		for ( Object element : result ) {
 			assertTrue( HibernateHelper.isInitialized( element ) );
 			s.delete( element );
 		}
@@ -96,7 +100,9 @@
 		assertNotNull( result );
 		assertEquals( "Query with delete objects", 0, result.size() );
 
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -108,7 +114,11 @@
 		s.save( clock );
 		clock = new Clock( 2, "Festina" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
 		s.save( book );
@@ -121,7 +131,9 @@
 		Statistics stats = s.getSessionFactory().getStatistics();
 		stats.clear();
 		boolean enabled = stats.isStatisticsEnabled();
-		if ( !enabled ) stats.setStatisticsEnabled( true );
+		if ( !enabled ) {
+			stats.setStatisticsEnabled( true );
+		}
 		FullTextQuery hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
 		assertEquals( "Exection of getResultSize without actual results", 2, hibQuery.getResultSize() );
 		assertEquals( "No entity should be loaded", 0, stats.getEntityLoadCount() );
@@ -131,8 +143,12 @@
 		List result = hibQuery.list();
 		assertNotNull( result );
 		assertEquals( "2 entities should be loaded", 2, stats.getEntityLoadCount() );
-		if ( !enabled ) stats.setStatisticsEnabled( false );
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		if ( !enabled ) {
+			stats.setStatisticsEnabled( false );
+		}
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -144,7 +160,11 @@
 		s.save( clock );
 		clock = new Clock( 2, "Festina" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
 		s.save( book );
@@ -178,7 +198,9 @@
 		assertNotNull( result );
 		assertEquals( "first result out of limit", 0, result.size() );
 
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -190,7 +212,11 @@
 		s.save( clock );
 		clock = new Clock( 2, "Festina" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
 		s.save( book );
@@ -224,7 +250,9 @@
 		assertNotNull( result );
 		assertFalse( result.hasNext() );
 
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -236,7 +264,11 @@
 		s.save( clock );
 		clock = new Clock( 2, "Festina" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
 		s.save( book );
@@ -267,12 +299,15 @@
 		while ( result.next() ) {
 			s.delete( result.get()[0] );
 		}
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
 
 	// Technically this is checked by other tests but let's do it anyway. J.G.
+
 	public void testDefaultFetchSize() throws Exception {
 		FullTextSession s = Search.getFullTextSession( openSession() );
 		prepEmployeeIndex( s );
@@ -294,7 +329,9 @@
 		assertTrue( projections.isFirst() );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -319,7 +356,9 @@
 		assertEquals( "incorrect entityInfo returned", 1000, result[0] );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -355,7 +394,9 @@
 		assertEquals( "incorrect entityInfo returned", 1002, result[0] );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -399,7 +440,9 @@
 		assertNull( result );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -425,11 +468,47 @@
 		assertNull( "non-null entity infos returned", result );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
 
+	/**
+	 * Test for HSEARCH-604. Tests that max result 0 does not throw an exception.
+	 *
+	 * @throws Exception in case the test fails.
+	 */
+	public void testMaxResultZero() throws Exception {
+		FullTextSession s = Search.getFullTextSession( openSession() );
+		prepEmployeeIndex( s );
+
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		QueryParser parser = new QueryParser( getTargetLuceneVersion(), "dept", SearchTestCase.standardAnalyzer );
+		Query query = parser.parse( "dept:foo" );
+		org.hibernate.search.FullTextQuery hibQuery = s.createFullTextQuery( query, Employee.class );
+		hibQuery.setFirstResult( 0 );
+		hibQuery.setMaxResults( 0 );
+
+		List result = hibQuery.list();
+        assertTrue( "We should get the empty result list", result.isEmpty() );
+
+		hibQuery.setFirstResult( 1 );
+		hibQuery.setMaxResults( 0 );
+
+		result = hibQuery.list();
+        assertTrue( "We should get the empty result list", result.isEmpty() );
+		
+		//cleanup
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
+		tx.commit();
+		s.close();
+	}
+
 	public void testCurrent() throws Exception {
 		FullTextSession s = Search.getFullTextSession( openSession() );
 		prepEmployeeIndex( s );
@@ -443,25 +522,24 @@
 		hibQuery.setProjection( "id", "lastname", "dept" );
 
 
-
 		ScrollableResults results = hibQuery.scroll();
 		results.beforeFirst();
 		results.next();
-		assertTrue("beforeFirst() pointer incorrect", results.isFirst());
+		assertTrue( "beforeFirst() pointer incorrect", results.isFirst() );
 
 		results.afterLast();
 		results.previous();
-		assertTrue("afterLast() pointer incorrect", results.isLast());
+		assertTrue( "afterLast() pointer incorrect", results.isLast() );
 
 		// Let's see if a bad reverse scroll screws things up
 		results.scroll( -8 );
 		results.next();
-		assertTrue("large negative scroll() pointer incorrect", results.isFirst());
+		assertTrue( "large negative scroll() pointer incorrect", results.isFirst() );
 
 		// And test a bad forward scroll.
 		results.scroll( 10 );
 		results.previous();
-		assertTrue("large positive scroll() pointer incorrect", results.isLast());
+		assertTrue( "large positive scroll() pointer incorrect", results.isLast() );
 
 		// Finally, let's test a REAL screwup.
 		hibQuery.setFirstResult( 3 );
@@ -470,14 +548,16 @@
 		results = hibQuery.scroll();
 		results.first();
 		Object[] result = results.get();
-		assertEquals(1004, result[0]);
+		assertEquals( 1004, result[0] );
 
 		results.last();
 		result = results.get();
-		assertEquals(1004, result[0]);
+		assertEquals( 1004, result[0] );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -487,9 +567,15 @@
 		Transaction tx = s.beginTransaction();
 		Clock clock = new Clock( 1, "Seiko" );
 		s.save( clock );
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
-		AlternateBook alternateBook = new AlternateBook( 1, "La chute de la petite reine a travers les yeux de Festina" );
+		AlternateBook alternateBook = new AlternateBook(
+				1, "La chute de la petite reine a travers les yeux de Festina"
+		);
 		s.save( alternateBook );
 		tx.commit();
 		s.clear();
@@ -529,11 +615,13 @@
 		result = hibQuery.list();
 		assertNotNull( result );
 		assertEquals( "Query with no class filter", 2, result.size() );
-		for (Object element : result) {
+		for ( Object element : result ) {
 			assertTrue( HibernateHelper.isInitialized( element ) );
 			s.delete( element );
 		}
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -541,7 +629,11 @@
 	public void testCriteria() throws Exception {
 		FullTextSession s = Search.getFullTextSession( openSession() );
 		Transaction tx = s.beginTransaction();
-		Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+		Book book = new Book(
+				1,
+				"La chute de la petite reine a travers les yeux de Festina",
+				"La chute de la petite reine a travers les yeux de Festina, blahblah"
+		);
 		s.save( book );
 		Author emmanuel = new Author();
 		emmanuel.setName( "Emmanuel" );
@@ -561,7 +653,8 @@
 		assertFalse( "Association should not be inintialized", HibernateHelper.isInitialized( book.getAuthors() ) );
 
 		result = s.createFullTextQuery( query ).setCriteriaQuery(
-				s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN ) ).list();
+				s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN )
+		).list();
 		assertNotNull( result );
 		assertEquals( "Query with explicit criteria", 1, result.size() );
 		book = (Book) result.get( 0 );
@@ -572,7 +665,9 @@
 		Author author = book.getAuthors().iterator().next();
 		book.getAuthors().remove( author );
 
-		for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -603,7 +698,9 @@
 		assertNull( projection );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -626,7 +723,9 @@
 		assertEquals( 0, result.size() );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}
@@ -649,7 +748,9 @@
 		assertFalse( iter.hasNext() );
 
 		//cleanup
-		for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+		for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+			s.delete( element );
+		}
 		tx.commit();
 		s.close();
 	}



More information about the hibernate-commits mailing list