mkql_value_builder.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #pragma once
  2. #include "mkql_computation_node_holders.h"
  3. #include <yql/essentials/public/udf/udf_value_builder.h>
  4. #include <yql/essentials/public/udf/udf_validate.h>
  5. #include <util/generic/noncopyable.h>
  6. #include <util/memory/pool.h>
  7. #include <yql/essentials/minikql/mkql_node.h>
  8. #include <yql/essentials/minikql/mkql_terminator.h>
  9. namespace NKikimr {
  10. namespace NMiniKQL {
  11. ///////////////////////////////////////////////////////////////////////////////
  12. // TDefaultValueBuilder
  13. ///////////////////////////////////////////////////////////////////////////////
  14. class TDefaultValueBuilder final: public NUdf::IValueBuilder, private TNonCopyable, public ITerminator,
  15. public NUdf::IDateBuilder
  16. {
  17. public:
  18. explicit TDefaultValueBuilder(const THolderFactory& holderFactory, NUdf::EValidatePolicy policy = NUdf::EValidatePolicy::Fail);
  19. void SetSecureParamsProvider(const NUdf::ISecureParamsProvider* provider);
  20. void RethrowAtTerminate();
  21. void SetCalleePositionHolder(const NUdf::TSourcePosition*& position);
  22. void Terminate(const char* message) const final;
  23. NUdf::TUnboxedValue NewStringNotFilled(ui32 size) const final;
  24. NUdf::TUnboxedValue ConcatStrings(NUdf::TUnboxedValuePod first, NUdf::TUnboxedValuePod second) const final;
  25. NUdf::TUnboxedValue AppendString(NUdf::TUnboxedValuePod value, const NUdf::TStringRef& ref) const final;
  26. NUdf::TUnboxedValue PrependString(const NUdf::TStringRef& ref,NUdf::TUnboxedValuePod value) const final;
  27. NUdf::TUnboxedValue SubString(NUdf::TUnboxedValuePod value, ui32 offset, ui32 size) const final;
  28. NUdf::TUnboxedValue NewList(NUdf::TUnboxedValue* items, ui64 count) const final; // Destroys (moves out from) items
  29. NUdf::TUnboxedValue NewString(const NUdf::TStringRef& ref) const final;
  30. NUdf::IDictValueBuilder::TPtr NewDict(const NUdf::TType* dictType, ui32 flags) const final;
  31. NUdf::TUnboxedValue ReverseList(const NUdf::TUnboxedValuePod& list) const final;
  32. NUdf::TUnboxedValue SkipList(const NUdf::TUnboxedValuePod& list, ui64 count) const final;
  33. NUdf::TUnboxedValue TakeList(const NUdf::TUnboxedValuePod& list, ui64 count) const final;
  34. NUdf::TUnboxedValue ToIndexDict(const NUdf::TUnboxedValuePod& list) const final;
  35. NUdf::TUnboxedValue NewArray32(ui32 count, NUdf::TUnboxedValue*& itemsPtr) const final;
  36. NUdf::TUnboxedValue NewVariant(ui32 index, NUdf::TUnboxedValue&& value) const final;
  37. const NUdf::IDateBuilder& GetDateBuilder() const final {
  38. return *this;
  39. }
  40. bool GetSecureParam(NUdf::TStringRef key, NUdf::TStringRef &value) const final;
  41. const NUdf::TSourcePosition* CalleePosition() const final;
  42. NUdf::TUnboxedValue Run(const NUdf::TSourcePosition& callee, const NUdf::IBoxedValue& value, const NUdf::TUnboxedValuePod* args) const final;
  43. void ExportArrowBlock(NUdf::TUnboxedValuePod value, ui32 chunk, ArrowArray* out) const final;
  44. NUdf::TUnboxedValue ImportArrowBlock(ArrowArray* arrays, ui32 chunkCount, bool isScalar, const NUdf::IArrowType& type) const final;
  45. ui32 GetArrowBlockChunks(NUdf::TUnboxedValuePod value, bool& isScalar, ui64& length) const final;
  46. bool MakeDate(ui32 year, ui32 month, ui32 day, ui16& value) const final;
  47. bool SplitDate(ui16 value, ui32& year, ui32& month, ui32& day) const final;
  48. bool MakeDatetime(ui32 year, ui32 month, ui32 day, ui32 hour, ui32 minute, ui32 second, ui32& value, ui16 tzId = 0) const final;
  49. bool SplitDatetime(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second, ui16 tzId = 0) const final;
  50. bool EnrichDate(ui16 date, ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek) const final;
  51. // in minutes
  52. bool GetTimezoneShift(ui32 year, ui32 month, ui32 day, ui32 hour, ui32 minute, ui32 second, ui16 tzId, i32& value) const final;
  53. bool FullSplitDate(ui16 value, ui32& year, ui32& month, ui32& day,
  54. ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  55. bool FullSplitDatetime(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second,
  56. ui32& dayOfYear, ui32& weekOfYear, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  57. bool FindTimezoneName(ui32 id, NUdf::TStringRef& name) const final;
  58. bool FindTimezoneId(const NUdf::TStringRef& name, ui32& id) const final;
  59. bool EnrichDate2(ui16 date, ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek) const final;
  60. bool FullSplitDate2(ui16 value, ui32& year, ui32& month, ui32& day,
  61. ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  62. bool FullSplitDatetime2(ui32 value, ui32& year, ui32& month, ui32& day, ui32& hour, ui32& minute, ui32& second,
  63. ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  64. const NUdf::IPgBuilder& GetPgBuilder() const final {
  65. return *PgBuilder_;
  66. }
  67. NUdf::TUnboxedValue NewArray64(ui64 count, NUdf::TUnboxedValue*& itemsPtr) const final;
  68. bool SplitTzDate32(i32 date, i32& year, ui32& month, ui32& day,
  69. ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  70. bool SplitTzDatetime64(i64 datetime, i32& year, ui32& month, ui32& day,
  71. ui32& hour, ui32& minute, ui32& second,
  72. ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
  73. bool MakeTzDate32(i32 year, ui32 month, ui32 day, i32& date, ui16 timezoneId = 0) const final;
  74. bool MakeTzDatetime64(i32 year, ui32 month, ui32 day,
  75. ui32 hour, ui32 minute, ui32 second, i64& datetime, ui16 timezoneId = 0) const final;
  76. NUdf::IListValueBuilder::TPtr NewListBuilder() const final;
  77. private:
  78. const THolderFactory& HolderFactory_;
  79. NUdf::EValidatePolicy Policy_;
  80. std::unique_ptr<NUdf::IPgBuilder> PgBuilder_;
  81. const NUdf::ISecureParamsProvider* SecureParamsProvider_ = nullptr;
  82. const NUdf::TSourcePosition** CalleePositionPtr_ = nullptr;
  83. mutable bool Rethrow_ = false;
  84. };
  85. } // namespace NMiniKQL
  86. } // namespace Nkikimr