mkql_computation_list_adapter.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #pragma once
  2. #include <yql/essentials/minikql/defs.h>
  3. #include "mkql_computation_node_impl.h"
  4. #include <yql/essentials/minikql/mkql_alloc.h>
  5. namespace NKikimr {
  6. namespace NMiniKQL {
  7. template <typename TVectorType>
  8. class TVectorListAdapter : public TComputationValue<TVectorListAdapter<TVectorType>> {
  9. public:
  10. typedef typename TVectorType::value_type TItem;
  11. typedef TVectorListAdapter<TVectorType> TSelf;
  12. typedef std::function<NUdf::TUnboxedValue(const TItem&)> TItemFactory;
  13. typedef TComputationValue<TVectorListAdapter<TVectorType>> TBase;
  14. class TIterator: public TTemporaryComputationValue<TIterator> {
  15. public:
  16. TIterator(TMemoryUsageInfo* memInfo, const TVectorType& list, TItemFactory itemFactory, ui64 start, ui64 finish, bool reversed)
  17. : TTemporaryComputationValue<TIterator>(memInfo)
  18. , List(list)
  19. , ItemFactory(itemFactory)
  20. , Start(start)
  21. , Finish(finish)
  22. , Reversed(reversed)
  23. {
  24. Index = Reversed ? Finish : (Start - 1);
  25. }
  26. private:
  27. bool Next(NUdf::TUnboxedValue& value) override {
  28. if (!Skip())
  29. return false;
  30. value = ItemFactory(List[Index]);
  31. return true;
  32. }
  33. bool Skip() override {
  34. if (!Reversed) {
  35. if (Index + 1 >= Finish)
  36. return false;
  37. ++Index;
  38. } else {
  39. if (Index < Start + 1)
  40. return false;
  41. --Index;
  42. }
  43. return true;
  44. }
  45. const TVectorType& List;
  46. const TItemFactory ItemFactory;
  47. const ui64 Start;
  48. const ui64 Finish;
  49. const bool Reversed;
  50. ui64 Index;
  51. };
  52. class TDictIterator : public TTemporaryComputationValue<TDictIterator> {
  53. public:
  54. TDictIterator(TMemoryUsageInfo* memInfo, THolder<TIterator>&& iter)
  55. : TTemporaryComputationValue<TDictIterator>(memInfo)
  56. , Iter(std::move(iter))
  57. , Index(Max<ui64>())
  58. {}
  59. private:
  60. bool Next(NUdf::TUnboxedValue& key) override {
  61. if (NUdf::TBoxedValueAccessor::Skip(*Iter)) {
  62. key = NUdf::TUnboxedValuePod(++Index);
  63. return true;
  64. }
  65. return false;
  66. }
  67. bool NextPair(NUdf::TUnboxedValue& key, NUdf::TUnboxedValue& payload) override {
  68. if (NUdf::TBoxedValueAccessor::Next(*Iter, payload)) {
  69. key = NUdf::TUnboxedValuePod(++Index);
  70. return true;
  71. }
  72. return false;
  73. }
  74. bool Skip() override {
  75. if (NUdf::TBoxedValueAccessor::Skip(*Iter)) {
  76. ++Index;
  77. return true;
  78. }
  79. return false;
  80. }
  81. THolder<TIterator> Iter;
  82. ui64 Index;
  83. };
  84. TVectorListAdapter(
  85. TMemoryUsageInfo* memInfo,
  86. const TVectorType& list,
  87. TItemFactory itemFactory,
  88. ui64 start, ui64 finish,
  89. bool reversed)
  90. : TBase(memInfo)
  91. , List(list)
  92. , ItemFactory(itemFactory)
  93. , Start(start)
  94. , Finish(finish)
  95. , Reversed(reversed)
  96. {
  97. Y_ABORT_UNLESS(Start <= Finish && Finish <= List.size());
  98. }
  99. private:
  100. bool HasFastListLength() const override {
  101. return true;
  102. }
  103. ui64 GetListLength() const override {
  104. return Finish - Start;
  105. }
  106. ui64 GetEstimatedListLength() const override {
  107. return Finish - Start;
  108. }
  109. bool HasListItems() const override {
  110. return Finish != Start;
  111. }
  112. NUdf::IBoxedValuePtr ReverseListImpl(const NUdf::IValueBuilder& builder) const override {
  113. Y_UNUSED(builder);
  114. return new TSelf(this->GetMemInfo(), List, ItemFactory, Start, Finish, !Reversed);
  115. }
  116. NUdf::IBoxedValuePtr SkipListImpl(const NUdf::IValueBuilder& builder, ui64 count) const override {
  117. Y_UNUSED(builder);
  118. const ui64 newStart = Min(Start + count, Finish);
  119. if (newStart == Start) {
  120. return const_cast<TVectorListAdapter*>(this);
  121. }
  122. return new TSelf(this->GetMemInfo(), List, ItemFactory, newStart, Finish, Reversed);
  123. }
  124. NUdf::IBoxedValuePtr TakeListImpl(const NUdf::IValueBuilder& builder, ui64 count) const override {
  125. Y_UNUSED(builder);
  126. const ui64 newFinish = Min(Start + count, Finish);
  127. if (newFinish == Finish) {
  128. return const_cast<TVectorListAdapter*>(this);
  129. }
  130. return new TSelf(this->GetMemInfo(), List, ItemFactory, Start, newFinish, Reversed);
  131. }
  132. NUdf::IBoxedValuePtr ToIndexDictImpl(const NUdf::IValueBuilder& builder) const override {
  133. Y_UNUSED(builder);
  134. return const_cast<TVectorListAdapter*>(this);
  135. }
  136. NUdf::TUnboxedValue GetListIterator() const override {
  137. return NUdf::TUnboxedValuePod(new TIterator(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed));
  138. }
  139. bool Contains(const NUdf::TUnboxedValuePod& key) const override {
  140. const ui64 index = key.Get<ui64>();
  141. return (index < GetListLength());
  142. }
  143. NUdf::TUnboxedValue Lookup(const NUdf::TUnboxedValuePod& key) const override {
  144. const ui64 index = key.Get<ui64>();
  145. if (index >= GetListLength()) {
  146. return NUdf::TUnboxedValuePod();
  147. }
  148. const ui64 realIndex = Reversed ? (Finish - 1 - index) : (Start + index);
  149. return ItemFactory(List[realIndex]).Release().MakeOptional();
  150. }
  151. NUdf::TUnboxedValue GetKeysIterator() const override {
  152. return NUdf::TUnboxedValuePod(new TDictIterator(this->GetMemInfo(), MakeHolder<TIterator>(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed)));
  153. }
  154. NUdf::TUnboxedValue GetDictIterator() const override {
  155. return NUdf::TUnboxedValuePod(new TDictIterator(this->GetMemInfo(), MakeHolder<TIterator>(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed)));
  156. }
  157. ui64 GetDictLength() const override {
  158. return GetListLength();
  159. }
  160. bool HasDictItems() const override {
  161. return Finish != Start;
  162. }
  163. bool IsSortedDict() const override {
  164. return true;
  165. }
  166. private:
  167. const TVectorType& List;
  168. const TItemFactory ItemFactory;
  169. const ui64 Start;
  170. const ui64 Finish;
  171. const bool Reversed;
  172. };
  173. template <typename TVectorType>
  174. class TOwningVectorListAdapter : private TVectorType, public TVectorListAdapter<TVectorType> {
  175. public:
  176. using TAdapterBase = TVectorListAdapter<TVectorType>;
  177. TOwningVectorListAdapter(
  178. TMemoryUsageInfo* memInfo,
  179. TVectorType&& list,
  180. typename TAdapterBase::TItemFactory itemFactory,
  181. ui64 start, ui64 finish,
  182. bool reversed)
  183. : TVectorType(std::move(list))
  184. , TAdapterBase(memInfo, *this, itemFactory, start, finish, reversed) {}
  185. TOwningVectorListAdapter(
  186. TMemoryUsageInfo* memInfo,
  187. const TVectorType& list,
  188. typename TAdapterBase::TItemFactory itemFactory,
  189. ui64 start, ui64 finish,
  190. bool reversed)
  191. : TVectorType(list)
  192. , TAdapterBase(memInfo, *this, itemFactory, start, finish, reversed) {}
  193. };
  194. template<typename TVectorType>
  195. NUdf::TUnboxedValue CreateOwningVectorListAdapter(
  196. TVectorType&& list,
  197. typename TVectorListAdapter<std::remove_reference_t<TVectorType>>::TItemFactory itemFactory,
  198. ui64 start, ui64 finish,
  199. bool reversed,
  200. TMemoryUsageInfo& memInfo)
  201. {
  202. return NUdf::TUnboxedValuePod(new TOwningVectorListAdapter<std::remove_reference_t<TVectorType>>(
  203. &memInfo, std::forward<TVectorType>(list), itemFactory, start, finish, reversed));
  204. }
  205. }
  206. }