#include "yql_factory.h" #include "yql_formatcode.h" #include "yql_formattype.h" #include "yql_formattypediff.h" #include "yql_makecode.h" #include "yql_maketype.h" #include "yql_parsetypehandle.h" #include "yql_reprcode.h" #include "yql_serializetypehandle.h" #include "yql_splittype.h" #include "yql_typehandle.h" #include "yql_typekind.h" namespace NKikimr { namespace NMiniKQL { typedef IComputationNode* (*TYqlCallableComputationNodeBuilderFunc)(TCallable& callable, const TComputationNodeFactoryContext& ctx, ui32 exprCtxMutableIndex); typedef THashMap TYqlCallableComputationNodeBuilderFuncMap; struct TYqlCallableComputationNodeBuilderFuncMapFiller { TYqlCallableComputationNodeBuilderFuncMap Map; TYqlCallableComputationNodeBuilderFuncMapFiller() { Map["FormatType"] = &WrapFormatType; Map["FormatTypeDiff"] = &WrapFormatTypeDiff; Map["ParseTypeHandle"] = &WrapParseTypeHandle; Map["SerializeTypeHandle"] = &WrapSerializeTypeHandle; Map["TypeHandle"] = &WrapTypeHandle; Map["TypeKind"] = &WrapTypeKind; Map["DataTypeComponents"] = &WrapSplitType; Map["DataTypeHandle"] = &WrapMakeType; Map["OptionalItemType"] = &WrapSplitType; Map["OptionalTypeHandle"] = &WrapMakeType; Map["ListItemType"] = &WrapSplitType; Map["ListTypeHandle"] = &WrapMakeType; Map["StreamItemType"] = &WrapSplitType; Map["StreamTypeHandle"] = &WrapMakeType; Map["TupleTypeComponents"] = &WrapSplitType; Map["TupleTypeHandle"] = &WrapMakeType; Map["StructTypeComponents"] = &WrapSplitType; Map["StructTypeHandle"] = &WrapMakeType; Map["DictTypeComponents"] = &WrapSplitType; Map["DictTypeHandle"] = &WrapMakeType; Map["ResourceTypeTag"] = &WrapSplitType; Map["ResourceTypeHandle"] = &WrapMakeType; Map["TaggedTypeComponents"] = &WrapSplitType; Map["TaggedTypeHandle"] = &WrapMakeType; Map["VariantUnderlyingType"] = &WrapSplitType; Map["VariantTypeHandle"] = &WrapMakeType; Map["VoidTypeHandle"] = &WrapMakeType; Map["NullTypeHandle"] = &WrapMakeType; Map["EmptyListTypeHandle"] = &WrapMakeType; Map["EmptyDictTypeHandle"] = &WrapMakeType; Map["CallableTypeComponents"] = &WrapSplitType; Map["CallableTypeHandle"] = &WrapMakeType; Map["PgTypeName"] = &WrapSplitType; Map["PgTypeHandle"] = &WrapMakeType; Map["FormatCode"] = &WrapFormatCode; Map["FormatCodeWithPositions"] = &WrapFormatCode; Map["SerializeCode"] = &WrapSerializeCode; Map["WorldCode"] = &WrapMakeCode; Map["AtomCode"] = &WrapMakeCode; Map["ListCode"] = &WrapMakeCode; Map["FuncCode"] = &WrapMakeCode; Map["LambdaCode"] = &WrapMakeCode; Map["ReprCode"] = &WrapReprCode; } }; TComputationNodeFactory GetYqlFactory(ui32 exprCtxMutableIndex) { return [exprCtxMutableIndex](TCallable& callable, const TComputationNodeFactoryContext& ctx) -> IComputationNode* { const auto& map = Singleton()->Map; auto it = map.find(callable.GetType()->GetName()); if (it == map.end()) return nullptr; return it->second(callable, ctx, exprCtxMutableIndex); }; } TComputationNodeFactory GetYqlFactory() { TComputationNodeFactory yqlFactory; return [yqlFactory] (TCallable& callable, const TComputationNodeFactoryContext& ctx) mutable -> IComputationNode* { if (!yqlFactory) { yqlFactory = GetYqlFactory(ctx.Mutables.CurValueIndex++); } return yqlFactory(callable, ctx); }; } } }