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]