package com.txtr.hibernatedelta; import java.util.Collections; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.txtr.hibernatedelta.model.ExplicitHibernateIndex; import com.txtr.hibernatedelta.model.HibernateColumn; import com.txtr.hibernatedelta.model.HibernateDatabase; import com.txtr.hibernatedelta.model.HibernateIndexName; import com.txtr.hibernatedelta.model.HibernateIndexNames; import com.txtr.hibernatedelta.model.HibernateTable; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; public class IndexIdFactory { private IndexIdFactory() { } public static void setIndexNames(HibernateDatabase newDatabase, HibernateIndexNames indexNames) { for (HibernateTable table : newDatabase.getTables()) { setIndexNames(table, indexNames); } } public static void setIndexNames(HibernateTable newTable, HibernateIndexNames indexNames) { List<ExplicitHibernateIndex> explicitIndexes = newTable.getExplicitIndexes(); Collections.sort(explicitIndexes, Ordering.from(String.CASE_INSENSITIVE_ORDER).onResultOf(new Function<ExplicitHibernateIndex, String>() { @Override public String apply(ExplicitHibernateIndex input) { return StringUtils.join(input.getColumns(), ","); } })); for (HibernateColumn column : newTable.getColumns()) { if (needsIndexName(column)) { column.setIndexName(getIndexName(newTable, ImmutableList.of(column.getName()), indexNames)); } } for (ExplicitHibernateIndex index : explicitIndexes) { if (index.getName() == null) { index.setIndexName(getIndexName(newTable, index.getColumns(), indexNames)); } } } private static boolean needsIndexName(HibernateColumn column) { return column.getTargetTable() != null && column.getForeignKeyIndexName() == null; } private static HibernateIndexName getIndexName(HibernateTable table, List<String> columns, HibernateIndexNames indexNames) { HibernateIndexName oldName = indexNames.find(table.getName(), columns); if (oldName != null) { return oldName; } HibernateIndexName name = new HibernateIndexName(createIndexName(table.getIndexPrefix(), indexNames), table.getName(), columns); indexNames.getIndexNames().add(name); return name; } private static String createIndexName(String tableName, HibernateIndexNames indexNames) { int i = 1; while (true) { String indexName = tableName + i; if (indexNames.findByName(indexName) == null) { return indexName; } i++; } } }