You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			223 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* 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<RowPosition>& 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<windowfunction::FrameBound> parseFrameBound(
 | |
|       const execplan::WF_Boundary&, const std::map<uint64_t, uint64_t>&, const std::vector<execplan::SRCP>&,
 | |
|       const boost::shared_ptr<ordering::EqualCompData>&, JobInfo&, bool, bool);
 | |
|   boost::shared_ptr<windowfunction::FrameBound> parseFrameBoundRows(const execplan::WF_Boundary&,
 | |
|                                                                     const std::map<uint64_t, uint64_t>&,
 | |
|                                                                     JobInfo&);
 | |
|   boost::shared_ptr<windowfunction::FrameBound> parseFrameBoundRange(const execplan::WF_Boundary&,
 | |
|                                                                      const std::map<uint64_t, uint64_t>&,
 | |
|                                                                      const std::vector<execplan::SRCP>&,
 | |
|                                                                      JobInfo&);
 | |
|   void updateWindowCols(execplan::ParseTree*, const std::map<uint64_t, uint64_t>&, JobInfo&);
 | |
|   void updateWindowCols(execplan::ReturnedColumn*, const std::map<uint64_t, uint64_t>&, JobInfo&);
 | |
|   void sort(std::vector<joblist::RowPosition>::iterator, uint64_t);
 | |
| 
 | |
|   void formatMiniStats();
 | |
|   void printCalTrace();
 | |
| 
 | |
|   static void AddSimplColumn(const std::vector<execplan::SimpleColumn*>& 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<execplan::CalpontSystemCatalog> 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<rowgroup::RGData> fInRowGroupData;
 | |
| 
 | |
|   //	for funciton/expression taking window function as parameter
 | |
|   std::vector<execplan::SRCP> 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<uint64_t> fFunctionThreads;
 | |
| 
 | |
|   std::vector<RowPosition> fRows;
 | |
|   std::vector<boost::shared_ptr<windowfunction::WindowFunction> > fFunctions;
 | |
|   uint64_t fFunctionCount;
 | |
|   uint64_t fTotalThreads;
 | |
|   int fNextIndex;
 | |
| 
 | |
|   // query order by
 | |
|   boost::shared_ptr<ordering::OrderByData> fQueryOrderBy;
 | |
|   uint64_t fQueryLimitStart;
 | |
|   uint64_t fQueryLimitCount;
 | |
| 
 | |
|   // for resource management
 | |
|   uint64_t fMemUsage;
 | |
|   ResourceManager* fRm;
 | |
|   boost::shared_ptr<int64_t> fSessionMemLimit;
 | |
| 
 | |
|   friend class windowfunction::WindowFunction;
 | |
| };
 | |
| 
 | |
| }  // namespace joblist
 |