package sqlancer.schema;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import sqlancer.Randomly;
public class AbstractTable
, I extends TableIndex>
implements Comparable> {
private final String name;
private final List columns;
private final List indexes;
private final boolean isView;
public AbstractTable(String name, List columns, List indexes, boolean isView) {
this.name = name;
this.indexes = indexes;
this.isView = isView;
this.columns = Collections.unmodifiableList(columns);
}
public String getName() {
return name;
}
@Override
public int compareTo(AbstractTable, ?> o) {
return o.getName().compareTo(getName());
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(getName() + "\n");
for (COL c : columns) {
sb.append("\t" + c + "\n");
}
return sb.toString();
}
public List getIndexes() {
return indexes;
}
public List getColumns() {
return columns;
}
public String getColumnsAsString() {
return columns.stream().map(c -> c.getName()).collect(Collectors.joining(", "));
}
public String getColumnsAsString(Function function) {
return columns.stream().map(function).collect(Collectors.joining(", "));
}
public COL getRandomColumn() {
return Randomly.fromList(columns);
}
public boolean hasIndexes() {
return !indexes.isEmpty();
}
public TableIndex getRandomIndex() {
return Randomly.fromList(indexes);
}
public List getRandomNonEmptyColumnSubset() {
return Randomly.nonEmptySubset(getColumns());
}
public List getRandomNonEmptyColumnSubset(int size) {
return Randomly.nonEmptySubset(getColumns(), size);
}
public boolean isView() {
return isView;
}
public String getFreeColumnName() {
int i = 0;
if (Randomly.getBooleanWithRatherLowProbability()) {
i = (int) Randomly.getNotCachedInteger(0, 100);
}
do {
String columnName = String.format("c%d", i++);
if (columns.stream().noneMatch(t -> t.getName().contentEquals(columnName))) {
return columnName;
}
} while (true);
}
}