yql_factory.cpp 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "yql_factory.h"
  2. #include "yql_formatcode.h"
  3. #include "yql_formattype.h"
  4. #include "yql_formattypediff.h"
  5. #include "yql_makecode.h"
  6. #include "yql_maketype.h"
  7. #include "yql_parsetypehandle.h"
  8. #include "yql_reprcode.h"
  9. #include "yql_serializetypehandle.h"
  10. #include "yql_splittype.h"
  11. #include "yql_typehandle.h"
  12. #include "yql_typekind.h"
  13. namespace NKikimr {
  14. namespace NMiniKQL {
  15. typedef IComputationNode* (*TYqlCallableComputationNodeBuilderFunc)(TCallable& callable, const TComputationNodeFactoryContext& ctx, ui32 exprCtxMutableIndex);
  16. typedef THashMap<TString, TYqlCallableComputationNodeBuilderFunc> TYqlCallableComputationNodeBuilderFuncMap;
  17. struct TYqlCallableComputationNodeBuilderFuncMapFiller {
  18. TYqlCallableComputationNodeBuilderFuncMap Map;
  19. TYqlCallableComputationNodeBuilderFuncMapFiller()
  20. {
  21. Map["FormatType"] = &WrapFormatType;
  22. Map["FormatTypeDiff"] = &WrapFormatTypeDiff;
  23. Map["ParseTypeHandle"] = &WrapParseTypeHandle;
  24. Map["SerializeTypeHandle"] = &WrapSerializeTypeHandle;
  25. Map["TypeHandle"] = &WrapTypeHandle;
  26. Map["TypeKind"] = &WrapTypeKind;
  27. Map["DataTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Data>;
  28. Map["DataTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Data>;
  29. Map["OptionalItemType"] = &WrapSplitType<NYql::ETypeAnnotationKind::Optional>;
  30. Map["OptionalTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Optional>;
  31. Map["ListItemType"] = &WrapSplitType<NYql::ETypeAnnotationKind::List>;
  32. Map["ListTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::List>;
  33. Map["StreamItemType"] = &WrapSplitType<NYql::ETypeAnnotationKind::Stream>;
  34. Map["StreamTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Stream>;
  35. Map["TupleTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Tuple>;
  36. Map["TupleTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Tuple>;
  37. Map["StructTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Struct>;
  38. Map["StructTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Struct>;
  39. Map["DictTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Dict>;
  40. Map["DictTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Dict>;
  41. Map["ResourceTypeTag"] = &WrapSplitType<NYql::ETypeAnnotationKind::Resource>;
  42. Map["ResourceTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Resource>;
  43. Map["TaggedTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Tagged>;
  44. Map["TaggedTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Tagged>;
  45. Map["VariantUnderlyingType"] = &WrapSplitType<NYql::ETypeAnnotationKind::Variant>;
  46. Map["VariantTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Variant>;
  47. Map["VoidTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Void>;
  48. Map["NullTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Null>;
  49. Map["EmptyListTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::EmptyList>;
  50. Map["EmptyDictTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::EmptyDict>;
  51. Map["CallableTypeComponents"] = &WrapSplitType<NYql::ETypeAnnotationKind::Callable>;
  52. Map["CallableTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Callable>;
  53. Map["PgTypeName"] = &WrapSplitType<NYql::ETypeAnnotationKind::Pg>;
  54. Map["PgTypeHandle"] = &WrapMakeType<NYql::ETypeAnnotationKind::Pg>;
  55. Map["FormatCode"] = &WrapFormatCode<false>;
  56. Map["FormatCodeWithPositions"] = &WrapFormatCode<true>;
  57. Map["SerializeCode"] = &WrapSerializeCode;
  58. Map["WorldCode"] = &WrapMakeCode<NYql::TExprNode::World>;
  59. Map["AtomCode"] = &WrapMakeCode<NYql::TExprNode::Atom>;
  60. Map["ListCode"] = &WrapMakeCode<NYql::TExprNode::List>;
  61. Map["FuncCode"] = &WrapMakeCode<NYql::TExprNode::Callable>;
  62. Map["LambdaCode"] = &WrapMakeCode<NYql::TExprNode::Lambda>;
  63. Map["ReprCode"] = &WrapReprCode;
  64. }
  65. };
  66. TComputationNodeFactory GetYqlFactory(ui32 exprCtxMutableIndex) {
  67. return [exprCtxMutableIndex](TCallable& callable, const TComputationNodeFactoryContext& ctx) -> IComputationNode* {
  68. const auto& map = Singleton<TYqlCallableComputationNodeBuilderFuncMapFiller>()->Map;
  69. auto it = map.find(callable.GetType()->GetName());
  70. if (it == map.end())
  71. return nullptr;
  72. return it->second(callable, ctx, exprCtxMutableIndex);
  73. };
  74. }
  75. TComputationNodeFactory GetYqlFactory() {
  76. TComputationNodeFactory yqlFactory;
  77. return [yqlFactory]
  78. (TCallable& callable, const TComputationNodeFactoryContext& ctx) mutable -> IComputationNode* {
  79. if (!yqlFactory) {
  80. yqlFactory = GetYqlFactory(ctx.Mutables.CurValueIndex++);
  81. }
  82. return yqlFactory(callable, ctx);
  83. };
  84. }
  85. }
  86. }