1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-18 21:44:02 +03:00
2025-02-21 20:02:38 +04:00

251 lines
6.0 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
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: crossenginestep.h 9620 2013-06-13 15:51:52Z pleblanc $
#pragma once
#include <my_config.h>
#include <mysql.h>
#include <boost/scoped_array.hpp>
#include "jobstep.h"
#include "primitivestep.h"
#include "threadnaming.h"
// forward reference
namespace utils
{
class LibMySQL;
}
namespace execplan
{
class ParseTree;
class ReturnedColumn;
} // namespace execplan
namespace funcexp
{
class FuncExp;
}
namespace joblist
{
/** @brief class CrossEngineStep
*
*/
class CrossEngineStep : public BatchPrimitive, public TupleDeliveryStep
{
public:
/** @brief CrossEngineStep constructor
*/
CrossEngineStep(const std::string& schema, const std::string& table, const std::string& alias,
const JobInfo& jobInfo);
/** @brief CrossEngineStep destructor
*/
~CrossEngineStep() override;
/** @brief virtual void Run method
*/
void run() override;
/** @brief virtual void join method
*/
void join() override;
/** @brief virtual string toString method
*/
const std::string toString() const override;
// from BatchPrimitive
bool getFeederFlag() const override
{
return false;
}
uint64_t getLastTupleId() const override
{
return 0;
}
uint32_t getStepCount() const override
{
return 1;
}
void setBPP(JobStep* jobStep) override;
void setFirstStepType(PrimitiveStepType firstStepType) override
{
}
void setIsProjectionOnly() override
{
}
void setLastTupleId(uint64_t id) override
{
}
void setOutputType(BPSOutputType outputType) override
{
}
void setProjectBPP(JobStep* jobStep1, JobStep* jobStep2) override;
void setStepCount() override
{
}
void setSwallowRows(const bool swallowRows) override
{
}
void setBppStep() override
{
}
void dec(DistributedEngineComm* dec) override
{
}
const OIDVector& getProjectOids() const override
{
return fOIDVector;
}
uint64_t blksSkipped() const override
{
return 0;
}
bool wasStepRun() const override
{
return fRunExecuted;
}
BPSOutputType getOutputType() const override
{
return ROW_GROUP;
}
uint64_t getRows() const override
{
return fRowsReturned;
}
const std::string& schemaName() const
{
return fSchema;
}
const std::string& tableName() const
{
return fTable;
}
const std::string& tableAlias() const
{
return fAlias;
}
void setJobInfo(const JobInfo* jobInfo) override
{
}
void setOutputRowGroup(const rowgroup::RowGroup&) override;
const rowgroup::RowGroup& getOutputRowGroup() const override;
// from DECEventListener
void newPMOnline(uint32_t) override
{
}
const rowgroup::RowGroup& getDeliveredRowGroup() const override;
void deliverStringTableRowGroup(bool b) override;
bool deliverStringTableRowGroup() const override;
uint32_t nextBand(messageqcpp::ByteStream& bs) override;
void addFcnJoinExp(const std::vector<execplan::SRCP>&) override;
void addFcnExpGroup1(const boost::shared_ptr<execplan::ParseTree>&) override;
void setFE1Input(const rowgroup::RowGroup&) override;
void setFcnExpGroup3(const std::vector<execplan::SRCP>&) override;
void setFE23Output(const rowgroup::RowGroup&) override;
void addFilter(JobStep* jobStep);
void addProject(JobStep* jobStep);
protected:
virtual void execute();
virtual void getMysqldInfo(const JobInfo&);
virtual void makeMappings();
virtual void addFilterStr(const std::vector<const execplan::Filter*>&, const std::string&);
virtual std::string makeQuery();
virtual void setField(int, const char*, unsigned long, MYSQL_FIELD*, rowgroup::Row&);
inline void addRow(rowgroup::RGData&);
template <typename T>
T convertValueNum(const char*, const execplan::CalpontSystemCatalog::ColType&);
virtual void formatMiniStats();
virtual void printCalTrace();
uint64_t fRowsRetrieved;
uint64_t fRowsReturned;
uint64_t fRowsPerGroup;
// output rowgroup and row
rowgroup::RowGroup fRowGroupOut;
rowgroup::RowGroup fRowGroupDelivered;
rowgroup::RowGroup fRowGroupAdded;
rowgroup::Row fRowDelivered;
// for datalist
RowGroupDL* fOutputDL;
uint64_t fOutputIterator;
class Runner
{
public:
explicit Runner(CrossEngineStep* step) : fStep(step)
{
}
void operator()()
{
utils::setThreadName("CESRunner");
fStep->execute();
}
CrossEngineStep* fStep;
};
uint64_t fRunner; // thread pool handle
OIDVector fOIDVector;
bool fEndOfResult;
bool fRunExecuted;
// MySQL server info
std::string fHost;
std::string fUser;
std::string fPasswd;
std::string fSchema;
std::string fTable;
std::string fAlias;
unsigned int fPort;
// returned columns and primitive filters
std::string fWhereClause;
std::string fSelectClause;
// Function & Expression columns
std::vector<boost::shared_ptr<execplan::ParseTree> > fFeFilters;
std::vector<boost::shared_ptr<execplan::ReturnedColumn> > fFeSelects;
std::vector<boost::shared_ptr<execplan::ReturnedColumn> > fFeFcnJoin;
std::map<uint32_t, uint32_t> fColumnMap; // projected key position (k->p)
uint64_t fColumnCount;
boost::scoped_array<int> fFe1Column;
std::shared_ptr<int[]> fFeMapping1;
std::shared_ptr<int[]> fFeMapping3;
rowgroup::RowGroup fRowGroupFe1;
rowgroup::RowGroup fRowGroupFe3;
funcexp::FuncExp* fFeInstance;
utils::LibMySQL* mysql;
};
} // namespace joblist