/* * 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 . */ #ifndef _DBHIERINDEX_HH_ #define _DBHIERINDEX_HH_ #include "reladminif/dbobject.hh" #include "indexmgr/hierindexds.hh" #include "relcatalogif/inlineminterval.hh" //@ManMemo: Module: {\bf relindexif} /*@Doc: This class stores data of hierarchical indexes in the database. There should be another interface to include the isLeaf/isRoot/... functionality. Beware of the cache when droping the IndexDS classes! See indexmgr/hierindexds.hh and indexmgr/indexds.hh for documentation. */ class DBHierIndex : public HierIndexDS { public: DBHierIndex(r_Dimension dim, bool isNode, bool makePersistent); /*@Doc: constructs a new index with type ixType, dimension dim. if isNode is true the index behaves as a node, else as a leaf instance is imediately persistent */ virtual double getOccupancy() const; HierIndexDS* getParent() const; void setParent(const HierIndexDS* newPa); virtual void setIsNode(bool beNode); virtual bool isLeaf() const; virtual bool isRoot() const; /*@Doc: is a check for a valid myParent OId */ virtual unsigned int getHeight() const; virtual unsigned int getHeightOfTree() const; /*@Doc: Recursive function to get height of the tree. */ virtual unsigned int getHeightToRoot() const; /*@Doc: Recursive function to get the number of levels to the root. */ virtual unsigned int getHeightToLeaf() const; /*@Doc: Recursive function to get the number of levels to the leafs. */ virtual unsigned int getTotalEntryCount() const; virtual unsigned int getTotalNodeCount() const; virtual unsigned int getTotalLeafCount() const; virtual r_Minterval getCoveredDomain() const; virtual r_Minterval getAssignedDomain() const; virtual r_Minterval getObjectDomain(unsigned int pos) const; virtual r_Dimension getDimension() const; virtual void setAssignedDomain(const r_Minterval& domain); virtual unsigned int getSize() const; virtual r_Bytes getTotalStorageSize() const; virtual bool isValid() const; virtual bool isUnderFull() const; virtual bool isOverFull() const; virtual bool isSameAs(const IndexDS* pix) const; virtual bool removeObject(unsigned int pos); virtual bool removeObject(const KeyObject& theKey); virtual void insertObject(const KeyObject& theKey, unsigned int pos); virtual void setObject(const KeyObject& theKey, unsigned int pos); virtual void setObjectDomain(const r_Minterval& dom, unsigned int pos); virtual const KeyObject& getObject(unsigned int pos) const; virtual void getObjects(KeyObjectVector& objs) const; virtual unsigned int getOptimalSize() const; static unsigned int getOptimalSize(r_Dimension dim); /*@Doc: Used to calculate the optimal number of entries for that dimension */ virtual void freeDS(); virtual OId::OIdPrimitive getIdentifier() const; static r_Bytes BytesPerTupel; /*@Doc: tuning parameter. used to calculate the optimal size of an index. this is also the number of bytes written to the database. */ virtual void printStatus(unsigned int level = 0, std::ostream& stream = std::cout) const; virtual ~DBHierIndex(); virtual void destroy(); virtual IndexDS* getNewInstance() const; virtual BinaryRepresentation getBinaryRepresentation() const throw (r_Error); virtual void setBinaryRepresentation(const BinaryRepresentation&) throw (r_Error); protected: friend class ObjectBroker; /*@Doc: ObjectBroker needs to access OId constructor */ DBHierIndex(const OId& id); /*@Doc: */ virtual void readFromDb() throw (r_Error); /*@Doc: */ virtual void updateInDb() throw (r_Error); /*@Doc: */ virtual void deleteFromDb() throw (r_Error); /*@Doc: */ virtual void insertInDb() throw (r_Error); /*@Doc: */ void extendCoveredDomain(const r_Minterval& newTilesExtents) throw (r_Edim_mismatch, r_Eno_interval); /*@Doc: Recalculates the current domain of this index to include newTilesExtents. */ OId parent; /*@Doc: persistent, identifies the parent */ bool _isNode; /*@Doc: persistent, tells the object what it is. */ unsigned int maxSize; /*@Doc: Non persistent attribute. a cache so the maxSize does not have to be calculated all the time. */ KeyObjectVector myKeyObjects; InlineMinterval myDomain; /*@Doc: Defined domain of this index. */ short currentDbRows; /*@Doc: is needed to support update of index in database keeps the number of rows currently taken up in the db by this instance */ }; #endif