Функции для работы с типами данных

Помимо обычных функций, которые работают с конкретными значениями (типа 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, ...])->тип вызываемого значения

Строит тип вызываемого значения по следующим аргументам:

  1. Число опциональных аргументов (если все обязательные — 0).
  2. Тип результата.
  3. Все последующие аргументы 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>