The following patch changes the DAS to assume a primary key field of "ID" in the absence of any configuration.
 
Brent
 
Index: src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java
===================================================================
--- src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java    
(revision 392391)
+++ src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java    
(working copy)
@@ -26,10 +26,13 @@
  * 
  */
 
+import java.util.Iterator;
+
 import org.apache.tuscany.das.rdb.ApplyChangesCommand;
 import org.apache.tuscany.das.rdb.Command;
 import org.apache.tuscany.das.rdb.SDODataTypes;
 import org.apache.tuscany.das.rdb.test.data.CustomerData;
+import org.apache.tuscany.das.rdb.test.data.OrderDetailsData;
 import org.apache.tuscany.das.rdb.test.framework.DasTest;
 
 import commonj.sdo.DataObject;
@@ -43,6 +46,7 @@
     {
         super.setUp();
         new CustomerData( getAutoConnection() ).refresh();
+        new OrderDetailsData( getAutoConnection() ).refresh();
     }
 
     protected void tearDown()
@@ -251,4 +255,126 @@
 
     }
 
+    
+    public void testReadModifyApplyWithAssumedID() throws Exception {
+
+               //Read customer with particular ID
+               Command select = Command.FACTORY
+                               .createCommand("Select * from CUSTOMER");
+               select.setConnection(getConnection());
+               DataObject root = select.executeQuery();
+
+               DataObject customer = root.getDataObject("CUSTOMER[1]");
+
+               //Modify customer
+               customer.set("LASTNAME", "Pavick");
+
+               DataObject customerForDelete = 
root.getDataObject("CUSTOMER[2]");
+               String deletedLastName = 
customerForDelete.getString("LASTNAME");
+               customerForDelete.delete();
+               
+               DataObject newCustomer = root.createDataObject("CUSTOMER");
+               newCustomer.set("LASTNAME", "NewCustomer");
+               newCustomer.setInt("ID", 9000);
+               
+               //Build apply changes command
+               ApplyChangesCommand apply = 
Command.FACTORY.createApplyChangesCommand();
+               apply.setConnection(getConnection());           
+
+               //Flush changes
+               apply.execute(root);
+
+               //Verify the change
+               root = select.executeQuery();
+               assertEquals("Pavick", getCustomerByLastName(root, 
"Pavick").getString("LASTNAME"));
+               assertEquals("NewCustomer", getCustomerByLastName(root, 
"NewCustomer").getString("LASTNAME"));
+               assertNull(getCustomerByLastName(root, deletedLastName));
+
+       }
+    
+    
+    public void testReadModifyApplyWithAssumedIDFailure() throws Exception {
+       
+               Command select = Command.FACTORY
+                               .createCommand("Select * from ORDERDETAILS");
+               select.setConnection(getConnection());
+               DataObject root = select.executeQuery();
+
+               DataObject od = root.getDataObject("ORDERDETAILS[1]");
+
+               //Modify customer
+               od.setInt("PRODUCTID", 72);     
+               
+               //Build apply changes command
+               ApplyChangesCommand apply = 
Command.FACTORY.createApplyChangesCommand();
+               apply.setConnection(getConnection());           
+
+               //Flush changes -- This should fail because Order Details does 
not have a column that
+               // we can assume to be an ID
+               try {
+                       apply.execute(root);    
+               } catch (RuntimeException ex) {
+                       assertTrue(ex.getMessage().contains("changed in the 
DataGraph but is not present in the Config"));
+               }
+
+       }
+    
+    public void testReadModifyApplyWithAssumedIDFailure2() throws Exception {
+       
+               Command select = Command.FACTORY
+                               .createCommand("Select * from ORDERDETAILS");
+               select.setConnection(getConnection());
+               DataObject root = select.executeQuery();
+
+               DataObject od = root.getDataObject("ORDERDETAILS[1]");
+               od.delete();    
+               
+               //Build apply changes command
+               ApplyChangesCommand apply = 
Command.FACTORY.createApplyChangesCommand();
+               apply.setConnection(getConnection());           
+
+               //Flush changes -- This should fail because Order Details does 
not have a column that
+               // we can assume to be an ID
+               try {
+                       apply.execute(root);    
+               } catch (RuntimeException ex) {
+                       assertTrue(ex.getMessage().contains("changed in the 
DataGraph but is not present in the Config"));
+               }
+
+       }
+    public void testReadModifyApplyWithAssumedIDFailure3() throws Exception {
+       
+               Command select = Command.FACTORY
+                               .createCommand("Select * from ORDERDETAILS");
+               select.setConnection(getConnection());
+               DataObject root = select.executeQuery();
+
+               DataObject od = root.createDataObject("ORDERDETAILS");
+
+               //Modify customer
+               od.setInt("PRODUCTID", 72);     
+               od.setInt("ORDERID", 500);
+               
+               //Build apply changes command
+               ApplyChangesCommand apply = 
Command.FACTORY.createApplyChangesCommand();
+               apply.setConnection(getConnection());           
+
+               //Flush changes -- This should fail because Order Details does 
not have a column that
+               // we can assume to be an ID
+               try {
+                       apply.execute(root);    
+               } catch (RuntimeException ex) {
+                       assertTrue(ex.getMessage().contains("changed in the 
DataGraph but is not present in the Config"));
+               }
+
+       }
+    private DataObject getCustomerByLastName(DataObject root, String name) {
+       Iterator i = root.getList("CUSTOMER").iterator(); 
+       while ( i. hasNext()) {
+               DataObject obj = (DataObject)i.next();
+               if (name.equals(obj.getString("LASTNAME")))
+                       return obj;
+       }
+       return null;
+    }
 }
Index: src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java
===================================================================
--- src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java        
(revision 392391)
+++ src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java        
(working copy)
@@ -77,8 +77,8 @@
                // Set minimum metadata necessary to describe relationship
                // Maybe something like this ...
                select.addRelationship("CUSTOMER.ID", "ANORDER.CUSTOMER_ID");
-               select.addPrimaryKey("CUSTOMER.ID");
-               select.addPrimaryKey("ANORDER.ID");
+//             select.addPrimaryKey("CUSTOMER.ID");
+//             select.addPrimaryKey("ANORDER.ID");
 
                DataObject root = select.executeQuery();
 
@@ -191,5 +191,75 @@
                                "CUSTOMER[1]/orders").size());
 
        }
+       
+       public void testRelationshipModificationWithoutConfig() throws 
Exception {
 
+               // Read some customers and related orders
+               Command select = Command.FACTORY
+                               .createCommand("SELECT * FROM CUSTOMER LEFT 
JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID");
+               select.setConnection(getConnection());
+
+               // Set minimum metadata necessary to describe relationship
+               // Maybe something like this ...
+//             select.addRelationship("CUSTOMER.ID", "ANORDER.CUSTOMER_ID");
+//             select.addPrimaryKey("CUSTOMER.ID");
+//             select.addPrimaryKey("ANORDER.ID");
+
+               DataObject root = select.executeQuery();
+
+               DataObject cust1 = root.getDataObject("CUSTOMER[1]");
+               DataObject cust2 = root.getDataObject("CUSTOMER[2]");
+
+               // Save IDs
+               Integer cust1ID = (Integer) cust1.get("ID");
+               Integer cust2ID = (Integer) cust2.get("ID");
+               // save order count
+               Integer cust1OrderCount = new 
Integer(cust1.getList("ANORDER").size());
+               Integer cust2OrderCount = new 
Integer(cust2.getList("ANORDER").size());
+
+               // Move an order to cust1 from cust2
+               DataObject order = (DataObject) cust2.getList("ANORDER").get(0);
+               cust1.getList("ANORDER").add(order);
+
+               // Build apply changes command
+               ApplyChangesCommand apply = Command.FACTORY
+                               .createApplyChangesCommand();
+               apply.setConnection(getConnection());
+
+               // Manually create and add commands
+               Command update = Command.FACTORY
+                               .createCommand("update ANORDER set CUSTOMER_ID 
= :CUSTOMER_ID where ID = :ID");
+               update.addParameter("CUSTOMER_ID", SDODataTypes.INTEGER);
+               update.addParameter("ID", SDODataTypes.INTEGER);
+               update.addRelationship("CUSTOMER.ID", "ANORDER.CUSTOMER_ID");
+               update.addPrimaryKey("CUSTOMER.ID");
+               update.addPrimaryKey("ANORDER.ID");
+               apply.addUpdateCommand(order.getType(), update);
+
+               // Flush changes
+               apply.execute(root);
+
+               // verify cust1 relationship updates
+               select = Command.FACTORY
+                               .createCommand("SELECT * FROM CUSTOMER LEFT 
JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID where CUSTOMER.ID = :ID");
+               select.setConnection(getConnection());
+               select.setParameterValue("ID", cust1ID);
+
+               select.addRelationship("CUSTOMER.ID", "ANORDER.CUSTOMER_ID");
+               select.addPrimaryKey("CUSTOMER.ID");
+               select.addPrimaryKey("ANORDER.ID");
+               root = select.executeQuery();
+
+               assertEquals(cust1OrderCount.intValue() + 1, root.getList(
+                               "CUSTOMER[1]/ANORDER").size());
+
+               // verify cust2 relationship updates
+               select.setParameterValue("ID", cust2ID);
+               root = select.executeQuery();
+
+               assertEquals(cust2OrderCount.intValue() - 1, root.getList(
+                               "CUSTOMER[1]/ANORDER").size());
+
+       }
+
 }
Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java    
(revision 395356)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java    
(working copy)
@@ -100,8 +100,16 @@
                
                if ( createCommand == null ) {
                        Table table = 
mapping.getTable(changedObject.getType().getName());
-                       if (table == null ) 
-                               throw new RuntimeException("Table " + 
changedObject.getType().getName() + " was changed in the DataGraph but is not 
present in the Config");
+                       if (table == null ) {
+                               if (changedObject.getType().getProperty("ID") 
!= null ) {
+                                       // If the table is not defined in the 
config, assume it has a primary key of "ID"
+                                       
mapping.addPrimaryKey(changedObject.getType().getName() + ".ID");
+                                       table = 
mapping.getTableByPropertyName(changedObject.getType().getName());
+                               } else {
+                                       throw new RuntimeException("Table " + 
changedObject.getType().getName() + " was changed in the DataGraph but is not 
present in the Config");
+                               }
+                       }
+
        
                        String createStatement = table.getCreate();
                        if ( createStatement == null ) {
@@ -124,8 +132,16 @@
                
                if ( deleteCommand == null ) {
                        Table table = 
mapping.getTable(changedObject.getType().getName());
-                       if (table == null ) 
-                               throw new RuntimeException("Table " + table + " 
was changed in the DataGraph but is not present in the Config");
+                       if (table == null )  {
+                               if (changedObject.getType().getProperty("ID") 
!= null ) {
+                                       // If the table is not defined in the 
config, assume it has a primary key of "ID"
+                                       
mapping.addPrimaryKey(changedObject.getType().getName() + ".ID");
+                                       table = 
mapping.getTableByPropertyName(changedObject.getType().getName());
+                               } else {
+                                       throw new RuntimeException("Table " + 
changedObject.getType().getName() + " was changed in the DataGraph but is not 
present in the Config");
+                               }
+                       }
+                       
                        String deleteStatement = table.getDelete();
                        if ( deleteStatement == null ) {
                                deleteCommand = 
getCudGenerator().getDeleteCommand(table);
@@ -145,8 +161,15 @@
        
                if ( updateCommand == null ) {
                        Table table = 
mapping.getTableByPropertyName(changedObject.getType().getName());
-                       if (table == null ) 
-                               throw new RuntimeException("Table " + table + " 
was changed in the DataGraph but is not present in the Config");
+                       if (table == null ) {
+                               if (changedObject.getType().getProperty("ID") 
!= null ) {
+                                       // If the table is not defined in the 
config, assume it has a primary key of "ID"
+                                       
mapping.addPrimaryKey(changedObject.getType().getName() + ".ID");
+                                       table = 
mapping.getTableByPropertyName(changedObject.getType().getName());
+                               } else {
+                                       throw new RuntimeException("Table " + 
changedObject.getType().getName() + " was changed in the DataGraph but is not 
present in the Config");
+                               }
+                       }
                        String updateStatement = table.getUpdate();
                        if ( updateStatement == null ) {
                                updateCommand = 
getCudGenerator().getUpdateCommand(mapping, changedObject,table);

Reply via email to