cpp/core/compute/ResultIterator.h (54 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "memory/ColumnarBatch.h" #include "memory/ColumnarBatchIterator.h" #include "utils/Metrics.h" namespace gluten { class Runtime; // FIXME the code is tightly coupled with Velox plan execution. Should cleanup the abstraction for uses from // other places. class ResultIterator { public: explicit ResultIterator(std::unique_ptr<ColumnarBatchIterator> iter, Runtime* runtime = nullptr) : iter_(std::move(iter)), next_(nullptr), runtime_(runtime) {} // copy constructor and copy assignment (deleted) ResultIterator(const ResultIterator& in) = delete; ResultIterator& operator=(const ResultIterator&) = delete; // move constructor and move assignment ResultIterator(ResultIterator&& in) = default; ResultIterator& operator=(ResultIterator&& in) = default; bool hasNext() { checkValid(); getNext(); return next_ != nullptr; } std::shared_ptr<ColumnarBatch> next() { checkValid(); getNext(); return std::move(next_); } // For testing and benchmarking. ColumnarBatchIterator* getInputIter() { return iter_.get(); } Metrics* getMetrics(); void setExportNanos(int64_t exportNanos) { exportNanos_ = exportNanos; } int64_t getExportNanos() const { return exportNanos_; } int64_t spillFixedSize(int64_t size) { return iter_->spillFixedSize(size); } private: void checkValid() const { if (iter_ == nullptr) { throw GlutenException("ResultIterator: the underlying iterator has expired."); } } void getNext() { if (next_ == nullptr) { next_ = iter_->next(); } } std::unique_ptr<ColumnarBatchIterator> iter_; std::shared_ptr<ColumnarBatch> next_; Runtime* runtime_; int64_t exportNanos_; }; } // namespace gluten