Author: tomdz
Date: Sun Jan 14 15:15:01 2007
New Revision: 496186

URL: http://svn.apache.org/viewvc?view=rev&rev=496186
Log:
Reworked the deferral and insertion of deferred beans

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java

Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java
URL: 
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java?view=diff&rev=496186&r1=496185&r2=496186
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java 
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/io/DataToDatabaseSink.java 
Sun Jan 14 15:15:01 2007
@@ -334,38 +334,62 @@
 
         insertBeanIntoDatabase(table, bean);
 
+        if (_log.isDebugEnabled())
+        {
+            _log.debug("Inserted bean " + origIdentity);
+        }
+
         if (_ensureFkOrder && _fkTables.contains(table))
         {
             Identity  newIdentity  = buildIdentityFromPKs(table, bean);
             ArrayList finishedObjs = new ArrayList();
 
             _identityMap.put(origIdentity, newIdentity);
-            for (Iterator waitingObjIt = _waitingObjects.iterator(); 
waitingObjIt.hasNext();)
-            {
-                WaitingObject waitingObj = (WaitingObject)waitingObjIt.next();
-                Identity      fkIdentity = 
waitingObj.removePendingFK(origIdentity);
 
-                if (!waitingObj.hasPendingFKs())
-                {
-                    waitingObjIt.remove();
-                    // the object was only waiting for this one, so store it 
now
-                    // prior to that we also update the fk fields in case one 
of the pk
-                    // columns of the target object is auto-incremented by the 
database
-                    updateFKColumns(waitingObj.getObject(), 
fkIdentity.getForeignKeyName(), newIdentity);
-                    // we defer handling of the finished objects to avoid 
concurrent modification exceptions
-                    finishedObjs.add(waitingObj.getObject());
-                }
-            }
-            for (Iterator finishedObjIt = finishedObjs.iterator(); 
finishedObjIt.hasNext();)
+            // we're doing multiple passes so that we can insert as much 
objects in
+            // one go as possible
+            ArrayList identitiesToCheck = new ArrayList();
+
+            identitiesToCheck.add(origIdentity);
+            while (!identitiesToCheck.isEmpty() && !_waitingObjects.isEmpty())
             {
-                DynaBean finishedObj = (DynaBean)finishedObjIt.next();
+                Identity curIdentity    = (Identity)identitiesToCheck.get(0);
+                Identity curNewIdentity = 
(Identity)_identityMap.get(curIdentity);
 
-                addBean(finishedObj);
-                if (_log.isDebugEnabled())
+                identitiesToCheck.remove(0);
+                finishedObjs.clear();
+                for (Iterator waitingObjIt = _waitingObjects.iterator(); 
waitingObjIt.hasNext();)
                 {
-                    Table waitingObjTable = 
((SqlDynaClass)finishedObj.getDynaClass()).getTable();
+                    WaitingObject waitingObj = 
(WaitingObject)waitingObjIt.next();
+                    Identity      fkIdentity = 
waitingObj.removePendingFK(curIdentity);
 
-                    _log.debug("Inserted deferred row 
"+buildIdentityFromPKs(waitingObjTable, finishedObj));
+                    if (fkIdentity != null)
+                    {
+                        updateFKColumns(waitingObj.getObject(), 
fkIdentity.getForeignKeyName(), curNewIdentity);
+                    }
+                    if (!waitingObj.hasPendingFKs())
+                    {
+                        waitingObjIt.remove();
+                        // we defer handling of the finished objects to avoid 
concurrent modification exceptions
+                        finishedObjs.add(waitingObj.getObject());
+                    }
+                }
+                for (Iterator finishedObjIt = finishedObjs.iterator(); 
finishedObjIt.hasNext();)
+                {
+                    DynaBean finishedObj = (DynaBean)finishedObjIt.next();
+                    Table    tableForObj = 
_model.getDynaClassFor(finishedObj).getTable();
+                    Identity objIdentity = buildIdentityFromPKs(tableForObj, 
finishedObj);
+
+                    insertBeanIntoDatabase(tableForObj, finishedObj);
+                    
+                    Identity newObjIdentity = 
buildIdentityFromPKs(tableForObj, finishedObj);
+
+                    _identityMap.put(objIdentity, newObjIdentity);
+                    identitiesToCheck.add(objIdentity);
+                    if (_log.isDebugEnabled())
+                    {
+                        _log.debug("Inserted deferred row " + objIdentity);
+                    }
                 }
             }
         }
@@ -492,10 +516,6 @@
             if (!_connection.getAutoCommit())
             {
                 _connection.commit();
-            }
-            if (_log.isDebugEnabled())
-            {
-                _log.debug("Inserted bean "+buildIdentityFromPKs(table, 
bean).toString());
             }
         }
         catch (Exception ex)


Reply via email to