url_query.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #pragma once
  2. #include <yql/essentials/public/udf/udf_helpers.h>
  3. namespace NUrlUdf {
  4. using namespace NYql::NUdf;
  5. struct TQueryStringConv : public TBoxedValue {
  6. protected:
  7. static constexpr char Separator[] = "Separator";
  8. using TQueryStr = char*;
  9. using TSeparatorNArg = TNamedArg<TQueryStr, Separator>;
  10. static inline TType* GetListType(const IFunctionTypeInfoBuilder& builder,
  11. bool optional = false)
  12. {
  13. auto tupleType = optional ?
  14. builder.Tuple()->Add<TQueryStr>().Add(builder.Optional()->Item<TQueryStr>().Build()).Build()
  15. : builder.Tuple()->Add<TQueryStr>().Add<TQueryStr>().Build();
  16. return builder.List()->Item(tupleType).Build();
  17. }
  18. static inline TType* GetDictType(const IFunctionTypeInfoBuilder& builder,
  19. bool optional = false)
  20. {
  21. auto listType = optional ?
  22. builder.List()->Item(builder.Optional()->Item<TQueryStr>().Build()).Build()
  23. : builder.List()->Item<TQueryStr>().Build();
  24. return builder.Dict()->Key<TQueryStr>().Value(listType).Build();
  25. }
  26. static inline TType* GetFlattenDictType(const IFunctionTypeInfoBuilder& builder,
  27. bool optional = false)
  28. {
  29. return optional ?
  30. builder.Dict()->Key<TQueryStr>().Value(builder.Optional()->Item<TQueryStr>().Build()).Build()
  31. : builder.Dict()->Key<TQueryStr>().Value<TQueryStr>().Build();
  32. }
  33. };
  34. struct TQueryStringParse: public TQueryStringConv {
  35. explicit TQueryStringParse(TSourcePosition&& pos) : Pos_(std::move(pos)) {}
  36. protected:
  37. static constexpr char KeepBlankValues[] = "KeepBlankValues";
  38. static constexpr char Strict[] = "Strict";
  39. static constexpr char MaxFields[] = "MaxFields";
  40. using TKeepBlankValuesNArg = TNamedArg<bool, KeepBlankValues>;
  41. using TStrictNArg = TNamedArg<bool, Strict>;
  42. using TMaxFieldsNArg = TNamedArg<ui32, MaxFields>;
  43. static void MakeSignature(IFunctionTypeInfoBuilder& builder, const TType* retType);
  44. std::vector<std::pair<TString, TString>>
  45. RunImpl(const TUnboxedValuePod* args) const;
  46. private:
  47. TSourcePosition Pos_;
  48. };
  49. struct TQueryStringToList : public TQueryStringParse {
  50. explicit TQueryStringToList(TSourcePosition&& pos)
  51. : TQueryStringParse(std::forward<TSourcePosition>(pos)) {}
  52. static const TStringRef& Name() {
  53. static const auto name = TStringRef::Of("QueryStringToList");
  54. return name;
  55. }
  56. static bool DeclareSignature(const TStringRef& name,
  57. TType*,
  58. IFunctionTypeInfoBuilder& builder,
  59. bool typesOnly);
  60. TUnboxedValue Run(const IValueBuilder* valueBuilder,
  61. const TUnboxedValuePod* args) const override;
  62. };
  63. struct TQueryStringToDict : public TQueryStringParse {
  64. explicit TQueryStringToDict(TType* dictType, TSourcePosition&& pos)
  65. : TQueryStringParse(std::move(pos))
  66. , DictType_(dictType)
  67. {}
  68. static const TStringRef& Name() {
  69. static const auto name = TStringRef::Of("QueryStringToDict");
  70. return name;
  71. }
  72. static bool DeclareSignature(const TStringRef& name,
  73. TType*,
  74. IFunctionTypeInfoBuilder& builder,
  75. bool typesOnly);
  76. TUnboxedValue Run(const IValueBuilder* valueBuilder,
  77. const TUnboxedValuePod* args) const override;
  78. private:
  79. TType* DictType_;
  80. };
  81. class TBuildQueryString : public TQueryStringConv {
  82. TSourcePosition Pos_;
  83. enum class EFirstArgTypeId {
  84. None,
  85. Dict,
  86. FlattenDict,
  87. List,
  88. } FirstArgTypeId_;
  89. public:
  90. typedef bool TTypeAwareMarker;
  91. explicit TBuildQueryString(TSourcePosition&& pos, EFirstArgTypeId firstArgTypeId)
  92. : Pos_(std::move(pos))
  93. , FirstArgTypeId_(firstArgTypeId)
  94. {}
  95. static const TStringRef& Name() {
  96. static const auto name = TStringRef::Of("BuildQueryString");
  97. return name;
  98. }
  99. TUnboxedValue Run(const IValueBuilder* valueBuilder,
  100. const TUnboxedValuePod* args) const override;
  101. static bool DeclareSignature(const TStringRef& name,
  102. TType* userType,
  103. IFunctionTypeInfoBuilder& builder,
  104. bool typesOnly);
  105. };
  106. }