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