Работа с подключениями
Ссылка на источник задачи (п.4)
Концепция
Для редактирования типа данных в подключении (в скрипте загрузки) необходимо сначала подготовить функционал по определению подходящего типа данных для поля при загрузке. Если для загрузки из БД тип уже определен, то для загрузки из файла (н-р, Excel) на данный момент по умолчанию устанавливается String. При нажатии на заголовок столбца в таблице в подключении должен раскрываться список с доступными типами данных, где на первом месте будет стоять рекомендуемый (загруженный по метаданным из БД или файла). При выборе подходящего типа данных он фиксируется для указанного поля (и переносится в скрипт). При выборе неподходящего типа данных выдаётся ошибка.
Задание на разработку
При создании подключения в окне «Выбрать данные» необходимо заменить заголовок выбранной пользователем таблицы с неизменяемого текста на изменяемое поле. При нажатии на такое поле должен открываться двухуровневый список (список полей, являющихся списками, раскрывающимися при нажатии). На первом уровне находятся все существующие типы данных на понятном человеку языке с той иконкой, которая будет установлена при выборе. Текущий тип данных столбца должен быть выделен заливкой. Рекомендуемый тип данных (см. п.1.2) должен выделяться цветной обводкой. На втором уровне, открывающемся в виде списка при выборе типа данных на первом уровне, должны быть типы данных на языке ClickHouse с указанием точности, длины и других необходимых характеристик. При наличии возможности ввода дополнительных параметров (н-р, разрядности для Decimal) необходимо при нажатии на тип данных выводить поле для внесения этих параметров.
1. Список типов (x.x. – первый уровень списка; x.x.x. – второй уровень; «::» - поле для ввода дополнительных параметров, при отсутствии названия выводить только поле):
1.1. «Целое число» – целые числа разного размера:
1.1.1. Int – знаковые целые :: разрядность списком (8, 16, 32, 64, 128, 256)
1.1.2. UInt – беззнаковые целые :: разрядность списком (8, 16, 32, 64, 128, 256)
1.2. «Вещественное число»:
1.2.1. Float32, Float64 – числа с плавающей точкой
1.2.2. Decimal – число с фиксированной точностью :: поле «Длина» (максимальное количество цифр), поле «Разрядность» (количество цифр после запятой)
1.3. «Строковые типы»:
1.3.1. String – строка произвольной длины для любого текста
1.3.2. FixedString – строка фиксированной длины :: максимальное количество знаков
1.4. «Дата и время»:
1.4.1. Date – дата в диапазоне [1970-01-01, 2149-06-06]
1.4.2. Date32 – дата в четырех байтах, представляющим дни с 1970-01-01 (0 представляет 1970-01-01, а отрицательные значения представляют дни до 1970)
1.4.3. DateTime – дата и время в диапазоне [1970-01-01 00:00:00, 2106-02-07 06:28:15]
1.4.4. DateTime64 – момент времени с суб-секундной точностью в диапазоне [1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999] :: точность тика (число от 1 до 8)
1.5. «Логический тип» (принимает только значения True и False, а также их аналоги, н-р 1 и 0)
2. Рекомендуемый тип данных. При создании подключения к СУБД рекомендуемым является тот тип данных, который был указан в СУБД для рассматриваемого столбца. При создании подключения к файлу возможны 2 варианта (в зависимости от того, какой более эффективен):
2.1. Подставлять перебором в столбец разные типы данных до тех пор, пока будут выдаваться ошибки (принимать первый вариант без ошибки) в следующем порядке: Логический тип - Вещественное число (Float32 - Float64) - Целое число (Int8...Int256 - UInt8...UInt256) - Дата и время (Date - Date32 - DateTime - DateTime64) - Строковые типы (String).
2.2. Использовать функцию toTypeName() для получения информации о текущем типе данных. Возможная проблема – при отсутствии работы с метаданными файла и автоматической установке типа данных String данный метод не будет работать.
3. Автоматическое приведение типов (если возможно) – при указании неподходящего типа данных СУБД автоматически пытается привести данные в поле к указанному типу (однозначно должен срабатывать перевод любых данных в строку).
4. Ошибки. В случае выбора неподходящего типа данных должно выдавать ошибки (как пример):
1.4.1. Невозможно перевести в указанный тип данных: "Cannot parse string 'abc' as Int32: syntax error at position 0"
1.4.2. Выбор типа данных с меньшим диапазоном, чем необходимо: "Cannot parse number: unexpected end of input while parsing Int32: (at row 1). Сhange to an Int64 or type with a higher bit depth"
1.4.3.Неверный формат даты или времени (нет функции автоматического приведения формата "DD.MM.YYYY" к "DD-MM-YYYY")
В SQL-представлении все полученные с помощью редактирования типы данных должны записываться в формате "Имя_столбца" Nullable (Тип данных), чтобы не было конфликтов с Null-строками
Дополнительно
В окне создания подключения из файла необходимо реализовать дополнительный функционал:
-
Чекбокс "Исключить пустые столбцы"
Должен проводить проверку используемых столбцов на наличие непустых значений в них. Если весь столбец содержит только пустые (null) значения, то при активации чекбокса весь столбец должен быть исключен при добавлении в подключение (столбцы "__EMPTY"). При активном чекбоксе добавить пустые столбцы через их собственные чекбоксы должно быть невозможно (становятся некликабельными).
По умолчанию чекбокс активирован.
-
Чекбокс "Использовать первую строку в качестве заголовков"
В активированном состоянии должен передавать первую строку в качестве заголовков столбцов (так работает сейчас по умолчанию). В деактивированном состоянии первая строка становится частью содержимого столбца, а названия для всех столбцов последовательно формируются как "Столбец 1", "Столбец 2", . . . , "Столбец N".
По умолчанию чекбокс деактивирован.
-
таблицыУДобавеличитьчисло отображаемых стпрокрутку доля20
В окне созданияв подключенияи (обсудизть)
файла
Необходимо должно быавить виднполосу первые 20 строкрутки изв файобла. Именно столькои будет использовано для опредепросмотра таблицы справа от последния типа данныхего столбца. При этом после загрузки отображается только 100 строк с возможностью прокрутки до 100-й, после чего загружается ещё 100. Пролистывая полосу вниз можно постепенно загружать остальные строки вплоть до конца таблицы.