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();
}
Show replies by thread