Files
secondo/Algebras/SpatialJoinTOUCH/Column/SpatialJoinColumnLocalInfo.cpp
2026-01-23 17:03:45 +08:00

331 lines
8.1 KiB
C++

/*
This file is part of SECONDO.
Copyright (C) 2004, University in Hagen, Department of Computer Science,
Database Systems for New Applications.
SECONDO 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; either version 2 of the License, or
(at your option) any later version.
SECONDO 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 SECONDO; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Algebras/CRel/TBlock.h"
#include "Algebras/CRel/TypeConstructors/TBlockTC.h"
#include "Algebras/CRel/SpatialAttrArray.h"
#include "RTreeTouchCol.h"
#include "SpatialJoinColumnLocalInfo.h"
#include "Algebras/Relation-C++/RelationAlgebra.h"
#include "tupleBlockStr.h"
class NestedList;
class QueryProcessor;
class nodeCol;
namespace CRelAlgebra {
class TBlockEntry;
class TBlock;
class TBlockIterator;
}
extern NestedList* nl;
extern QueryProcessor *qp;
using namespace std;
using namespace mmrtreetouch;
using namespace CRelAlgebra;
namespace STRColumn {
vector<mmrtreetouch::nodeCol *> createBuckets(
vector<tupleBlockStr> tuples,
int _numOfItemsInBucket
);
}
SpatialJoinColumnLocalInfo::~SpatialJoinColumnLocalInfo() {
tt->DeleteIfAllowed();
delete rtree;
for (const TBlock* tb: fTBlockVector) {
if(tb) {
tb->DecRef();
}
}
fTBlockVector.clear();
for (const TBlock* tb: sTBlockVector) {
if(tb) {
tb->DecRef();
}
}
sTBlockVector.clear();
delete[] tuple;
};
SpatialJoinColumnLocalInfo::SpatialJoinColumnLocalInfo(
Word firstStreamWordParam,
Word secondStreamWordParam,
int fanout,
int numOfItemsInBucket,
int cellFactor,
int firstStreamWordIndex,
int secondStreamWordIndex,
ListExpr ttl,
Supplier s
):rTBlockTypeInfo(CRelAlgebra::TBlockTI(qp->GetType(s), false)),
rTBlockInfo(rTBlockTypeInfo.GetBlockInfo()),
rTBlockSize(rTBlockTypeInfo.GetDesiredBlockSize()
* CRelAlgebra::TBlockTI::blockSizeFactor),
tuple(0)
{
tt = new ::TupleType(ttl);
firstStreamWord = firstStreamWordParam;
secondStreamWord = secondStreamWordParam;
_firstStreamIndex = firstStreamWordIndex;
_secondStreamIndex = secondStreamWordIndex;
getAllTuplesFromStreamA(firstStreamWord);
getAllTuplesFromStreamB(secondStreamWord);
bts = createTupleBlockStrVectorA(_firstStreamIndex);
btsB = createTupleBlockStrVectorB(_secondStreamIndex);
vector<mmrtreetouch::nodeCol * > buckets =
STRColumn::createBuckets(bts, numOfItemsInBucket);
rtree = new RTreeTouchCol(
tt,
_firstStreamIndex,
_secondStreamIndex,
cellFactor
);
rtree->constructTree(buckets, fanout);
assignTuplesB(btsB);
findMatchings();
}
void SpatialJoinColumnLocalInfo::assignTuplesB(vector<tupleBlockStr> BBTs)
{
for (tupleBlockStr tupleB: BBTs) {
rtree->assignTupleBs(tupleB);
}
}
void SpatialJoinColumnLocalInfo::findMatchings()
{
vector<pair<tupleBlockStr, tupleBlockStr >> matchings =
rtree->findMatchings();
const size_t fNumColumns = fTBlockVector[0]->GetColumnCount();
const size_t sNumColumns = sTBlockVector[0]->GetColumnCount();
tuple = new AttrArrayEntry[fNumColumns + sNumColumns];
tempTBlock = new TBlock(rTBlockInfo, 0, 0);
for (pair<tupleBlockStr, tupleBlockStr> btPair: matchings) {
addtupleBlockStrToTBlock(
btPair,
fNumColumns,
sNumColumns);
}
if (tempTBlock->GetRowCount() > 0) {
matchingVector.push_back(tempTBlock);
tempTBlock = 0;
}
}
TBlock* SpatialJoinColumnLocalInfo::NextResultTBlock () {
if (!matchingVector.empty()) {
TBlock *tBlockToReturn = matchingVector.back();
matchingVector.pop_back();
return tBlockToReturn;
} else {
return 0;
}
}
// TODO: use second stream
void SpatialJoinColumnLocalInfo::addtupleBlockStrToTBlock(
pair<tupleBlockStr, tupleBlockStr> btPair,
const size_t fNumColumns,
const size_t sNumColumns
)
{
tupleBlockStr fBT = btPair.first;
tupleBlockStr sBT = btPair.second;
const CRelAlgebra::TBlockEntry &fTuple = CRelAlgebra::TBlockEntry(
fTBlockVector[fBT.blockNum],
fBT.row);
const CRelAlgebra::TBlockEntry &sTuple = CRelAlgebra::TBlockEntry(
sTBlockVector[sBT.blockNum],
sBT.row
);
for(uint64_t i = 0; i < fNumColumns; i++) {
tuple[i] = fTuple[i];
}
for(uint64_t i = 0; i < sNumColumns; i++) {
tuple[fNumColumns + i] = sTuple[i];
}
tempTBlock->Append(tuple);
if(tempTBlock->GetSize() >= rTBlockSize) { // if tempTBlock is full
matchingVector.push_back(tempTBlock);
tempTBlock = new TBlock(rTBlockInfo, 0, 0);
}
}
void SpatialJoinColumnLocalInfo::getAllTuplesFromStreamA(
const Word stream)
{
Word streamTBlockWord;
qp->Open (stream.addr);
qp->Request (stream.addr, streamTBlockWord);
while (qp->Received (stream.addr) )
{
TBlock* tBlock = (TBlock*) streamTBlockWord.addr;
fTBlockVector.push_back(tBlock);
qp->Request ( stream.addr, streamTBlockWord);
}
qp->Close (stream.addr);
}
void SpatialJoinColumnLocalInfo::getAllTuplesFromStreamB(
const Word stream)
{
Word streamTBlockWord;
qp->Open (stream.addr);
qp->Request (stream.addr, streamTBlockWord);
while (qp->Received (stream.addr) )
{
TBlock* tBlock = (TBlock*) streamTBlockWord.addr;
sTBlockVector.push_back(tBlock);
qp->Request ( stream.addr, streamTBlockWord);
}
qp->Close (stream.addr);
}
vector<tupleBlockStr> SpatialJoinColumnLocalInfo::createTupleBlockStrVectorA(
const uint64_t &joinIndex
) {
vector<tupleBlockStr> BT;
uint64_t tBlockNum = 0;
tupleBlockStr temp;
uint64_t tblockVectorSize = fTBlockVector.size();
while(tBlockNum < tblockVectorSize) {
CRelAlgebra::TBlockIterator tBlockIter =
fTBlockVector[tBlockNum]->GetIterator();
uint64_t row = 0;
while(tBlockIter.IsValid()) {
const CRelAlgebra::TBlockEntry &tuple = tBlockIter.Get();
temp.blockNum = tBlockNum;
temp.row = row;
CRelAlgebra::SpatialAttrArrayEntry<2> attribute = tuple[joinIndex];
Rectangle<2> rec = attribute.GetBoundingBox();
temp.xMin = rec.MinD(0);
temp.xMax = rec.MaxD(0);
temp.yMin = rec.MinD(1);
temp.yMax = rec.MaxD(1);
BT.push_back(temp);
++row;
tBlockIter.MoveToNext();
}
++tBlockNum;
}
return BT;
}
vector<tupleBlockStr> SpatialJoinColumnLocalInfo::createTupleBlockStrVectorB(
const uint64_t &joinIndex
) {
vector<tupleBlockStr> BT;
uint64_t tBlockNum = 0;
tupleBlockStr temp;
uint64_t tblockVectorSize = sTBlockVector.size();
while(tBlockNum < tblockVectorSize) {
CRelAlgebra::TBlockIterator tBlockIter =
sTBlockVector[tBlockNum]->GetIterator();
uint64_t row = 0;
while(tBlockIter.IsValid()) {
const CRelAlgebra::TBlockEntry &tuple = tBlockIter.Get();
temp.blockNum = tBlockNum;
temp.row = row;
CRelAlgebra::SpatialAttrArrayEntry<2> attribute = tuple[joinIndex];
Rectangle<2> rec = attribute.GetBoundingBox();
temp.xMin = rec.MinD(0);
temp.xMax = rec.MaxD(0);
temp.yMin = rec.MinD(1);
temp.yMax = rec.MaxD(1);
BT.push_back(temp);
++row;
tBlockIter.MoveToNext();
}
++tBlockNum;
}
return BT;
}