Функции для работы с типами данных
- FormatType
- 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
Помимо обычных функций, которые работают с конкретными значениями (типа FIND, COALESCE), YQL поддерживает функции для работами с типами.
Функции позволяют узнать тип произвольного выражения, проанализировать контейнерный тип и создавть новый контейнерный тип на основе имеющегося.
Примеры
$itemType = TypeOf($item);
SELECT CAST($foo AS ListType($itemType)); -- каст $foo к типу List<$itemType>
FormatType
Сигнатура
FormatType(Type)->String
Сериализация типа в человекочитаемую строку. Это полезно для отладки, а также будет использоваться в последующих примерах данного раздела. Документация по формату.
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 — возвращают тип элемента по типу соответствующего контейнера.
Примеры
SELECT FormatType(ListItemType(
ParseType("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 — возвращает низлежащий тип по типу варианта.
Примеры
SELECT FormatType(VariantUnderlyingType(
ParseType("Variant<foo:Int32,bar:Double>")
)), -- Struct<'bar':Double,'foo':Int32>
FormatType(VariantUnderlyingType(
ParseType("Variant<Int32,Double>")
)); -- Tuple<Int32,Double>