Author: bdaniel
Date: Tue Oct 17 13:15:58 2006
New Revision: 465025

URL: http://svn.apache.org/viewvc?view=rev&rev=465025
Log:
TUSCANY-866 Use overqualified update by default

Modified:
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java?view=diff&rev=465025&r1=465024&r2=465025
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
 Tue Oct 17 13:15:58 2006
@@ -28,6 +28,7 @@
 import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
 import org.apache.tuscany.das.rdb.config.wrapper.RelationshipWrapper;
 import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
+import org.apache.tuscany.das.rdb.impl.CollisionParameter;
 import org.apache.tuscany.das.rdb.impl.ManagedParameterImpl;
 import org.apache.tuscany.das.rdb.impl.OptimisticWriteCommandImpl;
 import org.apache.tuscany.das.rdb.impl.ParameterImpl;
@@ -38,6 +39,7 @@
 import commonj.sdo.DataObject;
 import commonj.sdo.Property;
 import commonj.sdo.Type;
+import commonj.sdo.ChangeSummary.Setting;
 
 public final class UpdateGenerator extends BaseGenerator {
 
@@ -49,92 +51,97 @@
         super();
     }
 
-    public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, 
DataObject changedObject, Table table) {
-        List updatedProperties = new ArrayList();
-        List managedProperties = new ArrayList();
-        List whereClauseProperties = new ArrayList();
+    public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, 
DataObject changedObject, Table table) {      
+        List parameters = new ArrayList();
         Type type = changedObject.getType();
-        TableWrapper t = new TableWrapper(table);
+        TableWrapper tableWrapper = new TableWrapper(table);
         StringBuffer statement = new StringBuffer("update ");
         statement.append(table.getTableName());
         statement.append(" set ");
 
         ChangeSummary summary = 
changedObject.getDataGraph().getChangeSummary();
-        Iterator i = getChangedFields(mapping, summary, 
changedObject).iterator();
-
+        List changedFields = getChangedFields(mapping, summary, changedObject);
+        Iterator i = changedFields.iterator();
+      
+        int idx = 1;
         while (i.hasNext()) {
             Property property = (Property) i.next();
-            Column c = t.getColumnByPropertyName(property.getName());
-            if ((c != null) && (c.isCollision() || c.isPrimaryKey())) {
-                // get rid of comma if OCC or PK is last field
-                if (!i.hasNext()) {
-                    statement.delete(statement.length() - 2, 
statement.length());
-                }
-            } else {
-                updatedProperties.add(property);
-                statement.append(c == null ? property.getName() : 
c.getColumnName());
-                statement.append(" = ?");
-                if (i.hasNext()) {
-                    statement.append(", ");
-                }
-            }
+            Column c = 
tableWrapper.getColumnByPropertyName(property.getName());          
+            
+            if ((c == null) || !c.isCollision() || !c.isPrimaryKey()) { 
+                String columnName = c == null ? property.getName() : 
c.getColumnName();
+                appendFieldSet(statement, idx > 1, columnName);
+                parameters.add(createParameter(tableWrapper, property, idx++));
+            } 
         }
-
-        Column c = t.getManagedColumn();
+        
+        Column c = tableWrapper.getManagedColumn();
         if (c != null) {
-            statement.append(", ");
-            statement.append(c.getColumnName());
-            statement.append(" = ?");
-            
managedProperties.add(changedObject.getProperty(t.getManagedColumnPropertyName()));
+            appendFieldSet(statement, idx > 1, c.getColumnName());
+            String propertyName = c.getPropertyName() == null ? 
c.getColumnName() : c.getPropertyName();
+            parameters.add(createManagedParameter(tableWrapper, 
+                    changedObject.getProperty(propertyName), idx++));
         }
+        
         statement.append(" where ");
 
-        Iterator names = t.getPrimaryKeyNames().iterator();
-        Iterator pkProperties = t.getPrimaryKeyProperties().iterator();
-        while (names.hasNext() && pkProperties.hasNext()) {
-            String name = (String) names.next();
-            String property = (String) pkProperties.next();
-            statement.append(name);
+        Iterator pkColumnNames = tableWrapper.getPrimaryKeyNames().iterator();
+        Iterator pkPropertyNames = 
tableWrapper.getPrimaryKeyProperties().iterator();
+        while (pkColumnNames.hasNext() && pkPropertyNames.hasNext()) {
+            String columnName = (String) pkColumnNames.next();
+            String propertyName = (String) pkPropertyNames.next();
+            statement.append(columnName);
             statement.append(" = ?");
-            if (names.hasNext() && pkProperties.hasNext()) {
+            if (pkColumnNames.hasNext() && pkPropertyNames.hasNext()) {
                 statement.append(" and ");
             }
-            whereClauseProperties.add(type.getProperty(property));
+            parameters.add(createParameter(tableWrapper, 
type.getProperty(propertyName), idx++));
         }
 
-        if (t.getCollisionColumn() != null) {
+        if (tableWrapper.getCollisionColumn() == null) {
+            Iterator iter = changedFields.iterator();
+            while (iter.hasNext()) {
+                statement.append(" and ");
+                Property changedProperty = (Property) iter.next();
+                Column column = 
tableWrapper.getColumnByPropertyName(changedProperty.getName()); 
+                statement.append(column == null ? changedProperty.getName() : 
column.getColumnName());
+                                 
+                Object value;
+                Setting setting = summary.getOldValue(changedObject, 
changedProperty);
+                // Setting is null if this is a relationship change
+                if (setting == null) {
+                    value = changedObject.get(changedProperty);
+                } else {
+                    value = setting.getValue();
+                }
+                
+                if (value == null) {                   
+                    statement.append(" is null");                    
+                } else {
+                    ParameterImpl param = 
createCollisionParameter(tableWrapper, changedProperty, idx++);
+                    statement.append(" = ?");
+                    param.setValue(value);
+                    parameters.add(param);
+                }
+                
+               
+            }
+           
+        } else {
             statement.append(" and ");
-            statement.append(t.getCollisionColumn().getColumnName());
+            
statement.append(tableWrapper.getCollisionColumn().getColumnName());
             statement.append(" = ?");
-            
whereClauseProperties.add(type.getProperty(t.getCollisionColumnPropertyName()));
-        }
-
-        UpdateCommandImpl updateCommand;
-        if (t.getCollisionColumn() != null) {
-            updateCommand = new 
OptimisticWriteCommandImpl(statement.toString());
-        } else {
-            updateCommand = new UpdateCommandImpl(statement.toString());
+            parameters.add(createParameter(tableWrapper, 
+                    
type.getProperty(tableWrapper.getCollisionColumnPropertyName()), idx++));       
                
+        }                  
+
+        UpdateCommandImpl updateCommand = new 
OptimisticWriteCommandImpl(statement.toString());
+        
+        Iterator params = parameters.iterator();
+        while (params.hasNext()) {           
+            updateCommand.addParameter((ParameterImpl) params.next());
         }
-
-        int idx = 1;
-        Iterator params = updatedProperties.iterator();
-        while (params.hasNext()) {
-            Property p = (Property) params.next();
-            updateCommand.addParameter(createParameter(t, p, idx++));
-        }
-
-        params = managedProperties.iterator();
-        while (params.hasNext()) {
-            Property p = (Property) params.next();
-            updateCommand.addParameter(createManagedParameter(t, p, idx++));
-        }
-
-        params = whereClauseProperties.iterator();
-        while (params.hasNext()) {
-            Property p = (Property) params.next();
-            updateCommand.addParameter(createParameter(t, p, idx++));
-        }
-
+           
         if (this.logger.isDebugEnabled()) {
             this.logger.debug(statement.toString());
         }
@@ -142,11 +149,24 @@
         return updateCommand;
     }
 
+  
+
+    private void appendFieldSet(StringBuffer statement, boolean appendComma, 
String columnName) {
+        if (appendComma) {
+            statement.append(", ");
+        }
+        statement.append(columnName);
+        statement.append(" = ?");
+    }
+
+
+
     private List getChangedFields(MappingWrapper mapping, ChangeSummary 
summary, DataObject obj) {
         List changes = new ArrayList();
         Iterator i = summary.getOldValues(obj).iterator();
         while (i.hasNext()) {
             ChangeSummary.Setting setting = (ChangeSummary.Setting) i.next();
+            
             if (setting.getProperty().getType().isDataType()) {
                 changes.add(setting.getProperty());
             } else {
@@ -167,8 +187,7 @@
         return changes;
     }
 
-    private ParameterImpl createManagedParameter(TableWrapper table, Property 
property, int idx) {
-        ParameterImpl param = new ManagedParameterImpl();
+    private ParameterImpl fillParameter(ParameterImpl param, TableWrapper 
table, Property property, int idx) {
         param.setName(property.getName());
         param.setType(property.getType());
         
param.setConverter(getConverter(table.getConverter(property.getName())));
@@ -178,17 +197,19 @@
 
         return param;
     }
+    private ParameterImpl createCollisionParameter(TableWrapper tableWrapper, 
Property property, int i) {
+        ParameterImpl param = new CollisionParameter();
+        return fillParameter(param, tableWrapper, property, i);
+    }
+    
+    private ParameterImpl createManagedParameter(TableWrapper table, Property 
property, int idx) {
+        ParameterImpl param = new ManagedParameterImpl();
+        return fillParameter(param, table, property, idx);
+    }
 
     private ParameterImpl createParameter(TableWrapper table, Property 
property, int idx) {
         ParameterImpl param = new ParameterImpl();
-        param.setName(property.getName());
-        param.setType(property.getType());
-        
param.setConverter(getConverter(table.getConverter(property.getName())));
-        if (idx != -1) {
-            param.setIndex(idx);
-        }
-
-        return param;
+        return fillParameter(param, table, property, idx);
     }
 
 }

Modified: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java?view=diff&rev=465025&r1=465024&r2=465025
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
 Tue Oct 17 13:15:58 2006
@@ -18,12 +18,15 @@
  */
 package org.apache.tuscany.das.rdb.test;
 
+import java.sql.SQLException;
+
 import org.apache.tuscany.das.rdb.Command;
 import org.apache.tuscany.das.rdb.ConfigHelper;
 import org.apache.tuscany.das.rdb.DAS;
 import org.apache.tuscany.das.rdb.config.Config;
 import org.apache.tuscany.das.rdb.config.ConfigFactory;
 import org.apache.tuscany.das.rdb.test.data.BookData;
+import org.apache.tuscany.das.rdb.test.data.CustomerData;
 import org.apache.tuscany.das.rdb.test.framework.DasTest;
 
 import commonj.sdo.DataObject;
@@ -33,9 +36,37 @@
         super.setUp();
 
         new BookData(getAutoConnection()).refresh();
+        new CustomerData(getAutoConnection()).refresh();
     }
 
-    public void testSimpleOCC() throws Exception {
+    public void testAutomaticOCC() throws SQLException {
+        DAS das = DAS.FACTORY.createDAS(getConnection());
+        // Read customer with particular ID
+        Command select = das.createCommand("Select * from CUSTOMER where ID = 
1");
+        DataObject root = select.executeQuery();
+
+        // Explicitly update the DB to force a collision
+        Command update = das.createCommand("update CUSTOMER set LASTNAME = 
'Smith' where ID = 1");
+        update.execute();
+        
+        DataObject customer = root.getDataObject("CUSTOMER[1]");
+
+        // Modify customer
+        customer.set("LASTNAME", "Pavick");
+
+        // Build apply changes command
+        try {
+            das.applyChanges(root);
+            fail("An OCCException should be thrown");
+        } catch (RuntimeException ex) {
+            if (!ex.getMessage().equals("An update collision occurred")) {
+                throw ex;
+            }
+        }
+      
+    }
+    
+    public void testSimpleOCC() throws SQLException  {
 
         DAS das = DAS.FACTORY.createDAS(getConfig("BooksConfig.xml"), 
getConnection());
         // Read a book instance
@@ -61,7 +92,7 @@
         }
     }
 
-    public void testManagedOCC() throws Exception {
+    public void testManagedOCC() throws SQLException  {
         DAS das = DAS.FACTORY.createDAS(getConfig("ManagedBooksConfig.xml"), 
getConnection());
         Command select = das.getCommand("select book 1");
         DataObject root = select.executeQuery();
@@ -76,7 +107,7 @@
         assertEquals(occValue + 1, book.getInt("OCC"));
     }
 
-    public void testManagedOCCFailure() throws Exception {
+    public void testManagedOCCFailure() throws SQLException  {
         DAS das = DAS.FACTORY.createDAS(getConfig("ManagedBooksConfig.xml"), 
getConnection());
         // Read a book instance
         Command select = das.getCommand("select book 1");
@@ -105,7 +136,7 @@
         }
     }
 
-    public void testProvidedConfig() throws Exception {
+    public void testProvidedConfig() throws SQLException  {
         // Create config programmatically
         Config config = ConfigFactory.INSTANCE.createConfig();
         ConfigHelper helper = new ConfigHelper(config);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to