protected int[] indexesForColumns(List<Column> columns) { int[] recordIndexes = new int[columns.size()]; AtomicInteger i = new AtomicInteger(0); columns.forEach(column -> { recordIndexes[i.getAndIncrement()] = column.position() - 1; // position is 1-based, indexes 0-based }); return recordIndexes; }
protected boolean positionsAreValid() { AtomicInteger position = new AtomicInteger(1); return sortedColumns.values().stream().allMatch(defn -> defn.position() == position.getAndIncrement()); }
if (columnToMove == null) throw new IllegalArgumentException("No column with name '" + columnName + "'"); Column afterColumn = afterColumnName == null ? null : columnWithName(afterColumnName); if (afterColumn != null && (afterColumn.position() + 1) == columnToMove.position()) { } else if ( afterColumn == null && columnToMove.position() == 1) { if (afterColumn != null && afterColumn.position() == sortedColumns.size()) {
protected void updatePositions() { AtomicInteger position = new AtomicInteger(1); sortedColumns.replaceAll((name, defn) -> { // Decrement the position ... int nextPosition = position.getAndIncrement(); if (defn.position() != nextPosition) { return defn.edit().position(nextPosition).create(); } return defn; }); }
protected void add(Column defn) { if (defn != null) { Column existing = columnWithName(defn.name()); int position = existing != null ? existing.position() : sortedColumns.size() + 1; sortedColumns.put(defn.name().toLowerCase(), defn.edit().position(position).create()); } assert positionsAreValid(); }
protected void assertValidPositions(TableEditor editor) { AtomicInteger position = new AtomicInteger(1); assertThat(editor.columns().stream().allMatch(defn -> defn.position() == position.getAndIncrement())).isTrue(); }
protected void assertValidPositions(Table editor) { AtomicInteger position = new AtomicInteger(1); assertThat(editor.columns().stream().allMatch(defn -> defn.position() == position.getAndIncrement())).isTrue(); } }
@Override public boolean equals(Object obj) { if (obj == this) return true; if (obj instanceof Column) { Column that = (Column) obj; return this.name().equalsIgnoreCase(that.name()) && this.typeExpression().equalsIgnoreCase(that.typeExpression()) && this.typeName().equalsIgnoreCase(that.typeName()) && this.jdbcType() == that.jdbcType() && Strings.equalsIgnoreCase(this.charsetName(),that.charsetName()) && this.position() == that.position() && this.length() == that.length() && this.scale().equals(that.scale()) && this.isOptional() == that.isOptional() && this.isAutoIncremented() == that.isAutoIncremented() && this.isGenerated() == that.isGenerated() && Objects.equals(this.defaultValue(), that.defaultValue()) && this.hasDefaultValue() == that.hasDefaultValue(); } return false; }
int position = table.columnWithName(columnName).position() - 1; if (position < 0) { logger.warn(
@FixFor("DBZ-193") @Test public void shouldParseFulltextKeyInCreateTable() { parser.parse(readFile("ddl/mysql-dbz-193.ddl"), tables); Testing.print(tables); assertThat(tables.size()).isEqualTo(1); // 1 table assertThat(listener.total()).isEqualTo(1); listener.forEach(this::printEvent); Table t = tables.forTable(new TableId(null, null, "roles")); assertThat(t).isNotNull(); assertThat(t.retrieveColumnNames()).containsExactly("id", "name", "context", "organization_id", "client_id", "scope_action_ids"); assertThat(t.primaryKeyColumnNames()).containsExactly("id"); assertColumn(t, "id", "VARCHAR", Types.VARCHAR, 32, -1, false, false, false); assertColumn(t, "name", "VARCHAR", Types.VARCHAR, 100, -1, false, false, false); assertColumn(t, "context", "VARCHAR", Types.VARCHAR, 20, -1, false, false, false); assertColumn(t, "organization_id", "INT", Types.INTEGER, 11, -1, true, false, false); assertColumn(t, "client_id", "VARCHAR", Types.VARCHAR, 32, -1, false, false, false); assertColumn(t, "scope_action_ids", "TEXT", Types.VARCHAR, -1, -1, false, false, false); assertThat(t.columnWithName("id").position()).isEqualTo(1); assertThat(t.columnWithName("name").position()).isEqualTo(2); assertThat(t.columnWithName("context").position()).isEqualTo(3); assertThat(t.columnWithName("organization_id").position()).isEqualTo(4); assertThat(t.columnWithName("client_id").position()).isEqualTo(5); assertThat(t.columnWithName("scope_action_ids").position()).isEqualTo(6); }
private Document toDocument(Column column) { Document document = Document.create(); document.setString("name", column.name()); document.setNumber("jdbcType", column.jdbcType()); if (column.nativeType() != Column.UNSET_INT_VALUE) { document.setNumber("nativeType", column.nativeType()); } document.setString("typeName", column.typeName()); document.setString("typeExpression", column.typeExpression()); document.setString("charsetName", column.charsetName()); if (column.length() != Column.UNSET_INT_VALUE) { document.setNumber("length", column.length()); } column.scale().ifPresent(s -> document.setNumber("scale", s)); document.setNumber("position", column.position()); document.setBoolean("optional", column.isOptional()); document.setBoolean("autoIncremented", column.isAutoIncremented()); document.setBoolean("generated", column.isGenerated()); return document; }
@Override public void shouldParseTimeWithNowDefault() { String ddl = "CREATE TABLE t1 ( " + "c1 int primary key auto_increment, " + "c2 datetime, " + "c3 datetime on update now(), " + "c4 char(4));"; parser.parse(ddl, tables); assertThat(tables.size()).isEqualTo(1); assertThat(listener.total()).isEqualTo(1); Table t = tables.forTable(new TableId(null, null, "t1")); assertThat(t).isNotNull(); assertThat(t.retrieveColumnNames()).containsExactly("c1", "c2", "c3", "c4"); assertThat(t.primaryKeyColumnNames()).containsExactly("c1"); assertColumn(t, "c1", "INT", Types.INTEGER, -1, -1, false, true, true); assertColumn(t, "c2", "DATETIME", Types.TIMESTAMP, -1, -1, true, false, false); assertColumn(t, "c3", "DATETIME", Types.TIMESTAMP, -1, -1, true, true, true); assertColumn(t, "c4", "CHAR", Types.CHAR, 4, -1, true, false, false); assertThat(t.columnWithName("c1").position()).isEqualTo(1); assertThat(t.columnWithName("c2").position()).isEqualTo(2); assertThat(t.columnWithName("c3").position()).isEqualTo(3); assertThat(t.columnWithName("c4").position()).isEqualTo(4); }
@Test @FixFor("DBZ-169") public void shouldParseTimeWithNowDefault() { String ddl = "CREATE TABLE t1 ( " + "c1 int primary key auto_increment, " + "c2 datetime, " + "c3 datetime on update now(), " + "c4 char(4));"; parser.parse(ddl, tables); assertThat(tables.size()).isEqualTo(1); assertThat(listener.total()).isEqualTo(1); Table t = tables.forTable(new TableId(null, null, "t1")); assertThat(t).isNotNull(); assertThat(t.retrieveColumnNames()).containsExactly("c1", "c2", "c3", "c4"); assertThat(t.primaryKeyColumnNames()).containsExactly("c1"); assertColumn(t, "c1", "INT", Types.INTEGER, -1, -1, false, true, true); assertColumn(t, "c2", "DATETIME", Types.TIMESTAMP, -1, -1, true, false, false); assertColumn(t, "c3", "DATETIME", Types.TIMESTAMP, -1, -1, true, false, true); assertColumn(t, "c4", "CHAR", Types.CHAR, 4, -1, true, false, false); assertThat(t.columnWithName("c1").position()).isEqualTo(1); assertThat(t.columnWithName("c2").position()).isEqualTo(2); assertThat(t.columnWithName("c3").position()).isEqualTo(3); assertThat(t.columnWithName("c4").position()).isEqualTo(4); }
@Test public void shouldParseCreateTableWithEnumAndSetColumns() { String ddl = "CREATE TABLE t ( c1 ENUM('a','b','c') NOT NULL, c2 SET('a','b','c') NULL);"; parser.parse(ddl, tables); assertThat(tables.size()).isEqualTo(1); Table t = tables.forTable(new TableId(null, null, "t")); assertThat(t).isNotNull(); assertThat(t.retrieveColumnNames()).containsExactly("c1", "c2"); assertThat(t.primaryKeyColumnNames()).isEmpty(); assertColumn(t, "c1", "ENUM", Types.CHAR, 1, -1, false, false, false); assertColumn(t, "c2", "SET", Types.CHAR, 5, -1, true, false, false); assertThat(t.columnWithName("c1").position()).isEqualTo(1); assertThat(t.columnWithName("c2").position()).isEqualTo(2); }
assertThat(t.primaryKeyColumnNames()).isEmpty(); assertColumn(t, "col1", "VARCHAR", Types.VARCHAR, 25, -1, true, false, false); assertThat(t.columnWithName("col1").position()).isEqualTo(1); assertColumn(t2, "col1", "VARCHAR", Types.VARCHAR, 25, -1, true, false, false); assertColumn(t2, "col2", "VARCHAR", Types.VARCHAR, 50, -1, false, false, false); assertThat(t2.columnWithName("col1").position()).isEqualTo(1); assertThat(t2.columnWithName("col2").position()).isEqualTo(2); assertColumn(t3, "col3", "FLOAT", Types.FLOAT, -1, -1, false, false, false); assertColumn(t3, "col2", "VARCHAR", Types.VARCHAR, 50, -1, false, false, false); assertThat(t3.columnWithName("col1").position()).isEqualTo(1); assertThat(t3.columnWithName("col3").position()).isEqualTo(2); assertThat(t3.columnWithName("col2").position()).isEqualTo(3);
@Test public void shouldCreateColumnWithAllFieldsSetToDefaults() { Column column = editor.create(); assertThat(column.name()).isNull(); assertThat(column.typeName()).isNull(); assertThat(column.jdbcType()).isEqualTo(Types.INTEGER); assertThat(column.length()).isEqualTo(-1); Assert.assertFalse(column.scale().isPresent()); assertThat(column.position()).isEqualTo(1); assertThat(column.isOptional()).isTrue(); assertThat(column.isAutoIncremented()).isFalse(); assertThat(column.isGenerated()).isFalse(); }
@Test public void shouldAllowAddingPrimaryKeyColumnWhenFound() { editor.tableId(id); Column c1 = columnEditor.name("C1").type("VARCHAR").jdbcType(Types.VARCHAR).length(10).position(1).create(); Column c2 = columnEditor.name("C2").type("NUMBER").jdbcType(Types.NUMERIC).length(5).position(1).create(); Column c3 = columnEditor.name("C3").type("DATE").jdbcType(Types.DATE).position(1).create(); editor.addColumns(c1, c2, c3); editor.setPrimaryKeyNames("C1"); c1 = editor.columnWithName(c1.name()); c2 = editor.columnWithName(c2.name()); c3 = editor.columnWithName(c3.name()); assertThat(c1.position()).isEqualTo(1); assertThat(c2.position()).isEqualTo(2); assertThat(c3.position()).isEqualTo(3); table = editor.create(); assertThat(table.retrieveColumnNames()).containsExactly("C1", "C2", "C3"); assertThat(table.columns()).containsExactly(c1, c2, c3); assertThat(table.primaryKeyColumnNames()).containsOnly("C1"); assertValidPositions(editor); }
@Test public void shouldCreateColumnWithAllFieldsSetToNonDefaults() { createColumnWithAllFieldsSetToNonDefaults(); assertThat(column.name()).isEqualTo("price"); assertThat(column.typeName()).isEqualTo("NUMBER"); assertThat(column.jdbcType()).isEqualTo(Types.DOUBLE); assertThat(column.length()).isEqualTo(5); assertThat(column.scale().get()).isEqualTo(2); assertThat(column.position()).isEqualTo(4); assertThat(column.isOptional()).isTrue(); assertThat(column.isAutoIncremented()).isTrue(); assertThat(column.isGenerated()).isTrue(); }