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)); } } }