Getl фичи
- Добавлен интерфейс получения версии текущего приложения VersionInfo.
- getl.files.Manager: добавлено свойство useDateSizeInBuildList, которое указывает, что при поиске новых файлов надо учитывать в истории их длину и время создания.
- getl.dbf: добавлена работа с DBF файлами на чтение с помощью DBFConnection и DBFDataset. Поддерживается чтение форматов DBF до DBASE 7, FoxPro и Visual FoxPro.
- getl.files.Manager: добавлено свойство checkDateSizeFile, при включении которого файл не считается обработанным в истории, если у него не совпадает размер или время изменения.
- getl.proc.Flow: в copy теперь можно в map указывать выражения и вычисляемые поля по синтаксису, который поддерживается в GenerationUtils.GenerateCalculateMapClosure (выражения указываются в ${...}, обращение к полям источника и к вычисляемым полям внутри выражений идет как source.поле, к внешним переменным processVars как vars.переменная, вычисляемые поля определяются в именах приёмника с звездочкой спереди, как *выч_поле1, где можно задать последовательность расчета таких полей с помощью количества звездочек, например **выч_поле2 будет расчитано после *выч_поле1, а значит может на него ссылаться.
- getl.utils.MapUtils: добавлена функция RemoveNullValues для удаления в словаре ключей, у которых в значениях стоит null.
Getl баги
- getl.tfs.TFD: при каждом новом создании датасета через функцию Dataset, создавалась новая база данных TDS в памяти.
- getl.proc.Executor: при shutdown виртуальной машины не отслеживались запущенные Executor потоки. Теперь автоматически потокам посылается сигнал завершения, а ждущие на выполнения в очереди потоки снимаются с работы.
Getl баги
- getl.utils.GenerationUtils: если в параметре маппинга полей функции GenerateCalcMapClosure встречались null значения в полях источника, то возникала ошибка.
Пример работы с вычисляемыми выражениями в маппинге
etl.copy(csv('file1'), verticaTable('table1')) {
/* поле field1 с table1 не будет участвовать в процессе копирования,
если для него в таблице задан constraint default, то оно будет им заполняться */
map.field1 = null
/* Поле field2 в table1 будет заполняться из поля файла f2 */
map.field2 = "f2"
/* Поле field3 в table1 будет заполняться полем f3 в верхнем регистре */
map.field3 = '${source.field3.toUpperCase()}'
/* Вычисляемое поле xml первого уровня из поля data файла */
map."*xml" = '${new XmlParser().parseText(source.data)}'
/* Вычисляемое поле dt_value второго уровня будет получаться из текста элемента dt,
ранее полученного вычисляемого поля xml */
map."**dt_value" = '${source.xml.dt.value()[0]}'
/* Поле dt будет заполняться датой, отпарсенной с вычисляемого поля dt_value */
map."dt" = '${DateUtils.ParseDate(source.dt_value)}'
}
