Создайте базу SQL на основе порядка расположения столбцов в ArrayList
У меня есть класс с именем TableConnectionInfo
который содержит детали о таблице, такие как tableName
И его columns
, Я написал метод, в котором я должен генерировать случайный выбор SQL с использованием значений столбца из table.getColumns()
метод каждой таблицы.
Предположим, что для таблицы 1 имеется 10 столбцов, таких как
col1
col2
col3
col4
col5
col6
col7
col8
col9
col10
Ниже мой метод, в котором я пытаюсь сгенерировать случайный выбор SQL с помощью table.getColumns()
, Вот table
это TableConnectionInfo
объект.
private static Random random = new SecureRandom();
private String generateRandomSQL(TableConnectionInfo table) {
int rNumber = random.nextInt(table.getColumns().size());
List<String> shuffledColumns = new ArrayList<String>(table.getColumns());
Collections.shuffle(shuffledColumns);
String columnsList = "";
for (int i = 0; i < rNumber; i++) {
columnsList += ("," + shuffledColumns.get(i));
}
final String sql = "SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE" + columnsList + " from " + table.getTableName() + " where id = ?";
return sql;
}
Ниже мой TableConncectionInfo
класс который проведет tableName
И его columns
список
public class TableConnectionInfo {
public String tableName;
public ArrayList<String> columns;
public ArrayList<String> getColumns() {
return columns;
}
public void setColumns(ArrayList<String> columns) {
this.columns = columns;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
}
Постановка задачи:-
Таким образом, проблема с вышеописанным методом заключается в том, что он будет перемешивать все столбцы случайным образом, и я получу такой результат:
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col3, col1, col5 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col7, col2, col3, col1 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col8, col1, col2, col6 from table1 where id = ?`
... Other possible combinations
И я ищу что-то подобное. Как столбцы вставляются в ArrayList. Предположим, это порядок
col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
Тогда столбцы в моем SELECT SQL
должно быть в том же порядке. Имея в виду-
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col1, col3, col5 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col7, col8, col9, col10 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col1, col4, col5, col6, col10 from table1 where id = ?`
Это не должно быть случайным, как col1
, затем col5
, затем col2
(что не так). Так должно быть-
col5, col7, col10
col3, col6, col8, col10
other options
По сути, я хочу, чтобы в моем SELECT sql были столбцы в том виде, в каком они были вставлены в ArrayList, но в случайном порядке. Like- Выберите любые 4 в том порядке, в котором они вставлены, или выберите любые 6 в том порядке, в котором они вставлены, или выберите любые 7 в том порядке, в котором они вставлены.
1 ответ
1 решение заключается в следующем
private static String getColumns(final List<String> columns) {
List<String> copy = new ArrayList<String>(columns);
Collections.shuffle(copy);
int rNumber = random.nextInt(columns.size());
List<String> subList = copy.subList(0, rNumber);
Collections.sort(subList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1;
}
});
return StringUtils.join(subList, ",");
}
Я использую StringUtils от Commons-Lang