summaryrefslogtreecommitdiffstats
path: root/storagemgr/sstoragelayout.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storagemgr/sstoragelayout.cc')
-rw-r--r--storagemgr/sstoragelayout.cc260
1 files changed, 260 insertions, 0 deletions
diff --git a/storagemgr/sstoragelayout.cc b/storagemgr/sstoragelayout.cc
new file mode 100644
index 0000000..fc7a793
--- /dev/null
+++ b/storagemgr/sstoragelayout.cc
@@ -0,0 +1,260 @@
+/*
+* 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>.
+*/
+/****************************************************************************
+ *
+ *
+ *
+ * COMMENTS:
+ * none
+ *
+ ****************************************************************************/
+
+#include "sstoragelayout.hh"
+#include <stdlib.h>
+#include "raslib/rmdebug.hh"
+
+const r_Bytes StorageLayout::DBSPageSize = 4096;
+
+r_Bytes StorageLayout::DefaultMinimalTileSize = DBSPageSize;
+
+r_Bytes StorageLayout::DefaultPCTMax = 2 * DBSPageSize;
+
+r_Bytes StorageLayout::DefaultTileSize = 32 * DBSPageSize;
+
+unsigned int StorageLayout::DefaultIndexSize = 0;
+
+r_Index_Type StorageLayout::DefaultIndexType = r_RPlus_Tree_Index; // DirTilesIx; // AutoIx;
+
+r_Tiling_Scheme StorageLayout::DefaultTilingScheme = r_NoTiling;
+
+r_Minterval StorageLayout::DefaultTileConfiguration("[0:511,0:511]");
+
+r_Data_Format StorageLayout::DefaultDataFormat = r_Array;
+
+StorageLayout::StorageLayout(r_Index_Type ixType)
+ : myLayout(new DBStorageLayout())
+ {
+ setIndexType(ixType);
+ RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout(" << ixType << ")")
+ }
+
+StorageLayout::StorageLayout()
+ : myLayout(new DBStorageLayout())
+ {
+ RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout()")
+ }
+
+StorageLayout::StorageLayout(const DBStorageLayoutId& id)
+ : myLayout(id)
+ {
+ RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout(" << id.getOId() << ")")
+ }
+
+/*
+const char*
+StorageLayout::getName() const
+ {
+ return stName;
+ }
+*/
+
+DBStorageLayoutId
+StorageLayout::getDBStorageLayout() const
+ {
+ return myLayout;
+ }
+
+r_Index_Type
+StorageLayout::getIndexType() const
+ {
+ return myLayout->getIndexType();
+ }
+
+
+r_Tiling_Scheme
+StorageLayout::getTilingScheme() const
+ {
+ return myLayout->getTilingScheme();
+ }
+
+r_Bytes
+StorageLayout::getTileSize() const
+ {
+ return myLayout->getTileSize();
+ }
+
+r_Bytes
+StorageLayout::getMinimalTileSize() const
+ {
+ return StorageLayout::DBSPageSize;
+ }
+
+r_Minterval
+StorageLayout::getTileConfiguration() const
+ {
+ return myLayout->getTileConfiguration();
+ }
+
+
+void
+StorageLayout::setIndexType(r_Index_Type it)
+ {
+ myLayout->setIndexType(it);
+ }
+
+void
+StorageLayout::setDataFormat(r_Data_Format cs)
+ {
+ myLayout->setDataFormat(cs);
+ }
+
+void
+StorageLayout::setTilingScheme(r_Tiling_Scheme ts)
+ {
+ myLayout->setTilingScheme(ts);
+ }
+
+void
+StorageLayout::setTileSize(r_Bytes newSize)
+ {
+ myLayout->setTileSize(newSize);
+ }
+
+void
+StorageLayout::setTileConfiguration(const r_Minterval& tc)
+ {
+ myLayout->setTileConfiguration(tc);
+ }
+
+r_Data_Format
+StorageLayout::getDataFormat(const r_Point& where) const
+ {
+ return myLayout->getDataFormat();
+ }
+
+std::vector< r_Minterval >
+StorageLayout::getLayout(const r_Minterval& tileDomain)
+ {
+ RMDBGENTER(5, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ")");
+ std::vector< r_Minterval > retval;
+ if (myLayout->supportsTilingScheme())
+ switch (myLayout->getTilingScheme())
+ {
+ case r_RegularTiling:
+ if (myLayout->getTileConfiguration().dimension() == tileDomain.dimension())
+ retval = calcRegLayout(tileDomain);
+ else {
+ RMInit::logOut << "Regular Tiling chosen without Tiling Domain!\nPlease specify a Tiling Domain.\nNow using no tiling." << endl;
+ RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") Regular Tiling without Tiling Domain");
+ retval.push_back(tileDomain);
+ }
+ break;
+ case r_InterestTiling:
+ case r_StatisticalTiling:
+ case r_AlignedTiling:
+ case r_DirectionalTiling:
+ case r_SizeTiling:
+ RMInit::logOut << "Tiling Scheme " << myLayout->getTilingScheme() << " " << (int)myLayout->getTilingScheme() << " not supported" << endl;
+ RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") of " << myLayout->getOId() << " Tiling Scheme " << myLayout->getTilingScheme() << " " << (int)myLayout->getTilingScheme() << " not supported");
+ retval.push_back(tileDomain);
+ break;
+ default:
+ RMInit::logOut << "Unknown Tiling Scheme " << myLayout->getTilingScheme() << " " << (int)myLayout->getTilingScheme() << endl;
+ RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") of " << myLayout->getOId() << " unknown Tiling Scheme " << myLayout->getTilingScheme() << " " << (int)myLayout->getTilingScheme());
+ case r_NoTiling:
+ retval.push_back(tileDomain);
+ break;
+ }
+ else
+ retval.push_back(tileDomain);
+ RMDBGEXIT(5, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ")");
+ return retval;
+ }
+
+StorageLayout::~StorageLayout()
+ {
+ }
+
+std::vector< r_Minterval >
+StorageLayout::calcRegLayout(const r_Minterval& tileDomain) const
+ {
+ RMDBGENTER(4, RMDebug::module_storagemgr, "StorageLayout", "calcRegLayout(" << tileDomain << ") " << myLayout->getOId());
+ std::vector< r_Minterval > retval;
+ r_Minterval base = myLayout->getTileConfiguration();
+ RMDBGMIDDLE(5, RMDebug::module_storagemgr, "StorageLayout", "base: " << base)
+ r_Point borigin = base.get_origin();
+ r_Point bhigh = base.get_high();
+ r_Point bextent = base.get_extent();
+ r_Point torigin = tileDomain.get_origin();
+ r_Point thigh = tileDomain.get_high();
+ r_Point textent = tileDomain.get_extent();
+ r_Dimension dim = base.dimension();
+ r_Point transex(dim);
+ r_Point transexmax(dim);
+ r_Point transco(dim);
+ r_Point transcotemp(dim);
+ r_Minterval nextDomain(dim);
+ r_Dimension counter2 = 0;
+ r_Range extent = 0;
+ r_Range extent2 = 0;
+ r_Range origindiff = 0;
+ r_Range highdiff = 0;
+ for (counter2 = 0; counter2 < dim; counter2++)
+ {
+ origindiff = torigin[counter2] - borigin[counter2];
+ highdiff = thigh[counter2] - bhigh[counter2];
+ if (highdiff%bextent[counter2] > 0)
+ transexmax[counter2] = highdiff/bextent[counter2] + 1;
+ else
+ transexmax[counter2] = highdiff/bextent[counter2];
+ if (origindiff%bextent[counter2] < 0)
+ transex[counter2] = origindiff/bextent[counter2] - 1;
+ else
+ transex[counter2] = origindiff/bextent[counter2];
+ transco[counter2] = (transex[counter2]) * bextent[counter2];
+ }
+ for (extent = transex[dim - 1]; extent <= transexmax[dim - 1]; extent++)
+ {
+ transcotemp = transco;
+ transcotemp[dim - 1] = bextent[dim - 1] * extent;
+ nextDomain = base.create_translation(transcotemp);
+ retval.push_back(nextDomain);
+
+ for (counter2 = 0; counter2 < dim - 1; counter2++)
+ {
+ for (extent2 = transex[counter2] + 1; extent2 <= transexmax[counter2]; extent2++)
+ {
+ transcotemp[counter2] = bextent[counter2] * extent2;
+ nextDomain = base.create_translation(transcotemp);
+ retval.push_back(nextDomain);
+ }
+ }
+ }
+RMDBGIF(5, RMDebug::module_storagemgr, "StorageLayout", \
+ for (std::vector< r_Minterval >::iterator i = retval.begin(); i != retval.end(); i++) \
+ RMDBGMIDDLE(1, RMDebug::module_storagemgr, "StorageLayout", *i); \
+);
+ RMDBGEXIT(4, RMDebug::module_storagemgr, "StorageLayout", "calcRegLayout(" << tileDomain << ") " << myLayout->getOId());
+ return retval;
+ }
+