Функции для работы с типами данных
- Примеры
- FormatType
- FormatTypeDiff и FormatTypeDiffPretty
- ParseType
- TypeOf
- InstanceOf
- DataType
- OptionalType
- ListType и StreamType
- DictType
- TupleType
- StructType
- VariantType
- ResourceType
- CallableType
- GenericType, UnitType и VoidType
- OptionalItemType, ListItemType и StreamItemType
- DictKeyType и DictPayloadType
- TupleElementType
- StructMemberType
- CallableResultType и CallableArgumentType
- VariantUnderlyingType
- Функции для работы с типами данных во время выполнения вычислений
- TypeHandle
- EvaluateType
- ParseTypeHandle
- TypeKind
- DataTypeComponents
- DataTypeHandle
- OptionalTypeHandle
- PgTypeName
- PgTypeHandle
- ListTypeHandle и StreamTypeHandle
- EmptyListTypeHandle и EmptyDictTypeHandle
- TupleTypeComponents
- TupleTypeHandle
- StructTypeComponents
- StructTypeHandle
- DictTypeComponents
- DictTypeHandle
- ResourceTypeTag
- ResourceTypeHandle
- TaggedTypeComponents
- TaggedTypeHandle
- VariantTypeHandle
- VoidTypeHandle и NullTypeHandle
- CallableTypeComponents
- CallableArgument
- CallableTypeHandle
- LambdaArgumentsCount
- LambdaOptionalArgumentsCount
Помимо обычных функций, которые работают с конкретными значениями (типа FIND, COALESCE), YQL поддерживает функции для работами с типами.
Функции позволяют узнать тип произвольного выражения, проанализировать контейнерный тип и создавть новый контейнерный тип на основе имеющегося.
Примеры
$itemType = TypeOf($item);
SELECT CAST($foo AS ListType($itemType)); -- каст $foo к типу List<$itemType>
FormatType
Сигнатура
FormatType(Type)->String
FormatType(TypeHandle)->String
Сериализация типа или хендла типа в человекочитаемую строку. Это полезно для отладки, а также будет использоваться в последующих примерах данного раздела. Документация по формату.
FormatTypeDiff и FormatTypeDiffPretty
Сигнатура
FormatTypeDiff(Type, Type)->String
FormatTypeDiff(TypeHandle, TypeHandle)->String
FormatTypeDiffPretty(Type, Type)->String
FormatTypeDiffPretty(TypeHandle, TypeHandle)->String
Получение строкового представления разницы двух типов или двух хендлов типов. Pretty-версия делает результирующую строку более читаемой путем добавления переводов строк и пробелов.
ParseType
Сигнатура
ParseType(String)->Type
Построение типа по строке с его описанием. Документация по её формату.
Примеры
SELECT FormatType(ParseType("List<Int32>")); -- List<int32>
TypeOf
Сигнатура
TypeOf(<any expression>)->Type
Получение типа значения, переданного в аргумент.
Примеры
SELECT FormatType(TypeOf("foo")); -- String
SELECT FormatType(TypeOf(AsTuple(1, 1u))); -- Tuple<Int32,Uint32>
InstanceOf
Сигнатура
InstanceOf(Type)->объект типа Type
Возвращает экземпляр объекта указанного типа. Полученный объект не имеет какого-то определенного значения.
InstanceOf можно использовать только в том случае, если результат выражения в котором InstanceOf используется зависит от типа InstanceOf, но не от значения.
В противном случае операция будет завершена с ошибкой.
Примеры
SELECT InstanceOf(ParseType("Int32")) + 1.0; -- ошибка (Can't execute InstanceOf): результат зависит от (неопределенного) значения InstanceOf
SELECT FormatType(TypeOf(
InstanceOf(ParseType("Int32")) +
InstanceOf(ParseType("Double"))
)); -- вернет Double, так как сложение Int32 и Double возвращает Double (InstanceOf используется в контексте, где важен только его тип, но не значение)
DataType
Сигнатура
DataType(String, [String, ...])->Type
Возвращает тип для примитивных типов данных по его имени.
Для некоторых типов (например Decimal) необходимо передавать параметры типа в качестве дополнительных аргументов.
Примеры
SELECT FormatType(DataType("Bool")); -- Bool
SELECT FormatType(DataType("Decimal","5","1")); -- Decimal(5,1)
OptionalType
Сигнатура
OptionalType(Type)->опциональный Type
Добавляет в переданный тип возможность содержать NULL
.
Примеры
SELECT FormatType(OptionalType(DataType("Bool"))); -- Bool?
SELECT FormatType(OptionalType(ParseType("List<String?>"))); -- List<String?>?
ListType и StreamType
Сигнатура
ListType(Type)->тип списка с элементами типа Type
StreamType(Type)->тип потока с элементами типа Type
Строит тип списка или потока по переданному типу элемента.
Примеры
SELECT FormatType(ListType(DataType("Bool"))); -- List<Bool>
DictType
Сигнатура
DictType(Type, Type)->тип словаря
Строит тип словаря по переданным типам ключа (первый аргумент) и значения (второй аргумент).
Примеры
SELECT FormatType(DictType(
DataType("String"),
DataType("Double")
)); -- Dict<String,Double>
TupleType
Сигнатура
TupleType(Type, ...)->тип кортежа
Строит тип кортежа по переданным типам элементов.
Примеры
SELECT FormatType(TupleType(
DataType("String"),
DataType("Double"),
OptionalType(DataType("Bool"))
)); -- Tuple<String,Double,Bool?>
StructType
Сигнатура
StructType(Type AS ElementName1, Type AS ElementName2, ...)->тип структуры
Строит тип структуры по переданным типам элементов. Для указания имен элементов используется стандартный синтаксис именованных аргументов.
Примеры
SELECT FormatType(StructType(
DataType("Bool") AS MyBool,
ListType(DataType("String")) AS StringList
)); -- Struct<'MyBool':Bool,'StringList':List<String>>
VariantType
Сигнатура
VariantType(StructType)->тип варианта над структурой
VariantType(TupleType)->тип варианта над кортежем
Возвращает тип варианта по низлежащему типу (структуры или кортежа).
Примеры
SELECT FormatType(VariantType(
ParseType("Struct<foo:Int32,bar:Double>")
)); -- Variant<'bar':Double,'foo':Int32>
ResourceType
Сигнатура
ResourceType(String)->тип ресурса
Возвращает тип ресурса по переданной строковой метке.
Примеры
SELECT FormatType(ResourceType("Foo")); -- Resource<'Foo'>
CallableType
Сигнатура
CallableType(Uint32, Type, [Type, ...])->тип вызываемого значения
Строит тип вызываемого значения по следующим аргументам:
- Число опциональных аргументов (если все обязательные — 0).
- Тип результата.
- Все последующие аргументы CallableType трактуются как типы аргументов вызываемого значения со сдвигом на два обязательных (например, третий аргумент CallableType описывает тип первого аргумента вызываемого значения).
Примеры
SELECT FormatType(CallableType(
1, -- optional args count
DataType("Double"), -- result type
DataType("String"), -- arg #1 type
OptionalType(DataType("Int64")) -- arg #2 type
)); -- Callable<(String,[Int64?])->Double>
GenericType, UnitType и VoidType
Сигнатура
GenericType()->тип
UnitType()->тип
VoidType()->тип
Возвращают одноименные специальные типы данных. Аргументов нет, так как они не параметризуются.
Примеры
SELECT FormatType(VoidType()); -- Void
OptionalItemType, ListItemType и StreamItemType
Сигнатура
OptionalItemType(OptionalType)->тип элемента опционального типа
ListItemType(ListType)->тип элемента списочного типа
StreamItemType(StreamType)->тип элемента потокового типа
Если этим функциям передается тип, то они выполняют действие, обратное OptionalType, ListType и StreamType — возвращают тип элемента по типу соответствующего контейнера.
Если этим функциям передается хендл типа, то выполняют действие, обратное OptionalTypeHandle, ListTypeHandle и StreamTypeHandle - возвращают хендл типа элемента по хендлу типа соответствующего контейнера.
Примеры
SELECT FormatType(ListItemType(
ParseType("List<Int32>")
)); -- Int32
SELECT FormatType(ListItemType(
ParseTypeHandle("List<Int32>")
)); -- Int32
DictKeyType и DictPayloadType
Сигнатура
DictKetType(DictType)->тип ключа словаря
DictPayloadType(DictType)->тип значения словаря
Возвращают тип ключа или значения по типу словаря.
Примеры
SELECT FormatType(DictKeyType(
ParseType("Dict<Int32,String>")
)); -- Int32
TupleElementType
Сигнатура
TupleElementType(TupleType, String)->тип элемента кортежа
Возвращает тип элемента кортежа по типу кортежа и индексу элемента (индекс с нуля).
Примеры
SELECT FormatType(TupleElementType(
ParseType("Tuple<Int32,Double>"), "1"
)); -- Double
StructMemberType
Сигнатура
StructMemberType(StructType, String)->тип элемента структуры
Возвращает тип элемента структуры по типу структуры и имени элемента.
Примеры
SELECT FormatType(StructMemberType(
ParseType("Struct<foo:Int32,bar:Double>"), "foo"
)); -- Int32
CallableResultType и CallableArgumentType
Сигнатура
CallableResultType(CallableType)->тип результата вызываемого значения
CallableArgumentType(CallableType, Uint32)->тип аругмента вызываемого значения
CallableResultType
возвращает тип результата по типу вызываемого значения, а CallableArgumentType
— тип аргумента по типу вызываемого значения и его индексу (индекс с нуля).
Примеры
$callable_type = ParseType("(String,Bool)->Double");
SELECT FormatType(CallableResultType(
$callable_type
)), -- Double
FormatType(CallableArgumentType(
$callable_type, 1
)); -- Bool
VariantUnderlyingType
Сигнатура
VariantUnderlyingType(VariantType)->низлежащий тип варианта
Если этой функции передается тип, то она выполняет действие, обратное VariantType — возвращает низлежащий тип по типу варианта.
Если этой функции передается хендл типа, то она выполняет действие, обратное VariantTypeHandle — возвращает хендл низлежащего типа по хендлу типа варианта.
Примеры
SELECT FormatType(VariantUnderlyingType(
ParseType("Variant<foo:Int32,bar:Double>")
)), -- Struct<'bar':Double,'foo':Int32>
FormatType(VariantUnderlyingType(
ParseType("Variant<Int32,Double>")
)); -- Tuple<Int32,Double>
SELECT FormatType(VariantUnderlyingType(
ParseTypeHandle("Variant<foo:Int32,bar:Double>")
)), -- Struct<'bar':Double,'foo':Int32>
FormatType(VariantUnderlyingType(
ParseTypeHandle("Variant<Int32,Double>")
)); -- Tuple<Int32,Double>
Функции для работы с типами данных во время выполнения вычислений
Для работы с типами данных во время выполнения вычислений используется механизм хендлов типов - ресурс, содержащий непрозрачное описание типа. После конструирования хендла типа можно вернуться к обычному типу с помощью функции EvaluateType. Для отладки сконвертировать хендл типа в строку можно с помощью функции FormatType.
TypeHandle
Получение хендла типа из типа, переданного в аргумент.
Сигнатура
TypeHandle(Type)->хэндл типа
Примеры
SELECT FormatType(TypeHandle(TypeOf("foo"))); -- String
EvaluateType
Сигнатура
EvaluateType(TypeHandle)->тип
Получение типа из хендла типа, переданного в аргумент. Функция вычисляется до начала основного расчета, как и EvaluateExpr.
Примеры
SELECT FormatType(EvaluateType(TypeHandle(TypeOf("foo")))); -- String
ParseTypeHandle
Сигнатура
ParseTypeHandle(String)->хэндл типа
Построение хендла типа по строке с его описанием. Документация по её формату.
Примеры
SELECT FormatType(ParseTypeHandle("List<Int32>")); -- List<int32>
TypeKind
Сигнатура
TypeKind(TypeHandle)->String
Получение названия верхнего уровня типа из хендла типа, переданного в аргумент.
Примеры
SELECT TypeKind(TypeHandle(TypeOf("foo"))); -- Data
SELECT TypeKind(ParseTypeHandle("List<Int32>")); -- List
DataTypeComponents
Сигнатура
DataTypeComponents(DataTypeHandle)->List<String>
Получение названия и параметров примитивного типа данных из хендла примитивного типа, переданного в аргумент. Обратная функция - DataTypeHandle.
Примеры
SELECT DataTypeComponents(TypeHandle(TypeOf("foo"))); -- ["String"]
SELECT DataTypeComponents(ParseTypeHandle("Decimal(4,1)")); -- ["Decimal", "4", "1"]
DataTypeHandle
Сигнатура
DataTypeHandle(List<String>)->хэндл примитивного типа данных
Построение хендла примитивного типа данных из его названия и параметров, переданных списком в аргумент. Обратная функция - DataTypeComponents.
Примеры
SELECT FormatType(DataTypeHandle(
AsList("String")
)); -- String
SELECT FormatType(DataTypeHandle(
AsList("Decimal", "4", "1")
)); -- Decimal(4,1)
OptionalTypeHandle
Сигнатура
OptionalTypeHandle(TypeHandle)->хэндл опционального типа
Добавляет в переданный хендл типа возможность содержать NULL
.
Примеры
SELECT FormatType(OptionalTypeHandle(
TypeHandle(DataType("Bool"))
)); -- Bool?
PgTypeName
Сигнатура
PgTypeName(PgTypeHandle)->String
Получение имени PostgreSQL типа из хендла типа, переданного в аргумент. Обратная функция - PgTypeHandle.
Примеры
SELECT PgTypeName(ParseTypeHandle("pgint4")); -- int4
PgTypeHandle
Сигнатура
PgTypeHandle(String)->хендл типа
Построение хендла типа по имени PostgreSQL типа, переданного в аргумент. Обратная функция - PgTypeName.
Примеры
SELECT FormatType(PgTypeHandle("int4")); -- pgint4
ListTypeHandle и StreamTypeHandle
Сигнатура
ListTypeHandle(TypeHandle)->хэндл списочного типа
StreamTypeHandle(TypeHandle)->хэндл потокового типа
Строит хендл типа списка или потока по переданному хендлу типа элемента.
Примеры
SELECT FormatType(ListTypeHandle(
TypeHandle(DataType("Bool"))
)); -- List<Bool>
EmptyListTypeHandle и EmptyDictTypeHandle
Сигнатура
EmptyListTypeHandle()->хэндл типа пустого списка
EmptyDictTypeHandle()->хэндл типа пустого словаря
Строит хендл типа пустого списка или словаря.
Примеры
SELECT FormatType(EmptyListTypeHandle()); -- EmptyList
TupleTypeComponents
Сигнатура
TupleTypeComponents(TupleTypeHandle)->List<TypeHandle>
Получение списка хендлов типов элементов из хендла типа кортежа, переданного в аргумент. Обратная функция - TupleTypeHandle.
Примеры
SELECT ListMap(
TupleTypeComponents(
ParseTypeHandle("Tuple<Int32, String>")
),
($x)->{
return FormatType($x)
}
); -- ["Int32", "String"]
TupleTypeHandle
Сигнатура
TupleTypeHandle(List<TypeHandle>)->хэндл типа кортежа
Построение хендла типа кортежа из хендлов типов элементов, переданных списком в аргумент. Обратная функция - TupleTypeComponents.
Примеры
SELECT FormatType(
TupleTypeHandle(
AsList(
ParseTypeHandle("Int32"),
ParseTypeHandle("String")
)
)
); -- Tuple<Int32,String>
StructTypeComponents
Сигнатура
StructTypeComponents(StructTypeHandle)->List<Struct<Name:String, Type:TypeHandle>>
Получение списка хендлов типов элементов и их имен из хендла типа структуры, переданного в аргумент. Обратная функция - StructTypeHandle.
Примеры
SELECT ListMap(
StructTypeComponents(
ParseTypeHandle("Struct<a:Int32, b:String>")
),
($x) -> {
return AsTuple(
FormatType($x.Type),
$x.Name
)
}
); -- [("Int32","a"), ("String","b")]
StructTypeHandle
Сигнатура
StructTypeHandle(List<Struct<Name:String, Type:TypeHandle>>)->хэндл типа структуры
Построение хендла типа структуры из хендлов типов элементов и имен, переданных списком в аргумент. Обратная функция - StructTypeComponents.
Примеры
SELECT FormatType(
StructTypeHandle(
AsList(
AsStruct(ParseTypeHandle("Int32") as Type,"a" as Name),
AsStruct(ParseTypeHandle("String") as Type, "b" as Name)
)
)
); -- Struct<'a':Int32,'b':String>
DictTypeComponents
Сигнатура
DictTypeComponents(DictTypeHandle)->Struct<Key:TypeHandle, Payload:TypeHandle>
Получение хендла типа-ключа и хендла типа-значения - из хендла типа словаря, переданного в аргумент. Обратная функция - DictTypeHandle.
Примеры
$d = DictTypeComponents(ParseTypeHandle("Dict<Int32,String>"));
SELECT
FormatType($d.Key), -- Int32
FormatType($d.Payload); -- String
DictTypeHandle
Сигнатура
DictTypeHandle(TypeHandle, TypeHandle)->хэндл типа словаря
Построение хендла типа словаря из хендла типа-ключа и хендла типа-значения, переданных в аргументы. Обратная функция - DictTypeComponents.
Примеры
SELECT FormatType(
DictTypeHandle(
ParseTypeHandle("Int32"),
ParseTypeHandle("String")
)
); -- Dict<Int32, String>
ResourceTypeTag
Сигнатура
ResourceTypeTag(ResourceTypeHandle)->String
Получение тега из хендла типа ресурса, переданного в аргумент. Обратная функция - ResourceTypeHandle.
Примеры
SELECT ResourceTypeTag(ParseTypeHandle("Resource<foo>")); -- foo
ResourceTypeHandle
Сигнатура
ResourceTypeHandle(String)->хэндл типа ресурса
Построение хендла типа ресурса по значению тега, переданного в аргумент. Обратная функция - ResourceTypeTag.
Примеры
SELECT FormatType(ResourceTypeHandle("foo")); -- Resource<'foo'>
TaggedTypeComponents
Сигнатура
TaggedTypeComponents(TaggedTypeHandle)->Struct<Base:TypeHandle, Tag:String>
Получение тега и базового типа из хендла декорированного типа, переданного в аргумент. Обратная функция - TaggedTypeHandle.
Примеры
$t = TaggedTypeComponents(ParseTypeHandle("Tagged<Int32,foo>"));
SELECT FormatType($t.Base), $t.Tag; -- Int32, foo
TaggedTypeHandle
Сигнатура
TaggedTypeHandle(TypeHandle, String)->хэндл декорированного типа
Построение хендла декорированного типа по хендлу базового типа и имени тега, переданных в аргументах. Обратная функция - TaggedTypeComponents.
Примеры
SELECT FormatType(TaggedTypeHandle(
ParseTypeHandle("Int32"), "foo"
)); -- Tagged<Int32, 'foo'>
VariantTypeHandle
Сигнатура
VariantTypeHandle(StructTypeHandle)->хэндл типа варианта над структурой
VariantTypeHandle(TupleTypeHandle)->хэндл типа варианта над кортежем
Построение хендла типа варианта по хендлу низлежащего типа, переданного в аргумент. Обратная функция - VariantUnderlyingType.
Примеры
SELECT FormatType(VariantTypeHandle(
ParseTypeHandle("Tuple<Int32, String>")
)); -- Variant<Int32, String>
VoidTypeHandle и NullTypeHandle
Сигнатура
VoidTypeHandle()->хэндл типа Void
NullTypeHandle()->хэндл типа Null
Построение хендла типов Void и Null соответственно.
Примеры
SELECT FormatType(VoidTypeHandle()); -- Void
SELECT FormatType(NullTypeHandle()); -- Null
CallableTypeComponents
Сигнатура
CallableTypeComponents(CallableTypeHandle)->
Struct<
Arguments:List<Struct<
Flags:List<String>,
Name:String,
Type:TypeHandle>>,
OptionalArgumentsCount:Uint32,
Payload:String,
Result:TypeHandle
>
Получение описания хендла типа вызываемого значения, переданного в аргумент. Обратная функция - CallableTypeHandle.
Примеры
$formatArgument = ($x) -> {
return AsStruct(
FormatType($x.Type) as Type,
$x.Name as Name,
$x.Flags as Flags
)
};
$formatCallable = ($x) -> {
return AsStruct(
$x.OptionalArgumentsCount as OptionalArgumentsCount,
$x.Payload as Payload,
FormatType($x.Result) as Result,
ListMap($x.Arguments, $formatArgument) as Arguments
)
};
SELECT $formatCallable(
CallableTypeComponents(
ParseTypeHandle("(Int32,[bar:Double?{Flags:AutoMap}])->String")
)
); -- (OptionalArgumentsCount: 1, Payload: "", Result: "String", Arguments: [
-- (Type: "Int32", Name: "", Flags: []),
-- (Type: "Double?", Name: "bar", Flags: ["AutoMap"]),
-- ])
CallableArgument
Сигнатура
CallableArgument(TypeHandle, [String, [List<String>]])->Struct<Flags:List<String>,Name:String,Type:TypeHandle>
Упаковка в структуру описания аргумента вызываемого значения для передачи в функцию CallableTypeHandle по следующим аргументам:
- Хендл типа аргумента.
- Необязательное имя аргумента. Значение по умолчанию - пустая строка.
- Необязательные флаги аргумента в виде списка строк. Значение по умолчанию - пустой список. Поддерживаемые флаги - "AutoMap".
CallableTypeHandle
Сигнатура
CallableTypeHandle(TypeHandle, List<Struct<Flags:List<String>,Name:String,Type:TypeHandle>>, [Uint32, [String]])->хэндл типа вызываемого значения
Построение хендла типа вызываемого значения по следующим аргументам:
- Хендл типа возвращаемого значения.
- Список описаний аргументов, полученных через функцию CallableArgument.
- Необязательное количество необязательных аргументов в вызываемом значении. Значение по умолчанию - 0.
- Необязательная метка для типа вызываемого значения. Значение по умолчанию - пустая строка.
Обратная функция - CallableTypeComponents.
Примеры
SELECT FormatType(
CallableTypeHandle(
ParseTypeHandle("String"),
AsList(
CallableArgument(ParseTypeHandle("Int32")),
CallableArgument(ParseTypeHandle("Double?"), "bar", AsList("AutoMap"))
),
1
)
); -- Callable<(Int32,['bar':Double?{Flags:AutoMap}])->String>
LambdaArgumentsCount
Сигнатура
LambdaArgumentsCount(LambdaFunction)->Uint32
Получение количества аргументов в лямбда-функции.
Примеры
SELECT LambdaArgumentsCount(($x, $y)->($x+$y))
; -- 2
LambdaOptionalArgumentsCount
Сигнатура
LambdaOptionalArgumentsCount(LambdaFunction)->Uint32
Получение количества опциональных аргументов в лямбда-функции.
Примеры
SELECT LambdaOptionalArgumentsCount(($x, $y, $z?)->(if($x,$y,$z)))
; -- 1