From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- qlparser/qtmintervalop.cc | 222 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 qlparser/qtmintervalop.cc (limited to 'qlparser/qtmintervalop.cc') diff --git a/qlparser/qtmintervalop.cc b/qlparser/qtmintervalop.cc new file mode 100644 index 0000000..e112f18 --- /dev/null +++ b/qlparser/qtmintervalop.cc @@ -0,0 +1,222 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community 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 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community 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 rasdaman community. If not, see . +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see +* or contact Peter Baumann via . +*/ +/************************************************************* + * + * + * PURPOSE: + * + * + * COMMENTS: + * + ************************************************************/ + +static const char rcsid[] = "@(#)qlparser, QtMintervalOp: $Header: /home/rasdev/CVS-repository/rasdaman/qlparser/qtmintervalop.cc,v 1.12 2003/12/27 20:51:28 rasdev Exp $"; + +#include "raslib/rmdebug.hh" + +#include "qlparser/qtmintervalop.hh" +#include "qlparser/qtdata.hh" +#include "qlparser/qtmintervaldata.hh" +#include "qlparser/qtintervaldata.hh" +#include "qlparser/qtatomicdata.hh" + +#include "catalogmgr/ops.hh" +#include "relcatalogif/type.hh" + +#include +#ifndef CPPSTDLIB +#include // STL +#else +#include +using namespace std; +#endif + + +const QtNode::QtNodeType QtMintervalOp::nodeType = QT_MINTERVALOP; + +QtMintervalOp::QtMintervalOp( QtOperationList* opList ) + : QtNaryOperation( opList ) +{ +} + + + +QtData* +QtMintervalOp::evaluate( QtDataList* inputList ) +{ + RMDBCLASS( "QtMintervalOp", "evaluate( QtDataList* )", "qlparser", __FILE__, __LINE__ ) + + QtData* returnValue = NULL; + QtDataList* operandList = NULL; + + if( getOperands( inputList, operandList ) ) + { + vector::iterator dataIter; + bool goOn=true; + + // check for point operand + if( operandList->size() == 1 && ((*operandList)[0])->getDataType() == QT_MINTERVAL ) + { + // pass point as minterval projection + returnValue = (*operandList)[0]; + + delete operandList; + operandList=NULL; + } + else + { + // first check operand types + for( dataIter=operandList->begin(); dataIter!=operandList->end() && goOn; dataIter++ ) + if (!( (*dataIter)->getDataType() == QT_SHORT || (*dataIter)->getDataType() == QT_USHORT || + (*dataIter)->getDataType() == QT_LONG || (*dataIter)->getDataType() == QT_ULONG || + (*dataIter)->getDataType() == QT_OCTET || (*dataIter)->getDataType() == QT_CHAR || + (*dataIter)->getDataType() == QT_INTERVAL)) + { + goOn=false; + break; + } + + if( !goOn ) + { + RMInit::logOut << "Error: QtMintervalOp::evaluate() - expressions for minterval dimensions must be either of type integer or interval." << endl; + parseInfo.setErrorNo(390); + + // delete the old operands + if( operandList ) + { + for( dataIter=operandList->begin(); dataIter!=operandList->end(); dataIter++ ) + if( (*dataIter) ) (*dataIter)->deleteRef(); + + delete operandList; + operandList=NULL; + } + + throw parseInfo; + } + + // + // create a QtMintervalData object and fill it + // + r_Minterval domainData( operandList->size() ); + vector* trimFlags = new vector( operandList->size() ); + int pos; + + for( dataIter=operandList->begin(), pos=0; dataIter!=operandList->end(); dataIter++,pos++ ) + { + if( (*dataIter)->getDataType() == QT_INTERVAL ) + { + domainData << ((QtIntervalData*)(*dataIter))->getIntervalData(); + (*trimFlags)[pos] = true; + }else + { + if( (*dataIter)->getDataType() == QT_SHORT || + (*dataIter)->getDataType() == QT_LONG || + (*dataIter)->getDataType() == QT_OCTET ) + domainData << ((QtAtomicData*)(*dataIter))->getSignedValue(); + else + domainData << ((QtAtomicData*)(*dataIter))->getUnsignedValue(); + + (*trimFlags)[pos] = false; + } + } + + returnValue = new QtMintervalData( domainData, trimFlags ); + + // delete the old operands + if( operandList ) + { + for( dataIter=operandList->begin(); dataIter!=operandList->end(); dataIter++ ) + if( (*dataIter) ) (*dataIter)->deleteRef(); + + delete operandList; + operandList=NULL; + } + } + } + + return returnValue; +} + + + +void +QtMintervalOp::printTree( int tab, ostream& s, QtChildType mode ) +{ + s << SPACE_STR(tab).c_str() << "QtMintervalOp Object " << getNodeType() << endl; + + QtNaryOperation::printTree( tab, s, mode ); +} + + + +void +QtMintervalOp::printAlgebraicExpression( ostream& s ) +{ + s << "["; + + QtNaryOperation::printAlgebraicExpression( s ); + + s << "]"; +} + + + +const QtTypeElement& +QtMintervalOp::checkType( QtTypeTuple* typeTuple ) +{ + RMDBCLASS( "QtMintervalOp", "checkType( QtTypeTuple* )", "qlparser", __FILE__, __LINE__ ) + + dataStreamType.setDataType( QT_TYPE_UNKNOWN ); + + QtOperationList::iterator iter; + bool opTypesValid = true; + + for( iter=operationList->begin(); iter!=operationList->end() && opTypesValid; iter++ ) + { + const QtTypeElement& type = (*iter)->checkType( typeTuple ); + + // valid types: interval, integers + if (!( type.getDataType() == QT_INTERVAL || + type.getDataType() == QT_SHORT || + type.getDataType() == QT_LONG || + type.getDataType() == QT_OCTET || + type.getDataType() == QT_USHORT || + type.getDataType() == QT_ULONG || + type.getDataType() == QT_CHAR)) + { + opTypesValid=false; + break; + } + } + + if( !opTypesValid ) + { + RMInit::logOut << "Error: QtMintervalOp::checkType() - expressions for minterval dimensions must be either of type integer or interval." << endl; + parseInfo.setErrorNo(390); + throw parseInfo; + } + + dataStreamType.setDataType( QT_MINTERVAL ); + + return dataStreamType; +} -- cgit