public static boolean isRootElement(Element element) {
return !(element.getParentNode() instanceof Element);
}
public XmlDomDataContext flattenTables(Relationship relationship) {
MutableTable primaryTable = (MutableTable) relationship.getPrimaryTable();
MutableTable foreignTable = (MutableTable) relationship.getForeignTable();
// Check that foreignTable is not primary table in other relationships
// (if so we can't flatten as that would require id-rewriting of those
// foreign tables as well)
if (foreignTable.getPrimaryKeyRelationships().length != 0) {
Relationship[] foreignPrimaryRelationships = foreignTable.getPrimaryKeyRelationships();
String[] foreignPrimaryNames = new String[foreignPrimaryRelationships.length];
for (int i = 0; i < foreignPrimaryRelationships.length; i++) {
foreignPrimaryNames[i] = foreignPrimaryRelationships[i].getForeignTable().getName();
}
throw new UnsupportedOperationException("Cannot flatten foreign table '" + foreignTable.getName()
+ "' as it acts as primary table for tables: " + Arrays.toString(foreignPrimaryNames));
}
List<Column> primaryColumns = new ArrayList<Column>(Arrays.asList(primaryTable.getColumns()));
List<Column> foreignColumns = new ArrayList<Column>(Arrays.asList(foreignTable.getColumns()));
// Remove the surrogate id
String primaryTableName = primaryTable.getName();
String foreignTableName = foreignTable.getName();
MutableColumn idColumn = getIdColumn(foreignTable);
foreignColumns.remove(idColumn);
// Remove the foreign keys
Column[] foreignKeys = foreignTable.getForeignKeys();
for (Column foreignKey : foreignKeys) {
foreignColumns.remove(foreignKey);
}
Query q = new Query();
q.select(primaryColumns.toArray(new Column[primaryColumns.size()]));
q.select(foreignColumns.toArray(new Column[foreignColumns.size()]));
q.from(new FromItem(JoinType.LEFT, relationship));
if (logger.isDebugEnabled()) {
logger.debug("Setting table data for '{}' to query result: {}", primaryTableName, q.toString());
}
List<Object[]> tableRows = executeQuery(q).toObjectArrays();
for (Column foreignColumn : foreignColumns) {
MutableColumn newPrimaryColumn = new MutableColumn(foreignColumn.getName(), foreignColumn.getType(), primaryTable,
primaryTable.getColumnCount(), foreignColumn.isNullable());
newPrimaryColumn.setIndexed(foreignColumn.isIndexed());
newPrimaryColumn.setNativeType(foreignColumn.getNativeType());
primaryTable.addColumn(newPrimaryColumn);
}
_tableData.put(primaryTableName, tableRows);
MutableSchema mutableSchema = (MutableSchema) foreignTable.getSchema();
mutableSchema.removeTable(foreignTable);
_tableData.remove(foreignTableName);
((MutableRelationship) relationship).remove();