/* Copyright (C) 2014 InfiniDB, Inc. Copyright (c) 2016-2020 MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // $Id: windowfunctionstep.h 9722 2013-07-25 21:29:10Z pleblanc $ #pragma once #include "../../utils/windowfunction/idborderby.h" #include "jobstep.h" #include "rowgroup.h" #include "windowfunctioncolumn.h" #include "threadnaming.h" namespace execplan { // forward reference class CalpontSelectExecutionPlan; class ParseTree; class ReturnedColumn; }; // namespace execplan namespace windowfunction { // forward reference class WindowFunction; class FrameBound; }; // namespace windowfunction namespace ordering { // forward reference class EqualCompData; }; // namespace ordering namespace joblist { // forward reference struct JobInfo; class ResourceManager; struct RowPosition { uint64_t fGroupId : 48; uint64_t fRowId : 16; inline explicit RowPosition(uint64_t i = 0, uint64_t j = 0) : fGroupId(i), fRowId(j){}; }; /** @brief class WindowFunctionStep * */ class WindowFunctionStep : public JobStep, public TupleDeliveryStep { public: /** @brief WindowFunctionStep constructor * @param * @param */ explicit WindowFunctionStep(const JobInfo&); /** @brief WindowFunctionStep destructor */ ~WindowFunctionStep() override; /** @brief virtual methods */ void run() override; void join() override; const std::string toString() const override; void setOutputRowGroup(const rowgroup::RowGroup&) override; const rowgroup::RowGroup& getOutputRowGroup() const override; const rowgroup::RowGroup& getDeliveredRowGroup() const override; void deliverStringTableRowGroup(bool b) override; bool deliverStringTableRowGroup() const override; uint32_t nextBand(messageqcpp::ByteStream& bs) override; /** @brief initialize methods */ void initialize(const rowgroup::RowGroup& rg, JobInfo& jobInfo); static void checkWindowFunction(execplan::CalpontSelectExecutionPlan*, JobInfo&); static SJSTEP makeWindowFunctionStep(SJSTEP&, JobInfo&); // for WindowFunction and WindowFunctionWrapper callback const std::vector& getRowData() const { return fRows; } // for string table rowgroup::Row::Pointer getPointer(RowPosition& pos) { fRowGroupIn.setData(&(fInRowGroupData[pos.fGroupId])); fRowGroupIn.getRow(pos.fRowId, &fRowIn); return fRowIn.getPointer(); } rowgroup::Row::Pointer getPointer(RowPosition& pos, rowgroup::RowGroup& rg, rowgroup::Row& row) { rg.setData(&(fInRowGroupData[pos.fGroupId])); rg.getRow(pos.fRowId, &row); return row.getPointer(); } private: void execute(); void doFunction(); void doPostProcessForSelect(); void doPostProcessForDml(); uint64_t nextFunctionIndex(); boost::shared_ptr parseFrameBound( const execplan::WF_Boundary&, const std::map&, const std::vector&, const boost::shared_ptr&, JobInfo&, bool, bool); boost::shared_ptr parseFrameBoundRows(const execplan::WF_Boundary&, const std::map&, JobInfo&); boost::shared_ptr parseFrameBoundRange(const execplan::WF_Boundary&, const std::map&, const std::vector&, JobInfo&); void updateWindowCols(execplan::ParseTree*, const std::map&, JobInfo&); void updateWindowCols(execplan::ReturnedColumn*, const std::map&, JobInfo&); void sort(std::vector::iterator, uint64_t); void formatMiniStats(); void printCalTrace(); static void AddSimplColumn(const std::vector& scs, JobInfo& jobInfo); class Runner { public: explicit Runner(WindowFunctionStep* step) : fStep(step) { } void operator()() { utils::setThreadName("WFSRunner"); fStep->execute(); } WindowFunctionStep* fStep; }; uint64_t fRunner; // thread pool handle boost::shared_ptr fCatalog; uint64_t fRowsReturned; bool fEndOfResult; bool fIsSelect; bool fUseSSMutex; //@bug6065, mutex for setStringField bool fUseUFMutex; // To ensure thread safety of User Data (UDAnF) // for input/output datalist RowGroupDL* fInputDL; RowGroupDL* fOutputDL; int fInputIterator; int fOutputIterator; // rowgroups rowgroup::RowGroup fRowGroupIn; rowgroup::RowGroup fRowGroupOut; rowgroup::RowGroup fRowGroupDelivered; rowgroup::Row fRowIn; // data storage std::vector fInRowGroupData; // for funciton/expression taking window function as parameter std::vector fExpression; // for threads computing window functions and partitions class WFunction { public: explicit WFunction(WindowFunctionStep* step) : fStep(step) { } void operator()() { fStep->doFunction(); } WindowFunctionStep* fStep; }; std::vector fFunctionThreads; std::vector fRows; std::vector > fFunctions; uint64_t fFunctionCount; uint64_t fTotalThreads; int fNextIndex; // query order by boost::shared_ptr fQueryOrderBy; uint64_t fQueryLimitStart; uint64_t fQueryLimitCount; // for resource management uint64_t fMemUsage; ResourceManager* fRm; boost::shared_ptr fSessionMemLimit; friend class windowfunction::WindowFunction; }; } // namespace joblist