Skip to content

Commit af634fb

Browse files
dmealingclaude
andcommitted
refactor(omdb)!: remove diff-and-converge schema-migration engine
Deletes the migration engine itself, atomically with the driver render() surface it was coupled to (DatabaseDriver extends MigrationSqlRenderer; the drivers' render(Change) overrides and their SqlType dialect mappers were mutually dependent with migrate/, so they go together). Deleted: - omdb/.../manager/db/migrate/ (16 files: AllowOptions, BlockedChangesError, Change, ChangeStatusRules, DiffResult, EmitResult, ExpectedSchemaBuilder, JdbcSqlTypes, MigrationEmitter, RenameHints, SchemaDiffer, SchemaIntrospector, SchemaMigrationEngine, SchemaSnapshot, SqlType, ViewBodyBuilder). - omdb/.../manager/db/MigrationSqlRenderer.java (the interface drivers implemented). - omdb migrate unit tests (10 classes under .../db/migrate/) + DriverFloatTypeTest (asserted only on the deleted pgType/derbyType mappers; R6 float wire-fidelity stays covered by integration-tests NormalizationFloatTest). Edited (kept all CRUD/query/codec/paging + the legacy createTable/createIndex/ createForeignKey/createSequence DDL used by MetaClassDBValidatorService): - DatabaseDriver: drop `extends MigrationSqlRenderer`. - GenericSQLDriver: drop the throwing render(Change) default. - PostgresDriver / DerbyDriver: drop render(Change), renderCreateTable, the SqlType type mappers (pgType/derbyType), Postgres' render-only q()/joinQ() helpers, and the migrate-package imports. PostgresDriver keeps quoteIdent (used by the runtime CRUD path + the legacy createTable quoting from the prior commit). The shared manager/db/defs/* model is untouched (runtime mapping model). Verified: om/omdb/maven-plugin/core-spring/omdb-ktx green; integration-tests green under Docker (query 9 pass + 1 deferred, api-contract 20, float 4). No code references the removed engine symbols remain. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 77a5c46 commit af634fb

32 files changed

Lines changed: 1 addition & 2205 deletions

server/java/omdb/src/main/java/com/metaobjects/manager/db/DatabaseDriver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* A Database Driver has specific methods to handle database specific SQL
2727
* calls.
2828
*/
29-
public interface DatabaseDriver extends MigrationSqlRenderer
29+
public interface DatabaseDriver
3030
{
3131
//public final static int AUTO_NONE = ObjectManager.AUTO_NONE;
3232
//public final static int AUTO_PRIOR = ObjectManager.AUTO_PRIOR;

server/java/omdb/src/main/java/com/metaobjects/manager/db/MigrationSqlRenderer.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

server/java/omdb/src/main/java/com/metaobjects/manager/db/driver/DerbyDriver.java

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@
2424
import com.metaobjects.manager.db.defs.SequenceDef;
2525
import com.metaobjects.manager.db.defs.TableDef;
2626
import com.metaobjects.manager.db.defs.ViewDef;
27-
import com.metaobjects.manager.db.migrate.Change;
28-
import com.metaobjects.manager.db.migrate.SchemaSnapshot.ColumnDescriptor;
29-
import com.metaobjects.manager.db.migrate.SchemaSnapshot.TableDescriptor;
30-
import com.metaobjects.manager.db.migrate.SqlType;
3127
import com.metaobjects.manager.exp.Range;
3228

3329
/**
@@ -344,83 +340,6 @@ public String getDateFormat() {
344340
return "yyyy-MM-dd HH:mm:ss";
345341
}
346342

347-
// --- Migration render support ---
348-
349-
/** Maps a canonical SqlType to its Derby DDL type string. */
350-
String derbyType(SqlType t) {
351-
return switch (t) {
352-
case SqlType.Int i -> i.bits() == 64 ? "BIGINT" : "INTEGER";
353-
case SqlType.Text tx -> {
354-
if (tx.maxLength() == null || tx.maxLength() > 32700) yield "CLOB";
355-
yield "VARCHAR(" + tx.maxLength() + ")";
356-
}
357-
case SqlType.Bool b -> "BOOLEAN";
358-
case SqlType.Timestamp ts -> "TIMESTAMP";
359-
case SqlType.Real r -> "DOUBLE";
360-
case SqlType.Real4 r -> "REAL";
361-
case SqlType.Numeric n -> "NUMERIC";
362-
case SqlType.Json j -> "VARCHAR(32700)";
363-
case SqlType.Date d -> "DATE";
364-
case SqlType.Uuid u -> "VARCHAR(36)";
365-
case SqlType.Blob b -> "BLOB";
366-
};
367-
}
368-
369-
/**
370-
* Renders a CREATE TABLE DDL string from a canonical TableDescriptor.
371-
* Used by {@link #render(Change)} for CreateTable changes.
372-
* The existing {@link #createTable(Connection, TableDef)} is left intact so existing tests are unaffected.
373-
*/
374-
String renderCreateTable(TableDescriptor table) {
375-
StringBuilder sb = new StringBuilder("CREATE TABLE ").append(table.name()).append(" (");
376-
List<ColumnDescriptor> cols = table.columns();
377-
for (int i = 0; i < cols.size(); i++) {
378-
if (i > 0) sb.append(", ");
379-
ColumnDescriptor col = cols.get(i);
380-
sb.append(col.name()).append(" ").append(derbyType(col.sqlType()));
381-
if (!col.nullable()) sb.append(" NOT NULL");
382-
}
383-
if (!table.primaryKey().isEmpty()) {
384-
sb.append(", PRIMARY KEY (").append(String.join(", ", table.primaryKey())).append(")");
385-
}
386-
sb.append(")");
387-
return sb.toString();
388-
}
389-
390-
@Override
391-
public String render(Change change) {
392-
return switch (change) {
393-
case Change.CreateTable ct -> renderCreateTable(ct.table());
394-
case Change.AddColumn a ->
395-
"ALTER TABLE " + a.table() + " ADD COLUMN " + a.column().name() + " " + derbyType(a.column().sqlType());
396-
case Change.ChangeColumnType ch ->
397-
"ALTER TABLE " + ch.table() + " ALTER COLUMN " + ch.column() + " SET DATA TYPE " + derbyType(ch.to());
398-
case Change.RenameColumn rc ->
399-
"RENAME COLUMN " + rc.table() + "." + rc.from() + " TO " + rc.to();
400-
case Change.RenameTable rt ->
401-
"RENAME TABLE " + rt.from() + " TO " + rt.to();
402-
case Change.AddIndex ai ->
403-
"CREATE " + (ai.index().unique() ? "UNIQUE " : "") + "INDEX " + ai.index().name() +
404-
" ON " + ai.table() + "(" + String.join(",", ai.index().columns()) + ")";
405-
case Change.AddFk af ->
406-
"ALTER TABLE " + af.table() + " ADD CONSTRAINT " + af.fk().name() +
407-
" FOREIGN KEY (" + String.join(",", af.fk().columns()) + ") REFERENCES " +
408-
af.fk().refTable() + " (" + String.join(",", af.fk().refColumns()) + ")";
409-
case Change.CreateView cv ->
410-
"CREATE VIEW " + cv.view().name() + " AS " + cv.view().sql();
411-
case Change.DropColumn dc ->
412-
"ALTER TABLE " + dc.table() + " DROP COLUMN " + dc.column();
413-
case Change.DropTable dt ->
414-
"DROP TABLE " + dt.table();
415-
case Change.DropIndex di ->
416-
"DROP INDEX " + di.index();
417-
case Change.DropFk df ->
418-
"ALTER TABLE " + df.table() + " DROP CONSTRAINT " + df.fk();
419-
default -> throw new UnsupportedOperationException(
420-
"DerbyDriver does not support migration render for change kind: " + change.kind());
421-
};
422-
}
423-
424343
@Override
425344
public String toString() {
426345
return "Apache Derby Database Driver (Enhanced for Derby 10.15+)";

server/java/omdb/src/main/java/com/metaobjects/manager/db/driver/GenericSQLDriver.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,11 +1774,4 @@ protected void parseField(Object o, MetaField f, ResultSet rs, int j) throws SQL
17741774
public String toString() {
17751775
return getClass().getSimpleName();
17761776
}
1777-
1778-
// --- MigrationSqlRenderer default: subclasses override for supported dialects ---
1779-
@Override
1780-
public String render(com.metaobjects.manager.db.migrate.Change change) {
1781-
throw new UnsupportedOperationException(
1782-
getClass().getSimpleName() + " does not implement migration render for " + change.kind());
1783-
}
17841777
}

server/java/omdb/src/main/java/com/metaobjects/manager/db/driver/PostgresDriver.java

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@
2626
import com.metaobjects.manager.db.defs.SequenceDef;
2727
import com.metaobjects.manager.db.defs.TableDef;
2828
import com.metaobjects.manager.db.defs.ViewDef;
29-
import com.metaobjects.manager.db.migrate.Change;
30-
import com.metaobjects.manager.db.migrate.SchemaSnapshot.ColumnDescriptor;
31-
import com.metaobjects.manager.db.migrate.SchemaSnapshot.TableDescriptor;
32-
import com.metaobjects.manager.db.migrate.SqlType;
3329
import com.metaobjects.manager.exp.Range;
3430

3531
/**
@@ -361,101 +357,6 @@ protected String quoteIdent(String name) {
361357
return "\"" + name + "\"";
362358
}
363359

364-
/** Maps a canonical SqlType to its PostgreSQL DDL type string. */
365-
String pgType(SqlType t) {
366-
return switch (t) {
367-
case SqlType.Int i -> i.bits() == 64 ? "BIGINT" : "INTEGER";
368-
case SqlType.Text tx -> tx.maxLength() == null ? "TEXT" : "VARCHAR(" + tx.maxLength() + ")";
369-
case SqlType.Bool b -> "BOOLEAN";
370-
// Honor the withTimezone flag so a plain TIMESTAMP doesn't get
371-
// gratuitously promoted to TIMESTAMPTZ (matches TS/C# behavior).
372-
case SqlType.Timestamp ts -> ts.withTimezone() ? "TIMESTAMP WITH TIME ZONE" : "TIMESTAMP";
373-
case SqlType.Real r -> "DOUBLE PRECISION";
374-
case SqlType.Real4 r -> "REAL";
375-
case SqlType.Numeric n -> "NUMERIC";
376-
case SqlType.Json j -> "JSONB";
377-
case SqlType.Date d -> "DATE";
378-
case SqlType.Uuid u -> "UUID";
379-
case SqlType.Blob b -> "BYTEA";
380-
};
381-
}
382-
383-
/**
384-
* Double-quote a Postgres identifier so mixed-case names (e.g. {@code programId})
385-
* survive PG's case-folding pass. Cross-port: TS + C# both quote all idents
386-
* in their migration DDL; matching this here lets {@code up-contains}
387-
* substring assertions compare cleanly across ports.
388-
*/
389-
private static String q(String ident) {
390-
if (ident.indexOf('"') >= 0) throw new IllegalArgumentException("unsafe identifier: " + ident);
391-
return "\"" + ident + "\"";
392-
}
393-
394-
private static String joinQ(List<String> idents) {
395-
StringBuilder sb = new StringBuilder();
396-
for (int i = 0; i < idents.size(); i++) {
397-
if (i > 0) sb.append(", ");
398-
sb.append(q(idents.get(i)));
399-
}
400-
return sb.toString();
401-
}
402-
403-
/**
404-
* Renders a CREATE TABLE DDL string from a canonical TableDescriptor.
405-
* Used by {@link #render(Change)} for CreateTable changes.
406-
* The existing {@link #createTable(Connection, TableDef)} is left intact so FruitDBTest is unaffected.
407-
*/
408-
String renderCreateTable(TableDescriptor table) {
409-
StringBuilder sb = new StringBuilder("CREATE TABLE ").append(q(table.name())).append(" (");
410-
List<ColumnDescriptor> cols = table.columns();
411-
for (int i = 0; i < cols.size(); i++) {
412-
if (i > 0) sb.append(", ");
413-
ColumnDescriptor col = cols.get(i);
414-
sb.append(q(col.name())).append(" ").append(pgType(col.sqlType()));
415-
if (!col.nullable()) sb.append(" NOT NULL");
416-
}
417-
if (!table.primaryKey().isEmpty()) {
418-
sb.append(", CONSTRAINT ").append(q(table.name() + "_pkey"))
419-
.append(" PRIMARY KEY (").append(joinQ(table.primaryKey())).append(")");
420-
}
421-
sb.append(")");
422-
return sb.toString();
423-
}
424-
425-
@Override
426-
public String render(Change change) {
427-
return switch (change) {
428-
case Change.CreateTable ct -> renderCreateTable(ct.table());
429-
case Change.AddColumn a ->
430-
"ALTER TABLE " + q(a.table()) + " ADD COLUMN " + q(a.column().name()) + " " + pgType(a.column().sqlType());
431-
case Change.ChangeColumnType ch ->
432-
"ALTER TABLE " + q(ch.table()) + " ALTER COLUMN " + q(ch.column()) + " TYPE " + pgType(ch.to());
433-
case Change.RenameColumn rc ->
434-
"ALTER TABLE " + q(rc.table()) + " RENAME COLUMN " + q(rc.from()) + " TO " + q(rc.to());
435-
case Change.RenameTable rt ->
436-
"ALTER TABLE " + q(rt.from()) + " RENAME TO " + q(rt.to());
437-
case Change.AddIndex ai ->
438-
"CREATE " + (ai.index().unique() ? "UNIQUE " : "") + "INDEX " + q(ai.index().name()) +
439-
" ON " + q(ai.table()) + " (" + joinQ(ai.index().columns()) + ")";
440-
case Change.AddFk af ->
441-
"ALTER TABLE " + q(af.table()) + " ADD CONSTRAINT " + q(af.fk().name()) +
442-
" FOREIGN KEY (" + joinQ(af.fk().columns()) + ") REFERENCES " +
443-
q(af.fk().refTable()) + " (" + joinQ(af.fk().refColumns()) + ")";
444-
case Change.CreateView cv ->
445-
"CREATE OR REPLACE VIEW " + q(cv.view().name()) + " AS " + cv.view().sql();
446-
case Change.DropColumn dc ->
447-
"ALTER TABLE " + q(dc.table()) + " DROP COLUMN " + q(dc.column());
448-
case Change.DropTable dt ->
449-
"DROP TABLE " + q(dt.table());
450-
case Change.DropIndex di ->
451-
"DROP INDEX " + q(di.index());
452-
case Change.DropFk df ->
453-
"ALTER TABLE " + q(df.table()) + " DROP CONSTRAINT " + q(df.fk());
454-
default -> throw new UnsupportedOperationException(
455-
"PostgresDriver does not support migration render for change kind: " + change.kind());
456-
};
457-
}
458-
459360
@Override
460361
public String toString() {
461362
return "PostgreSQL Database Driver (Enhanced for PostgreSQL 14+)";

server/java/omdb/src/main/java/com/metaobjects/manager/db/migrate/AllowOptions.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

server/java/omdb/src/main/java/com/metaobjects/manager/db/migrate/BlockedChangesError.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)