Search in sources :

Example 51 with Column

use of org.jumpmind.db.model.Column in project symmetric-ds by JumpMind.

the class AbstractTriggerTemplate method createInitalLoadSql.

public String createInitalLoadSql(Node node, TriggerRouter triggerRouter, Table originalTable, TriggerHistory triggerHistory, Channel channel, String overrideSelectSql) {
    IParameterService parameterService = symmetricDialect.getParameterService();
    boolean dateTimeAsString = parameterService.is(ParameterConstants.DATA_LOADER_TREAT_DATETIME_AS_VARCHAR);
    boolean concatInCsv = parameterService.is(ParameterConstants.INITIAL_LOAD_CONCAT_CSV_IN_SQL_ENABLED);
    Table table = originalTable.copyAndFilterColumns(triggerHistory.getParsedColumnNames(), triggerHistory.getParsedPkColumnNames(), true);
    Column[] columns = table.getColumns();
    String textColumnExpression = parameterService.getString(ParameterConstants.DATA_EXTRACTOR_TEXT_COLUMN_EXPRESSION);
    String sql = null;
    String tableAlias = symmetricDialect.getInitialLoadTableAlias();
    if (concatInCsv) {
        sql = sqlTemplates.get(INITIAL_LOAD_SQL_TEMPLATE);
        String columnsText = buildColumnsString(tableAlias, tableAlias, "", columns, DataEventType.INSERT, false, channel, triggerRouter.getTrigger()).columnString;
        if (isNotBlank(textColumnExpression)) {
            columnsText = textColumnExpression.replace("$(columnName)", columnsText);
        }
        sql = FormatUtils.replace("columns", columnsText, sql);
    } else {
        sql = "select $(columns) from $(schemaName)$(tableName) t where $(whereClause)";
        StringBuilder columnList = new StringBuilder();
        for (int i = 0; i < columns.length; i++) {
            Column column = columns[i];
            if (column != null) {
                if (i > 0) {
                    columnList.append(",");
                }
                boolean isLob = symmetricDialect.getPlatform().isLob(column.getMappedTypeCode());
                if (!(isLob && triggerRouter.getTrigger().isUseStreamLobs())) {
                    String columnExpression = null;
                    if (useTriggerTemplateForColumnTemplatesDuringInitialLoad()) {
                        ColumnString columnString = fillOutColumnTemplate(tableAlias, tableAlias, "", column, DataEventType.INSERT, false, channel, triggerRouter.getTrigger());
                        columnExpression = columnString.columnString;
                        if (isNotBlank(textColumnExpression) && TypeMap.isTextType(column.getMappedTypeCode())) {
                            columnExpression = textColumnExpression.replace("$(columnName)", columnExpression);
                        }
                    } else {
                        columnExpression = SymmetricUtils.quote(symmetricDialect, column.getName());
                        if (dateTimeAsString && TypeMap.isDateTimeType(column.getMappedTypeCode())) {
                            columnExpression = castDatetimeColumnToString(column.getName());
                        } else if (isNotBlank(textColumnExpression) && TypeMap.isTextType(column.getMappedTypeCode())) {
                            columnExpression = textColumnExpression.replace("$(columnName)", columnExpression);
                        }
                    }
                    columnList.append(columnExpression).append(" as ").append("x__").append(i);
                } else {
                    columnList.append(" ").append(emptyColumnTemplate).append(" as ").append("x__").append(i);
                }
            }
        }
        sql = FormatUtils.replace("columns", columnList.toString(), sql);
    }
    String initialLoadSelect = StringUtils.isBlank(triggerRouter.getInitialLoadSelect()) ? Constants.ALWAYS_TRUE_CONDITION : triggerRouter.getInitialLoadSelect();
    if (StringUtils.isNotBlank(overrideSelectSql)) {
        initialLoadSelect = overrideSelectSql;
    }
    sql = FormatUtils.replace("whereClause", initialLoadSelect, sql);
    sql = FormatUtils.replace("tableName", SymmetricUtils.quote(symmetricDialect, table.getName()), sql);
    sql = FormatUtils.replace("schemaName", triggerHistory == null ? getSourceTablePrefix(originalTable) : getSourceTablePrefix(triggerHistory), sql);
    sql = FormatUtils.replace("primaryKeyWhereString", getPrimaryKeyWhereString(symmetricDialect.getInitialLoadTableAlias(), table.hasPrimaryKey() ? table.getPrimaryKeyColumns() : table.getColumns()), sql);
    // Replace these parameters to give the initiaLoadContition a chance to
    // reference the node that is being loaded
    sql = FormatUtils.replace("groupId", node.getNodeGroupId(), sql);
    sql = FormatUtils.replace("externalId", node.getExternalId(), sql);
    sql = FormatUtils.replace("nodeId", node.getNodeId(), sql);
    sql = replaceDefaultSchemaAndCatalog(sql);
    sql = FormatUtils.replace("prefixName", symmetricDialect.getTablePrefix(), sql);
    sql = FormatUtils.replace("oracleToClob", triggerRouter.getTrigger().isUseCaptureLobs() ? "to_clob('')||" : "", sql);
    return sql;
}
Also used : Table(org.jumpmind.db.model.Table) Column(org.jumpmind.db.model.Column) IParameterService(org.jumpmind.symmetric.service.IParameterService)

