use of org.openforis.collect.relational.model.Column in project collect by openforis.
the class JooqRelationalSchemaCreator method createDataTableView.
private void createDataTableView(RelationalSchema schema, DataTable dataTable, Connection conn) {
CollectDSLContext dsl = new CollectDSLContext(conn);
List<Field<?>> fields = new ArrayList<Field<?>>();
List<TableLike<?>> tables = new ArrayList<TableLike<?>>();
List<Condition> conditions = new ArrayList<Condition>();
DataTable currentTable = dataTable;
while (currentTable != null) {
org.jooq.Table<Record> currentJooqTable = jooqTable(schema, currentTable, !dsl.isSchemaLess());
tables.add(currentJooqTable);
List<Column<?>> columns = currentTable.getColumns();
for (Column<?> column : columns) {
if (!(column instanceof DataAncestorFKColumn)) {
fields.add(field(name(currentJooqTable.getName(), column.getName())));
}
}
// add parent table join condition
DataTable parentTable = currentTable.getParent();
if (parentTable != null) {
// names are duplicate, use the table name as prefix in the join condition
Condition parentTableJoinCondition = field(currentJooqTable.getName() + "." + currentTable.getParentFKColumn().getName()).eq(field(parentTable.getName() + "." + parentTable.getPrimaryKeyColumn().getName()));
conditions.add(parentTableJoinCondition);
}
currentTable = parentTable;
}
Select<?> select = dsl.select(fields).from(tables).where(conditions);
Name name;
if (dsl.isSchemaLess()) {
name = name(dataTable.getName() + "_view");
} else {
name = name(schema.getName(), dataTable.getName() + "_view");
}
dsl.createView(DSL.table(name), fields.toArray(new Field[fields.size()])).as(select).execute();
}
use of org.openforis.collect.relational.model.Column in project collect by openforis.
the class JooqRelationalSchemaCreator method createForeignKeys.
private void createForeignKeys(RelationalSchema schema, CollectDSLContext dsl) {
for (org.openforis.collect.relational.model.Table<?> table : schema.getTables()) {
List<ReferentialConstraint> fks = table.getReferentialContraints();
for (ReferentialConstraint fk : fks) {
Field<?>[] fields = toJooqFields(fk.getColumns());
org.jooq.Table<Record> jooqTable = jooqTable(schema, table, !dsl.isSchemaLess());
org.jooq.Table<Record> referencedJooqTable = jooqTable(schema, fk.getReferencedKey().getTable(), !dsl.isSchemaLess());
List<Column<?>> referencedColumns = fk.getReferencedKey().getColumns();
dsl.alterTable(jooqTable).add(constraint(fk.getName()).foreignKey(fields).references(referencedJooqTable, toJooqFields(referencedColumns))).execute();
}
}
}
use of org.openforis.collect.relational.model.Column in project collect by openforis.
the class RDBSchemaPrintTask method writeTable.
private void writeTable(Table<?> table) throws IOException {
writer.write("CREATE TABLE ");
if (!isSchemaless()) {
writer.write(doubleQuote(schema.getName()));
writer.write('.');
}
writer.write(doubleQuote(table.getName()));
writer.write(" (");
writer.write('\n');
List<Column<?>> columns = table.getColumns();
for (int i = 0; i < columns.size(); i++) {
if (i > 0) {
writer.write(',');
writer.write('\n');
}
Column<?> column = columns.get(i);
writeColumn(column);
}
if (includeForeignKeysInCreateTable && !table.getReferentialContraints().isEmpty()) {
writer.write(',');
writer.write('\n');
List<ReferentialConstraint> fks = table.getReferentialContraints();
for (int i = 0; i < fks.size(); i++) {
ReferentialConstraint fk = fks.get(i);
writer.write('\t');
writeForeignKeyConstraint(fk);
if (i < fks.size() - 1) {
writer.write(", \n");
}
}
}
writer.write('\n');
writer.write(");");
writer.write('\n');
}
Aggregations