# Функции для работы со словарями ## DictCreate {#dictcreate} ### Сигнатура ```yql DictCreate(K,V)->Dict ``` Сконструировать пустой словарь. Передается два аргумента — для ключа и значения, в каждом из которых указывается строка с описанием типа данных, либо сам тип, полученный с помощью [предназначенных для этого функций](types.md). Словарей с неизвестным типом ключа или значения в YQL не бывает. В качестве типа ключа могут быть заданы: * [примитивный тип данных](../types/primitive.md) (кроме `Yson` и `Json`), * примитивный тип данных (кроме `Yson` и `Json`) с признаком опциональности, * кортеж длины не менее два из типов, перечисленных выше. [Документация по формату описания типа](../types/type_string.md). ### Примеры ```yql SELECT DictCreate(String, Tuple); ``` ```yql SELECT DictCreate(Tuple, OptionalType(DataType("String"))); ``` ```yql SELECT DictCreate(ParseType("Tuple"), ParseType("Tuple")); ``` ## SetCreate {#setcreate} ### Сигнатура ```yql SetCreate(T)->Set ``` Сконструировать пустое множество. Передается аргумент - тип ключа, возможно, полученный с помощью [предназначенных для этого функций](types.md). Множеств с неизвестным типом ключа в YQL не бывает. Ограничения на тип ключа такие же как и на тип ключа для словаря. Следует иметь ввиду, что множество это словарь с типом значения `Void` и множество также можно создать и с помощью функции `DictCreate`. Отсюда также следует, что все функции, которые принимают на вход `Dict` могут также принимать `Set`. [Документация по формату описания типа](../types/type_string.md). ### Примеры ```yql SELECT SetCreate(String); ``` ```yql SELECT SetCreate(Tuple); ``` ## DictLength {#dictlength} ### Сигнатура ```yql DictLength(Dict)->Uint64 DictLength(Dict?)->Uint64? ``` Количество элементов в словаре. ### Примеры ```yql SELECT DictLength(AsDict(AsTuple(1, AsList("foo", "bar")))); ``` ```yql SELECT DictLength(dict_column) FROM my_table; ``` ## DictHasItems {#dicthasitems} ### Сигнатура ```yql DictHasItems(Dict)->Bool DictHasItems(Dict?)->Bool? ``` Проверка того, что словарь содержит хотя бы один элемент. ### Примеры ```yql SELECT DictHasItems(AsDict(AsTuple(1, AsList("foo", "bar")))) FROM my_table; ``` ```yql SELECT DictHasItems(dict_column) FROM my_table; ``` ## DictItems {#dictitems} ### Сигнатура ```yql DictItems(Dict)->List> DictItems(Dict?)->List>? ``` Получение содержимого словаря в виде списка кортежей с парами ключ-значение (`List>`). ### Примеры ```yql SELECT DictItems(AsDict(AsTuple(1, AsList("foo", "bar")))); -- [ ( 1, [ "foo", "bar" ] ) ] ``` ```yql SELECT DictItems(dict_column) FROM my_table; ``` ## DictKeys {#dictkeys} ### Сигнатура ```yql DictKeys(Dict)->List DictKeys(Dict?)->List? ``` Получение списка ключей словаря. ### Примеры ```yql SELECT DictKeys(AsDict(AsTuple(1, AsList("foo", "bar")))); -- [ 1 ] ``` ```yql SELECT DictKeys(dict_column) FROM my_table; ``` ## DictPayloads {#dictpayloads} ### Сигнатура ```yql DictPayloads(Dict)->List DictPayloads(Dict?)->List? ``` Получение списка значений словаря. ### Примеры ```yql SELECT DictPayloads(AsDict(AsTuple(1, AsList("foo", "bar")))); -- [ [ "foo", "bar" ] ] ``` ```yql SELECT DictPayloads(dict_column) FROM my_table; ``` ## DictLookup {#dictlookup} ### Сигнатура ```yql DictLookup(Dict, K)->V? DictLookup(Dict?, K)->V? DictLookup(Dict, K?)->V? DictLookup(Dict?, K?)->V? ``` Получение элемента словаря по ключу. ### Примеры ```yql SELECT DictLookup(AsDict( AsTuple(1, AsList("foo", "bar")), AsTuple(2, AsList("bar", "baz")) ), 1); -- [ "foo", "bar" ] ``` ```yql SELECT DictLookup(dict_column, "foo") FROM my_table; ``` ## DictContains {#dictcontains} ### Сигнатура ```yql DictContains(Dict, K)->Bool DictContains(Dict?, K)->Bool DictContains(Dict, K?)->Bool DictContains(Dict?, K?)->Bool ``` Проверка наличия элемента в словаре по ключу. Возвращает true или false. ### Примеры ```yql SELECT DictContains(AsDict( AsTuple(1, AsList("foo", "bar")), AsTuple(2, AsList("bar", "baz")) ), 42); -- false ``` ```yql SELECT DictContains(dict_column, "foo") FROM my_table; ``` ## DictAggregate {#dictaggregate} ### Сигнатура ```yql DictAggregate(Dict>, List->T)->Dict DictAggregate(Dict>?, List->T)->Dict? ``` Применить [фабрику агрегационных функций](basic.md#aggregationfactory) для переданного словаря, в котором каждое значение является списком. Фабрика применяется отдельно внутри каждого ключа. Если список является пустым, то результат агрегации будет такой же, как для пустой таблицы: 0 для функции `COUNT` и `NULL` для других функций. Если в переданном словаре список по некоторому ключу является пустым, то такой ключ удаляется из результата. Если переданный словарь является опциональным и содержит значение `NULL`, то в результате также будет `NULL`. Аргументы: 1. Словарь; 2. [Фабрика агрегационных функций](basic.md#aggregationfactory). ### Примеры ```yql SELECT DictAggregate(AsDict( AsTuple(1, AsList("foo", "bar")), AsTuple(2, AsList("baz", "qwe"))), AggregationFactory("Max")); -- {1 : "foo", 2 : "qwe" } ``` ## SetIsDisjoint {#setisjoint} ### Сигнатура ```yql SetIsDisjoint(Dict, Dict)->Bool SetIsDisjoint(Dict?, Dict)->Bool? SetIsDisjoint(Dict, Dict?)->Bool? SetIsDisjoint(Dict?, Dict?)->Bool? SetIsDisjoint(Dict, List)->Bool SetIsDisjoint(Dict?, List)->Bool? SetIsDisjoint(Dict, List?)->Bool? SetIsDisjoint(Dict?, List?)->Bool? ``` Проверка того, что словарь и список или другой словарь не пересекаются по ключам. Таким образом есть два варианта вызова: * С аргументами `Dict` и `List`; * С аргументами `Dict` и `Dict`. ### Примеры ```yql SELECT SetIsDisjoint(ToSet(AsList(1, 2, 3)), AsList(7, 4)); -- true SELECT SetIsDisjoint(ToSet(AsList(1, 2, 3)), ToSet(AsList(3, 4))); -- false ``` ## SetIntersection {#setintersection} ### Сигнатура ```yql SetIntersection(Dict, Dict)->Set SetIntersection(Dict?, Dict)->Set? SetIntersection(Dict, Dict?)->Set? SetIntersection(Dict?, Dict?)->Set? SetIntersection(Dict, Dict, (K,V1,V2)->U)->Dict SetIntersection(Dict?, Dict, (K,V1,V2)->U)->Dict? SetIntersection(Dict, Dict?, (K,V1,V2)->U)->Dict? SetIntersection(Dict?, Dict?, (K,V1,V2)->U)->Dict? ``` Строит пересечение двух словарей по ключам. Аргументы: * Два словаря: `Dict` и `Dict`. * Необязательная функция, которая объединяет значения из исходных словарей для построения значений выходного словаря. Если тип такой функции `(K,V1,V2) -> U`, то типом результата будет `Dict`. Если функция не задана, типом результата будет `Dict`, а значения из исходных словарей игнорируются. ### Примеры ```yql SELECT SetIntersection(ToSet(AsList(1, 2, 3)), ToSet(AsList(3, 4))); -- { 3 } SELECT SetIntersection( AsDict(AsTuple(1, "foo"), AsTuple(3, "bar")), AsDict(AsTuple(1, "baz"), AsTuple(2, "qwe")), ($k, $a, $b) -> { RETURN AsTuple($a, $b) }); -- { 1 : ("foo", "baz") } ``` {% note info %} В примере использовалась [лямбда функция](../syntax/expressions.md#lambda). {% endnote %} ## SetIncludes {#setincludes} ### Сигнатура ```yql SetIncludes(Dict, List)->Bool SetIncludes(Dict?, List)->Bool? SetIncludes(Dict, List?)->Bool? SetIncludes(Dict?, List?)->Bool? SetIncludes(Dict, Dict)->Bool SetIncludes(Dict?, Dict)->Bool? SetIncludes(Dict, Dict?)->Bool? SetIncludes(Dict?, Dict?)->Bool? ``` Проверка того, что в ключи заданного словаря входят все элементы списка или ключи второго словаря. Таким образом есть два варианта вызова: * С аргументами `Dict` и `List`; * С аргументами `Dict` и `Dict`. ### Примеры ```yql SELECT SetIncludes(ToSet(AsList(1, 2, 3)), AsList(3, 4)); -- false SELECT SetIncludes(ToSet(AsList(1, 2, 3)), ToSet(AsList(2, 3))); -- true ``` ## SetUnion {#setunion} ### Сигнатура ```yql SetUnion(Dict, Dict)->Set SetUnion(Dict?, Dict)->Set? SetUnion(Dict, Dict?)->Set? SetUnion(Dict?, Dict?)->Set? SetUnion(Dict, Dict,(K,V1?,V2?)->U)->Dict SetUnion(Dict?, Dict,(K,V1?,V2?)->U)->Dict? SetUnion(Dict, Dict?,(K,V1?,V2?)->U)->Dict? SetUnion(Dict?, Dict?,(K,V1?,V2?)->U)->Dict? ``` Строит объединение двух словарей по ключам. Аргументы: * Два словаря: `Dict` и `Dict`. * Необязательная функция, которая объединяет значения из исходных словарей для построения значений выходного словаря. Если тип такой функции `(K,V1?,V2?) -> U`, то типом результата будет `Dict`. Если функция не задана, типом результата будет `Dict`, а значения из исходных словарей игнорируются. ### Примеры ```yql SELECT SetUnion(ToSet(AsList(1, 2, 3)), ToSet(AsList(3, 4))); -- { 1, 2, 3, 4 } SELECT SetUnion( AsDict(AsTuple(1, "foo"), AsTuple(3, "bar")), AsDict(AsTuple(1, "baz"), AsTuple(2, "qwe")), ($k, $a, $b) -> { RETURN AsTuple($a, $b) }); -- { 1 : ("foo", "baz"), 2 : (null, "qwe"), 3 : ("bar", null) } ``` ## SetDifference {#setdifference} ### Сигнатура ```yql SetDifference(Dict, Dict)->Dict SetDifference(Dict?, Dict)->Dict? SetDifference(Dict, Dict?)->Dict? SetDifference(Dict?, Dict?)->Dict? ``` Строит словарь, в котором есть все ключи с соответствующими значениями первого словаря, для которых нет ключа во втором словаре. ### Примеры ```yql SELECT SetDifference(ToSet(AsList(1, 2, 3)), ToSet(AsList(3, 4))); -- { 1, 2 } SELECT SetDifference( AsDict(AsTuple(1, "foo"), AsTuple(2, "bar")), ToSet(AsList(2, 3))); -- { 1 : "foo" } ``` ## SetSymmetricDifference {#setsymmetricdifference} ### Сигнатура ```yql SetSymmetricDifference(Dict, Dict)->Set SetSymmetricDifference(Dict?, Dict)->Set? SetSymmetricDifference(Dict, Dict?)->Set? SetSymmetricDifference(Dict?, Dict?)->Set? SetSymmetricDifference(Dict, Dict,(K,V1?,V2?)->U)->Dict SetSymmetricDifference(Dict?, Dict,(K,V1?,V2?)->U)->Dict? SetSymmetricDifference(Dict, Dict?,(K,V1?,V2?)->U)->Dict? SetSymmetricDifference(Dict?, Dict?,(K,V1?,V2?)->U)->Dict? ``` Строит симметрическую разность двух словарей по ключам. Аргументы: * Два словаря: `Dict` и `Dict`. * Необязательная функция, которая объединяет значения из исходных словарей для построения значений выходного словаря. Если тип такой функции `(K,V1?,V2?) -> U`, то типом результата будет `Dict`. Если функция не задана, типом результата будет `Dict`, а значения из исходных словарей игнорируются. ### Примеры ```yql SELECT SetSymmetricDifference(ToSet(AsList(1, 2, 3)), ToSet(AsList(3, 4))); -- { 1, 2, 4 } SELECT SetSymmetricDifference( AsDict(AsTuple(1, "foo"), AsTuple(3, "bar")), AsDict(AsTuple(1, "baz"), AsTuple(2, "qwe")), ($k, $a, $b) -> { RETURN AsTuple($a, $b) }); -- { 2 : (null, "qwe"), 3 : ("bar", null) } ```