[hibernate-commits] Hibernate SVN: r11229 - in branches/Branch_3_2/HibernateExt/search/src: test/org/hibernate/search/test/query and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Feb 21 14:28:07 EST 2007


Author: epbernard
Date: 2007-02-21 14:28:07 -0500 (Wed, 21 Feb 2007)
New Revision: 11229

Modified:
   branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
   branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java
   branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java
Log:
HSEARCH-7 ignore null objects

Modified: branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2007-02-21 00:02:28 UTC (rev 11228)
+++ branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2007-02-21 19:28:07 UTC (rev 11229)
@@ -30,6 +30,7 @@
 import org.hibernate.ScrollMode;
 import org.hibernate.ScrollableResults;
 import org.hibernate.Session;
+import org.hibernate.ObjectNotFoundException;
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.engine.query.ParameterMetadata;
 import org.hibernate.impl.AbstractQueryImpl;
@@ -155,10 +156,21 @@
 				//we don't face proxy casting issues since the exact class is extracted from the index
 			}
 			//then initialize the objects
-			for ( Object element : result ) {
-				Hibernate.initialize( element );
-			}
-			return result;
+         List excludedObects = new ArrayList();
+         for ( Object element : result ) {
+            try {
+               Hibernate.initialize( element );
+            }
+            catch (ObjectNotFoundException e) {
+               log.debug( "Object found in Search index but not in database: "
+                       + e.getEntityName() + " wih id " + e.getIdentifier() );
+               excludedObects.add( element );
+            }
+         }
+         if (excludedObects.size() > 0) {
+            result.removeAll( excludedObects );
+         }
+         return result;
 		}
 		catch (IOException e) {
 			throw new HibernateException( "Unable to query Lucene index", e );

Modified: branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java	2007-02-21 00:02:28 UTC (rev 11228)
+++ branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java	2007-02-21 19:28:07 UTC (rev 11229)
@@ -3,6 +3,7 @@
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import org.hibernate.Session;
 
@@ -16,21 +17,43 @@
 	private final Session session;
 	private int index = 0;
 	private final int size;
+   private Object next;
+   private int nextObjectIndex = -1;
 
-	public IteratorImpl(List<EntityInfo> entityInfos, Session session) {
+   public IteratorImpl(List<EntityInfo> entityInfos, Session session) {
 		this.entityInfos = entityInfos;
 		this.session = session;
 		this.size = entityInfos.size();
 	}
 
-	public boolean hasNext() {
-		return index < size;
-	}
+   //side effect is to set up next
+   public boolean hasNext() {
+      if (nextObjectIndex == index) return next != null;
+      next = null;
+      nextObjectIndex = -1;
+      do {
+         if ( index >= size ) {
+            nextObjectIndex = index;
+            next = null;
+            return false;
+         }
+         next = session.get( entityInfos.get( index ).clazz, entityInfos.get( index ).id );
+         if (next == null) {
+            index++;
+         }
+         else {
+            nextObjectIndex = index;
+         }
+      }
+      while( next == null );
+      return true;
+   }
 
 	public Object next() {
-		Object object = session.get( entityInfos.get( index ).clazz, entityInfos.get( index ).id );
-		index++;
-		return object;
+      //hasNext() has side effect
+      if ( ! hasNext() ) throw new NoSuchElementException("Out of boundaries");
+      index++;
+      return next;
 	}
 
 	public void remove() {

Modified: branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java	2007-02-21 00:02:28 UTC (rev 11228)
+++ branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java	2007-02-21 19:28:07 UTC (rev 11229)
@@ -22,6 +22,10 @@
 import org.hibernate.type.Type;
 
 /**
+ * Implements scollable and paginated resultsets.
+ * Contrary to query#iterate() or query#list(), this implementation is
+ * exposed to returned null objects (if the index is out of date).
+ *
  * @author Emmanuel Bernard
  */
 public class ScrollableResultsImpl implements ScrollableResults {

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java	2007-02-21 00:02:28 UTC (rev 11228)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java	2007-02-21 19:28:07 UTC (rev 11229)
@@ -48,16 +48,23 @@
 		assertNotNull( result );
 		assertEquals( "Query with explicit class filter", 2, result.size() );
 
-        query = parser.parse( "summary:Festina Or brand:Seiko" );
+      query = parser.parse( "summary:Festina Or brand:Seiko" );
 		hibQuery = s.createFullTextQuery( query );
 		result = hibQuery.list();
 		assertNotNull( result );
 		assertEquals( "Query with no class filter", 2, result.size() );
-        for (Object element : result) {
+      for (Object element : result) {
 			assertTrue( Hibernate.isInitialized( element ) );
 			s.delete( element );
 		}
-		for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+      s.flush();
+      query = parser.parse( "summary:Festina Or brand:Seiko" );
+		hibQuery = s.createFullTextQuery( query );
+		result = hibQuery.list();
+		assertNotNull( result );
+		assertEquals( "Query with delete objects", 0, result.size() );
+
+      for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
 		tx.commit();
 		s.close();
 	}
@@ -140,7 +147,16 @@
 			s.delete( result.next() );
 		}
 		assertEquals( 2, index );
-		for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+
+      s.flush();
+
+      query = parser.parse( "summary:Festina Or brand:Seiko" );
+      hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+      result = hibQuery.iterate();
+      assertNotNull( result );
+      assertFalse( result.hasNext() );
+
+      for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
 		tx.commit();
 		s.close();
 	}




More information about the hibernate-commits mailing list