diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-05-13 23:06:26 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-05-13 23:06:26 +0300 |
commit | 0bfb3045cc5c7d0c6fd32743ebb32f2acebaed93 (patch) | |
tree | c2c04767863243d960856f63e07061ce733a694c | |
parent | 6f299e47927ff5aa5f2a25c4da4d9fbf78f6510a (diff) | |
download | ydb-0bfb3045cc5c7d0c6fd32743ebb32f2acebaed93.tar.gz |
intermediate changes
ref:b93ecd64cb85ee5b54b94c088050ff68f6c5f87d
17 files changed, 192 insertions, 50 deletions
diff --git a/build/rules/flake8/migrations.yaml b/build/rules/flake8/migrations.yaml index 055223414d4..1367f9e332c 100644 --- a/build/rules/flake8/migrations.yaml +++ b/build/rules/flake8/migrations.yaml @@ -1976,7 +1976,6 @@ migrations: - mapreduce/yt/python - maps/contrib/pylibs/googlemaps - maps/contrib/pylibs/mox - - maps/goods/contrib/pylibs/xlrd - maps/pylibs/utils/lib - maps/pymod/yandex/maps/test_utils - maps/renderer/designs_config/libs/pymod diff --git a/contrib/python/ipython/py2/.yandex_meta/yamaker.yaml b/contrib/python/ipython/py2/.yandex_meta/yamaker.yaml new file mode 100644 index 00000000000..94837c4e29a --- /dev/null +++ b/contrib/python/ipython/py2/.yandex_meta/yamaker.yaml @@ -0,0 +1,2 @@ +exclude_from_macros: +- IPython/testing/plugin/*.txt diff --git a/contrib/python/ipython/py2/patches/02-fix-ya.make.patch b/contrib/python/ipython/py2/patches/02-fix-ya.make.patch index 9a613d68708..9d9f23a7920 100644 --- a/contrib/python/ipython/py2/patches/02-fix-ya.make.patch +++ b/contrib/python/ipython/py2/patches/02-fix-ya.make.patch @@ -32,14 +32,3 @@ NO_LINT() NO_CHECK_IMPORTS( -@@ -257,10 +271,6 @@ RESOURCE_FILES( - .dist-info/entry_points.txt - .dist-info/top_level.txt - IPython/core/profile/README_STARTUP -- IPython/testing/plugin/README.txt -- IPython/testing/plugin/test_combo.txt -- IPython/testing/plugin/test_example.txt -- IPython/testing/plugin/test_exampleip.txt - ) - - END() diff --git a/contrib/python/ipython/py3/.yandex_meta/yamaker.yaml b/contrib/python/ipython/py3/.yandex_meta/yamaker.yaml new file mode 100644 index 00000000000..94837c4e29a --- /dev/null +++ b/contrib/python/ipython/py3/.yandex_meta/yamaker.yaml @@ -0,0 +1,2 @@ +exclude_from_macros: +- IPython/testing/plugin/*.txt diff --git a/contrib/python/ipython/py3/patches/02-fix-ya.make.patch b/contrib/python/ipython/py3/patches/02-fix-ya.make.patch index bfec2cb4983..75e0e9b0bba 100644 --- a/contrib/python/ipython/py3/patches/02-fix-ya.make.patch +++ b/contrib/python/ipython/py3/patches/02-fix-ya.make.patch @@ -41,14 +41,3 @@ NO_LINT() NO_CHECK_IMPORTS( -@@ -255,10 +269,6 @@ RESOURCE_FILES( - .dist-info/entry_points.txt - .dist-info/top_level.txt - IPython/core/profile/README_STARTUP -- IPython/testing/plugin/README.txt -- IPython/testing/plugin/test_combo.txt -- IPython/testing/plugin/test_example.txt -- IPython/testing/plugin/test_exampleip.txt - ) - - END() diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/agg_list.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/agg_list.md index 69e04a169bd..a50f75423ed 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/agg_list.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/agg_list.md @@ -1,5 +1,13 @@ ## AGGREGATE_LIST {#agg-list} +**Сигнатура** +``` +AGGREGATE_LIST(T? [, limit:Uint64])->List<T> +AGGREGATE_LIST(T [, limit:Uint64])->List<T> +AGGREGATE_LIST_DISTINCT(T? [, limit:Uint64])->List<T> +AGGREGATE_LIST_DISTINCT(T [, limit:Uint64])->List<T> +``` + Получить все значения столбца в виде списка. В сочетании с `DISTINCT` возвращает только уникальные значения. Опциональный второй параметр задает максимальное количество получаемых значений. Если заранее известно, что уникальных значений не много, то лучше воспользоваться агрегатной функцией `AGGREGATE_LIST_DISTINCT`, которая строит тот же результат в памяти (которой при большом числе уникальных значений может не хватить). diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/bool_bit.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/bool_bit.md index 2042a7cf8b3..a90793e7676 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/bool_bit.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/bool_bit.md @@ -1,5 +1,12 @@ ## BOOL_AND, BOOL_OR и BOOL_XOR {#bool-and-or-xor} +**Сигнатура** +``` +BOOL_AND(Bool?)->Bool? +BOOL_OR(Bool?)->Bool? +BOOL_XOR(Bool?)->Bool? +``` + Применение соответствующей логической операции (`AND`/`OR`/`XOR`) ко всем значениям булевой колонки или выражения. Эти функции **не пропускают** `NULL` значение при агрегации, единственное `NULL` значение превратит результат в `NULL`. Для агрегации с пропуском `NULL`-ов можно использовать функции `MIN`/`MAX` или `BIT_AND`/`BIT_OR`/`BIT_XOR`. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/corr_covar.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/corr_covar.md index 5423b611e6b..1f0d0ca4f4d 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/corr_covar.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/corr_covar.md @@ -1,5 +1,13 @@ ## CORRELATION и COVARIANCE {#correlation-covariance} +**Сигнатура** +``` +CORRELATION(Double?, Double?)->Double? +COVARIANCE(Double?, Double?)->Double? +COVARIANCE_SAMPLE(Double?, Double?)->Double? +COVARIANCE_POPULATION(Double?, Double?)->Double? +``` + Корреляция и ковариация двух колонок. Также доступны сокращенные версии `CORR` или `COVAR`, а для ковариации - версии с суффиксом `SAMPLE` / `POPULATION` по аналогии с описанной выше [VARIANCE](#variance). diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/count_distinct_estimate.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/count_distinct_estimate.md index c1d58199219..d39dba89032 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/count_distinct_estimate.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/count_distinct_estimate.md @@ -1,5 +1,12 @@ ## CountDistinctEstimate, HyperLogLog и HLL {#countdistinctestimate} +**Сигнатура** +``` +CountDistinctEstimate(T)->Uint64? +HyperLogLog(T)->Uint64? +HLL(T)->Uint64? +``` + Примерная оценка числа уникальных значений по алгоритму [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog). Логически делает то же самое, что и [COUNT(DISTINCT ...)](#count), но работает значительно быстрее ценой некоторой погрешности. Аргументы: diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/histogram.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/histogram.md index 9ff04d9c505..48796f48d17 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/histogram.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/histogram.md @@ -1,5 +1,14 @@ ## HISTOGRAM {#histogram} +**Сигнатура** +``` +HISTOGRAM(Double?)->HistogramStruct? +HISTOGRAM(Double?, weight:Double)->HistogramStruct? +HISTOGRAM(Double?, intervals:Uint32)->HistogramStruct? +HISTOGRAM(Double?, weight:Double, intervals:Uint32)->HistogramStruct? +``` +В описании сигнатур под HistogramStruct подразумевается результат работы агрегатной функции, который является структурой определенного вида. + Построение примерной гистограммы по числовому выражению с автоматическим выбором корзин. [Вспомогательные функции](../../../udf/list/histogram.md) @@ -94,6 +103,17 @@ FROM my_table; Построение гистограммы по явно указанной фиксированной шкале корзин. +**Сигнатура** +``` +LinearHistogram(Double?)->HistogramStruct? +LinearHistogram(Double? [, binSize:Double [, min:Double [, max:Double]]])->HistogramStruct? + +LogarithmicHistogram(Double?)->HistogramStruct? +LogarithmicHistogram(Double? [, logBase:Double [, min:Double [, max:Double]]])->HistogramStruct? +LogHistogram(Double?)->HistogramStruct? +LogHistogram(Double? [, logBase:Double [, min:Double [, max:Double]]])->HistogramStruct? +``` + Аргументы: 1. Выражение, по значению которого строится гистограмма. Все последующие — опциональны. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/max_min_by.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/max_min_by.md index 1d4b3e91e4c..bcc73d08ee6 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/max_min_by.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/max_min_by.md @@ -1,5 +1,14 @@ ## MAX_BY и MIN_BY {#max-min-by} +**Сигнатура** +``` +MAX_BY(T1, T2)->T1? +MAX_BY(T1, T2, limit:Uint64)->List<T1>? + +MIN_BY(T1, T2)->T1? +MIN_BY(T1, T2, limit:Uint64)->List<T1>? +``` + Вернуть значение первого аргумента для строки таблицы, в которой второй аргумент оказался минимальным/максимальным. Опционально можно указать третий аргумент N, который влияет на поведение в случае, если в таблице есть несколько строк с одинаковым минимальным или максимальным значением: diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/percentile_median.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/percentile_median.md index 14de5a2415c..94192fd287d 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/percentile_median.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/percentile_median.md @@ -1,5 +1,12 @@ ## PERCENTILE и MEDIAN {#percentile-median} +**Сигнатура** +``` +PERCENTILE(Double?, Double)->Double? + +MEDIAN(Double? [, Double])->Double? +``` + Подсчет процентилей по амортизированной версии алгоритма [TDigest](https://github.com/tdunning/t-digest). `MEDIAN` — алиас для `PERCENTILE(N, 0.5)`. {% note info "Ограничение" %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/simple.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/simple.md index 0edf5e0d4df..72acb2b7eca 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/simple.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/simple.md @@ -1,5 +1,12 @@ ## COUNT {#count} +**Сигнатура** +``` +COUNT(*)->Uint64 +COUNT(T)->Uint64 +COUNT(T?)->Uint64 +``` + Подсчет количества строк в таблице (если в качестве аргумента указана `*` или константа) или непустых значений в столбце таблицы (если в качестве аргумента указано имя столбца). Как и другие агрегатные функции, может использоваться в сочетании с [GROUP BY](../../../syntax/group_by.md) для получения статистики по частям таблицы, соответствующим значениям в столбцах, по которым идет группировка. {% if select_statement != "SELECT STREAM" %}А модификатор [DISTINCT](../../../syntax/group_by.md#distinct) позволяет посчитать число уникальных значений.{% endif %} @@ -21,9 +28,17 @@ SELECT COUNT(DISTINCT value) FROM my_table; ## MIN и MAX {#min-max} +**Сигнатура** +``` +MIN(T?)->T? +MIN(T)->T? +MAX(T?)->T? +MAX(T)->T? +``` + Минимальное или максимальное значение. -В качестве аргумента допустимо произвольное вычислимое выражение с числовым результатом. +В качестве аргумента допустимо произвольное вычислимое выражение с результатом, допускающим сравнение значений. **Примеры** ``` yql @@ -32,6 +47,12 @@ SELECT MIN(value), MAX(value) FROM my_table; ## SUM {#sum} +**Сигнатура** +``` +SUN(Unsigned?)->Uint64? +SUN(Signed?)->Int64? +``` + Сумма чисел. В качестве аргумента допустимо произвольное вычислимое выражение с числовым результатом. @@ -44,6 +65,11 @@ SELECT SUM(value) FROM my_table; ## AVG {#avg} +**Сигнатура** +``` +AVG(Double?)->Double? +``` + Арифметическое среднее. В качестве аргумента допустимо произвольное вычислимое выражение с числовым результатом. @@ -57,6 +83,11 @@ SELECT AVG(value) FROM my_table; ## COUNT_IF {#count-if} +**Сигнатура** +``` +COUNT_IF(Bool?)->Uint64? +``` + Количество строк, для которых указанное в качестве аргумента выражение истинно (результат вычисления выражения — true). Значение `NULL` приравнивается к `false` (в случае, если тип аргумента `Bool?`). @@ -79,6 +110,14 @@ SELECT ## SUM_IF и AVG_IF {#sum-if} +**Сигнатура** +``` +SUM_IF(Unsigned?, Bool?)->Uint64? +SUM_IF(Signed?, Bool?)->Int64? + +AVG_IF(Double?, Bool?)->Double? +``` + Сумма или арифметическое среднее, но только для строк, удовлетворяющих условию, переданному вторым аргументом. Таким образом, `SUM_IF(value, condition)` является чуть более короткой записью для `SUM(IF(condition, value))`, аналогично для `AVG`. Расширение типа данных аргумента работает так же аналогично одноименным функциям без суффикса. @@ -107,6 +146,12 @@ FROM my_table; ## SOME {#some} +**Сигнатура** +``` +SOME(T?)->T? +SOME(T)->T? +``` + Получить значение указанного в качестве аргумента выражения для одной из строк таблицы. Не дает никаких гарантий о том, какая именно строка будет использована. Аналог функции [any()]{% if lang == "en" %}(https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/reference/any/){% else %}(https://clickhouse.tech/docs/ru/sql-reference/aggregate-functions/reference/any/){% endif %} в ClickHouse. Из-за отсутствия гарантий `SOME` вычислительно дешевле, чем часто использующиеся в подобных ситуациях [MIN](#min)/[MAX](#max). diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/stddev_variance.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/stddev_variance.md index a5afd135d70..7af4de84798 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/stddev_variance.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/stddev_variance.md @@ -1,11 +1,26 @@ ## STDDEV и VARIANCE {#stddev-variance} +**Сигнатура** +``` +STDDEV(Double?)->Double? +STDDEV_POPULATION(Double?)->Double? +POPULATION_STDDEV(Double?)->Double? +STDDEV_SAMPLE(Double?)->Double? +STDDEVSAMP(Double?)->Double? + +VARIANCE(Double?)->Double? +VARIANCE_POPULATION(Double?)->Double? +POPULATION_VARIANCE(Double?)->Double? +VARPOP(Double?)->Double? +VARIANCE_SAMPLE(Double?)->Double? +``` + Стандартное отклонение и дисперсия по колонке. Используется [однопроходной параллельный алгоритм](https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm), результат которого может отличаться от полученного более распространенными методами, требующими двух проходов по данным. По умолчанию вычисляются выборочная дисперсия и стандартное отклонение. Доступны несколько способов записи: * с суффиксом/префиксом `POPULATION`, например: `VARIANCE_POPULATION`, `POPULATION_VARIANCE` — вычисляет дисперсию/стандартное отклонение для генеральной совокупности; -* с суффиксом/префиксом `SAMPLE` или без суффикса, например `VARIANCE_SAMPLE`, `SAMPLE_VARIANCE`, `SAMPLE` — вычисляет выборочную дисперсию и стандартное отклонение. +* с суффиксом `SAMPLE` или без суффикса, например `VARIANCE_SAMPLE`, `SAMPLE_VARIANCE`, `VARIANCE` — вычисляет выборочную дисперсию и стандартное отклонение. Также определено несколько сокращенных алиасов, например `VARPOP` или `STDDEVSAMP`. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/top_bottom.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/top_bottom.md index 8d83e0f0321..543f52bac33 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/top_bottom.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/top_bottom.md @@ -1,5 +1,13 @@ ## TOP и BOTTOM {#top-bottom} +**Сигнатура** +``` +TOP(T?, limit:Uint32)->List<T> +TOP(T, limit:Uint32)->List<T> +BOTTOM(T?, limit:Uint32)->List<T> +BOTTOM(T, limit:Uint32)->List<T> +``` + Вернуть список максимальных/минимальных значений выражения. Первый аргумент - выражение, второй - ограничение на количество элементов. **Примеры** @@ -22,6 +30,14 @@ FROM my_table; ## TOP_BY и BOTTOM_BY {#top-bottom-by} +**Сигнатура** +``` +TOP_BY(T1?, T2, limit:Uint32)->List<T1> +TOP_BY(T1, T2, limit:Uint32)->List<T1> +BOTTOM_BY(T1?, T2, limit:Uint32)->List<T1> +BOTTOM_BY(T1, T2, limit:Uint32)->List<T1> +``` + Вернуть список значений первого аргумента для строк с максимальными/минимальными значениями второго аргумента. Третий аргумент - ограничение на количество элементов в списке. При использовании [фабрики агрегационной функции](../../basic.md#aggregationfactory) в качестве первого аргумента [AGGREGATE_BY](#aggregateby) передается `Tuple` из значения и ключа. Ограничение на количество элементов в этом случае передаётся вторым аргументом при создании фабрики. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/topfreq_mode.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/topfreq_mode.md index d102cf292a0..195447b8590 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/topfreq_mode.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/topfreq_mode.md @@ -1,5 +1,11 @@ ## TOPFREQ и MODE {#topfreq-mode} +**Сигнатура** +``` +TOPFREQ(T [, num:Uint32 [, bufSize:Uint32]])->List<Struct<Frequency:Uint64, Value:T>> +MODE(T [, num:Uint32 [, bufSize:Uint32]])->List<Struct<Frequency:Uint64, Value:T>> +``` + Получение приближенного списка самых часто встречающихся значений колонки с оценкой их числа. Возвращают список структур с двумя полями: * `Value`— найденное часто встречающееся значение; diff --git a/ydb/library/yql/mount/lib/yql/aggregate.yql b/ydb/library/yql/mount/lib/yql/aggregate.yql index a1c231f3392..a92a7efbde6 100644 --- a/ydb/library/yql/mount/lib/yql/aggregate.yql +++ b/ydb/library/yql/mount/lib/yql/aggregate.yql @@ -702,6 +702,12 @@ (let double_traits_factory_opt (lambda '(factory list_type first second) (block '( (let item_type (ListItemType list_type)) (let key_type (TypeOf (Apply first (InstanceOf item_type)))) + (let value_type (TypeOf (Apply second (InstanceOf item_type)))) + (let null_value (MatchType value_type + 'Optional (lambda '() (Nothing value_type)) + 'Null (lambda '() (Null)) + (lambda '() (Nothing (OptionalType value_type))) + )) (let test_type (MatchType item_type 'Optional (lambda '() item_type) (lambda '() key_type))) (let traits (Apply factory (ListType (MatchType item_type 'Optional (lambda '() (OptionalItemType item_type)) (lambda '() item_type))) (lambda '(row) (MatchType key_type 'Optional @@ -718,24 +724,25 @@ (let finish (NthArg '6 traits)) (let defval (NthArg '7 traits)) - (let init_opt (lambda '(row) (MatchType test_type 'Optional - (lambda '() (Map (Apply first row) (lambda '(key) (Apply init row)))) + (let init_opt (lambda '(row) (MatchType test_type + 'Optional (lambda '() (Map (Apply first row) (lambda '(key) (Apply init row)))) + 'Null (lambda '() null_value) (lambda '() (Apply init row)) ))) - (let update_opt (lambda '(row state) - (MatchType test_type 'Optional - (lambda '() (IfPresent state (lambda '(state) (Just (If (Exists (Apply first row)) (Apply update row state) state))) (Apply init_opt row))) - (lambda '() (Apply update row state)) - ) - )) - (let save_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state save)) (lambda '() (Apply save state))))) - (let load_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state load)) (lambda '() (Apply load state))))) - (let merge_opt (lambda '(one two) (MatchType test_type 'Optional (lambda '() (OptionalReduce one two merge)) (lambda '() (Apply merge one two))))) - (let finish_opt (lambda '(state) (MatchType test_type 'Optional - (lambda '() (MatchType (TypeOf (Apply finish (InstanceOf (OptionalItemType (TypeOf state))))) 'Optional + (let update_opt (lambda '(row state) (MatchType test_type + 'Optional (lambda '() (IfPresent state (lambda '(state) (Just (If (Exists (Apply first row)) (Apply update row state) state))) (Apply init_opt row))) + 'Null (lambda '() null_value) + (lambda '() (Apply update row state)) + ))) + (let save_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state save)) 'Null (lambda '() null_value) (lambda '() (Apply save state))))) + (let load_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state load)) 'Null (lambda '() null_value) (lambda '() (Apply load state))))) + (let merge_opt (lambda '(one two) (MatchType test_type 'Optional (lambda '() (OptionalReduce one two merge)) 'Null (lambda '() null_value) (lambda '() (Apply merge one two))))) + (let finish_opt (lambda '(state) (MatchType test_type + 'Optional (lambda '() (MatchType (TypeOf (Apply finish (InstanceOf (OptionalItemType (TypeOf state))))) 'Optional (lambda '() (FlatMap state finish)) (lambda '() (Map state finish)) )) + 'Null (lambda '() null_value) (lambda '() (Apply finish state)) ))) (return (AggregationTraits item_type init_opt update_opt save_opt load_opt merge_opt finish_opt defval)) @@ -746,6 +753,12 @@ (let double_traits_factory_opt_parent (lambda '(factory list_type first second) (block '( (let item_type (ListItemType list_type)) (let key_type (TypeOf (Apply first (InstanceOf item_type)))) + (let value_type (TypeOf (Apply second (InstanceOf item_type)))) + (let null_value (MatchType value_type + 'Optional (lambda '() (Nothing value_type)) + 'Null (lambda '() (Null)) + (lambda '() (Nothing (OptionalType value_type))) + )) (let test_type (MatchType item_type 'Optional (lambda '() item_type) (lambda '() key_type))) (let traits (Apply factory (ListType (MatchType item_type 'Optional (lambda '() (OptionalItemType item_type)) (lambda '() item_type))) (lambda '(row) (MatchType key_type 'Optional @@ -762,20 +775,20 @@ (let finish (NthArg '6 traits)) (let defval (NthArg '7 traits)) - (let init_opt (lambda '(row parent) (MatchType test_type 'Optional - (lambda '() (Map (Apply first row) (lambda '(key) (Apply init row parent)))) + (let init_opt (lambda '(row parent) (MatchType test_type + 'Optional (lambda '() (Map (Apply first row) (lambda '(key) (Apply init row parent)))) + 'Null (lambda '() null_value) (lambda '() (Apply init row parent)) ))) - (let update_opt (lambda '(row state parent) - (MatchType test_type 'Optional - (lambda '() (IfPresent state (lambda '(state) (Just (If (Exists (Apply first row)) (Apply update row state parent) state))) (Apply init_opt row parent))) - (lambda '() (Apply update row state parent)) - ) - )) - (let save_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state save)) (lambda '() (Apply save state))))) - (let load_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state load)) (lambda '() (Apply load state))))) - (let merge_opt (lambda '(one two) (MatchType test_type 'Optional (lambda '() (OptionalReduce one two merge)) (lambda '() (Apply merge one two))))) - (let finish_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state finish)) (lambda '() (Apply finish state))))) + (let update_opt (lambda '(row state parent) (MatchType test_type + 'Optional (lambda '() (IfPresent state (lambda '(state) (Just (If (Exists (Apply first row)) (Apply update row state parent) state))) (Apply init_opt row parent))) + 'Null (lambda '() null_value) + (lambda '() (Apply update row state parent)) + ))) + (let save_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state save)) 'Null (lambda '() null_value) (lambda '() (Apply save state))))) + (let load_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state load)) 'Null (lambda '() null_value) (lambda '() (Apply load state))))) + (let merge_opt (lambda '(one two) (MatchType test_type 'Optional (lambda '() (OptionalReduce one two merge)) 'Null (lambda '() null_value) (lambda '() (Apply merge one two))))) + (let finish_opt (lambda '(state) (MatchType test_type 'Optional (lambda '() (Map state finish)) 'Null (lambda '() null_value) (lambda '() (Apply finish state))))) (return (AggregationTraits item_type init_opt update_opt save_opt load_opt merge_opt finish_opt defval)) )))) |