123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- #pragma once
- #include <yql/essentials/minikql/defs.h>
- #include "mkql_computation_node_impl.h"
- #include <yql/essentials/minikql/mkql_alloc.h>
- namespace NKikimr {
- namespace NMiniKQL {
- template <typename TVectorType>
- class TVectorListAdapter : public TComputationValue<TVectorListAdapter<TVectorType>> {
- public:
- typedef typename TVectorType::value_type TItem;
- typedef TVectorListAdapter<TVectorType> TSelf;
- typedef std::function<NUdf::TUnboxedValue(const TItem&)> TItemFactory;
- typedef TComputationValue<TVectorListAdapter<TVectorType>> TBase;
- class TIterator: public TTemporaryComputationValue<TIterator> {
- public:
- TIterator(TMemoryUsageInfo* memInfo, const TVectorType& list, TItemFactory itemFactory, ui64 start, ui64 finish, bool reversed)
- : TTemporaryComputationValue<TIterator>(memInfo)
- , List(list)
- , ItemFactory(itemFactory)
- , Start(start)
- , Finish(finish)
- , Reversed(reversed)
- {
- Index = Reversed ? Finish : (Start - 1);
- }
- private:
- bool Next(NUdf::TUnboxedValue& value) override {
- if (!Skip())
- return false;
- value = ItemFactory(List[Index]);
- return true;
- }
- bool Skip() override {
- if (!Reversed) {
- if (Index + 1 >= Finish)
- return false;
- ++Index;
- } else {
- if (Index < Start + 1)
- return false;
- --Index;
- }
- return true;
- }
- const TVectorType& List;
- const TItemFactory ItemFactory;
- const ui64 Start;
- const ui64 Finish;
- const bool Reversed;
- ui64 Index;
- };
- class TDictIterator : public TTemporaryComputationValue<TDictIterator> {
- public:
- TDictIterator(TMemoryUsageInfo* memInfo, THolder<TIterator>&& iter)
- : TTemporaryComputationValue<TDictIterator>(memInfo)
- , Iter(std::move(iter))
- , Index(Max<ui64>())
- {}
- private:
- bool Next(NUdf::TUnboxedValue& key) override {
- if (NUdf::TBoxedValueAccessor::Skip(*Iter)) {
- key = NUdf::TUnboxedValuePod(++Index);
- return true;
- }
- return false;
- }
- bool NextPair(NUdf::TUnboxedValue& key, NUdf::TUnboxedValue& payload) override {
- if (NUdf::TBoxedValueAccessor::Next(*Iter, payload)) {
- key = NUdf::TUnboxedValuePod(++Index);
- return true;
- }
- return false;
- }
- bool Skip() override {
- if (NUdf::TBoxedValueAccessor::Skip(*Iter)) {
- ++Index;
- return true;
- }
- return false;
- }
- THolder<TIterator> Iter;
- ui64 Index;
- };
- TVectorListAdapter(
- TMemoryUsageInfo* memInfo,
- const TVectorType& list,
- TItemFactory itemFactory,
- ui64 start, ui64 finish,
- bool reversed)
- : TBase(memInfo)
- , List(list)
- , ItemFactory(itemFactory)
- , Start(start)
- , Finish(finish)
- , Reversed(reversed)
- {
- Y_ABORT_UNLESS(Start <= Finish && Finish <= List.size());
- }
- private:
- bool HasFastListLength() const override {
- return true;
- }
- ui64 GetListLength() const override {
- return Finish - Start;
- }
- ui64 GetEstimatedListLength() const override {
- return Finish - Start;
- }
- bool HasListItems() const override {
- return Finish != Start;
- }
- NUdf::IBoxedValuePtr ReverseListImpl(const NUdf::IValueBuilder& builder) const override {
- Y_UNUSED(builder);
- return new TSelf(this->GetMemInfo(), List, ItemFactory, Start, Finish, !Reversed);
- }
- NUdf::IBoxedValuePtr SkipListImpl(const NUdf::IValueBuilder& builder, ui64 count) const override {
- Y_UNUSED(builder);
- const ui64 newStart = Min(Start + count, Finish);
- if (newStart == Start) {
- return const_cast<TVectorListAdapter*>(this);
- }
- return new TSelf(this->GetMemInfo(), List, ItemFactory, newStart, Finish, Reversed);
- }
- NUdf::IBoxedValuePtr TakeListImpl(const NUdf::IValueBuilder& builder, ui64 count) const override {
- Y_UNUSED(builder);
- const ui64 newFinish = Min(Start + count, Finish);
- if (newFinish == Finish) {
- return const_cast<TVectorListAdapter*>(this);
- }
- return new TSelf(this->GetMemInfo(), List, ItemFactory, Start, newFinish, Reversed);
- }
- NUdf::IBoxedValuePtr ToIndexDictImpl(const NUdf::IValueBuilder& builder) const override {
- Y_UNUSED(builder);
- return const_cast<TVectorListAdapter*>(this);
- }
- NUdf::TUnboxedValue GetListIterator() const override {
- return NUdf::TUnboxedValuePod(new TIterator(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed));
- }
- bool Contains(const NUdf::TUnboxedValuePod& key) const override {
- const ui64 index = key.Get<ui64>();
- return (index < GetListLength());
- }
- NUdf::TUnboxedValue Lookup(const NUdf::TUnboxedValuePod& key) const override {
- const ui64 index = key.Get<ui64>();
- if (index >= GetListLength()) {
- return NUdf::TUnboxedValuePod();
- }
- const ui64 realIndex = Reversed ? (Finish - 1 - index) : (Start + index);
- return ItemFactory(List[realIndex]).Release().MakeOptional();
- }
- NUdf::TUnboxedValue GetKeysIterator() const override {
- return NUdf::TUnboxedValuePod(new TDictIterator(this->GetMemInfo(), MakeHolder<TIterator>(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed)));
- }
- NUdf::TUnboxedValue GetDictIterator() const override {
- return NUdf::TUnboxedValuePod(new TDictIterator(this->GetMemInfo(), MakeHolder<TIterator>(this->GetMemInfo(), List, ItemFactory, Start, Finish, Reversed)));
- }
- ui64 GetDictLength() const override {
- return GetListLength();
- }
- bool HasDictItems() const override {
- return Finish != Start;
- }
- bool IsSortedDict() const override {
- return true;
- }
- private:
- const TVectorType& List;
- const TItemFactory ItemFactory;
- const ui64 Start;
- const ui64 Finish;
- const bool Reversed;
- };
- template <typename TVectorType>
- class TOwningVectorListAdapter : private TVectorType, public TVectorListAdapter<TVectorType> {
- public:
- using TAdapterBase = TVectorListAdapter<TVectorType>;
- TOwningVectorListAdapter(
- TMemoryUsageInfo* memInfo,
- TVectorType&& list,
- typename TAdapterBase::TItemFactory itemFactory,
- ui64 start, ui64 finish,
- bool reversed)
- : TVectorType(std::move(list))
- , TAdapterBase(memInfo, *this, itemFactory, start, finish, reversed) {}
- TOwningVectorListAdapter(
- TMemoryUsageInfo* memInfo,
- const TVectorType& list,
- typename TAdapterBase::TItemFactory itemFactory,
- ui64 start, ui64 finish,
- bool reversed)
- : TVectorType(list)
- , TAdapterBase(memInfo, *this, itemFactory, start, finish, reversed) {}
- };
- template<typename TVectorType>
- NUdf::TUnboxedValue CreateOwningVectorListAdapter(
- TVectorType&& list,
- typename TVectorListAdapter<std::remove_reference_t<TVectorType>>::TItemFactory itemFactory,
- ui64 start, ui64 finish,
- bool reversed,
- TMemoryUsageInfo& memInfo)
- {
- return NUdf::TUnboxedValuePod(new TOwningVectorListAdapter<std::remove_reference_t<TVectorType>>(
- &memInfo, std::forward<TVectorType>(list), itemFactory, start, finish, reversed));
- }
- }
- }
|