package net.sourceforge.mayfly.datastore;
import net.sourceforge.mayfly.MayflyException;
import net.sourceforge.mayfly.parser.Location;
import net.sourceforge.mayfly.util.CaseInsensitiveString;
import net.sourceforge.mayfly.util.ImmutableList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class Indexes implements Iterable<Index> {
public final ImmutableList<Index> indexes;
public Indexes() {
this(new ImmutableList<Index>());
}
public Indexes(ImmutableList<Index> indexes) {
checkDuplicates(indexes);
this.indexes = indexes;
}
private static void checkDuplicates(ImmutableList<Index> proposed) {
Set<CaseInsensitiveString> names = new HashSet<CaseInsensitiveString>();
for (Index index : proposed) {
if (index.hasName()) {
boolean wasPresent =
!names.add(new CaseInsensitiveString(index.name()));
if (wasPresent) {
throw new MayflyException("duplicate index " + index.name());
}
}
}
}
public Indexes with(Index index) {
return new Indexes(indexes.with(index));
}
public Indexes without(String indexName) {
boolean found = false;
Indexes result = new Indexes();
for (Index index : indexes) {
if (indexName.equalsIgnoreCase(index.name())) {
found = true;
}
else {
result = result.with(index);
}
}
if (!found) {
throw new MayflyException("no index " + indexName);
}
return result;
}
public Iterator<Index> iterator() {
return indexes.iterator();
}
public Indexes renameColumn(String oldName, String newName) {
List result = new ArrayList();
for (Index index : indexes) {
result.add(index.renameColumn(oldName, newName));
}
return new Indexes(new ImmutableList(result));
}
public int indexCount() {
return indexes.size();
}
public void check(Rows rows, Row newRow, TableReference table, Location location) {
for (Index index : indexes) {
index.check(rows, newRow, table, location);
}
}
public boolean hasIndex(String indexName) {
for (Index index : indexes) {
if (indexName.equalsIgnoreCase(index.name())) {
return true;
}
}
return false;
}
public List<String> names() {
List<String> result = new ArrayList<String>();
for (Index index : indexes) {
result.add(index.name());
}
return result;
}
}