Example 52 with Column

use of org.jumpmind.db.model.Column in project symmetric-ds by JumpMind.

the class AseDdlBuilder method processChange.

/*
     * Processes the change of the default value of a column. Note that this
     * method is only used if it is the only change to that column.
     */
protected void processChange(Database currentModel, Database desiredModel, ColumnDefaultValueChange change, StringBuilder ddl) {
    ddl.append("ALTER TABLE ");
    ddl.append(getFullyQualifiedTableNameShorten(change.getChangedTable()));
    printIndent(ddl);
    ddl.append("REPLACE ");
    printIdentifier(getColumnName(change.getChangedColumn()), ddl);
    Table curTable = currentModel.findTable(change.getChangedTable().getName(), delimitedIdentifierModeOn);
    Column curColumn = curTable.findColumn(change.getChangedColumn().getName(), delimitedIdentifierModeOn);
    ddl.append(" DEFAULT ");
    if (isValidDefaultValue(change.getNewDefaultValue(), curColumn.getMappedTypeCode())) {
        printDefaultValue(change.getNewDefaultValue(), curColumn.getMappedTypeCode(), ddl);
    } else {
        ddl.append("NULL");
    }
    printEndOfStatement(ddl);
    change.apply(currentModel, delimitedIdentifierModeOn);
}
Also used : Table(org.jumpmind.db.model.Table) Column(org.jumpmind.db.model.Column)

Example 53 with Column

use of org.jumpmind.db.model.Column in project symmetric-ds by JumpMind.

the class AseDdlBuilder method processTableStructureChanges.

