rendered paste body/** Projekt: i6db* Revision: $Id: CNestedLoopJoin.cpp,v 1.4 2006/11/26 16:43:46 snphbaum Exp $** Copyright (C) 2006 by SOS2 Team, IMMD6, Uni Erlangen* sos2@i6.informatik.uni-erlangen.de*/#include "CNestedLoopJoin.hpp"namespace i6db { namespace relops { CNestedLoopJoin::CNestedLoopJoin(CRelationalOperator *leftOp, const string &leftAttr, CRelationalOperator *rightOp, const string &rightAttr) { if (!leftOp || !rightOp) throw CException ("CNestedLoopJoin: null pointer as operator not allowed", __LINE__ ); cerr << "XXXXXXXXXXXKONSTRUKORXXXXXXXXXXXXXXX" << endl; leftOperator = leftOp; rightOperator = rightOp; leftAttribute = leftOp->getTupleDesc()->getAttributeNumber(leftAttr); rightAttribute = rightOp->getTupleDesc()->getAttributeNumber(rightAttr); isOpen = false; numOfFetches = 0; descriptor = NULL; lastSlowTuple = NULL; if (leftOp->getCardinality() < rightOp->getCardinality()) { leftIsSmaller = true; } else { leftIsSmaller = false; } } CNestedLoopJoin::CNestedLoopJoin(CRelationalOperator *leftOp, unsigned int leftAttrNum, CRelationalOperator *rightOp, unsigned int rightAttrNum):lastSlowTuple(NULL) { if (leftOp == NULL || rightOp == NULL) throw CException ("CNestedLoopJoin: null pointer as operator not allowed", __LINE__ ); leftOperator = leftOp; rightOperator = rightOp; leftAttribute = leftAttrNum; rightAttribute = rightAttrNum; isOpen = false; numOfFetches = 0; descriptor = NULL; //lastSlowTuple = NULL; if (leftOp->getCardinality() < rightOp->getCardinality()) leftIsSmaller = true; else { leftIsSmaller = false; } } CNestedLoopJoin::~CNestedLoopJoin() { delete descriptor; delete lastSlowTuple; } void CNestedLoopJoin::open() { if (isOpen == true) throw CException("CNestedLoopJoin: Already open", __LINE__); leftOperator->open(); rightOperator->open(); isOpen = true; } void CNestedLoopJoin::close() { if (isOpen == false) throw CException("CNestedLoopJoin: Already closed", __LINE__); leftOperator->close(); rightOperator->close(); isOpen = false; } CTuple *CNestedLoopJoin::next() { cerr << "XXXXXXXXXXX NEXT XXXXXXXXXXXX" << endl; if(isOpen == false) throw CException("CNestedLoopJoin: Operator not open"); CTuple *joined = NULL; CTuple *rightTuple = NULL; CTuple *leftTuple = lastSlowTuple; vector<Indexable *> values; unsigned int i = 0; if (!leftIsSmaller) { cerr << "XXXXXXXXXXX NEXT 1 XXXXXXXXXXXX" << endl; if (lastSlowTuple == NULL) { cerr << "XXXXXXXXXXX NEXT 2 XXXXXXXXXXXX" << endl; lastSlowTuple = leftOperator->next(); } while((rightTuple = rightOperator->next()) != NULL) { cerr << "XXXXXXXXXXX NEXT 5 XXXXXXXXXXXX" << endl; if(*(lastSlowTuple->getValue(leftAttribute)) == *(rightTuple->getValue(rightAttribute))) { cerr << "XXXXXXXXXXX NEXT 7 XXXXXXXXXXXX" << endl; i = 0; while(rightOperator->getTupleDesc()->isAttribute(i)) { cerr << "XXXXXXXXXXX NEXT 55 XXXXXXXXXXXX" << endl; values.push_back(lastSlowTuple->getValue(i)); cerr << "XXXXXXXXXXX NEXT 55 XXXXXXXXXXXX" << endl; i++; } /*i = 0; while(rightOperator->getTupleDesc()->isAttribute(i)) {cerr << "XXXXXXXXXXX NEXT 7777 XXXXXXXXXXXX" << endl; values.push_back(rightTuple->getValue(i)); i++; } */ cerr << "XXXXXXXXXXX NEXT 88888887 XXXXXXXXXXXX" << endl; joined = new CTuple(*descriptor, values); rightOperator->close(); rightOperator->open(); if((lastSlowTuple = leftOperator->next()) == NULL) { return NULL; } cerr << "XXXXXXXXXXX NEXT 9999999999 XXXXXXXXXXXX" << endl; return next(); } } } if (leftIsSmaller) { if (lastSlowTuple == NULL) { lastSlowTuple = rightOperator->next(); } while((leftTuple = leftOperator->next()) != NULL) {cerr << "XXXXXXXXXXX NEXT 8 XXXXXXXXXXXX" << endl; if(*(lastSlowTuple->getValue(rightAttribute)) == *(leftTuple->getValue(leftAttribute))) {cerr << "XXXXXXXXXXX NEXT 9 XXXXXXXXXXXX" << endl; i = 0; while(rightOperator->getTupleDesc()->isAttribute(i)) {cerr << "XXXXXXXXXXX NEXT 10 XXXXXXXXXXXX" << endl; values.push_back(rightTuple->getValue(i)); i++; } i = 0; while(leftOperator->getTupleDesc()->isAttribute(i)) { values.push_back(leftTuple->getValue(i)); i++; } joined = new CTuple(*descriptor, values); leftOperator->close(); leftOperator->open(); if((lastSlowTuple = rightOperator->next()) == NULL) { return NULL; } return next(); } } } return joined; } unsigned int CNestedLoopJoin::getCardinality() const { if (!isOpen) throw CException("CNestedLoopJoin: operator not open", __LINE__); return rightOperator->getCardinality() * leftOperator->getCardinality(); } unsigned long CNestedLoopJoin::getNumOfFetches() const { return leftOperator->getNumOfFetches() + rightOperator->getNumOfFetches(); } CTupleDescriptor *CNestedLoopJoin::getTupleDesc() { cerr << "XXXXXXXXXXXX TUPLE DESC XXXXXXXXXXXXXX" << endl; if(descriptor == NULL) { std::vector<table::TableDefinition::Attribute> attributes; for (unsigned int i = 0; leftOperator->getTupleDesc()->isAttribute(i); i++) attributes.push_back(leftOperator->getTupleDesc()->getColumn(i)); for (unsigned int i = 0; rightOperator->getTupleDesc()->isAttribute(i); i++) attributes.push_back(rightOperator->getTupleDesc()->getColumn(i)); descriptor = new CTupleDescriptor(attributes); } cerr << "XXXXXXXXXXXX TUPLE DESC 2443 XXXXXXXXXXXXXX" << endl; return new CTupleDescriptor(*descriptor); } }}