public UpdateCommandImpl getUpdateCommand()

in rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java [69:184]


    public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, DataObject changedObject, Table table) {      
        List parameters = new ArrayList();
        Type type = changedObject.getType();
        TableWrapper tableWrapper = new TableWrapper(table);
        // get changed fields 
        ChangeSummary summary = changedObject.getDataGraph().getChangeSummary();
        HashSet changedFields = getChangedFields(mapping, summary, changedObject, tableWrapper); 
        // if there are no changed fields return null
        if (changedFields.size() == 0) {
        	return null; 
        }
        // compose statement 
        StringBuffer statement = new StringBuffer("update ");
        if(mapping.getConfig().isDatabaseSchemaNameSupported()){
        	statement.append(table.getSchemaName()+"."+table.getTableName());
        }
        else{
        	statement.append(table.getTableName());
        }
        statement.append(" set ");

        Iterator i = changedFields.iterator();
      
        int idx = 1;
        while (i.hasNext()) {
            Property property = (Property) i.next();
            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 = tableWrapper.getManagedColumn();
        if (c != null) {
            appendFieldSet(statement, idx > 1, c.getColumnName());
            String propertyName = c.getPropertyName() == null ? c.getColumnName() : c.getPropertyName();
            parameters.add(createManagedParameter(tableWrapper, 
                    changedObject.getInstanceProperty(propertyName), idx++));
        }
        
        statement.append(" where ");

        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();
            
            if(!isContained(changedFields, propertyName)) {//if PK itself is changed, don't add here, will get added below as collision parameter
	            statement.append(columnName);
	            statement.append(" = ?");
	            if (pkColumnNames.hasNext() && pkPropertyNames.hasNext()) {
	                statement.append(" and ");
	            }
	            parameters.add(createParameter(tableWrapper, type.getProperty(propertyName), idx++));
            }
        }

        if (tableWrapper.getCollisionColumn() == null) {
            Iterator iter = changedFields.iterator();
            while (iter.hasNext()) {
            	if(statement.lastIndexOf(" where ") != statement.length()-7)
            		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 {
                	ParameterExtendedImpl param = createCollisionParameter(tableWrapper, changedProperty, idx++);
                    statement.append(" = ?");
                    param.setValue(value);
                    parameters.add(param);
                }
                
               
            }
           
        } else {
        	if(statement.lastIndexOf(" where ") != statement.length()-7)
        		statement.append(" and ");

        	statement.append(tableWrapper.getCollisionColumn().getColumnName());
            statement.append(" = ?");
            parameters.add(createParameter(tableWrapper, 
                    type.getProperty(tableWrapper.getCollisionColumnPropertyName()), idx++));                       
        }                  

        UpdateCommandImpl updateCommand = new OptimisticWriteCommandImpl(statement.toString());
        
        Iterator params = parameters.iterator();
        while (params.hasNext()) {     
        	ParameterExtendedImpl ptemp = (ParameterExtendedImpl) params.next();
        	updateCommand.addParameter(ptemp);
        }
           
        if (this.logger.isDebugEnabled()) {
            this.logger.debug(statement.toString());
        }

        return updateCommand;
    }