@Override
protected void processTableStructureChanges(Database currentModel, Database desiredModel, Table sourceTable, Table targetTable, List<TableChange> changes, StringBuilder ddl) {
    // First we drop primary keys as necessary
    for (Iterator changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = (TableChange) changeIt.next();
        if (change instanceof RemovePrimaryKeyChange) {
            processChange(currentModel, desiredModel, (RemovePrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            RemovePrimaryKeyChange removePkChange = new RemovePrimaryKeyChange(pkChange.getChangedTable(), pkChange.getOldPrimaryKeyColumns());
            processChange(currentModel, desiredModel, removePkChange, ddl);
        }
    }
    HashMap columnChanges = new HashMap();
    // Next we add/remove columns
    for (Iterator changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = (TableChange) changeIt.next();
        if (change instanceof AddColumnChange) {
            AddColumnChange addColumnChange = (AddColumnChange) change;
            // Sybase can only add not insert columns
            if (addColumnChange.isAtEnd()) {
                processChange(currentModel, desiredModel, addColumnChange, ddl);
                changeIt.remove();
            }
        } else if (change instanceof CopyColumnValueChange) {
            CopyColumnValueChange copyColumnChange = (CopyColumnValueChange) change;
            processChange(currentModel, desiredModel, copyColumnChange, ddl);
            changeIt.remove();
        } else if (change instanceof RemoveColumnChange) {
            processChange(currentModel, desiredModel, (RemoveColumnChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof ColumnAutoIncrementChange) {
            // Sybase has no way of adding or removing an IDENTITY
            // constraint
            // Thus we have to rebuild the table anyway and can ignore all
            // the other
            // column changes
            columnChanges = null;
        } else if ((change instanceof ColumnChange) && (columnChanges != null)) {
            // we gather all changed columns because we can use the ALTER
            // TABLE ALTER COLUMN
            // statement for them
            ColumnChange columnChange = (ColumnChange) change;
            ArrayList changesPerColumn = (ArrayList) columnChanges.get(columnChange.getChangedColumn());
            if (changesPerColumn == null) {
                changesPerColumn = new ArrayList();
                columnChanges.put(columnChange.getChangedColumn(), changesPerColumn);
            }
            changesPerColumn.add(change);
        }
    }
    if (columnChanges != null) {
        for (Iterator changesPerColumnIt = columnChanges.entrySet().iterator(); changesPerColumnIt.hasNext(); ) {
            Map.Entry entry = (Map.Entry) changesPerColumnIt.next();
            Column sourceColumn = (Column) entry.getKey();
            ArrayList changesPerColumn = (ArrayList) entry.getValue();
            // different handler
            if ((changesPerColumn.size() == 1) && (changesPerColumn.get(0) instanceof ColumnDefaultValueChange)) {
                processChange(currentModel, desiredModel, (ColumnDefaultValueChange) changesPerColumn.get(0), ddl);
            } else {
                Column targetColumn = targetTable.findColumn(sourceColumn.getName(), delimitedIdentifierModeOn);
                processColumnChange(sourceTable, targetTable, sourceColumn, targetColumn, ddl);
            }
            for (Iterator changeIt = changesPerColumn.iterator(); changeIt.hasNext(); ) {
                ((ColumnChange) changeIt.next()).apply(currentModel, delimitedIdentifierModeOn);
            }
        }
    }
    // Finally we add primary keys
    for (Iterator changeIt = changes.iterator(); changeIt.hasNext(); ) {
        TableChange change = (TableChange) changeIt.next();
        if (change instanceof AddPrimaryKeyChange) {
            processChange(currentModel, desiredModel, (AddPrimaryKeyChange) change, ddl);
            changeIt.remove();
        } else if (change instanceof PrimaryKeyChange) {
            PrimaryKeyChange pkChange = (PrimaryKeyChange) change;
            AddPrimaryKeyChange addPkChange = new AddPrimaryKeyChange(pkChange.getChangedTable(), pkChange.getNewPrimaryKeyColumns());
            processChange(currentModel, desiredModel, addPkChange, ddl);
            changeIt.remove();
        }
    }
}
Also used : CopyColumnValueChange(org.jumpmind.db.alter.CopyColumnValueChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ColumnDefaultValueChange(org.jumpmind.db.alter.ColumnDefaultValueChange) ColumnChange(org.jumpmind.db.alter.ColumnChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) Column(org.jumpmind.db.model.Column) PrimaryKeyChange(org.jumpmind.db.alter.PrimaryKeyChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) RemovePrimaryKeyChange(org.jumpmind.db.alter.RemovePrimaryKeyChange) RemoveColumnChange(org.jumpmind.db.alter.RemoveColumnChange) Iterator(java.util.Iterator) ColumnAutoIncrementChange(org.jumpmind.db.alter.ColumnAutoIncrementChange) AddPrimaryKeyChange(org.jumpmind.db.alter.AddPrimaryKeyChange) AddColumnChange(org.jumpmind.db.alter.AddColumnChange) HashMap(java.util.HashMap) Map(java.util.Map) TableChange(org.jumpmind.db.alter.TableChange)

Example 54 with Column

use of org.jumpmind.db.model.Column in project symmetric-ds by JumpMind.

the class OracleDdlBuilder method processChange.

protected void processChange(Database currentModel, Database desiredModel, ColumnRequiredChange change, StringBuilder ddl) {
    boolean required = !change.getChangedColumn().isRequired();
    writeTableAlterStmt(change.getChangedTable(), ddl);
    ddl.append(" MODIFY (");
    Column column = change.getChangedColumn();
    printIdentifier(getColumnName(column), ddl);
    if (required) {
        ddl.append(" NOT NULL ");
    } else {
        ddl.append(" NULL ");
    }
    ddl.append(" )");
    printEndOfStatement(ddl);
}
Also used : Column(org.jumpmind.db.model.Column)

Example 55 with Column

use of org.jumpmind.db.model.Column in project symmetric-ds by JumpMind.

the class OracleDdlBuilder method writeAlterColumnDataTypeToBigInt.

@Override
protected boolean writeAlterColumnDataTypeToBigInt(ColumnDataTypeChange change, StringBuilder ddl) {
    writeTableAlterStmt(change.getChangedTable(), ddl);
    ddl.append("MODIFY (");
    Column column = change.getChangedColumn();
    column.setTypeCode(change.getNewTypeCode());
    printIdentifier(getColumnName(column), ddl);
    ddl.append(" ");
    ddl.append(getSqlType(column));
    ddl.append(")");
    printEndOfStatement(ddl);
    return true;
}
Also used : Column(org.jumpmind.db.model.Column)

Aggregations

Column (org.jumpmind.db.model.Column)179 Table (org.jumpmind.db.model.Table)78 ArrayList (java.util.ArrayList)34 IndexColumn (org.jumpmind.db.model.IndexColumn)23 PlatformColumn (org.jumpmind.db.model.PlatformColumn)21 Test (org.junit.Test)16 Row (org.jumpmind.db.sql.Row)15 LinkedHashMap (java.util.LinkedHashMap)12 ResultSet (java.sql.ResultSet)11 DmlStatement (org.jumpmind.db.sql.DmlStatement)10 SqlException (org.jumpmind.db.sql.SqlException)10 InvocationTargetException (java.lang.reflect.InvocationTargetException)9 IIndex (org.jumpmind.db.model.IIndex)9 HashMap (java.util.HashMap)8 ForeignKey (org.jumpmind.db.model.ForeignKey)8 CsvData (org.jumpmind.symmetric.io.data.CsvData)8 PreparedStatement (java.sql.PreparedStatement)7 IOException (java.io.IOException)6 SQLException (java.sql.SQLException)6 Reference (org.jumpmind.db.model.Reference)6