aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-05-13 23:06:26 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-05-13 23:06:26 +0300
commit0bfb3045cc5c7d0c6fd32743ebb32f2acebaed93 (patch)
treec2c04767863243d960856f63e07061ce733a694c
parent6f299e47927ff5aa5f2a25c4da4d9fbf78f6510a (diff)
downloadydb-0bfb3045cc5c7d0c6fd32743ebb32f2acebaed93.tar.gz
intermediate changes
ref:b93ecd64cb85ee5b54b94c088050ff68f6c5f87d
-rw-r--r--build/rules/flake8/migrations.yaml1
-rw-r--r--contrib/python/ipython/py2/.yandex_meta/yamaker.yaml2
-rw-r--r--contrib/python/ipython/py2/patches/02-fix-ya.make.patch11
-rw-r--r--contrib/python/ipython/py3/.yandex_meta/yamaker.yaml2
-rw-r--r--contrib/python/ipython/py3/patches/02-fix-ya.make.patch11
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/agg_list.md8
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/bool_bit.md7
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/corr_covar.md8
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/count_distinct_estimate.md7
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/histogram.md20
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/max_min_by.md9
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/percentile_median.md7
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/simple.md47
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/stddev_variance.md17
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/top_bottom.md16
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/aggregation/topfreq_mode.md6
-rw-r--r--ydb/library/yql/mount/lib/yql/aggregate.yql63
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))
))))