public void ensureCopyingPossible(String sourceTable, String destinationTable) {
Map<String, ColumnMetadata> sourceMetadataMap = getMetadata(sourceTable);
Map<String, ColumnMetadata> destMetadataMap = getMetadata(destinationTable);
if (destMetadataMap.size() < sourceMetadataMap.size()) {
throw new IllegalArgumentException(format("Source table %s has more columns than destination table %s", sourceTable,
destinationTable));
}
if (!destMetadataMap.keySet().containsAll(sourceMetadataMap.keySet())) {
Set<String> missingColumns = new LinkedHashSet<>(sourceMetadataMap.keySet());
missingColumns.removeAll(destMetadataMap.keySet());
throw new IllegalArgumentException(format("Destination table %s is missing columns %s that are present in source table %s",
destinationTable, missingColumns, sourceTable));
}
for (Entry<String, ColumnMetadata> entry : sourceMetadataMap.entrySet()) {
ColumnMetadata sourceMetadata = entry.getValue();
ColumnMetadata destMetadata = destMetadataMap.get(entry.getKey());
if (!sourceMetadata.typeName.equals(destMetadata.typeName)) {
throw new IllegalArgumentException(format(
"Source column %s.%s has type %s and destination column %s.%s has mismatching type %s", sourceTable,
sourceMetadata.columnName, sourceMetadata.typeName, destinationTable, destMetadata.columnName, destMetadata.typeName));
}
if (sourceMetadata.size > destMetadata.size) {
throw new IllegalArgumentException(format("Source column %s.%s has size %s and destination column %s.%s smaller size %s",
sourceTable, sourceMetadata.columnName, sourceMetadata.size, destinationTable, destMetadata.columnName,
destMetadata.size));
}
}
}