Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection In directory sc8-pr-cvs1:/tmp/cvs-serv3845 Modified Files: ArrayHolder.java Bag.java CollectionPersister.java List.java Map.java PersistentCollection.java Set.java SortedSet.java Log Message: collections now represent null values as a missing row performance improvement for collection dirty-searching Index: ArrayHolder.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/ArrayHolder.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ArrayHolder.java 9 Feb 2003 07:41:15 -0000 1.8 --- ArrayHolder.java 19 Feb 2003 01:51:30 -0000 1.9 *************** *** 8,12 **** import java.sql.SQLException; import java.util.ArrayList; - import java.util.HashSet; import java.util.Iterator; --- 8,11 ---- *************** *** 202,209 **** public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.Set deletes = new HashSet(); ! int size = Array.getLength( getSnapshot() ); ! for ( int i=Array.getLength(array); i<size; i++ ) { ! deletes.add( new Integer(i) ); } return deletes.iterator(); --- 201,218 ---- public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.List deletes = new ArrayList(); ! Serializable sn = getSnapshot(); ! int snSize = Array.getLength(sn); ! int arraySize = Array.getLength(array); ! int end; ! if ( snSize > arraySize ) { ! for ( int i=arraySize; i<snSize; i++ ) deletes.add( new Integer(i) ); ! end = arraySize; ! } ! else { ! end = snSize; ! } ! for ( int i=0; i<end; i++ ) { ! if ( Array.get(array, i)==null && Array.get(sn, i)!=null ) deletes.add( new Integer(i) ); } return deletes.iterator(); *************** *** 211,220 **** public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { ! return i >= Array.getLength(getSnapshot()); } public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { ! Serializable snapshot = getSnapshot(); ! return i<Array.getLength(snapshot) && elemType.isDirty( Array.get(array, i), Array.get(snapshot, i), session ); } /** --- 220,233 ---- public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { ! Serializable sn = getSnapshot(); ! return Array.get(array, i)!=null && ( i >= Array.getLength(sn) || Array.get(sn, i)==null ); } public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { ! Serializable sn = getSnapshot(); ! return i<Array.getLength(sn) && ! Array.get(sn, i)!=null && ! Array.get(array, i)!=null && ! elemType.isDirty( Array.get(array, i), Array.get(sn, i), session ); } /** *************** *** 225,228 **** --- 238,248 ---- } + /** + * @see net.sf.hibernate.collection.PersistentCollection#entryExists(java.lang.Object, int) + */ + public boolean entryExists(Object entry, int i) { + return entry!=null; + } + } Index: Bag.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Bag.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Bag.java 9 Feb 2003 07:41:15 -0000 1.7 --- Bag.java 19 Feb 2003 01:51:30 -0000 1.8 *************** *** 478,481 **** --- 478,488 ---- }*/ + /** + * @see net.sf.hibernate.collection.PersistentCollection#entryExists(java.lang.Object, int) + */ + public boolean entryExists(Object entry, int i) { + return entry!=null; + } + } Index: CollectionPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/CollectionPersister.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** CollectionPersister.java 15 Feb 2003 01:00:51 -0000 1.11 --- CollectionPersister.java 19 Feb 2003 01:51:30 -0000 1.12 *************** *** 523,527 **** while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( !isOneToMany || entry!=null ) { writeKey(st, id, false, session); collection.writeTo(st, this, entry, i, false); --- 523,527 ---- while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( collection.entryExists(entry, i) ) { writeKey(st, id, false, session); collection.writeTo(st, this, entry, i, false); *************** *** 619,623 **** while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( entry!=null && collection.needsUpdating(entry, i, elementType) ) { if (insst==null) insst = session.getBatcher().prepareBatchStatement( getSQLInsertRowString() ); writeKey(insst, id, false, session); --- 619,623 ---- while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( collection.needsUpdating(entry, i, elementType) ) { if (insst==null) insst = session.getBatcher().prepareBatchStatement( getSQLInsertRowString() ); writeKey(insst, id, false, session); *************** *** 664,668 **** while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( collection.needsInserting(entry, i, elementType) && ( !isOneToMany || entry!=null ) ) { if (st==null) st = session.getBatcher().prepareBatchStatement( getSQLInsertRowString() ); writeKey(st, id, false, session); --- 664,668 ---- while ( entries.hasNext() ) { Object entry = entries.next(); ! if ( collection.needsInserting(entry, i, elementType) ) { if (st==null) st = session.getBatcher().prepareBatchStatement( getSQLInsertRowString() ); writeKey(st, id, false, session); Index: List.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/List.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** List.java 9 Feb 2003 07:41:15 -0000 1.8 --- List.java 19 Feb 2003 01:51:30 -0000 1.9 *************** *** 6,10 **** import java.sql.ResultSet; import java.sql.SQLException; - import java.util.HashSet; import java.util.Iterator; import java.util.Collection; --- 6,9 ---- *************** *** 340,358 **** public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.Set deletes = new HashSet(); ! for ( int i=list.size(); i<( (java.util.List) getSnapshot() ).size(); i++ ) { ! deletes.add( new Integer(i) ); } return deletes.iterator(); } ! public boolean needsInserting(Object entry, int i,Type elemType) throws HibernateException { final java.util.List sn = (java.util.List) getSnapshot(); ! return i >= sn.size(); } public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { final java.util.List sn = (java.util.List) getSnapshot(); ! return i<sn.size() && elemType.isDirty( list.get(i), sn.get(i), session ); } --- 339,366 ---- public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.List deletes = new ArrayList(); ! java.util.List sn = (java.util.List) getSnapshot(); ! int end; ! if ( sn.size() > list.size() ) { ! for ( int i=list.size(); i<sn.size(); i++ ) deletes.add( new Integer(i) ); ! end = list.size(); ! } ! else { ! end = sn.size(); ! } ! for ( int i=0; i<end; i++ ) { ! if ( list.get(i)==null && sn.get(i)!=null ) deletes.add( new Integer(i) ); } return deletes.iterator(); } ! public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { final java.util.List sn = (java.util.List) getSnapshot(); ! return list.get(i)!=null && ( i >= sn.size() || sn.get(i)==null ); } public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { final java.util.List sn = (java.util.List) getSnapshot(); ! return i<sn.size() && sn.get(i)!=null && list.get(i)!=null && elemType.isDirty( list.get(i), sn.get(i), session ); } *************** *** 401,404 **** --- 409,419 ---- } + /** + * @see net.sf.hibernate.collection.PersistentCollection#entryExists(java.lang.Object, int) + */ + public boolean entryExists(Object entry, int i) { + return entry!=null; + } + } Index: Map.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Map.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Map.java 9 Feb 2003 07:41:15 -0000 1.8 --- Map.java 19 Feb 2003 01:51:30 -0000 1.9 *************** *** 7,12 **** import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; - import java.util.HashSet; import java.util.Iterator; --- 7,12 ---- import java.sql.ResultSet; import java.sql.SQLException; + import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; *************** *** 335,344 **** public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.Set deletes = new HashSet(); Iterator iter = ( (java.util.Map) getSnapshot() ).entrySet().iterator(); while ( iter.hasNext() ) { java.util.Map.Entry e = (java.util.Map.Entry) iter.next(); Object key = e.getKey(); ! if ( !map.containsKey(key) ) deletes.add(key); } return deletes.iterator(); --- 335,344 ---- public Iterator getDeletes(Type elemType) throws HibernateException { ! java.util.List deletes = new ArrayList(); Iterator iter = ( (java.util.Map) getSnapshot() ).entrySet().iterator(); while ( iter.hasNext() ) { java.util.Map.Entry e = (java.util.Map.Entry) iter.next(); Object key = e.getKey(); ! if ( e.getValue()!=null && map.get(key)==null ) deletes.add(key); } return deletes.iterator(); *************** *** 348,352 **** final java.util.Map sn = (java.util.Map) getSnapshot(); java.util.Map.Entry e = (java.util.Map.Entry) entry; ! return !sn.containsKey( e.getKey() ); } --- 348,352 ---- final java.util.Map sn = (java.util.Map) getSnapshot(); java.util.Map.Entry e = (java.util.Map.Entry) entry; ! return e.getValue()!=null && sn.get( e.getKey() )==null; } *************** *** 354,358 **** final java.util.Map sn = (java.util.Map) getSnapshot(); java.util.Map.Entry e = (java.util.Map.Entry) entry; ! return sn.containsKey( e.getKey() ) && elemType.isDirty( e.getValue(), sn.get( e.getKey() ), session ); } --- 354,361 ---- final java.util.Map sn = (java.util.Map) getSnapshot(); java.util.Map.Entry e = (java.util.Map.Entry) entry; ! Object snValue = sn.get( e.getKey() ); ! return e.getValue()!=null && ! snValue!=null && ! elemType.isDirty( snValue, e.getValue(), session ); } *************** *** 372,375 **** --- 375,385 ---- } + /** + * @see net.sf.hibernate.collection.PersistentCollection#entryExists(java.lang.Object, int) + */ + public boolean entryExists(Object entry, int i) { + return ( (Map.Entry) entry ).getValue()!=null; + } + } Index: PersistentCollection.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/PersistentCollection.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** PersistentCollection.java 9 Feb 2003 06:28:14 -0000 1.7 --- PersistentCollection.java 19 Feb 2003 01:51:30 -0000 1.8 *************** *** 188,193 **** } ! public abstract boolean needsInserting(Object key, int i, Type elemType) throws HibernateException; ! public abstract boolean needsUpdating(Object key, int i, Type elemType) throws HibernateException; public abstract Iterator getDeletes(Type elemType) throws HibernateException; --- 188,194 ---- } ! public abstract boolean entryExists(Object entry, int i); ! public abstract boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException; ! public abstract boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException; public abstract Iterator getDeletes(Type elemType) throws HibernateException; Index: Set.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Set.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Set.java 9 Feb 2003 07:41:15 -0000 1.7 --- Set.java 19 Feb 2003 01:51:30 -0000 1.8 *************** *** 4,7 **** --- 4,8 ---- import java.util.ArrayList; import java.util.Collection; + import java.util.HashMap; import java.util.Iterator; import java.util.Map; *************** *** 28,35 **** public Serializable snapshot(CollectionPersister persister) throws HibernateException { //if (set==null) return new Set(session); ! HashSet clonedSet = new HashSet( set.size() ); Iterator iter = set.iterator(); while ( iter.hasNext() ) { ! clonedSet.add( persister.getElementType().deepCopy( iter.next() ) ); } return clonedSet; --- 29,37 ---- public Serializable snapshot(CollectionPersister persister) throws HibernateException { //if (set==null) return new Set(session); ! HashMap clonedSet = new HashMap( set.size() ); Iterator iter = set.iterator(); while ( iter.hasNext() ) { ! Object copied = persister.getElementType().deepCopy( iter.next() ); ! clonedSet.put(copied, copied); } return clonedSet; *************** *** 37,60 **** public boolean equalsSnapshot(Type elementType) throws HibernateException { ! java.util.Set sn = (java.util.Set) getSnapshot(); if ( sn.size()!=set.size() ) { return false; } - else if ( elementType.hasNiceEquals() ) { - return sn.equals(set); - } else { Iterator iter = set.iterator(); while ( iter.hasNext() ) { Object test = iter.next(); ! Iterator sniter = sn.iterator(); ! boolean success=false; ! while ( sniter.hasNext() ) { ! if ( elementType.equals( test, sniter.next() ) ) { ! success=true; ! break; ! } ! } ! if (!success) return false; } return true; --- 39,52 ---- public boolean equalsSnapshot(Type elementType) throws HibernateException { ! java.util.Map sn = (java.util.Map) getSnapshot(); if ( sn.size()!=set.size() ) { return false; } else { Iterator iter = set.iterator(); while ( iter.hasNext() ) { Object test = iter.next(); ! Object oldValue = sn.get(test); ! if ( oldValue==null || elementType.isDirty(oldValue, test, session) ) return false; } return true; *************** *** 266,288 **** public Iterator getDeletes(Type elemType) throws HibernateException { ! final java.util.Set sn = (java.util.Set) getSnapshot(); ArrayList deletes = new ArrayList( sn.size() ); ! Iterator iter = sn.iterator(); while ( iter.hasNext() ) { Object test = iter.next(); if ( !set.contains(test) ) { deletes.add(test); } ! else if ( !elemType.hasNiceEquals() ) { ! Iterator setiter = set.iterator(); ! boolean found = false; ! while ( setiter.hasNext() ) { ! if ( elemType.equals( setiter.next(), test ) ) { ! found=true; ! break; ! } ! } ! if (!found) deletes.add(test); ! } } --- 258,278 ---- public Iterator getDeletes(Type elemType) throws HibernateException { ! final java.util.Map sn = (java.util.Map) getSnapshot(); ArrayList deletes = new ArrayList( sn.size() ); ! Iterator iter = sn.keySet().iterator(); while ( iter.hasNext() ) { Object test = iter.next(); if ( !set.contains(test) ) { + // the element has been removed from the set deletes.add(test); } ! } ! iter = set.iterator(); ! while ( iter.hasNext() ) { ! Object test = iter.next(); ! Object oldValue = sn.get(test); ! if ( oldValue!=null && elemType.isDirty(test, oldValue, session) ) { ! // the element has changed ! deletes.add(test); } } *************** *** 291,308 **** public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { ! final java.util.Set sn = (java.util.Set) getSnapshot(); ! if ( !sn.contains(entry) ) { ! return true; ! } ! else if ( !elemType.hasNiceEquals() ) { ! Iterator iter = sn.iterator(); ! while ( iter.hasNext() ) { ! if ( elemType.equals( iter.next(), entry ) ) return false; ! } ! return true; ! } ! else { ! return false; ! } } --- 281,287 ---- public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { ! final java.util.Map sn = (java.util.Map) getSnapshot(); ! Object oldValue = sn.get(entry); ! return oldValue==null || elemType.isDirty(oldValue, entry, session); } *************** *** 392,395 **** --- 371,381 ---- } + /** + * @see net.sf.hibernate.collection.PersistentCollection#entryExists(java.lang.Object, int) + */ + public boolean entryExists(Object key, int i) { + return true; + } + } Index: SortedSet.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/SortedSet.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** SortedSet.java 15 Feb 2003 01:00:51 -0000 1.7 --- SortedSet.java 19 Feb 2003 01:51:30 -0000 1.8 *************** *** 5,8 **** --- 5,9 ---- import java.sql.SQLException; import java.util.Iterator; + import java.util.TreeMap; import java.util.TreeSet; import java.util.Comparator; *************** *** 24,31 **** public Serializable snapshot(CollectionPersister persister) throws HibernateException { //if (set==null) return new Set(session); ! TreeSet clonedSet = new TreeSet(comparator); Iterator iter = set.iterator(); while ( iter.hasNext() ) { ! clonedSet.add( persister.getElementType().deepCopy( iter.next() ) ); } return clonedSet; --- 25,33 ---- public Serializable snapshot(CollectionPersister persister) throws HibernateException { //if (set==null) return new Set(session); ! TreeMap clonedSet = new TreeMap(comparator); Iterator iter = set.iterator(); while ( iter.hasNext() ) { ! Object copy = persister.getElementType().deepCopy( iter.next() ); ! clonedSet.put(copy, copy); } return clonedSet; |