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/dictstep-jl.cpp
2022-08-23 18:45:36 +08:00

185 lines
4.5 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: dictstep-jl.cpp 9655 2013-06-25 23:08:13Z xlou $
// C++ Implementation: dictstep-js
//
// Description:
//
//
// Author: Patrick LeBlanc <pleblanc@calpont.com>, (C) 2008
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "bpp-jl.h"
#include "string_prefixes.h"
using namespace std;
using namespace messageqcpp;
namespace joblist
{
DictStepJL::DictStepJL()
{
}
DictStepJL::DictStepJL(const pDictionaryStep& dict)
{
BOP = dict.fBOP;
OID = dict.oid();
colName = dict.name();
compressionType = dict.colType().compressionType;
hasEqFilter = dict.hasEqualityFilter;
if (hasEqFilter && dict.eqFilter.size()> USEEQFILTERTHRESHOLD)
{
eqOp = dict.tmpCOP;
eqFilter = dict.eqFilter;
}
else
{
hasEqFilter=false;
filterString = dict.fFilterString;
}
filterCount = dict.fFilterCount;
charsetNumber = dict.fColType.charsetNumber;
}
DictStepJL::~DictStepJL()
{
}
void DictStepJL::setLBID(uint64_t token, uint32_t dbroot)
{
// lbid = token >> 10; // the lbid is calculated on the PM
}
void DictStepJL::createCommand(ByteStream& bs) const
{
bs << (uint8_t)DICT_STEP;
bs << BOP;
bs << (uint8_t)compressionType;
bs << charsetNumber;
bs << filterCount;
bs << (uint8_t)hasEqFilter;
if (hasEqFilter)
{
idbassert(filterCount == eqFilter.size());
bs << eqOp;
for (uint32_t i = 0; i < filterCount; i++)
bs << eqFilter[i];
}
else
bs << filterString;
CommandJL::createCommand(bs);
}
void DictStepJL::runCommand(ByteStream& bs) const
{
}
uint8_t DictStepJL::getTableColumnType()
{
throw logic_error("Don't call DictStepJL::getTableColumn(); it's not a projection step");
}
string DictStepJL::toString()
{
ostringstream os;
os << "DictStepJL: " << filterCount << " filters, BOP=" << (int)BOP << ", oid=" << OID
<< " name=" << colName << endl;
return os.str();
}
uint16_t DictStepJL::getWidth()
{
return colWidth;
}
void DictStepJL::setWidth(uint16_t w)
{
colWidth = w;
}
messageqcpp::ByteStream DictStepJL::reencodedFilterString() const
{
messageqcpp::ByteStream bs;
if (hasEqFilter)
{
idbassert(filterCount == eqFilter.size());
for (uint32_t i = 0; i < filterCount; i++)
{
uint8_t roundFlag = 0;
int64_t encodedPrefix = encodeStringPrefix((unsigned char*)eqFilter[i].c_str(), eqFilter[i].size(), charsetNumber);
bs << eqOp;
bs << roundFlag;
bs << encodedPrefix;
}
}
else
{
messageqcpp::ByteStream filterStringCopy(
filterString); // XXX I am not sure about real semantics of messagecpp::ByteStream. So - copy.
// please erfer to pdictionary.cpp in this dicrectory, addFilter function for a proper encoding of string
// filters.
for (uint32_t i = 0; i < filterCount; i++)
{
uint8_t cop, roundFlag = 0;
uint16_t size;
const uint8_t* ptr;
int64_t encodedPrefix;
filterStringCopy >> cop;
// as we are dealing with prefixes, we have to use "... or equal" conditions instead of
// strict ones.
// Consider this: ... WHERE col > 'customer#001' AND col < 'customer#100'.
// "Working with prefixes of 8 bytes" means these conditions reduce to ... WHERE col > 'customer' AND
// col < 'customer' and their AND relation is impossible to satisfy. We do not pass this string to
// primproc and that means we can reencode operation codes here.
switch (cop)
{
case COMPARE_LT:
case COMPARE_NGE: cop = COMPARE_LE; break;
case COMPARE_GT:
case COMPARE_NLE: cop = COMPARE_GE; break;
default: break;
}
bs << cop;
bs << roundFlag;
filterStringCopy >> size;
ptr = filterStringCopy.buf();
encodedPrefix = encodeStringPrefix(ptr, size, charsetNumber);
bs << encodedPrefix;
filterStringCopy.advance(size);
}
}
return bs;
}
}; // namespace joblist