All pastes #283686 Raw Edit

Stuff

public cpp v1 · immutable
#283686 ·published 2006-12-18 15:03 UTC
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);					}	}}