/*
* 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 .
/
/**
* SOURCE: test_transmddcoll.cc
*
* MODULE: test for transmddobj of cachetamgr
*
* COMMENTS:
* none
*
*/
#include "rt_odb_Database.hxx"
#define TEST_PRIVATE
#include
#include
#include // STL
#include "mddmgr/transtile.hh"
#include "mddmgr/transmddobj.hh"
#include "typefactory.hh"
#include "ulongtype.hh" // from catalogif
#include "mddbasetype.hh" // from catalogif
#include "raslib/minterval.hh"
#include "mddmgr/transmddcoll.hh"
#include "mddmgr/mddcolliter.hh"
#include "adminif.hh"
#include "databaseif.hh"
#include "transactionif.hh"
#include "raslib/rminit.hh"
RMINITGLOBALS('C')
#include
// Needed by Adminif. Adminif has to be instantiated because
// of cell base types.
extern char* myExecArgv0 = "";
void testConstruction( );
void testRemovetile( );
void testIntersection( );
void printMemInfo( );
/*************************************************************
* Function name.: int main( int argc, char** argv)
*
* Arguments.....:
* argc: number of arguments given to program
* argv: array of char* with arguments
* Return value..: exit status
* Description...: none
************************************************************/
int
main( int argc, char** argv)
{
myExecArgv0 = argv[0];
AdminIf* myAdmin = AdminIf::instance();
TransactionIf ta;
char O2DBName[] = "BaseTestTransMDDObj";
// variables representing O2 database, ta and session
DatabaseIf database;
// connect to the database
cout << "Connecting to database " << O2DBName
<< "..." << endl;
int errorDBOpen;
try{
errorDBOpen = database.open( O2DBName );
}
catch( ...)
{
cout << "Caught Exception " << endl;
errorDBOpen = -6;
}
if ( errorDBOpen < 0 )
{
cout << "Database doesn't exist. Create it new ... " << endl;
cout << "Creating new database " << O2DBName
<< "..." << endl;
database.create( O2DBName, "TestSMSchema" );
cout << "Connecting to database " << O2DBName
<< "..." << endl;
try{
errorDBOpen = database.open( O2DBName );
}
catch(...)
{
errorDBOpen = -6;
}
}
if ( errorDBOpen < 0 )
{
cout << "Failed at opening newly created database " << errorDBOpen << endl;
cout << "Exiting " << endl;
return errorDBOpen;
}
ta.begin( &database, 1 );
cout << " Main - begin " << endl;
printMemInfo( );
/*
cout << "---------- ";
cout << "Testing constructor and insertTile for TransMDDObj: " << endl;
testConstruction( );
cout << "Testing constructor - end " << endl;
printMemInfo( );
*/
cout << "Testing intersection for TransMDDObj: " << endl;
testIntersection( );
cout << "Testing intersection - end " << endl;
printMemInfo( );
/*
cout << "---------- ";
cout << "Testing removeTile from TransMDDObj: " << endl;
testRemovetile( );
cout << "Main - end " << endl;
printMemInfo( );
*/
ta.abort( );
database.close( );
delete myAdmin;
}
void testConstruction( )
{
const int numTilesObj = 20;
r_Sinterval domSinterval;
cout <<"here 1" << endl;
ULongType ult;
BaseType* anyType = new( (d_Database*)(d_Database::transient_memory) ) ULongType; // anyType;
cout << "here 2"<< endl;
const MDDBaseType* anyBaseType =
new( (d_Database*)(d_Database::transient_memory) ) MDDBaseType( "AnyType", &ult/* anyType */ );
// const MDDBaseType anyBaseType( "AnyType", &ult );
char anyCell[4];
int j;
MDDObj* testMDDObj;
cout << "Creating transient tiles for the MDD object ... " << endl;
vector tilesVect(numTilesObj);
// initialize array of tiles
for (j=0; jinsertTile( tilesVect[j] );
}
// printMemInfo();
cout << "Printing contents of the created object ... " << endl;
testMDDObj->printStatus( );
cout << "Deleting the created object ... " << endl;
delete testMDDObj;
// printMemInfo();
}
void testIntersection( )
{
const int numTilesObj = 20;
r_Sinterval domSinterval;
const BaseType* ulongTypeObj = TypeFactory::mapType("ULong");
char uLongCell[] = {0,1,2,3};
const MDDBaseType* anyBaseType =
new MDDBaseType( "AnyType1", (BaseType*) ulongTypeObj );
TypeFactory::addTempType( (Type*) anyBaseType );
BaseType* bt = ( (MDDBaseType* ) anyBaseType )->getBaseType( );
cout << "Base type size " << bt->getSize( )<< endl;
int j;
MDDObj* testMDDObj;
cout << "Creating transient tiles for the MDD object ... " << endl;
vector tilesVect(numTilesObj);
// initialize array of tiles
for (j=0; jprintStatus( );
// printMemInfo();
tilesVect[j] = tt ;
}
// Test trans tiles part - BEGIN
// works fine
/*
for ( int h=0; h < tilesVect.size(); h++)
delete tilesVect[h];
*/
// release (tilesVect.begin( ), tilesVect.end( ) );
// Test trans tiles part - END
cout << "Creating the transient MDD object ... " << endl;
r_Minterval dom(2);
domSinterval.set_interval( r_Range( 0 ), r_Range( 100 ) );
domSinterval.set_low( '*' );
dom << domSinterval << domSinterval;
testMDDObj = new TransMDDObj( anyBaseType, dom );
for(j=0; j < numTilesObj; j++)
{
testMDDObj->insertTile( tilesVect[j] );
}
// printMemInfo();
cout << "Printing contents of the created object ... " << endl;
testMDDObj->printStatus( );
r_Minterval searchInterval(2);
domSinterval.set_interval( r_Range( 4 ), r_Range( 96 ) );
searchInterval<< domSinterval ;
domSinterval.set_interval( r_Range( 22 ), r_Range( 84 ) );
searchInterval<< domSinterval ;
cout << "Intersection with "<< searchInterval << " :" << endl ;
vector* intersectResult =
( testMDDObj )->intersect( searchInterval );
cout << "Result of intersection:" << endl;
cout << "Intersect result size " << intersectResult->size( ) << endl;
for (int tilesIter = 0; tilesIter < intersectResult->size( ) ; tilesIter++)
{
Tile* currTile;
currTile = (*intersectResult)[tilesIter];
cout << "Tile " << tilesIter << " domain : " ;
cout << currTile->getDomain( ) << endl;
}
// printMemInfo();
cout << "Deleting intersection result " << endl;
// Individual tiles in the intersectResult shouldn't be deleted, since
// they are part of the TransMDDObj. They are deleted whenever the object
// is deleted.
delete intersectResult;
// printMemInfo();
cout << "Testing point query " << endl;
r_Point pnt1( r_Range(2) , r_Range(3) );
unsigned long* c1 = (unsigned long*) testMDDObj->pointQuery( pnt1 );
// char* c1 = testMDDObj->pointQuery( pnt1 );
cout << "1. Result "<< pnt1 << ": "<< *c1 << endl;
r_Point pnt2( r_Range(20) , r_Range(30) );
unsigned long* c2 = (unsigned long*) testMDDObj->pointQuery( pnt2 );
// char* c2 = testMDDObj->pointQuery( pnt2 );
cout << "2. Result "<< pnt2 << ": "<< c2 << endl;
cout << "Deleting the created object ... " << endl;
delete testMDDObj;
printMemInfo();
}
void testRemovetile( )
{
const int numTilesObj = 20;
r_Sinterval domSinterval;
BaseType* anyType = new( (d_Database*)(d_Database::transient_memory) ) ULongType; // ULongType anyType;
char anyCell[4]= {'a','b','c','\0'};
int j,i;
TransMDDObj* testMDDObj;
vector* allTilesObj;
vector tilesToDelete;
const MDDBaseType* anyBaseType =
new( (d_Database*)(d_Database::transient_memory) ) MDDBaseType( "AnyType", anyType );
cout << "Creating transient tiles for the MDD object ... " << endl;
vector tilesVect;
// initialize array of tiles
for ( j=0; jinsertTile( ( Tile*) tilesVect[j] );
// printMemInfo( );
}
cout << "Printing contents of the created object ... " << endl;
testMDDObj->printStatus( );
cout << "Getting all tiles from the object... " << endl;
allTilesObj = testMDDObj->getTiles( );
// printMemInfo( );
cout << "Removing tile 2, 4, 6, and 12 from the object... " << endl;
for ( i = 0; i < allTilesObj->size( ); i++)
{
if ( i==2 || i == 4 || i == 6 || i == 12 )
{
tilesToDelete.push_back( (*allTilesObj)[i]);
}
}
for ( i = 0; i < tilesToDelete.size( ); i++)
{
cout << " Tile is going to be removed " << endl;
testMDDObj->removeTile(tilesToDelete[i] );
cout << endl << " Value of pointer to tile : " << tilesToDelete[i] << endl<< endl;
// printMemInfo();
}
testMDDObj->printStatus( );
cout << "Deleting the created object ... " << endl;
// printMemInfo( );
delete testMDDObj;
cout << "Already deleted " << endl;
// printMemInfo( );
delete allTilesObj;
}
void printMemInfo( )
{
// allows to store values in the program
struct mallinfo meminfo = mallinfo();
cout << " Memory Usage Information : " ;
cout << endl;
cout << " space in arena : " << meminfo.arena << endl;
cout << " number of small blocks : " << meminfo.smblks << endl;
cout << " number of ordinary blocks : " << meminfo.ordblks << endl;
cout << " space in free ordinary blocks : " << meminfo.fordblks << endl;
cout << " space in used ordinary blocks : " << meminfo.uordblks << endl;
// cout << "additional space from last call: " << meminfo.uordblks - memUsed << endl;
}