dicts_udf.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <yql/essentials/public/udf/udf_value.h>
  2. #include <yql/essentials/public/udf/udf_value_builder.h>
  3. #include <yql/essentials/public/udf/udf_type_builder.h>
  4. #include <yql/essentials/public/udf/udf_registrator.h>
  5. #include <util/generic/yexception.h>
  6. using namespace NKikimr;
  7. using namespace NUdf;
  8. namespace {
  9. //////////////////////////////////////////////////////////////////////////////
  10. // TStrToInt
  11. //////////////////////////////////////////////////////////////////////////////
  12. class TStrToInt: public TBoxedValue
  13. {
  14. public:
  15. explicit TStrToInt(TType* dictType)
  16. : DictType_(dictType)
  17. {
  18. }
  19. static TStringRef Name() {
  20. static auto name = TStringRef::Of("StrToInt");
  21. return name;
  22. }
  23. private:
  24. TUnboxedValue Run(
  25. const IValueBuilder* valueBuilder,
  26. const TUnboxedValuePod* args) const override
  27. {
  28. auto kind = args[0].AsStringRef();
  29. ui32 flags = 0;
  30. if (TStringRef::Of("Hashed") == kind) {
  31. flags |= TDictFlags::Hashed;
  32. } else if (TStringRef::Of("Sorted") == kind) {
  33. flags |= TDictFlags::Sorted;
  34. }
  35. return valueBuilder->NewDict(DictType_, flags)->
  36. Add(valueBuilder->NewString("zero"), TUnboxedValuePod((ui32) 0))
  37. .Add(valueBuilder->NewString("one"), TUnboxedValuePod((ui32) 1))
  38. .Add(valueBuilder->NewString("two"), TUnboxedValuePod((ui32) 2))
  39. .Add(valueBuilder->NewString("three"), TUnboxedValuePod((ui32) 3))
  40. .Add(valueBuilder->NewString("four"), TUnboxedValuePod((ui32) 4))
  41. .Add(valueBuilder->NewString("five"), TUnboxedValuePod((ui32) 5))
  42. .Add(valueBuilder->NewString("six"), TUnboxedValuePod((ui32) 6))
  43. .Add(valueBuilder->NewString("seven"), TUnboxedValuePod((ui32) 7))
  44. .Add(valueBuilder->NewString("eight"), TUnboxedValuePod((ui32) 8))
  45. .Add(valueBuilder->NewString("nine"), TUnboxedValuePod((ui32) 9))
  46. .Build();
  47. }
  48. TType* DictType_;
  49. };
  50. //////////////////////////////////////////////////////////////////////////////
  51. // TDictsModule
  52. //////////////////////////////////////////////////////////////////////////////
  53. class TDictsModule: public IUdfModule
  54. {
  55. public:
  56. TStringRef Name() const {
  57. return TStringRef::Of("Dicts");
  58. }
  59. void CleanupOnTerminate() const final {}
  60. void GetAllFunctions(IFunctionsSink& sink) const final {
  61. sink.Add(TStrToInt::Name());
  62. }
  63. void BuildFunctionTypeInfo(
  64. const TStringRef& name,
  65. TType* userType,
  66. const TStringRef& typeConfig,
  67. ui32 flags,
  68. IFunctionTypeInfoBuilder& builder) const final
  69. {
  70. try {
  71. Y_UNUSED(userType);
  72. Y_UNUSED(typeConfig);
  73. bool typesOnly = (flags & TFlags::TypesOnly);
  74. TType* dictType = builder.Dict()->Key<char*>().Value<ui32>().Build();
  75. if (TStrToInt::Name() == name) {
  76. // function signature:
  77. // Dict<String, ui32> New(String)
  78. // runConfig: void
  79. builder.Returns(dictType).Args()->Add<char*>().Done();
  80. if (!typesOnly) {
  81. builder.Implementation(new TStrToInt(dictType));
  82. }
  83. }
  84. } catch (const std::exception& e) {
  85. builder.SetError(CurrentExceptionMessage());
  86. }
  87. }
  88. };
  89. } // namespace
  90. REGISTER_MODULES(TDictsModule)