[hibernate-commits] Hibernate SVN: r19222 - in core/branches/Branch_3_2_4_SP1_CP: test/org/hibernate/test/hql and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Apr 13 12:01:57 EDT 2010


Author: stliu
Date: 2010-04-13 12:01:56 -0400 (Tue, 13 Apr 2010)
New Revision: 19222

Modified:
   core/branches/Branch_3_2_4_SP1_CP/src/org/hibernate/impl/FetchingScrollableResultsImpl.java
   core/branches/Branch_3_2_4_SP1_CP/test/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
Log:
JBPAPP-4095 HHH-5096 FetchingScrollableResultsImpl.last() does not move to the last result if cursor is after the last result

Modified: core/branches/Branch_3_2_4_SP1_CP/src/org/hibernate/impl/FetchingScrollableResultsImpl.java
===================================================================
--- core/branches/Branch_3_2_4_SP1_CP/src/org/hibernate/impl/FetchingScrollableResultsImpl.java	2010-04-13 14:58:16 UTC (rev 19221)
+++ core/branches/Branch_3_2_4_SP1_CP/src/org/hibernate/impl/FetchingScrollableResultsImpl.java	2010-04-13 16:01:56 UTC (rev 19222)
@@ -51,6 +51,12 @@
 			currentPosition = maxPosition.intValue() + 1;
 			return false;
 		}
+		
+		if ( isResultSetEmpty() ) {
+			currentRow = null;
+			currentPosition = 0;
+			return false;
+		}
 
 		Object row = getLoader().loadSequentialRowsForward(
 				getResultSet(),
@@ -160,13 +166,16 @@
 	public boolean last() throws HibernateException {
 		boolean more = false;
 		if ( maxPosition != null ) {
+			if ( currentPosition > maxPosition.intValue() ) {
+				more = previous();
+			}
 			for ( int i = currentPosition; i < maxPosition.intValue(); i++ ) {
 				more = next();
 			}
 		}
 		else {
 			try {
-				if ( getResultSet().isAfterLast() ) {
+				if ( isResultSetEmpty() || getResultSet().isAfterLast() ) {
 					// should not be able to reach last without maxPosition being set
 					// unless there are no results
 					return false;
@@ -290,4 +299,14 @@
 		}
 		return scroll( rowNumber - currentPosition );
 	}
+	private boolean isResultSetEmpty() {
+		try {
+			return currentPosition == 0 && !getResultSet().isBeforeFirst()
+					&& !getResultSet().isAfterLast();
+		} catch ( SQLException e ) {
+			throw JDBCExceptionHelper
+					.convert( getSession().getFactory().getSQLExceptionConverter(), e,
+							"Could not determine if resultset is empty due to exception calling isBeforeFirst or isAfterLast()" );
+		}
+	}
 }

Modified: core/branches/Branch_3_2_4_SP1_CP/test/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
===================================================================
--- core/branches/Branch_3_2_4_SP1_CP/test/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java	2010-04-13 14:58:16 UTC (rev 19221)
+++ core/branches/Branch_3_2_4_SP1_CP/test/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java	2010-04-13 16:01:56 UTC (rev 19222)
@@ -46,7 +46,195 @@
 		txn.commit();
 		s.close();
 	}
+	public void testScrollingJoinFetchesEmptyResultSet() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
 
+		assertTrue(s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .list()
+				.isEmpty() );
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .scroll();
+
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertFalse( results.next() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertFalse( results.previous() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		results.beforeFirst();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertFalse( results.first() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		results.afterLast();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertFalse( results.last() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		for ( int i=1; i<3; i++ ) {
+			assertFalse( results.scroll( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.scroll( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.setRowNumber( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.setRowNumber( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+		}
+
+		txn.commit();
+		s.close();
+	}
+
+	public void testScrollingJoinFetchesSingleRowResultSet() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		Animal mother = new Animal();
+		mother.setDescription( "root-1" );
+
+		Animal daughter = new Animal();
+		daughter.setDescription( "daughter" );
+
+		daughter.setMother( mother );
+		mother.addOffspring( daughter );
+
+		s.save( mother );
+		s.save( daughter );
+
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+
+		assertNotNull(s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .uniqueResult() );
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .scroll();
+
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.previous() );		
+
+		assertTrue( results.next() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		assertFalse( results.next() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertTrue( results.previous() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		assertFalse( results.previous() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertTrue( results.next() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		results.beforeFirst();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.previous() );
+
+		assertTrue( results.first() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+		assertFalse( results.next() );
+
+		results.afterLast();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertTrue( results.last() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+		assertFalse( results.next() );
+
+		assertTrue( results.first() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );		
+
+		for ( int i=1; i<3; i++ ) {
+			assertTrue( results.setRowNumber( 1 ) );
+			assertTrue( results.isFirst() );
+			assertTrue( results.isLast() );
+
+			assertFalse( results.scroll( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertTrue( results.setRowNumber( 1 ) );
+			assertTrue( results.isFirst() );
+			assertTrue( results.isLast() );
+
+			assertFalse( results.scroll( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			if ( i != 1 ) {
+				assertFalse( results.setRowNumber( i ) );
+				assertFalse( results.isFirst() );
+				assertFalse( results.isLast() );
+
+				assertFalse( results.setRowNumber( - i ) );
+				assertFalse( results.isFirst() );
+				assertFalse( results.isLast() );
+			}
+		}
+
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+
+		s.createQuery( "delete Animal where not description like 'root%'" ).executeUpdate();
+		s.createQuery( "delete Animal" ).executeUpdate();
+
+		txn.commit();
+		s.close();
+	}
+
 	public void testScrollingJoinFetchesForward() {
 		if ( ! supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() ) {
 			return;



More information about the hibernate-commits mailing list