1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00
Files
mariadb-columnstore-engine/dbcon/joblist/diskjoinstep.h
Leonid Fedorov 030144127e Remove boost shared array [develop 23.02] (#2812)
* remove boost/shared_array include

* replace boost::shared_array<T> to std::shared_ptr<T[]>
2023-04-17 20:56:09 +03:00

159 lines
3.6 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
Copyright (C) 2019 MariaDB Corporation.
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. */
#include "jobstep.h"
#include "tuplehashjoin.h"
#include "joinpartition.h"
#include "threadnaming.h"
#pragma once
namespace joblist
{
class DiskJoinStep : public JobStep
{
public:
DiskJoinStep();
DiskJoinStep(TupleHashJoinStep*, int djsIndex, int joinerIndex, bool lastOne);
virtual ~DiskJoinStep();
void run();
void join();
const std::string toString() const;
void loadExistingData(std::vector<rowgroup::RGData>& data);
uint32_t getIterationCount()
{
return largeIterationCount;
}
protected:
private:
boost::shared_ptr<joiner::JoinPartition> jp;
rowgroup::RowGroup largeRG, smallRG, outputRG, joinFERG;
std::vector<uint32_t> largeKeyCols, smallKeyCols;
boost::shared_ptr<RowGroupDL> largeDL, outputDL;
RowGroupDL* smallDL;
std::shared_ptr<int[]> LOMapping, SOMapping, SjoinFEMapping, LjoinFEMapping;
TupleHashJoinStep* thjs;
boost::shared_ptr<funcexp::FuncExpWrapper> fe;
bool typeless;
JoinType joinType;
std::shared_ptr<joiner::TupleJoiner> joiner; // the same instance THJS uses
/* main thread, started by JobStep::run() */
void mainRunner();
struct Runner
{
Runner(DiskJoinStep* d) : djs(d)
{
}
void operator()()
{
utils::setThreadName("DJSMainRunner");
djs->mainRunner();
}
DiskJoinStep* djs;
};
void smallReader();
void largeReader();
int largeIt;
bool lastLargeIteration;
uint32_t largeIterationCount;
uint64_t mainThread; // thread handle from thread pool
/* Loader structs */
struct LoaderOutput
{
std::vector<rowgroup::RGData> smallData;
uint64_t partitionID;
joiner::JoinPartition* jp;
};
boost::shared_ptr<joblist::FIFO<boost::shared_ptr<LoaderOutput> > > loadFIFO;
struct Loader
{
Loader(DiskJoinStep* d) : djs(d)
{
}
void operator()()
{
utils::setThreadName("DJSLoader");
djs->loadFcn();
}
DiskJoinStep* djs;
};
void loadFcn();
/* Builder structs */
struct BuilderOutput
{
std::shared_ptr<joiner::TupleJoiner> tupleJoiner;
std::vector<rowgroup::RGData> smallData;
uint64_t partitionID;
joiner::JoinPartition* jp;
};
boost::shared_ptr<joblist::FIFO<boost::shared_ptr<BuilderOutput> > > buildFIFO;
struct Builder
{
Builder(DiskJoinStep* d) : djs(d)
{
}
void operator()()
{
utils::setThreadName("DJSBuilder");
djs->buildFcn();
}
DiskJoinStep* djs;
};
void buildFcn();
/* Joining structs */
struct Joiner
{
Joiner(DiskJoinStep* d) : djs(d)
{
}
void operator()()
{
utils::setThreadName("DJSJoiner");
djs->joinFcn();
}
DiskJoinStep* djs;
};
void joinFcn();
// limits & usage
boost::shared_ptr<int64_t> smallUsage;
int64_t smallLimit;
int64_t largeLimit;
uint64_t partitionSize;
void reportStats();
uint32_t joinerIndex;
bool closedOutput;
};
} // namespace joblist