diff options
author | Constantin Jucovschi <cj@ubuntu.localdomain> | 2009-04-24 07:20:22 -0400 |
---|---|---|
committer | Constantin Jucovschi <cj@ubuntu.localdomain> | 2009-04-24 07:20:22 -0400 |
commit | 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 (patch) | |
tree | bd328a4dd4f92d32202241b5e3a7f36177792c5f /rasodmg/test/test_query.cc | |
download | rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.gz rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.xz rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.zip |
Initial commitv8.0
Diffstat (limited to 'rasodmg/test/test_query.cc')
-rw-r--r-- | rasodmg/test/test_query.cc | 693 |
1 files changed, 693 insertions, 0 deletions
diff --git a/rasodmg/test/test_query.cc b/rasodmg/test/test_query.cc new file mode 100644 index 0000000..b8b8faf --- /dev/null +++ b/rasodmg/test/test_query.cc @@ -0,0 +1,693 @@ +/* +* 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 <http://www.gnu.org/licenses/>. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see <http://www.rasdaman.org> +* or contact Peter Baumann via <baumann@rasdaman.com>. +/ +/** + * SOURCE: test_query.cc + * + * MODULE: rasodmg + * + * COMMENTS: + * None + */ + +#ifdef EARLY_TEMPLATE +#define __EXECUTABLE__ +#include "raslib/template_inst.hh" +#endif + +#ifdef __VISUALC__ +#include <strstrea.h> +#else +#include <strstream> +#endif + +#include <stdio.h> +#include <string.h> +#include <sstream> +#include <fstream> + +using namespace std; + +#ifdef __VISUALC__ + #define __EXECUTABLE__ +#endif + +#include "rasodmg/transaction.hh" +#include "rasodmg/database.hh" + +#include "rasodmg/ref.hh" + +#include "rasodmg/set.hh" +#include "rasodmg/marray.hh" +#include "rasodmg/iterator.hh" +#include "rasodmg/oqlquery.hh" + +#include "raslib/type.hh" + +#include "raslib/minterval.hh" + +#include "raslib/primitive.hh" +#include "raslib/complex.hh" +#include "raslib/structure.hh" + +#include "raslib/structuretype.hh" +#include "raslib/primitivetype.hh" + +#include "rasodmg/storagelayout.hh" + +#include "rasodmg/alignedtiling.hh" +#include "rasodmg/dirtiling.hh" +#include "rasodmg/dirdecompose.hh" +#include "rasodmg/interesttiling.hh" +#include "rasodmg/stattiling.hh" + +#ifdef __VISUALC__ + #undef __EXECUTABLE__ +#endif + +const int MAX_STR_LEN = 255; +const int MAX_QUERY_LEN = 10240; + +bool printText = false; + +int checkArguments( int argc, char** argv, const char* searchText, int& optionValueIndex ) +{ + int found = 0; + int i=1; + + while( !found && i<argc ) + found = !strcmp( searchText, argv[i++] ); + + if( found && i<argc && (argv[i][0] != '-') ) + optionValueIndex = i; + else + optionValueIndex = 0; + + return found; +} + + +void printScalar( const r_Scalar& scalar ) +{ + switch( scalar.get_type()->type_id() ) + { + case r_Type::BOOL: + std::cout << ( ((r_Primitive*)&scalar)->get_boolean() ? "T" : "F" ) << std::flush; + break; + + case r_Type::CHAR: + std::cout << (int)((r_Primitive*)&scalar)->get_char() << std::flush; + break; + + case r_Type::OCTET: + std::cout << (int)((r_Primitive*)&scalar)->get_octet() << std::flush; + break; + + case r_Type::SHORT: + std::cout << ((r_Primitive*)&scalar)->get_short() << std::flush; + break; + + case r_Type::USHORT: + std::cout << ((r_Primitive*)&scalar)->get_ushort() << std::flush; + break; + + case r_Type::LONG: + std::cout << ((r_Primitive*)&scalar)->get_long() << std::flush; + break; + + case r_Type::ULONG: + std::cout << ((r_Primitive*)&scalar)->get_ulong() << std::flush; + break; + + case r_Type::FLOAT: + std::cout << ((r_Primitive*)&scalar)->get_float() << std::flush; + break; + + case r_Type::DOUBLE: + std::cout << ((r_Primitive*)&scalar)->get_double() << std::flush; + break; + + case r_Type::COMPLEXTYPE1: + case r_Type::COMPLEXTYPE2: + std::cout << "(" << ((r_Complex*)&scalar)->get_re() << ", " << ((r_Complex*)&scalar)->get_im() << ")" << std::flush; + break; + + case r_Type::STRUCTURETYPE: + { + r_Structure* structValue = (r_Structure*)&scalar; + + std::cout << "{ " << std::flush; + + for( int i=0; i<structValue->count_elements(); i++ ) + { + printScalar( (*structValue)[i] ); + + if( i < structValue->count_elements()-1 ) std::cout << ", " << std::flush; + } + + std::cout << " }" << std::endl; + } + break; + default: + std::cout << "scalar type " << scalar.get_type()->type_id() << " not supported!" << std::endl; + break; + } +} + +void printUsage(char* name){ + std::cout << name << "v1.1 systemtest query utility " << std::endl; + std::cout << "Description: Systemtest query utility for query execution in RasDaMan" << std::endl; + std::cout << "Usage: " << name << " [options]" << std::endl << std::endl; + std::cout << "Options: -h ... this help" << std::endl; + std::cout << " -server <srvname> ... name of server.(mandatory)" << std::endl; + std::cout << " -port <nnnn> ... port of server.(default 7001)" << std::endl; + std::cout << " -base <dbname> ... name of database.(madatory)" << std::endl; + std::cout << " -file <filename> ... file name used to read query from a file" << std::endl; + std::cout << " -user <usrname> ... user name.(default rasguest)" << std::endl; + std::cout << " -passwd <usrpasswd> ... user password.(default rasguest)" << std::endl; + std::cout << " -transferformat <format> ... transfer format.(default Array)" << std::endl; + std::cout << " -transferformatparams <formatparams> ... transfer format parameters.(default NULL)" << std::endl; + std::cout << " -storageformat <format> ... storage format.(default Array)" << std::endl; + std::cout << " -storageformatparams <formatparams> ... storage format parameters.(default NULL)" << std::endl; + std::cout << " -mdddomain <domain> ... MDD domain." << std::endl; + std::cout << " -tiling <tiling> ... tiling strategy, only for update query.(default SizeTiling)" << std::endl; + std::cout << " -tilingparams <tilingparams> ... tiling strategy params, only for update query.(default 131072)" << std::endl; + std::cout << " -hex ... output in hex.(default off)" << std::endl; + std::cout << " -nooutput ... no output of MDD content.(default on)" << std::endl; + std::cout << " -testbed ... turn on output for testbed.(default off)" << std::endl; + std::cout << " -text ... print textual output.(default off)" << std::endl; + std::cout << std::endl << std::endl; + + std::cout << "Report bugs to <support@active-knowledge.com>" << std::endl; +} + +r_Tiling* +getTilingScheme(r_Tiling_Scheme& tilingS, char* tilingP){ + r_Tiling* retval=NULL; + + try { + std::cout << "Creating tiling strategy ..." << std::flush; + switch(tilingS) { + case r_NoTiling: + retval = new r_No_Tiling(tilingP); + break; + case r_AlignedTiling: + retval = new r_Aligned_Tiling(tilingP); + break; + case r_InterestTiling: + retval = new r_Interest_Tiling(tilingP); + break; + case r_DirectionalTiling: + retval = new r_Dir_Tiling(tilingP); + break; + case r_StatisticalTiling: + retval = new r_Stat_Tiling(tilingP); + break; + default: + retval = new r_Size_Tiling(tilingP); + break; + } + std::cout << "OK" << std::flush; + } + catch(r_Error& err){ + std::cout << "FAILED" << std::endl; + std::cout << "Error " << err.get_errorno() << " : " << err.what() << std::endl; + } + + return retval; +} + +int main( int argc, char** argv ) +{ + int optionValueIndex=0; + + char serverName[MAX_STR_LEN] = ""; + r_ULong serverPort = 7001; + char baseName[MAX_STR_LEN] = ""; + + char userName[MAX_STR_LEN] = "rasguest"; + char userPasswd[MAX_STR_LEN] = "rasguest"; + + char fileName[MAX_STR_LEN] = ""; + + r_Data_Format transferFormat = r_Array; + char *transferFormatParams = NULL; + r_Data_Format storageFormat = r_Array; + char *storageFormatParams = NULL; + + r_Tiling_Scheme tilingScheme = r_SizeTiling; + char* tilingSchemeParams = "131072"; + + + int output = 0; + int hexOutput = 0; + int testbed = 0; + + r_ULong tileSize=0; + r_Minterval tileConfig; + r_Minterval mddDomain; + + if( checkArguments( argc, argv, "-h", optionValueIndex ) ) { + printUsage(argv[0]); + return EXIT_SUCCESS; + } + + if( checkArguments( argc, argv, "-server", optionValueIndex ) && optionValueIndex ) + strcpy( serverName, argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-base", optionValueIndex ) && optionValueIndex ) + strcpy( baseName, argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-file", optionValueIndex ) && optionValueIndex ) + strcpy( fileName, argv[optionValueIndex] ); + + if(!strcmp(serverName, "") || + !strcmp(baseName, "") || + !strcmp(fileName, "") ) { + std::cerr << "Mandatory parameters are missing!" << std::endl; + printUsage(argv[0]); + return EXIT_SUCCESS; + } + + hexOutput = checkArguments( argc, argv, "-hex", optionValueIndex ); + printText = checkArguments( argc, argv, "-text", optionValueIndex ); + output = !checkArguments( argc, argv, "-nooutput", optionValueIndex ); + testbed = checkArguments( argc, argv, "-testbed", optionValueIndex ); + + if( checkArguments( argc, argv, "-mdddomain", optionValueIndex ) && optionValueIndex ) + mddDomain = r_Minterval( argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-tileconf", optionValueIndex ) && optionValueIndex ) + tileConfig = r_Minterval( argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-tilesize", optionValueIndex ) && optionValueIndex ) + tileSize = strtoul( argv[optionValueIndex], (char **)NULL, 10 ) ; + + if( checkArguments( argc, argv, "-port", optionValueIndex ) && optionValueIndex ) + serverPort = strtoul( argv[optionValueIndex], (char **)NULL, 10 ) ; + + if( checkArguments( argc, argv, "-user", optionValueIndex ) && optionValueIndex ) + strcpy( userName, argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-passwd", optionValueIndex ) && optionValueIndex ) + strcpy( userPasswd, argv[optionValueIndex] ); + + if( checkArguments( argc, argv, "-transferformat", optionValueIndex ) && optionValueIndex ) { + transferFormat = get_data_format_from_name( argv[optionValueIndex] ); + if(transferFormat == r_Data_Format_NUMBER) { + std::cerr << "Invalid transfer format '" << argv[optionValueIndex] << "' switched to " << r_Array << std::endl; + transferFormat = r_Array; + } + } + + if( checkArguments( argc, argv, "-transferformatparams", optionValueIndex ) && optionValueIndex ) + transferFormatParams = argv[optionValueIndex] ; + + if( checkArguments( argc, argv, "-storageformat", optionValueIndex ) && optionValueIndex ) { + storageFormat = get_data_format_from_name(argv[optionValueIndex] ); + if(storageFormat == r_Data_Format_NUMBER) { + std::cerr << "Invalid storage format '" << argv[optionValueIndex] << "' switched to " << r_Array << std::endl; + storageFormat = r_Array; + } + } + + if( checkArguments( argc, argv, "-storageformatparams", optionValueIndex ) && optionValueIndex ) + storageFormatParams = argv[optionValueIndex] ; + + if( checkArguments( argc, argv, "-tiling", optionValueIndex ) && optionValueIndex ) { + tilingScheme = get_tiling_scheme_from_name( argv[optionValueIndex] ); + if(tilingScheme == r_Tiling_Scheme_NUMBER) { + std::cerr << "Invalid tiling scheme '" << argv[optionValueIndex] << "' switched to " << r_SizeTiling << std::endl; + tilingScheme = r_SizeTiling; + } + if(tilingScheme == r_RegularTiling) { + std::cerr << "Tiling scheme '" << argv[optionValueIndex] << "' not supported, switched to " << r_SizeTiling << std::endl; + tilingScheme = r_SizeTiling; + } + } + + if( checkArguments( argc, argv, "-tilingparams", optionValueIndex ) && optionValueIndex ) + tilingSchemeParams = argv[optionValueIndex] ; + + +#ifdef __VISUALC__ + std::ifstream fileStream( fileName, ios::nocreate ); + if( !fileStream.is_open() ) +#else + std::ifstream fileStream( fileName ); + if( !fileStream ) +#endif + { + std::cout << "Error: File not found." << std::endl; + return EXIT_FAILURE; + } + + std::ostringstream queryStream; + + queryStream << "-- " << fileName << std::endl; + + char ch; + while( fileStream.get(ch) ) queryStream.put(ch); + + queryStream << std::ends; + + std::cout << std::endl << std::endl; + + r_Database db; + r_Transaction ta; + + db.set_servername( serverName, serverPort ); + db.set_useridentification( userName, userPasswd ); + + try + { + std::cout << "Creating query string ..."<< std::flush; + r_OQL_Query q1( queryStream.str().c_str() ); + std::cout << "OK" << std::endl; + std::cout << "The query is: " << std::endl; + + std::cout << q1.get_query() << std::endl; + + std::cout << "Opening Database " << baseName << " on " << serverName << "... "<< std::flush; + db.open( baseName ); + std::cout << "OK" << std::endl; + + if( q1.is_update_query() ) + { + std::cout << "Starting Update Transaction ... "<< std::flush; + ta.begin(); + std::cout << "OK" << std::endl; + + std::cout << "Setting transfer and storage formats ... " << std::flush; + db.set_transfer_format( transferFormat, transferFormatParams ); + db.set_storage_format( storageFormat, storageFormatParams ); + std::cout << "OK" << std::endl; + + r_Marray<r_ULong>* mddConst = NULL; + r_Tiling* tilingObj = NULL; + r_Storage_Layout* stl = NULL; + + + std::cout << "Executing the update query ..."<< std::flush; + + if( strstr( queryStream.str().c_str(), "$" ) ) + { + r_Minterval domain; + if( mddDomain.dimension() ) + domain = mddDomain; + else + domain = r_Minterval("[0:10,0:10]"); + + // create storage layout object + + try { + tilingObj = getTilingScheme(tilingScheme, tilingSchemeParams); + + stl = new r_Storage_Layout( tilingObj ); + + // mddConst = new( "GreyCube" ) r_Marray<r_Char>( domain, (unsigned char)0, stl ); + mddConst = new( "ULongImage" ) r_Marray<r_ULong>( domain, (r_ULong)9, stl ); + // mddConst = new( "FloatCube4" ) r_Marray<r_Float>( domain, 9ul, stl ); + + q1 << *mddConst; + } + catch(r_Error& errorObj) { + std::cout << "FAILED" << std::endl; + std::cout << "Error " << errorObj.get_errorno() << " : " << errorObj.what() << std::endl; + + if( testbed ) + { + std::cout << "-- Testbed line: error_no=" << errorObj.get_errorno() << std::endl; + std::cout << std::endl; + } + + std::cout << "Aborting Transaction ... "<< std::flush; + ta.abort(); + std::cout << "OK" << std::endl; + + std::cout << "Closing Database ... "<< std::flush; + db.close(); + + std::cout << "OK" << std::endl; + + if( mddConst ) delete mddConst; + else + if( stl ) delete stl; + else if(tilingObj) delete tilingObj; + + return EXIT_FAILURE; + } + } + + try + { + r_oql_execute( q1 ); + } + catch( r_Error& errorObj ) + { + std::cout << "FAILED" << std::endl; + std::cout << "Error " << errorObj.get_errorno() << " : " << errorObj.what() << std::endl; + + if( testbed ) + { + std::cout << "-- Testbed line: error_no=" << errorObj.get_errorno() << std::endl; + std::cout << std::endl; + } + + std::cout << "Aborting Transaction ... " << std::flush; + ta.abort(); + std::cout << "OK" << std::endl; + + std::cout << "Closing Database ... " << std::flush; + db.close(); + + std::cout << "OK" << std::endl; + + if( mddConst ) delete mddConst; + + return EXIT_FAILURE; + } + std::cout << "OK" << std::endl; + + if( mddConst ) delete mddConst; + } + else + { + std::cout << "Starting Read Only Transaction ... " << std::flush; + ta.begin( r_Transaction::read_only ); + std::cout << "OK" << std::endl; + + std::cout << "Setting transfer and storage formats ... " << std::flush; + db.set_transfer_format( transferFormat, transferFormatParams ); + db.set_storage_format( storageFormat, storageFormatParams ); + std::cout << "OK" << std::endl; + + r_Set< r_Ref_Any > result_set; + + std::cout << "Executing the retrieval query ..." << std::flush; + + try + { + r_oql_execute( q1, result_set ); + } + catch( r_Error& errorObj ) + { + std::cout << "FAILED" << std::endl; + std::cout << "Error " << errorObj.get_errorno() << " : " << errorObj.what() << std::endl; + + if( testbed ) + { + std::cout << "-- Testbed line: error_no=" << errorObj.get_errorno() << std::endl; + std::cout << std::endl; + } + + std::cout << "Aborting Transaction ... " << std::flush; + ta.abort(); + std::cout << "OK" << std::endl; + + std::cout << "Closing Database ... " << std::flush; + db.close(); + std::cout << "OK" << std::endl; + + return EXIT_FAILURE; + } + + std::cout << "OK" << std::endl; + std::cout << "Collection" << std::endl; + std::cout << " Oid...................: " << result_set.get_oid() << std::endl; + std::cout << " Type Structure........: " + << ( result_set.get_type_structure() ? result_set.get_type_structure() : "<nn>" ) << std::endl; + std::cout << " Type Schema...........: " << std::flush; + if( result_set.get_type_schema() ) + result_set.get_type_schema()->print_status( std::cout ); + else + std::cout << "<nn>" << std::flush; + std::cout << std::endl; + std::cout << " Number of entries.....: " << result_set.cardinality() << std::endl; + std::cout << " Element Type Schema...: " << std::flush; + if( result_set.get_element_type_schema() ) + result_set.get_element_type_schema()->print_status( std::cout ); + else + std::cout << "<nn>" << std::flush; + std::cout << std::endl; + + if( testbed ) + { + std::cout << "-- Testbed line: result_type=" << result_set.get_type_structure() << std::endl; + std::cout << "-- Testbed line: result_elements=" << result_set.cardinality() << std::endl; + std::cout << std::endl; + } + + /* The following can be used, if the type is known and the element type is not atomic. + + r_Set< r_Ref< r_Point > >* set2 = (r_Set< r_Ref< r_Point > >*)&result_set; + r_Iterator< r_Ref<r_Point> > iter2 = set2->create_iterator(); + for( iter2.reset(); iter2.not_done(); iter2++ ) + std::cout << **iter2 << std::endl; + */ + + if( output || testbed ) + { + r_Iterator< r_Ref_Any > iter = result_set.create_iterator(); + + std::cout << std::endl; + + if( testbed ) + std::cout << "-- Testbed start block:" << std::endl; + + for ( int i=1 ; iter.not_done(); iter++, i++ ) + { + switch( result_set.get_element_type_schema()->type_id() ) + { + case r_Type::MARRAYTYPE: + { + const char *defExt; + r_Data_Format mafmt = r_Ref<r_GMarray>(*iter)->get_current_format(); + + // special treatment only for DEFs + switch (mafmt) + { + case r_TIFF: + defExt = "tif"; break; + case r_JPEG: + defExt = "jpg"; break; + case r_HDF: + defExt = "hdf"; break; + case r_PNG: + defExt = "png"; break; + case r_BMP: + defExt = "bmp"; break; + case r_VFF: + defExt = "vff"; break; + default: + defExt = NULL; + } + + if( defExt == NULL ) + { + std::cout << "Image " << i << std::endl; + if (printText) + { + int numCells = r_Ref<r_GMarray>(*iter)->get_array_size(); + const char* theStuff = r_Ref<r_GMarray>(*iter)->get_array(); + for (int cnt = 0; cnt < numCells; cnt++) + std::cout << theStuff[cnt]; + std::cout << std::endl; + } + else { + r_Ref<r_GMarray>(*iter)->print_status( std::cout, hexOutput ); + } + std::cout << std::endl; + } + else + { + char defFileName[256]; + + sprintf( defFileName, "image%d.%s", i, defExt ); + std::cout << "Image " << i << " written to " << defFileName << std::endl; + + FILE *tfile = fopen( defFileName, "wb" ); + fwrite((void*)r_Ref<r_GMarray>(*iter)->get_array(), 1, + r_Ref<r_GMarray>(*iter)->get_array_size(), tfile ); + fclose(tfile); + } + } + break; + + case r_Type::POINTTYPE: + std::cout << "Element " << i << ": " << *(r_Ref<r_Point>(*iter)) << std::endl; + break; + + case r_Type::SINTERVALTYPE: + std::cout << "Element " << i << ": " << *(r_Ref<r_Sinterval>(*iter)) << std::endl; + break; + + case r_Type::MINTERVALTYPE: + std::cout << "Element " << i << ": " << *(r_Ref<r_Minterval>(*iter)) << std::endl; + break; + + case r_Type::OIDTYPE: + std::cout << "Element " << i << ": " << *(r_Ref<r_OId>(*iter)) << std::endl; + break; + + default: + std::cout << "Element " << i << ": " << std::flush; + printScalar( *(r_Ref<r_Scalar>(*iter)) ); + std::cout << std::endl; + // or simply + // r_Ref<r_Scalar>(*iter)->print_status( std::cout ); + } + } + + if( testbed ) + std::cout << "-- Testbed end block:" << std::endl; + + std::cout << std::endl; + } + + } // retrieval query + + std::cout << "Commiting Transaction ... " << std::endl; + ta.commit(); + std::cout << "OK" << std::endl; + + std::cout << "Closing Database ... " << std::flush; + db.close(); + std::cout << "OK" << std::endl; + } + catch( r_Error& errorObj ) + { + std::cout << "FAILED" << std::endl; + std::cout << "Error " << errorObj.get_errorno() << " : " << errorObj.what() << std::endl; + ta.abort(); + db.close(); + if( testbed ) + { + std::cout << "-- Testbed line: error_no=" << errorObj.get_errorno() << std::endl; + std::cout << std::endl; + } + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + |