Создайте базу 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

Другие вопросы по тегам