/*
* 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: transdirix.cc
*
* MODULE: indexmgr
* CLASS: TransDirIx
*
*
* COMMENTS:
* none
*
*/
static const char rcsid[] = "@(#)transdirix, TransDirIx: $Id: transdirix.cc,v 1.17 2002/05/16 16:26:10 coman Exp $";
#include
#include "indexmgr/keyobject.hh"
#include "indexmgr/transdirix.hh"
#include "raslib/rmdebug.hh"
#include "reladminif/oidif.hh"
#include "tilemgr/tile.hh"
IndexDS*
TransDirIx::getNewInstance() const
{
return new TransDirIx(getDimension());
}
void
TransDirIx::freeDS()
{
}
unsigned int
TransDirIx::getOptimalSize() const
{
return 1000;
}
unsigned int
TransDirIx::getDimension() const
{
return currDomain.dimension();
}
bool
TransDirIx::isPersistent() const
{
return false;
}
TransDirIx::TransDirIx(r_Dimension dim)
: currDomain(dim),
tiles()
{
RMDBGONCE(2, RMDebug::module_indexif, "TransDirIx", "TransDirIx() " << (r_Ptr)this);
}
void
TransDirIx::printStatus(unsigned int level, std::ostream& stream) const
{
stream << "TransDirIx " << currDomain << endl;
KeyObjectVector::const_iterator entryIt = tiles.begin();
int i = 0;
while (entryIt != tiles.end())
{
stream << i << ". " << (*entryIt).getDomain() << endl;
entryIt++;
i++;
}
}
void
TransDirIx::insertObject(const KeyObject& newKeyObject, unsigned int pos)
{
if (pos < 0 || pos > getSize())
{
RMInit::logOut << "TransDirIx::insertObject(" << newKeyObject << ", " << pos << ") pos out of range" << endl;
throw r_Error(TRANSIENT_INDEX_OUT_OF_BOUNDS);
}
else {
if (tiles.size() == 0)
currDomain = newKeyObject.getDomain();
else
currDomain.closure_with(newKeyObject.getDomain());
tiles.insert(tiles.begin() + pos, newKeyObject);
}
}
bool
TransDirIx::removeObject(const KeyObject& tileToRemove)
{
bool found = false;
for (KeyObjectVector::iterator iter = tiles.begin(); iter != tiles.end(); iter++)
{
if ((*iter).getTransObject() == tileToRemove.getTransObject())
{
found = true;
tiles.erase(iter);
break;
}
}
return found;
}
OId::OIdPrimitive
TransDirIx::getIdentifier() const
{
return (OId::OIdPrimitive)(r_Ptr)this;
}
void
TransDirIx::setAssignedDomain(const r_Minterval& newDomain)
{
currDomain = newDomain;
}
const KeyObject&
TransDirIx::getObject(unsigned int pos) const
{
return tiles[pos];
}
r_Minterval
TransDirIx::getObjectDomain(unsigned int pos) const
{
return tiles[pos].getDomain();
}
void
TransDirIx::getObjects(KeyObjectVector& objs) const
{
objs = tiles;
}
r_Minterval
TransDirIx::getCoveredDomain() const
{
return currDomain;
}
unsigned int
TransDirIx::getSize() const
{
return tiles.size();
}
r_Bytes
TransDirIx::getTotalStorageSize() const
{
// size of currDomain field:
r_Bytes sz = currDomain.get_storage_size();
// size of tiles vector
// even though the size of each entry summed here corresponds to the
// KeyObject, it should be added here since it
// is "additional data" stored due to the storage structure adopted.
// For each entry (tile), there is a domain specification, a pointer and
// an r_Bytes size field:
sz += tiles.size() * (currDomain.get_storage_size() + sizeof(KeyObject) + sizeof (r_Bytes));
return sz;
}
TransDirIx::~TransDirIx()
{
RMDBGENTER(2, RMDebug::module_indexif, "TransDirIx", "~TransDirIx() " << (r_Ptr)this);
for (unsigned int i = 0; i < tiles.size(); i++)
{
delete tiles[i].getTransObject();
}
RMDBGEXIT(2, RMDebug::module_indexif, "TransDirIx", "~TransDirIx() " << (r_Ptr)this);
}
std::vector< r_Minterval* >*
TransDirIx::getObjectDomains(void) const
{
std::vector< r_Minterval* >* te = new std::vector< r_Minterval* >();
te->reserve(tiles.size());
int end = tiles.size();
for (int i = 0; i < end; i++)
{
(*te)[i] = new r_Minterval(tiles[i].getDomain());
}
return te;
}
bool
TransDirIx::isValid() const
{
return true;
}
bool
TransDirIx::isUnderFull() const
{
return false;
}
bool
TransDirIx::isOverFull() const
{
return false;
}
bool
TransDirIx::isSameAs(const IndexDS* ix) const
{
if (ix->isPersistent())
return false;
else
if (ix == this)
return true;
else
return false;
}
void
TransDirIx::setObject(const KeyObject& theKey, unsigned int i)
{
tiles[i] = theKey;
}
void
TransDirIx::setObjectDomain(const r_Minterval& dom, unsigned int i)
{
tiles[i].setDomain(dom);
}
r_Minterval
TransDirIx::getAssignedDomain(void) const
{
return currDomain;
}
bool
TransDirIx::removeObject(unsigned int pos)
{
bool found = false;
if (pos < tiles.size())
{
found = true;
tiles.erase(tiles.begin() + pos);
}
return found;
}