summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qlparser/Makefile.am5
-rw-r--r--qlparser/lex.ll27
-rw-r--r--qlparser/oql.yy289
-rw-r--r--qlparser/qtdata.hh1
-rw-r--r--qlparser/qtinsert.cc758
-rw-r--r--qlparser/qtinsert.hh22
-rwxr-xr-xqlparser/qtmddcfgop.cc124
-rwxr-xr-xqlparser/qtmddcfgop.hh78
-rwxr-xr-xqlparser/qtmddconfig.cc150
-rwxr-xr-xqlparser/qtmddconfig.hh150
-rw-r--r--rasdl/Makefile.am4
-rw-r--r--raslib/minterval.cc11
-rw-r--r--raslib/minterval.hh1
-rw-r--r--rasodmg/Makefile.am2
-rw-r--r--rasodmg/alignedtiling.cc2
-rw-r--r--rasodmg/dirdecompose.cc11
-rw-r--r--rasodmg/dirdecompose.hh5
-rw-r--r--rasodmg/dirtiling.cc12
-rw-r--r--rasodmg/interesttiling.cc6
-rw-r--r--rasodmg/stattiling.cc10
-rw-r--r--rasodmg/tiling.cc4
-rw-r--r--rasodmg/tiling.hh4
-rw-r--r--server/Makefile.am1
-rw-r--r--storagemgr/Makefile.am3
-rw-r--r--storagemgr/sstoragelayout.cc215
-rw-r--r--storagemgr/sstoragelayout.hh39
-rwxr-xr-xstoragemgr/stgmddconfig.cc92
-rwxr-xr-xstoragemgr/stgmddconfig.hh57
28 files changed, 1714 insertions, 369 deletions
diff --git a/qlparser/Makefile.am b/qlparser/Makefile.am
index 577db19..47fba6f 100644
--- a/qlparser/Makefile.am
+++ b/qlparser/Makefile.am
@@ -86,7 +86,10 @@ libqlparser_a_SOURCES=oql.yy lex.ll alloca.c\
qtcondenseop.cc qtcondenseop.hh qtcondenseop.icc \
qtnode.cc qtnode.hh qtnode.icc \
querytree.cc querytree.hh querytree.icc \
- qtexecute.hh qtdelete.icc
+ qtexecute.hh qtdelete.icc \
+ qtmddconfig.hh qtmddconfig.cc \
+ qtmddcfgop.hh qtmddcfgop.cc
+
EXTRA_libqlparser_a_SOURCES = autogen_qtui.hh autogen_qtui.icc autogen_qtui.cc
BUILT_SOURCES=lex.cc oql.cc oql.h
diff --git a/qlparser/lex.ll b/qlparser/lex.ll
index 8a1b140..b5fd9ec 100644
--- a/qlparser/lex.ll
+++ b/qlparser/lex.ll
@@ -266,6 +266,32 @@ int string_yyinput( char* buf, int max_size )
"arccos" { SETTOKEN( ARCCOS, commandToken, ARCCOS ) }
"arctan" { SETTOKEN( ARCTAN, commandToken, ARCTAN ) }
+"index" { SETTOKEN( INDEX, commandToken, INDEX ) }
+"rc_index" { SETTOKEN( RC_INDEX, commandToken, RC_INDEX ) }
+"tc_index" { SETTOKEN( TC_INDEX, commandToken, TC_INDEX ) }
+"a_index" { SETTOKEN( A_INDEX, commandToken, A_INDEX ) }
+"d_index" { SETTOKEN( D_INDEX, commandToken, D_INDEX ) }
+"rd_index" { SETTOKEN( RD_INDEX, commandToken, RD_INDEX ) }
+"rpt_index" { SETTOKEN( RPT_INDEX, commandToken, RPT_INDEX ) }
+"rrpt_index" { SETTOKEN( RRPT_INDEX, commandToken, RRPT_INDEX ) }
+"it_index" { SETTOKEN( IT_INDEX, commandToken, IT_INDEX ) }
+"auto" { SETTOKEN( AUTO, commandToken, AUTO ) }
+"tiling" { SETTOKEN( TILING, commandToken, TILING ) }
+"aligned" { SETTOKEN( ALIGNED, commandToken, ALIGNED ) }
+"regular" { SETTOKEN( REGULAR, commandToken, REGULAR ) }
+"directional" { SETTOKEN( DIRECTIONAL, commandToken, DIRECTIONAL ) }
+"decomp" { SETTOKEN( DECOMP, commandToken, DECOMP ) }
+"with" { SETTOKEN( WITH, commandToken, WITH ) }
+"subtiling" { SETTOKEN( SUBTILING, commandToken, SUBTILING ) }
+"area" { SETTOKEN( AREA, commandToken, AREA ) }
+"of" { SETTOKEN( OF, commandToken, OF ) }
+"interest" { SETTOKEN( INTEREST, commandToken, INTEREST ) }
+"statistic" { SETTOKEN( STATISTIC, commandToken, STATISTIC ) }
+"tile" { SETTOKEN( TILE, commandToken, TILE ) }
+"size" { SETTOKEN( SIZE, commandToken, SIZE ) }
+"border" { SETTOKEN( BORDER, commandToken, BORDER ) }
+"threshold" { SETTOKEN( THRESHOLD, commandToken, THRESHOLD ) }
+
"unsigned" { SETTOKEN( TUNSIG, typeToken, TUNSIG) }
"bool" { SETTOKEN( TBOOL, typeToken, TBOOL) }
"char" { SETTOKEN( TCHAR, typeToken, TCHAR) }
@@ -277,6 +303,7 @@ int string_yyinput( char* buf, int max_size )
"float" { SETTOKEN( TFLOAT, typeToken, TFLOAT) }
"double" { SETTOKEN( TDOUBLE, typeToken, TDOUBLE) }
+
"bit" { SETTOKEN( BIT, commandToken, BIT ) }
"and" { SETTOKEN( AND, commandToken, AND ) }
"or" { SETTOKEN( OR, commandToken, OR ) }
diff --git a/qlparser/oql.yy b/qlparser/oql.yy
index 006ed88..c2c2130 100644
--- a/qlparser/oql.yy
+++ b/qlparser/oql.yy
@@ -1,32 +1,23 @@
%{
-/*
-* 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>.
-*/
/*************************************************************
*
+ * Copyright (C) 2003 Dr. Peter Baumann
+ *
+ * SOURCE: opp.y
+ *
+ * MODULE: qlparser
+ * CLASS: -
*
* PURPOSE:
* Grammar for RasQL
*
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 18-06-01 Barbat created (for preprocessor)
+ * 2005-jun-18 PB extended functionExp with EXTEND(mddExpr,mintervalExpr)
+ * 2006-jan-03 PB tried to implement DELETE with optional WHERE, but not yet operational
+ * 2008-oct-30 Shams added storage layout to insert expresion
*
* COMMENTS:
* - token BY unused
@@ -60,6 +51,9 @@ static const char rcsid[] = "@(#)qlparser, yacc parser: $Header: /home/rasdev/CV
#include "qlparser/qtmddaccess.hh"
#include "qlparser/querytree.hh"
#include "servercomm/servercomm.hh"
+#include "qlparser/parseinfo.hh"
+#include "qlparser/qtmddcfgop.hh"
+#include "rasodmg/dirdecompose.hh"
extern ServerComm::ClientTblElt* currentClientTblElt;
extern ParseInfo *currInfo;
@@ -175,6 +169,22 @@ struct QtUpdateSpecElement
ParseInfo *info;
} castTypes;
+ struct {
+ int indexType;
+ ParseInfo *info;
+ } indexType;
+
+ struct {
+ int tilingType;
+ QtOperation* tileCfg;
+ int tileSize;
+ int borderThreshold;
+ float interestThreshold;
+ QtNode::QtOperationList* bboxList;
+ std::vector<r_Dir_Decompose>* dirDecomp;
+ ParseInfo *info;
+ } tilingType;
+
}
%token <identifierToken> Identifier
@@ -190,7 +200,10 @@ struct QtUpdateSpecElement
DIV EQUAL LESS GREATER LESSEQUAL GREATEREQUAL NOTEQUAL COLON SEMICOLON LEPAR
REPAR LRPAR RRPAR LCPAR RCPAR INSERT INTO VALUES DELETE DROP CREATE COLLECTION
MDDPARAM OID SHIFT SCALE SQRT ABS EXP LOG LN SIN COS TAN SINH COSH TANH ARCSIN
- ARCCOS ARCTAN OVERLAY BIT UNKNOWN FASTSCALE MEMBERS ADD ALTER LIST
+ ARCCOS ARCTAN OVERLAY BIT UNKNOWN FASTSCALE PYRAMID MEMBERS ADD ALTER LIST
+ INDEX RC_INDEX TC_INDEX A_INDEX D_INDEX RD_INDEX RPT_INDEX RRPT_INDEX IT_INDEX AUTO
+ TILING ALIGNED REGULAR DIRECTIONAL
+ DECOMP WITH SUBTILING AREA OF INTEREST STATISTIC TILE SIZE BORDER THRESHOLD
STRCT COMPLEX RE IM TIFF BMP HDF CSV JPEG PNG VFF TOR DEM INV_TIFF INV_BMP INV_HDF
INV_JPEG INV_PNG INV_VFF INV_CSV INV_TOR INV_DEM
@@ -214,13 +227,19 @@ struct QtUpdateSpecElement
%type <qtONCStreamListValue> collectionList
%type <qtUnaryOperationValue> reduceIdent structSelection trimExp
%type <qtOperationValue> mddExp inductionExp generalExp resultList reduceExp functionExp spatialOp
- integerExp mintervalExp intervalExp condenseExp variable
-%type <qtOperationListValue> spatialOpList spatialOpList2
+// integerExp mintervalExp intervalExp condenseExp variable fscale mddConfiguration
+ integerExp mintervalExp intervalExp condenseExp variable mddConfiguration
+%type <tilingType> tilingAttributes tileTypes tileCfg statisticParameters tilingSize
+ borderCfg interestThreshold dirdecompArray dirdecomp dirdecompvals intArray
+%type <indexType> indexingAttributes indexTypes
+// %type <stgType> storageAttributes storageTypes comp compType zLibCfg rLECfg waveTypes
+%type <qtOperationListValue> spatialOpList spatialOpList2 bboxList
%type <integerToken> intLitExp
%type <operationValue> condenseOpLit
%type <castTypes> castType
-%type <dummyValue> qlfile query selectExp createExp insertExp deleteExp updateExp dropExp
-%type <identifierToken> namedCollection collectionIterator typeName attributeIdent pyrName
+%type <dummyValue> qlfile query selectExp createExp insertExp deleteExp updateExp dropExp
+//%type <identifierToken> namedCollection collectionIterator typeName attributeIdent pyrName
+%type <identifierToken> namedCollection collectionIterator typeName attributeIdent
marrayVariable condenseVariable
// literal data
@@ -230,6 +249,11 @@ struct QtUpdateSpecElement
%type <qtComplexDataValue> complexLit
%type <qtScalarDataListValue> scalarLitList dimensionLitList
+// pyramid data
+// %type <pyrElemType> pyrElem pyrElem2
+// %type <pyrListType> pyrList pyrList2
+// %type <stringToken> pyrOid
+
// marray2 with multiple intervals
%type <mddIntervalListType> ivList
%type <mddIntervalType> iv marray_head
@@ -245,13 +269,14 @@ qlfile: query
// clear all symbols in table at the end of parsing
QueryTree::symtab.wipe();
};
-
query: createExp
| dropExp
| selectExp
| updateExp
| insertExp
- | deleteExp;
+ | deleteExp
+// | pyramidExp;
+ ;
createExp: CREATE COLLECTION namedCollection typeName
@@ -520,7 +545,74 @@ insertExp: INSERT INTO namedCollection VALUES generalExp
FREESTACK($2)
FREESTACK($3)
FREESTACK($4)
- };
+ }
+ |
+ INSERT INTO namedCollection VALUES generalExp mddConfiguration
+ {
+ try {
+ accessControl.wantToWrite();
+ }
+ catch(...) {
+ // save the parse error info and stop the parser
+ if ( parseError ) delete parseError;
+ parseError = new ParseInfo( 803, $2.info->getToken().c_str(),
+ $2.info->getLineNo(), $2.info->getColumnNo() );
+ FREESTACK($1)
+ FREESTACK($2)
+ FREESTACK($3)
+ FREESTACK($4)
+ QueryTree::symtab.wipe();
+ YYABORT;
+ }
+
+ // create an update node
+ QtInsert* insert = new QtInsert( $3.value, $5 ,$6);
+ insert->setParseInfo( *($1.info) );
+ parseQueryTree->removeDynamicObject( $5 );
+
+ // set insert node as root of the Query Tree
+ parseQueryTree->setRoot( insert );
+
+ FREESTACK($1)
+ FREESTACK($2)
+ FREESTACK($3)
+ FREESTACK($4)
+ }
+
+/*{
+ try {
+ accessControl.wantToWrite();
+ }
+ catch(...) {
+ // save the parse error info and stop the parser
+ if ( parseError ) delete parseError;
+ parseError = new ParseInfo( 803, $2.info->getToken().c_str(),
+ $2.info->getLineNo(), $2.info->getColumnNo() );
+ FREESTACK($1)
+ FREESTACK($2)
+ FREESTACK($3)
+
+ QueryTree::symtab.wipe();
+ YYABORT;
+ }
+ //Creating a new collection
+// QtCommand* commandNode = new QtCommand( QtCommand::QT_CREATE_COLLECTION, $3.value, "GreySet" );
+// commandNode->setParseInfo( *($1.info) );
+
+ // create an update node
+ QtInsert* insert = new QtInsert( $3.value, $5, $6);
+ insert->setParseInfo( *($1.info) );
+ parseQueryTree->removeDynamicObject( $6 );
+
+ // set insert node as root of the Query Tree
+ parseQueryTree->setRoot( insert );
+
+ FREESTACK($1)
+ FREESTACK($2)
+ FREESTACK($3)
+
+ }*/
+;
deleteExp: DELETE FROM iteratedCollection WHERE generalExp
{
@@ -625,6 +717,7 @@ generalExp: mddExp { $$ = $1; }
| variable { $$ = $1; }
| mintervalExp { $$ = $1; }
| intervalExp { $$ = $1; }
+// | fscale { $$ = $1; }
| generalLit
{
$$ = new QtConst( $1 );
@@ -1706,8 +1799,6 @@ namedCollection: Identifier;
collectionIterator: Identifier;
-pyrName: Identifier;
-
attributeIdent: Identifier;
typeName: Identifier;
@@ -1999,8 +2090,6 @@ scalarLitList: scalarLitList COMMA scalarLit
};
-
-
trimExp: generalExp mintervalExp
{
QtDomainOperation *dop = new QtDomainOperation( $2 );
@@ -2164,6 +2253,137 @@ iv: marrayVariable IN generalExp
FREESTACK($2);
};
+// added on 30 Oct 2008 By Feyzabadi
+
+mddConfiguration:
+ tilingAttributes indexingAttributes
+ {$$=new QtMddCfgOp($1.tilingType, $1.tileSize, $1.borderThreshold,
+ $1.interestThreshold , $1.tileCfg, $1.bboxList,$1.dirDecomp, $2.indexType);}
+ | indexingAttributes
+ {$$=new QtMddCfgOp($1.indexType);}
+ | tilingAttributes
+ {$$=new QtMddCfgOp($1.tilingType, $1.tileSize, $1.borderThreshold,
+ $1.interestThreshold , $1.tileCfg, $1.bboxList,$1.dirDecomp);}
+ ;
+indexingAttributes: INDEX indexTypes{$$=$2;};
+
+indexTypes : RC_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_RC_INDEX; }
+ | TC_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_TC_INDEX;; }
+ | A_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_A_INDEX;; }
+ | D_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_D_INDEX;; }
+ | RD_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_RD_INDEX;; }
+ | RPT_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_RPT_INDEX;; }
+ | RRPT_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_RRPT_INDEX;; }
+ | IT_INDEX{$$.info = $1.info; $$.indexType = QtMDDConfig::r_IT_INDEX;; }
+;
+
+tilingAttributes: TILING tileTypes {$$=$2;};
+
+tileTypes: REGULAR tileCfg{$$.tilingType=QtMDDConfig::r_REGULAR_TLG;$$.tileCfg=$2.tileCfg;$$.tileSize = StorageLayout::DefaultTileSize;}
+ | REGULAR tileCfg tilingSize{$$.tilingType=QtMDDConfig::r_REGULAR_TLG;$$.tileCfg=$2.tileCfg;$$.tileSize = $3.tileSize;}
+ | ALIGNED tileCfg
+ {$$.tilingType=QtMDDConfig::r_ALIGNED_TLG; $$.tileCfg=$2.tileCfg;$$.tileSize = StorageLayout::DefaultTileSize;}
+ | ALIGNED tileCfg tilingSize
+ {$$.tilingType=QtMDDConfig::r_ALIGNED_TLG; $$.tileCfg=$2.tileCfg;$$.tileSize = $3.tileSize;}
+ | DIRECTIONAL DECOMP dirdecompArray
+ {$$.tilingType=QtMDDConfig::r_DRLDECOMP_TLG;$$.tileSize = StorageLayout::DefaultTileSize; $$.dirDecomp=$3.dirDecomp;}
+ | DIRECTIONAL DECOMP dirdecompArray WITH SUBTILING
+ {$$.tilingType=QtMDDConfig::r_DRLDECOMPSUBTILE_TLG;$$.tileSize = StorageLayout::DefaultTileSize; $$.dirDecomp=$3.dirDecomp;}
+ | DIRECTIONAL DECOMP dirdecompArray tilingSize{$$.tilingType=QtMDDConfig::r_DRLDECOMP_TLG; $$.tileSize = $4.tileSize; $$.dirDecomp=$3.dirDecomp;}
+ | DIRECTIONAL DECOMP dirdecompArray WITH SUBTILING tilingSize
+ {$$.tilingType=QtMDDConfig::r_DRLDECOMPSUBTILE_TLG;$$.tileSize = $6.tileSize; $$.dirDecomp=$3.dirDecomp;}
+ | AREA OF INTEREST bboxList{$$.tilingType=QtMDDConfig::r_AREAOFINTEREST_TLG;$$.bboxList=$4;$$.tileSize = StorageLayout::DefaultTileSize;}
+ | AREA OF INTEREST bboxList tilingSize{$$.tilingType=QtMDDConfig::r_AREAOFINTEREST_TLG;$$.bboxList=$4;$$.tileSize = $5.tileSize;}
+ | STATISTIC bboxList statisticParameters{$$=$3;$$.bboxList=$2;}
+ | STATISTIC bboxList{$$.tilingType=QtMDDConfig::r_STATISTICS_TLG; $$.bboxList=$2;$$.tileSize = StorageLayout::DefaultTileSize;};
+
+bboxList: mintervalExp {
+ $$ = new QtNode::QtOperationList(1);
+ (*$$)[0] = $1;
+}
+| mintervalExp COMMA bboxList {
+ $3->push_back( $1 );
+ $$ = $3;
+
+};
+
+tileCfg: mintervalExp{$$.tileCfg=$1;};
+
+statisticParameters: tilingSize borderCfg interestThreshold
+ {$$=$1;$$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;
+ $$.borderThreshold = $2.borderThreshold;
+ $$.interestThreshold = $3.interestThreshold;}
+ | tilingSize borderCfg
+ {$$=$1; $$.borderThreshold = $2.borderThreshold;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;
+ $$.interestThreshold = -1;}
+ | tilingSize interestThreshold
+ {$$=$1; $$.interestThreshold = $2.interestThreshold;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;
+ $$.borderThreshold=-1;}
+ | borderCfg interestThreshold
+ {$$=$1; $$.interestThreshold = $2.interestThreshold;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;
+ $$.tileSize = StorageLayout::DefaultTileSize;}
+ | tilingSize{$$=$1;$$.interestThreshold = -1; $$.borderThreshold = -1;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;}
+ | interestThreshold{$$=$1; $$.borderThreshold = -1;$$.tileSize = StorageLayout::DefaultTileSize;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;}
+ | borderCfg{$$=$1;$$.interestThreshold = -1;$$.tileSize = StorageLayout::DefaultTileSize;
+ $$.tilingType = QtMDDConfig::r_STATISTICSPARAM_TLG;};
+
+tilingSize: TILE SIZE IntegerLit
+{
+$$.tileSize = $3.svalue;};
+
+borderCfg: BORDER THRESHOLD IntegerLit
+{
+$$.borderThreshold = $3.svalue;};
+
+interestThreshold: INTEREST THRESHOLD FloatLit
+{
+$$.interestThreshold = $3.value;};
+
+dirdecompArray : dirdecomp {$$ = $1;}
+| dirdecomp COMMA dirdecompArray{
+$$ = $1;
+for(int i = 0 ; i < $3.dirDecomp->size() ; ++i){
+ $$.dirDecomp->push_back($3.dirDecomp->at(i));
+}
+};
+
+dirdecomp : LEPAR dirdecompvals REPAR {$$ = $2;};
+
+dirdecompvals : MULT {
+r_Dir_Decompose temp;
+if($$.dirDecomp == NULL){
+ $$.dirDecomp = new std::vector<r_Dir_Decompose>(1);
+ $$.dirDecomp->at(0) = temp;
+ }
+else
+ $$.dirDecomp->push_back(temp);
+}
+| intArray {
+$$=$1;
+};
+
+intArray : IntegerLit {
+r_Dir_Decompose temp;
+temp<<$1.svalue;
+if($$.dirDecomp == NULL){
+ $$.dirDecomp = new std::vector<r_Dir_Decompose>(1);
+ $$.dirDecomp->at(0) = temp;
+ }
+else
+ $$.dirDecomp->push_back(temp);
+}
+| IntegerLit COMMA intArray {
+$$.dirDecomp = $3.dirDecomp;
+r_Dir_Decompose temp = $$.dirDecomp->at($$.dirDecomp->size()-1);
+temp<<$1.svalue;
+$$.dirDecomp->at($$.dirDecomp->size()-1) = temp;
+};
+
/*--------------------------------------------------------------------
* Grammar ends here
*--------------------------------------------------------------------
@@ -2183,3 +2403,4 @@ void yyerror( char* /*s*/ ) {
}
}
}
+
diff --git a/qlparser/qtdata.hh b/qlparser/qtdata.hh
index ee2e285..c7a9bc7 100644
--- a/qlparser/qtdata.hh
+++ b/qlparser/qtdata.hh
@@ -60,6 +60,7 @@ enum QtDataType
QT_COMPLEXTYPE1, // with float members
QT_COMPLEXTYPE2, // with double
QT_MDD,
+ QT_MDD_CONFIG,
QT_COMPLEX,
QT_STRING,
QT_INTERVAL,
diff --git a/qlparser/qtinsert.cc b/qlparser/qtinsert.cc
index bfcfbc5..f024def 100644
--- a/qlparser/qtinsert.cc
+++ b/qlparser/qtinsert.cc
@@ -1,332 +1,339 @@
-/*
-* 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>.
-*/
/*************************************************************
*
+ * Copyright (C) 2003 Dr. Peter Baumann
*
- * PURPOSE:
+ * SOURCE: qtinsert.cc
*
+ * MODULE: qlparser
+ * CLASS: QtInsert
*
+ * PURPOSE:
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 17-01-98 Ritsch created
+ * 2003-aug-25 PB "insert into" type compatibility bug fixed (from K.Hahn)
+ * 2008-nov-10 Shams added storagelayout to the expression
* COMMENTS:
*
************************************************************/
+
+
+#include <vector>
+#include "raslib/dlist.hh"
+//#include "rasodmg/stattiling.hh"
+#include "rasodmg/interesttiling.hh"
+#include "rasodmg/dirdecompose.hh"
+
+
static const char rcsid[] = "@(#)qlparser, QtInsert: $Header: /home/rasdev/CVS-repository/rasdaman/qlparser/qtinsert.cc,v 1.27 2003/12/27 20:40:21 rasdev Exp $";
#include "qlparser/qtinsert.hh"
#include "qlparser/qtdata.hh"
#include "qlparser/qtmdd.hh"
-#include "tilemgr/tile.hh"
#include "mddmgr/mddcoll.hh"
#include "mddmgr/mddobj.hh"
#include <iostream>
+#include <exception>
#include "servercomm/servercomm.hh"
+#include "qlparser/qtmintervaldata.hh"
+#include "raslib/basetype.hh"
+#include "raslib/collectiontype.hh"
extern ServerComm::ClientTblElt* currentClientTblElt;
const QtNode::QtNodeType QtInsert::nodeType = QtNode::QT_INSERT;
-
-QtInsert::QtInsert( const std::string& initCollectionName, QtOperation* initSource )
- : QtExecute(), collectionName( initCollectionName ), source( initSource )
-{
- source->setParent( this );
+QtInsert::QtInsert(const std::string& initCollectionName, QtOperation* initSource)
+: QtExecute(), collectionName(initCollectionName), source(initSource) {
+ source->setParent(this);
+ stgLayout = NULL;
}
-
-
-QtInsert::~QtInsert()
-{
- if( source )
- {
- delete source;
- source=NULL;
- }
+QtInsert::QtInsert(const std::string& initCollectionName, QtOperation* initSource, QtOperation* storage)
+: QtExecute(), collectionName(initCollectionName), source(initSource), stgLayout(storage) {
+ source->setParent(this);
}
-
-
-int
-QtInsert::evaluate()
-{
- RMDBCLASS( "QtInsert", "evaluate()", "qlparser", __FILE__, __LINE__ )
-
- // empty data list for evaluation of insert expression including constant
- QtNode::QtDataList* nextTupel = new QtNode::QtDataList(0);
-
- // get the operands
- QtData* sourceData = source->evaluate( nextTupel );
-
- if( sourceData )
- {
- QtMDD* sourceMDD = (QtMDD*) sourceData;
- MDDObj* sourceObj = sourceMDD->getMDDObject();
-
- MDDColl* persColl = NULL;
- MDDColl* almost = NULL;
-
- try
- {
- almost = MDDColl::getMDDCollection( collectionName.c_str() );
+QtInsert::~QtInsert() {
+ if (source) {
+ delete source;
+ source = NULL;
}
- catch(...)
- {
-
- RMInit::logOut << "Error: QtInsert::evaluate() - collection name not found" << std::endl;
-
- // delete the operand
- if( sourceData ) sourceData->deleteRef();
+ if (stgLayout) {
+ delete stgLayout;
+ stgLayout = NULL;
+ }
+}
- parseInfo.setErrorNo(355);
- throw parseInfo;
+int
+QtInsert::evaluate() {
+ RMDBCLASS("QtInsert", "evaluate()", "qlparser", __FILE__, __LINE__)
+ QtMddCfgOp* configOp = NULL;
+ QtMDDConfig* mddConfig = NULL;
+ // empty data list for evaluation of insert expression including constant
+ QtNode::QtDataList* nextTupel = new QtNode::QtDataList(0);
+ if (stgLayout) {
+ configOp = (QtMddCfgOp*) stgLayout;
+ mddConfig = configOp->getMddConfig();
}
-if (!almost->isPersistent())
- {
- RMInit::logOut << "QtInsert: User tries to insert into system table" << std::endl;
- if( sourceData ) sourceData->deleteRef();
-
- parseInfo.setErrorNo(355);
- throw parseInfo;
- }
-else {
- persColl = (MDDColl*)almost;
- }
-
- //
- // check MDD and collection type for compatibility
- //
-
-RMDBGIF(3, RMDebug::module_qlparser, "QtInsert", \
- char* collTypeStructure = persColl->getCollectionType()->getTypeStructure(); \
- char* mddTypeStructure = sourceObj->getMDDBaseType()->getTypeStructure(); \
+ // get the operands
+ QtData* sourceData = source->evaluate(nextTupel);
+
+ if (sourceData) {
+ QtMDD* sourceMDD = (QtMDD*) sourceData;
+ MDDObj* sourceObj = sourceMDD->getMDDObject();
+
+ MDDColl* persColl = NULL;
+ MDDColl* almost = NULL;
+
+ try {
+ almost = MDDColl::getMDDCollection(collectionName.c_str());
+ } catch (...) {
+
+ RMInit::logOut << "Error: QtInsert::evaluate() - collection name not found" << std::endl;
+
+ // delete the operand
+ if (sourceData) sourceData->deleteRef();
+
+ parseInfo.setErrorNo(355);
+ throw parseInfo;
+ }
+ if (!almost->isPersistent()) {
+ RMInit::logOut << "QtInsert: User tries to insert into system table" << std::endl;
+ if (sourceData) sourceData->deleteRef();
+
+ parseInfo.setErrorNo(355);
+ throw parseInfo;
+ } else {
+ persColl = (MDDColl*) almost;
+ }
+
+ //
+ // check MDD and collection type for compatibility
+ //
+ int cellSize;
+ RMDBGIF(3, RMDebug::module_qlparser, "QtInsert", \
+ char* collTypeStructure = persColl->getCollectionType()->getTypeStructure(); \
+ char* mddTypeStructure = sourceObj->getMDDBaseType()->getTypeStructure(); \
RMInit::dbgOut << std::endl << "Collection type structure.: " << collTypeStructure << std::endl \
<< "MDD type structure........: " << mddTypeStructure << std::endl \
- << "MDD domain................: " << sourceObj->getDefinitionDomain() << std::endl; \
- free( collTypeStructure ); collTypeStructure=NULL; \
- free( mddTypeStructure ); mddTypeStructure=NULL; )
-
- // bug fix: "insert into" found claimed non-existing type mismatch -- PB 2003-aug-25, based on fix by K.Hahn
- // if( !persColl->getCollectionType()->compatibleWith( (Type*) sourceObj->getMDDBaseType() ) )
- if( !((MDDType*) sourceObj->getMDDBaseType())->compatibleWith( persColl->getCollectionType()->getMDDType() ) )
- {
- // free resources
- persColl->releaseAll();
- delete persColl;
- persColl=NULL;
- if( sourceData ) sourceData->deleteRef(); // delete the operand
-
- // return error
- RMInit::logOut << "Error: QtInsert::evaluate() - MDD and collection types are incompatible" << std::endl;
- parseInfo.setErrorNo(959);
- throw parseInfo;
- }
-
- if( !persColl->getCollectionType()->getMDDType()->compatibleWithDomain( &(sourceObj->getDefinitionDomain()) ) )
- {
- // free resources
- persColl->releaseAll();
- delete persColl;
- persColl=NULL;
- if( sourceData ) sourceData->deleteRef(); // delete the operand
-
- // return error
- RMInit::logOut << "Error: QtInsert::evaluate() - MDD and collection domains are incompatible" << std::endl;
- parseInfo.setErrorNo(959);
- throw parseInfo;
- }
-
- //
- // convert a transient MDD object to a persistent one
- //
-
- // allocate a new oid within the current db
- OId oid;
+ << "MDD domain................: " << sourceObj->getDefinitionDomain() << std::endl; \
+ free(collTypeStructure); collTypeStructure = NULL; \
+ free(mddTypeStructure); mddTypeStructure = NULL;)
+ cellSize = (int)sourceObj->getMDDBaseType()->getBaseType()->getSize();
+ // bug fix: "insert into" found claimed non-existing type mismatch -- PB 2003-aug-25, based on fix by K.Hahn
+ // if( !persColl->getCollectionType()->compatibleWith( (Type*) sourceObj->getMDDBaseType() ) )
+ if (!((MDDType*) sourceObj->getMDDBaseType())->compatibleWith(persColl->getCollectionType()->getMDDType())) {
+ // free resources
+ persColl->releaseAll();
+ delete persColl;
+ persColl = NULL;
+ if (sourceData) sourceData->deleteRef(); // delete the operand
+
+ // return error
+ RMInit::logOut << "Error: QtInsert::evaluate() - MDD and collection types are incompatible" << std::endl;
+ parseInfo.setErrorNo(959);
+ throw parseInfo;
+ }
+
+ if (!persColl->getCollectionType()->getMDDType()->compatibleWithDomain(&(sourceObj->getDefinitionDomain()))) {
+ // free resources
+ persColl->releaseAll();
+ delete persColl;
+ persColl = NULL;
+ if (sourceData) sourceData->deleteRef(); // delete the operand
+
+ // return error
+ RMInit::logOut << "Error: QtInsert::evaluate() - MDD and collection domains are incompatible" << std::endl;
+ parseInfo.setErrorNo(959);
+ throw parseInfo;
+ }
+
+ //
+ // convert a transient MDD object to a persistent one
+ //
+
+ // allocate a new oid within the current db
+ OId oid;
#ifdef BASEDB_O2
- if( !OId::allocateMDDOId( &oid ) )
- {
+ if (!OId::allocateMDDOId(&oid)) {
#else
- OId::allocateOId( oid, OId::MDDOID );
+ OId::allocateOId(oid, OId::MDDOID);
#endif
- // get all tiles
- vector<Tile*>* sourceTiles = sourceObj->getTiles();
-
- // get a persistent type pointer
- MDDBaseType* persMDDType = (MDDBaseType*)TypeFactory::ensurePersistence( (Type*)sourceObj->getMDDBaseType() );
-
- if( !persMDDType )
- {
- RMInit::logOut << "Error: QtInsert::evaluate() - type not persistent" << std::endl;
-
- // delete dynamic data
- if( sourceData ) sourceData->deleteRef();
- delete sourceTiles;
- sourceTiles=NULL;
- delete nextTupel;
- nextTupel=NULL;
- persColl->releaseAll();
- delete persColl;
- persColl=NULL;
- parseInfo.setErrorNo(964);
- throw parseInfo;
- }
-
- // create a persistent MDD object
- // need a StorageLayout here
- StorageLayout tempStorageLayout;
- tempStorageLayout.setTileSize(StorageLayout::DefaultTileSize);
- tempStorageLayout.setIndexType(StorageLayout::DefaultIndexType);
- tempStorageLayout.setTilingScheme(StorageLayout::DefaultTilingScheme);
- if (sourceObj->getDefinitionDomain().dimension() ==
- StorageLayout::DefaultTileConfiguration.dimension())
- tempStorageLayout.setTileConfiguration(StorageLayout::DefaultTileConfiguration);
- MDDObj* persMDDObj = new MDDObj( persMDDType, sourceObj->getDefinitionDomain(), oid,
- tempStorageLayout );
-
- // iterate over source tiles
- for( vector<Tile*>::iterator sourceIt = sourceTiles->begin(); sourceIt != sourceTiles->end(); sourceIt++ )
- {
- // create a new persistent tile, copy the transient data, and insert it into the target mdd object
- Tile* newPersTile = new Tile( (*sourceIt)->getDomain(), persMDDType->getBaseType(), (*sourceIt)->getDataFormat() );
- newPersTile->copyTile( (*sourceIt)->getDomain(), *sourceIt, (*sourceIt)->getDomain() );
- persMDDObj->insertTile( newPersTile );
- }
-
- // delete tile vector
- delete sourceTiles;
- sourceTiles=NULL;
- persColl->insert( persMDDObj );
+ // get all tiles
+ vector<Tile*>* sourceTiles = sourceObj->getTiles();
+
+ // get a persistent type pointer
+ MDDBaseType* persMDDType = (MDDBaseType*) TypeFactory::ensurePersistence((Type*) sourceObj->getMDDBaseType());
+
+ if (!persMDDType) {
+ RMInit::logOut << "Error: QtInsert::evaluate() - type not persistent" << std::endl;
+
+ // delete dynamic data
+ if (sourceData) sourceData->deleteRef();
+ delete sourceTiles;
+ sourceTiles = NULL;
+ delete nextTupel;
+ nextTupel = NULL;
+ persColl->releaseAll();
+ delete persColl;
+ persColl = NULL;
+ parseInfo.setErrorNo(964);
+ throw parseInfo;
+ }
+
+ // create a persistent MDD object
+ // need a StorageLayout here
+ if(mddConfig!= NULL){
+ if(mddConfig->getBorderThreshold() < 0)
+ mddConfig->setBorderThreshold(r_Stat_Tiling::DEF_BORDER_THR);
+ }
+ r_Index_Type ri = getIndexType(mddConfig);
+ StorageLayout tempStorageLayout;
+ tempStorageLayout.setDataFormat(getDataFormat(mddConfig));
+ r_Tiling_Scheme scheme = getTilingScheme(mddConfig);
+ tempStorageLayout.setIndexType(ri);
+ tempStorageLayout.setTilingScheme(scheme);
+ // Base Information has been set
+ tempStorageLayout.setTileSize
+ ((mddConfig != NULL && mddConfig->getTileSize() > 0) ? mddConfig->getTileSize() :
+ StorageLayout::DefaultTileSize);
+ if(mddConfig!= NULL){
+ tempStorageLayout.setInterestThreshold(mddConfig->getInterestThreshold());
+ tempStorageLayout.setBorderThreshold(mddConfig->getBorderThreshold());
+ if(mddConfig->getDirDecomp() != NULL)
+ tempStorageLayout.setDirDecomp(mddConfig->getDirDecomp());
+ vector<r_Minterval>intervals = getIntervals(mddConfig);
+ tempStorageLayout.setCellSize(cellSize);
+ if(mddConfig->getTilingType() == QtMDDConfig::r_DRLDECOMP_TLG){
+ tempStorageLayout.resetSubTiling();
+ }
+ else if(mddConfig->getTilingType() == QtMDDConfig::r_DRLDECOMPSUBTILE_TLG){
+ tempStorageLayout.setSubTiling();
+ }
+ if(intervals.size() > 0){
+ tempStorageLayout.setBBoxes(intervals);
+ }
+ }
+
+ r_Minterval tileCfg = getTileConfig(mddConfig);
+
+ if (sourceObj->getDefinitionDomain().dimension() ==
+ tileCfg.dimension()) {
+ tempStorageLayout.setTileConfiguration(tileCfg);
+ }
+ MDDObj* persMDDObj = new MDDObj(persMDDType, sourceObj->getDefinitionDomain(), oid,
+ tempStorageLayout);
+
+ // iterate over source tiles
+ for (vector<Tile*>::iterator sourceIt = sourceTiles->begin(); sourceIt != sourceTiles->end(); sourceIt++) {
+ // create a new persistent tile, copy the transient data, and insert it into the target mdd object
+ Tile* newPersTile = new Tile((*sourceIt)->getDomain(), persMDDType->getBaseType(), (*sourceIt)->getDataFormat());
+ newPersTile->copyTile((*sourceIt)->getDomain(), *sourceIt, (*sourceIt)->getDomain());
+ persMDDObj->insertTile(newPersTile);
+ }
+
+ // delete tile vector
+ delete sourceTiles;
+ sourceTiles = NULL;
+ persColl->insert(persMDDObj);
+
#ifdef BASEDB_O2
- }
- else
- {
- RMInit::logOut << "Error: QtInsert::evaluate() - allocation of oid failed" << std::endl;
-
- // delete dynamic data
- if( sourceData ) sourceData->deleteRef();
- delete nextTupel;
- nextTupel=NULL;
- persColl->releaseAll();
- delete persColl;
- persColl=NULL;
- parseInfo.setErrorNo(958);
- throw parseInfo;
- }
+ } else {
+ RMInit::logOut << "Error: QtInsert::evaluate() - allocation of oid failed" << std::endl;
+
+ // delete dynamic data
+ if (sourceData) sourceData->deleteRef();
+ delete nextTupel;
+ nextTupel = NULL;
+ persColl->releaseAll();
+ delete persColl;
+ persColl = NULL;
+ parseInfo.setErrorNo(958);
+ throw parseInfo;
+ }
#else
#endif
- // free transient memory
- persColl->releaseAll();
- delete persColl;
- persColl=NULL;
- }
- else
- RMInit::logOut << "Error: QtInsert::evaluate() - insert data is invalid." << std::endl;
-
- // delete source operand
- if( sourceData ) sourceData->deleteRef();
-
- // delete dummy tupel vector
- delete nextTupel;
- nextTupel=NULL;
-
- return 0;
-}
+ // free transient memory
+ persColl->releaseAll();
+ delete persColl;
+ persColl = NULL;
+ } else
+ RMInit::logOut << "Error: QtInsert::evaluate() - insert data is invalid." << std::endl;
+
+ // delete source operand
+ if (sourceData) sourceData->deleteRef();
+ // delete dummy tupel vector
+ delete nextTupel;
+ nextTupel = NULL;
+ return 0;
+}
QtNode::QtNodeList*
-QtInsert::getChilds( QtChildType flag )
-{
- QtNodeList* resultList=NULL;
+QtInsert::getChilds(QtChildType flag) {
+ QtNodeList* resultList = NULL;
RMDBGENTER(0, RMDebug::module_qlparser, "QtInsert", "QtInsert::getChilds()")
- if( source )
- {
- // allocate resultList
- if( flag == QT_DIRECT_CHILDS );
- resultList = new QtNodeList();
+ if (source) {
+ // allocate resultList
+ if (flag == QT_DIRECT_CHILDS);
+ resultList = new QtNodeList();
- if( flag == QT_LEAF_NODES || flag == QT_ALL_NODES )
- resultList = source->getChilds( flag );
+ if (flag == QT_LEAF_NODES || flag == QT_ALL_NODES)
+ resultList = source->getChilds(flag);
- // add the nodes of the current level
- if( flag == QT_DIRECT_CHILDS || flag == QT_ALL_NODES )
- resultList->push_back( source );
- }
- else
- resultList = new QtNodeList();
+ // add the nodes of the current level
+ if (flag == QT_DIRECT_CHILDS || flag == QT_ALL_NODES)
+ resultList->push_back(source);
+ } else
+ resultList = new QtNodeList();
RMDBGEXIT(0, RMDebug::module_qlparser, "QtInsert", "QtInsert::getChilds()")
- return resultList;
+ return resultList;
}
+void
+QtInsert::printTree(int tab, std::ostream& s, QtChildType mode) {
+ s << SPACE_STR(tab).c_str() << "QtInsert Object" << std::endl;
+ if (mode != QtNode::QT_DIRECT_CHILDS) {
+ if (source) {
+ s << SPACE_STR(tab).c_str() << "source : " << std::endl;
+ source->printTree(tab + 2, s);
+ } else
+ s << SPACE_STR(tab).c_str() << "no source" << std::endl;
-void
-QtInsert::printTree( int tab, std::ostream& s, QtChildType mode )
-{
- s << SPACE_STR(tab).c_str() << "QtInsert Object" << std::endl;
-
- if( mode != QtNode::QT_DIRECT_CHILDS )
- {
- if( source )
- {
- s << SPACE_STR(tab).c_str() << "source : " << std::endl;
- source->printTree( tab + 2, s );
+ s << std::endl;
}
- else
- s << SPACE_STR(tab).c_str() << "no source" << std::endl;
-
- s << std::endl;
- }
}
-
-
void
-QtInsert::printAlgebraicExpression( std::ostream& s )
-{
- s << "insert<";
+QtInsert::printAlgebraicExpression(std::ostream& s) {
+ s << "insert<";
- if( source )
- source->printAlgebraicExpression( s );
- else
- s << "<no source>";
+ if (source)
+ source->printAlgebraicExpression(s);
+ else
+ s << "<no source>";
- s << ">";
+ s << ">";
}
-
QtOperation*
-QtInsert::getSource()
-{
- return source;
+QtInsert::getSource() {
+ return source;
}
-
/*
void
QtInsert::preOptimize()
@@ -334,28 +341,217 @@ QtInsert::preOptimize()
if( source )
source->optimizeLoad( new QtNode::QtTrimList );
}
-*/
+ */
void
-QtInsert::checkType()
-{
- RMDBCLASS( "QtInsert", "checkType()", "qlparser", __FILE__, __LINE__ )
+QtInsert::checkType() {
+ RMDBCLASS("QtInsert", "checkType()", "qlparser", __FILE__, __LINE__)
+
+ // check operand branches
+ if (source) {
+
+ // get input type
+ const QtTypeElement& inputType = source->checkType();
+
+ if (inputType.getDataType() != QT_MDD) {
+ RMInit::logOut << "Error: QtInsert::checkType() - insert expression must be of type r_Marray<T>" << std::endl;
+ parseInfo.setErrorNo(960);
+ throw parseInfo;
+ }
+ } else
+ RMInit::logOut << "Error: QtInsert::checkType() - operand branch invalid." << std::endl;
+}
- // check operand branches
- if( source )
- {
-
- // get input type
- const QtTypeElement& inputType = source->checkType();
-
- if( inputType.getDataType() != QT_MDD )
- {
- RMInit::logOut << "Error: QtInsert::checkType() - insert expression must be of type r_Marray<T>" << std::endl;
- parseInfo.setErrorNo(960);
- throw parseInfo;
- }
- }
- else
- RMInit::logOut << "Error: QtInsert::checkType() - operand branch invalid." << std::endl;
+r_Data_Format
+QtInsert::getDataFormat(QtMDDConfig* config) {
+ if (!config)
+ return StorageLayout::DefaultDataFormat;
+ int dataType = config->getStorageType();
+ switch (dataType) {
+ case QtMDDConfig::r_DEFAULT_STG :
+ return StorageLayout::DefaultDataFormat;
+ case QtMDDConfig::r_ARRAY_STG :
+ return r_Array;
+ case QtMDDConfig::r_AUTO_STG :
+ return r_Auto_Compression;
+ case QtMDDConfig::r_BMP_STG :
+ return r_BMP;
+ case QtMDDConfig::r_DEM_STG :
+ return r_DEM;
+ case QtMDDConfig::r_HDF_STG :
+ return r_HDF;
+ // case QtMDDConfig::r_HDF5_STG://need review
+ // return r_HDF;
+ case QtMDDConfig::r_JPEG_STG :
+ return r_JPEG;
+ case QtMDDConfig::r_NTF_STG :
+ return r_NTF;
+ case QtMDDConfig::r_PACKBITS_STG :
+ return r_Pack_Bits;
+ case QtMDDConfig::r_PNG_STG :
+ return r_PNG;
+ case QtMDDConfig::r_PPM_STG :
+ return r_PPM;
+ case QtMDDConfig::r_RLE_STG :
+ return r_RLE;
+ case QtMDDConfig::r_RLESEP_STG :
+ return r_Sep_RLE;
+ case QtMDDConfig::r_TIFF_STG :
+ return r_TIFF;
+ case QtMDDConfig::r_TOR_STG :
+ return r_TOR;
+ case QtMDDConfig::r_VFF_STG :
+ return r_VFF;
+ case QtMDDConfig::r_WLTCOIFLETINT_STG :
+ if (config->getWltValue() == 6)
+ return r_Wavelet_Coiflet6;
+ if (config->getWltValue() == 12)
+ return r_Wavelet_Coiflet12;
+ if (config->getWltValue() == 18)
+ return r_Wavelet_Coiflet18;
+ if (config->getWltValue() == 24)
+ return r_Wavelet_Coiflet24;
+ if (config->getWltValue() == 30)
+ return r_Wavelet_Coiflet30;
+ return StorageLayout::DefaultDataFormat; //may be null
+ case QtMDDConfig::r_WLTDAUBECHIES_STG :
+ return r_Wavelet_Daubechies;
+ case QtMDDConfig::r_WLTDAUBECHIESINT_STG :
+ if (config->getWltValue() == 6)
+ return r_Wavelet_Daub6;
+ if (config->getWltValue() == 8)
+ return r_Wavelet_Daub8;
+ if (config->getWltValue() == 10)
+ return r_Wavelet_Daub10;
+ if (config->getWltValue() == 12)
+ return r_Wavelet_Daub12;
+ if (config->getWltValue() == 14)
+ return r_Wavelet_Daub14;
+ if (config->getWltValue() == 16)
+ return r_Wavelet_Daub16;
+ if (config->getWltValue() == 18)
+ return r_Wavelet_Daub18;
+ if (config->getWltValue() == 20)
+ return r_Wavelet_Daub20;
+ return StorageLayout::DefaultDataFormat; //may be default
+ case QtMDDConfig::r_WLTHAAR_STG :
+ return r_Wavelet_Haar;
+ case QtMDDConfig::r_WLTLEASTINT_STG :
+ if (config->getWltValue() == 8)
+ return r_Wavelet_Least8;
+ if (config->getWltValue() == 10)
+ return r_Wavelet_Least10;
+ if (config->getWltValue() == 12)
+ return r_Wavelet_Least12;
+ if (config->getWltValue() == 14)
+ return r_Wavelet_Least14;
+ if (config->getWltValue() == 16)
+ return r_Wavelet_Least16;
+ if (config->getWltValue() == 18)
+ return r_Wavelet_Least18;
+ if (config->getWltValue() == 20)
+ return r_Wavelet_Least20;
+ case QtMDDConfig::r_WLTQHAAR_STG :
+ return r_Wavelet_QHaar;
+ case QtMDDConfig::r_ZLIB_STG :
+ return r_ZLib;
+ case QtMDDConfig::r_ZLIBSEP_STG :
+ return r_Sep_ZLib;
+ default:
+ return StorageLayout::DefaultDataFormat;
+ }
+
+}
+
+r_Index_Type
+QtInsert::getIndexType(QtMDDConfig* config) {
+ if (!config)
+ return StorageLayout::DefaultIndexType;
+ int indexType = config->getIndexType();
+
+ switch (indexType) {
+ case QtMDDConfig::r_A_INDEX :
+ return r_Auto_Index;
+ case QtMDDConfig::r_DEFAULT_INDEX :
+ return StorageLayout::DefaultIndexType;
+ case QtMDDConfig::r_D_INDEX :
+ return r_Directory_Index;
+ case QtMDDConfig::r_IT_INDEX :
+ return r_Index_Type_NUMBER;
+ case QtMDDConfig::r_RC_INDEX :
+ return r_Reg_Computed_Index;
+ case QtMDDConfig::r_RD_INDEX :
+ return r_Reg_Directory_Index;
+ case QtMDDConfig::r_RPT_INDEX :
+ return r_RPlus_Tree_Index;
+ case QtMDDConfig::r_RRPT_INDEX :
+ return r_Reg_RPlus_Tree_Index;
+ case QtMDDConfig::r_TC_INDEX :
+ return r_Tile_Container_Index;
+ default:
+ return StorageLayout::DefaultIndexType;
+ }
+}
+
+r_Tiling_Scheme
+QtInsert::getTilingScheme(QtMDDConfig* cfg) {
+ if (!cfg)
+ return StorageLayout::DefaultTilingScheme;
+ int tileType = cfg->getTilingType();
+ switch (tileType) {
+ case QtMDDConfig::r_ALIGNED_TLG :
+ return r_AlignedTiling;
+ case QtMDDConfig::r_AREAOFINTEREST_TLG :
+ return r_InterestTiling;
+ case QtMDDConfig::r_REGULAR_TLG :
+ return r_RegularTiling;
+ case QtMDDConfig::r_DRLDECOMPSUBTILE_TLG :
+ return r_DirectionalTiling;
+ case QtMDDConfig::r_DRLDECOMP_TLG :
+ return r_DirectionalTiling;
+ case QtMDDConfig::r_STATISTICSPARAM_TLG :
+ return r_StatisticalTiling;
+ case QtMDDConfig::r_STATISTICS_TLG :
+ return r_StatisticalTiling;
+
+ default:
+ return StorageLayout::DefaultTilingScheme;
+ }
+}
+
+vector<r_Minterval>
+QtInsert::getIntervals(QtMDDConfig* cfg) {
+ vector<r_Minterval> intervals;
+ if (!cfg)
+ return intervals;
+ QtNode::QtOperationList* oplist = cfg->getBboxList();
+ if (!oplist)
+ return intervals;
+ QtNode::QtDataList* nextTupel = new QtNode::QtDataList(0);
+ QtOperationList::iterator iter;
+ for (iter = oplist->begin(); iter != oplist->end(); iter++) {
+ QtData* data = (*iter)->evaluate(nextTupel);
+ QtMintervalData* intervalData = (QtMintervalData*) data;
+ r_Minterval interval = intervalData->getMintervalData();
+ intervals.push_back(interval);
+ }
+ return intervals;
+}
+
+r_Minterval
+QtInsert::getTileConfig(QtMDDConfig* cfg) {
+ r_Minterval tileConfig;
+ if (!cfg || !(cfg->getTilingType() == QtMDDConfig::r_ALIGNED_TLG ||
+ cfg->getTilingType() == QtMDDConfig::r_REGULAR_TLG))
+ return StorageLayout::DefaultTileConfiguration;
+
+ QtOperation* op = cfg->getTileCfg();
+ if (!op)
+ return tileConfig;
+ QtNode::QtDataList* nextTupel = new QtNode::QtDataList(0);
+ QtData* data = op->evaluate(nextTupel);
+ QtMintervalData* intervalData = (QtMintervalData*) data;
+ tileConfig = intervalData->getMintervalData();
+ return tileConfig;
}
diff --git a/qlparser/qtinsert.hh b/qlparser/qtinsert.hh
index 5c928b9..725dcc3 100644
--- a/qlparser/qtinsert.hh
+++ b/qlparser/qtinsert.hh
@@ -3,6 +3,12 @@
#include "qlparser/qtexecute.hh"
#include "qlparser/qtoperation.hh"
+#include "qlparser/qtmddconfig.hh"
+#include "qlparser/qtmddcfgop.hh"
+#include "storagemgr/sstoragelayout.hh"
+
+#include "rasodmg/stattiling.hh"
+#include "rasodmg/interesttiling.hh"
#ifndef CPPSTDLIB
#include <ospace/string.h> // STL<ToolKit>
@@ -52,6 +58,8 @@ class QtInsert : public QtExecute
/// constructor getting name of collection and insert expression
QtInsert( const std::string& initCollectionName, QtOperation* initSource );
+ QtInsert(const std::string& initCollectionName, QtOperation* initSource, QtOperation* storage);
+
/// virtual destructor
virtual ~QtInsert();
@@ -76,6 +84,15 @@ class QtInsert : public QtExecute
/// returns source
QtOperation* getSource();
+ /// tiling functions
+ r_Data_Format getDataFormat(QtMDDConfig* config);
+ r_Index_Type getIndexType(QtMDDConfig* config);
+ r_Tiling_Scheme getTilingScheme(QtMDDConfig* cfg);
+ vector<r_Minterval> getIntervals(QtMDDConfig* cfg);
+ r_Minterval getTileConfig(QtMDDConfig* cfg);
+
+ void setStorageLayout(StorageLayout* layout);
+
/// pre optimization
// virtual void preOptimize();
/**
@@ -89,6 +106,9 @@ class QtInsert : public QtExecute
/// insert expression
QtOperation* source;
+ // Storage and Tiling type
+ QtOperation* stgLayout;
+
/// collection name
std::string collectionName;
@@ -100,5 +120,3 @@ class QtInsert : public QtExecute
#endif
-
-
diff --git a/qlparser/qtmddcfgop.cc b/qlparser/qtmddcfgop.cc
new file mode 100755
index 0000000..69637af
--- /dev/null
+++ b/qlparser/qtmddcfgop.cc
@@ -0,0 +1,124 @@
+/*
+* 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>.
+*/
+
+/*************************************************************
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 10-11-08 Shams Created the class
+ * COMMENTS:
+ *
+ ************************************************************/
+
+#include "qlparser/qtmddcfgop.hh"
+#include "qlparser/qtconst.hh"
+#include "qlparser/qtmddconfig.hh"
+#include <iostream>
+#ifndef CPPSTDLIB
+#include <ospace/string.h> // STL<ToolKit>
+#else
+#include <string>
+using namespace std;
+#endif
+#include<fstream>
+
+
+
+QtMddCfgOp::QtMddCfgOp()
+ : QtOperation(),
+ input(NULL)
+{
+}
+
+
+QtMddCfgOp::QtMddCfgOp( QtOperation* inputInit )
+ : QtOperation(),
+ input( inputInit )
+{
+ if( input )
+ input->setParent( this );
+}
+
+QtMddCfgOp::QtMddCfgOp( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp,
+ int indexType)
+{
+ mddCfgObj = new QtMDDConfig(tilingType,tileSize, borderThreshold, interestThreshold, tileCfg, box, dDecomp, indexType);
+
+}
+
+QtMddCfgOp::QtMddCfgOp( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp)
+{
+ mddCfgObj = new QtMDDConfig(tilingType,tileSize, borderThreshold, interestThreshold, tileCfg, box, dDecomp, QtMDDConfig::r_DEFAULT_INDEX);
+
+}
+
+QtMddCfgOp::QtMddCfgOp(int index)
+ : QtOperation()
+{
+ mddCfgObj = new QtMDDConfig(QtMDDConfig::r_DEFAULT_TLG, -1, -1, -1, NULL, NULL,NULL,index);
+
+}
+
+QtMddCfgOp::~QtMddCfgOp()
+{
+ if( input )
+ {
+ delete input;
+ input=NULL;
+ }
+}
+
+
+void
+QtMddCfgOp::optimizeLoad( QtTrimList* trimList )
+{
+ RMDBCLASS( "QtMddCfgOp", "optimizeLoad( QtTrimList* )", "qlparser", __FILE__, __LINE__ )
+
+ // by default, pass load domain to the input
+ if( input )
+ input->optimizeLoad( trimList );
+ else
+ {
+ delete trimList;
+ trimList=NULL;
+ }
+}
+
+QtMDDConfig*
+QtMddCfgOp::evaluate(QtDataList* inputList)
+{
+ QtMDDConfig* retvalue = NULL;
+ for (int i = 0 ; i < inputList->size() ; i++){
+ retvalue = (QtMDDConfig*)inputList->at(i);
+ }
+ return retvalue;
+}
+
+QtMDDConfig*
+QtMddCfgOp::getMddConfig()
+{
+ return mddCfgObj;
+}
diff --git a/qlparser/qtmddcfgop.hh b/qlparser/qtmddcfgop.hh
new file mode 100755
index 0000000..f2ba3e8
--- /dev/null
+++ b/qlparser/qtmddcfgop.hh
@@ -0,0 +1,78 @@
+/*
+* 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>.
+*/
+
+/*************************************************************
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 10-11-08 Shams Created the class
+ * COMMENTS:
+ *
+ ************************************************************/
+#ifndef _QTMDDCFGOP_HH_
+#define _QTMDDCFGOP_HH_
+
+#include <iostream>
+#ifndef CPPSTDLIB
+#include <ospace/string.h> // STL<ToolKit>
+#else
+#include <string>
+using namespace std;
+#endif
+#include<fstream>
+#include "qlparser/qtconst.hh"
+#include "qlparser/qtmddconfig.hh"
+#include "rasodmg/interesttiling.hh"
+
+
+class QtMddCfgOp: public QtOperation
+{
+private:
+ QtMDDConfig* mddCfgObj;
+ QtOperation* input;
+
+public:
+
+ QtMddCfgOp();
+ ~QtMddCfgOp();
+
+ QtMddCfgOp( QtOperation* inputInit );
+
+ QtMddCfgOp( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp,
+ int indexType);
+
+ QtMddCfgOp( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp);
+
+ QtMddCfgOp(int index);
+
+ void optimizeLoad( QtTrimList* trimList );
+
+ QtMDDConfig* evaluate(QtDataList* inputList);
+
+ QtMDDConfig* getMddConfig();
+};
+
+#endif
diff --git a/qlparser/qtmddconfig.cc b/qlparser/qtmddconfig.cc
new file mode 100755
index 0000000..6addda1
--- /dev/null
+++ b/qlparser/qtmddconfig.cc
@@ -0,0 +1,150 @@
+/*
+* 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>.
+*/
+
+/*************************************************************
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 10-11-08 Shams Created the class
+ * 14-08-09 Andrei Reimplemented the class
+ * COMMENTS:
+ *
+ ************************************************************/
+
+#include "qlparser/qtmddcfgop.hh"
+#include "qlparser/qtmddconfig.hh"
+#include "qlparser/qtconst.hh"
+#include "qlparser/qtdata.hh"
+#include <iostream>
+#ifndef CPPSTDLIB
+#include <ospace/string.h> // STL<ToolKit>
+#else
+#include <string>
+using namespace std;
+#endif
+#include <fstream>
+
+
+QtMDDConfig::QtMDDConfig() : QtData() {
+}
+
+QtDataType QtMDDConfig::getDataType() const {
+ return QT_MDD_CONFIG;
+}
+
+char* QtMDDConfig::getTypeStructure() const {
+ return NULL;
+}
+
+bool QtMDDConfig::equal(const QtData* p) const {
+ bool eq = false;
+ return eq;
+}
+
+string QtMDDConfig::getSpelling() const {
+ return "";
+}
+
+QtMDDConfig::QtMDDConfig(int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box, std::vector<r_Dir_Decompose>* dDecomp,
+ int indexType) {
+ this->tilingType = tilingType;
+ this->tileSize = tileSize;
+ this->borderThreshold = borderThreshold;
+ this->interestThreshold = interestThreshold;
+ this->tileCfg = tileCfg;
+ this->box = box;
+ this->dDecomp = dDecomp;
+ this->indexType = indexType;
+}
+
+QtMDDConfig::QtMDDConfig(int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg, QtNode::QtOperationList* box, std::vector<r_Dir_Decompose>* dDecomp) {
+ this->tilingType = tilingType;
+ this->tileSize = tileSize;
+ this->borderThreshold = borderThreshold;
+ this->interestThreshold = interestThreshold;
+ this->tileCfg = tileCfg;
+ this->box = box;
+ this->dDecomp = dDecomp;
+ this->indexType = QtMDDConfig::r_DEFAULT_INDEX;
+}
+
+QtMDDConfig::QtMDDConfig(int index)
+: QtData() {
+ this->tilingType = this->r_DEFAULT_TLG;
+ this->tileSize = -1;
+ this->borderThreshold = -1;
+ this->interestThreshold = -1;
+ this->tileCfg = NULL;
+ this->box = NULL;
+ this->dDecomp = NULL;
+ this->indexType = index;
+}
+
+int QtMDDConfig::getTileSize() {
+ return tileSize;
+}
+
+int QtMDDConfig::getBorderThreshold() {
+ return borderThreshold;
+}
+
+double QtMDDConfig::getInterestThreshold() {
+ return interestThreshold;
+}
+
+std::vector<r_Dir_Decompose>* QtMDDConfig::getDirDecomp() {
+ return dDecomp;
+}
+
+int QtMDDConfig::getStorageType() {
+ return QtMDDConfig::r_DEFAULT_STG;
+}
+
+int QtMDDConfig::getWltValue() {
+ return param;
+}
+
+int QtMDDConfig::getIndexType() {
+ return indexType;
+}
+
+int QtMDDConfig::getTilingType() {
+ return tilingType;
+}
+
+QtNode::QtOperationList* QtMDDConfig::getBboxList() {
+ return box;
+}
+
+QtOperation* QtMDDConfig::getTileCfg() {
+ return tileCfg;
+}
+
+void QtMDDConfig::setBorderThreshold(int threshold)
+{
+ borderThreshold = threshold;
+}
+
diff --git a/qlparser/qtmddconfig.hh b/qlparser/qtmddconfig.hh
new file mode 100755
index 0000000..79c512e
--- /dev/null
+++ b/qlparser/qtmddconfig.hh
@@ -0,0 +1,150 @@
+/*
+* 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>.
+*/
+
+/*************************************************************
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * ----------------------------------------------------------
+ * 10-11-08 Shams Created the class
+ * 14-08-09 Andrei Reimplemented the class
+ * COMMENTS:
+ *
+ ************************************************************/
+#ifndef _QTMDDCONFIG_HH_
+#define _QTMDDCONFIG_HH_
+
+#include "qlparser/qtconst.hh"
+#include "rasodmg/dirdecompose.hh"
+#include <iostream>
+#ifndef CPPSTDLIB
+#include <ospace/string.h> // STL<ToolKit>
+#else
+#include <string>
+using namespace std;
+#endif
+#include<fstream>
+
+
+class QtMDDConfig: public QtData
+{
+private:
+ int tilingType;
+ int tileSize;
+ int borderThreshold;
+ double interestThreshold;
+ QtOperation* tileCfg;
+ QtNode::QtOperationList* box;
+ std::vector<r_Dir_Decompose>* dDecomp;
+ int indexType;
+ int param; // wavelet param
+
+public:
+ // Constructors
+ QtMDDConfig();
+ QtMDDConfig( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg,
+ QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp,
+ int indexType);
+ QtMDDConfig( int tilingType, int tileSize, int borderThreshold,
+ double interestThreshold, QtOperation* tileCfg,
+ QtNode::QtOperationList* box,std::vector<r_Dir_Decompose>* dDecomp);
+ QtMDDConfig(int index);
+
+ // Getters
+ int getTileSize();
+ int getBorderThreshold();
+ double getInterestThreshold();
+ std::vector<r_Dir_Decompose>* getDirDecomp();
+ int getStorageType();
+ int getWltValue(); // Check return type !
+ int getIndexType();
+ int getTilingType();
+ QtNode::QtOperationList* getBboxList();
+ QtOperation* getTileCfg();
+
+ // Setters
+ void setBorderThreshold(int threshold);
+
+ // Pure virtual methods definition (from class QtData)
+ virtual QtDataType getDataType() const;
+ virtual char* getTypeStructure() const;
+ virtual bool equal(const QtData*) const;
+ virtual string getSpelling() const;
+
+ enum QtIndexConstants
+ {
+ r_DEFAULT_INDEX,
+ r_A_INDEX,
+ r_D_INDEX,
+ r_IT_INDEX,
+ r_RC_INDEX,
+ r_RD_INDEX,
+ r_RPT_INDEX,
+ r_RRPT_INDEX,
+ r_TC_INDEX
+ };
+
+ enum QtTilingConstants
+ {
+ r_DEFAULT_TLG,
+ r_ALIGNED_TLG,
+ r_AREAOFINTEREST_TLG,
+ r_DRLDECOMPSUBTILE_TLG,
+ r_DRLDECOMP_TLG,
+ r_REGULAR_TLG,
+ r_STATISTICSPARAM_TLG,
+ r_STATISTICS_TLG
+ };
+
+ enum QtStorageConstants
+ {
+ r_DEFAULT_STG,
+ r_ARRAY_STG,
+ r_AUTO_STG,
+ r_BMP_STG,
+ r_DEM_STG ,
+ r_HDF5_STG,
+ r_HDF_STG ,
+ r_JPEG_STG,
+ r_NTF_STG,
+ r_PACKBITS_STG,
+ r_PPM_STG,
+ r_PNG_STG,
+ r_RLESEP_STG,
+ r_RLE_STG,
+ r_TIFF_STG,
+ r_TOR_STG ,
+ r_VFF_STG,
+ r_WLTCOIFLETINT_STG,
+ r_WLTDAUBECHIESINT_STG,
+ r_WLTDAUBECHIES_STG,
+ r_WLTHAAR_STG,
+ r_WLTLEASTINT_STG,
+ r_WLTQHAAR_STG,
+ r_ZLIBSEP_STG,
+ r_ZLIB_STG
+ };
+};
+
+#endif
diff --git a/rasdl/Makefile.am b/rasdl/Makefile.am
index 87f26a2..bbe17d3 100644
--- a/rasdl/Makefile.am
+++ b/rasdl/Makefile.am
@@ -46,14 +46,14 @@ rasdl_LDADD = ../reladminif/libreladminif.a ../relmddif/librelmddif.a \
../indexmgr/libindexmgr.a ../catalogmgr/libcatalogmgr.a \
../storagemgr/libstoragemgr.a ../tilemgr/libtilemgr.a \
../compression/libcompression.a ../commline/libcommline.a ../raslib/libraslib.a \
- ../conversion/libconversion.a
+ ../conversion/libconversion.a ../rasodmg/librasodmg.a
BUILT_SOURCES=lex.cc odl.cc odl.h
CLEANFILES=lex.cc odl.cc odl.h
SUBDIRS=../reladminif ../relmddif ../relstorageif ../relindexif ../relcatalogif \
../relblobif ../indexmgr ../catalogmgr ../storagemgr ../tilemgr \
- ../compression ../raslib ../conversion ../commline
+ ../compression ../raslib ../conversion ../commline ../rasodmg
$(RECURSIVE_CLEAN_TARGETS):
@$(MAKE) $(AM_MAKEFLAGS) `echo $@ | sed s/-recursive/-am/`
diff --git a/raslib/minterval.cc b/raslib/minterval.cc
index 311c8e9..cab12b7 100644
--- a/raslib/minterval.cc
+++ b/raslib/minterval.cc
@@ -1035,6 +1035,17 @@ std::ostream& operator<<(std::ostream& s, const r_Minterval& d)
d.print_status(s);
return s;
}
+
+std::ostream& operator<<(std::ostream& os, const std::vector<r_Minterval>& vec)
+{
+ os << " Vector { ";
+
+ int size = vec.size();
+ for (int i = 0; i < size; i++)
+ os << vec[i] << std::endl;
+
+ os << " } ";
+}
std::ostream& operator<<(std::ostream& s, const vector<double>& doubleVec)
{
diff --git a/raslib/minterval.hh b/raslib/minterval.hh
index a9b596d..b799132 100644
--- a/raslib/minterval.hh
+++ b/raslib/minterval.hh
@@ -561,6 +561,7 @@ class r_Minterval
Output stream operator for objects of type {\tt const} \Ref{r_Minterval}.
*/
extern std::ostream& operator<<( std::ostream& s, const r_Minterval& d );
+extern std::ostream& operator<<( std::ostream& s, const std::vector<r_Minterval>& d );
#include "raslib/minterval.icc"
diff --git a/rasodmg/Makefile.am b/rasodmg/Makefile.am
index d781176..d6c8348 100644
--- a/rasodmg/Makefile.am
+++ b/rasodmg/Makefile.am
@@ -44,10 +44,10 @@ librasodmg_a_SOURCES = collection.cc collection.hh collection.icc \
database.cc database.hh database.icc \
gmarray.cc gmarray.hh gmarray.icc \
storagelayout.cc storagelayout.hh storagelayout.icc \
+ dirdecompose.cc dirdecompose.hh \
tiling.cc tiling.hh \
alignedtiling.cc alignedtiling.hh alignedtiling.icc \
dirtiling.cc dirtiling.hh \
- dirdecompose.cc dirdecompose.hh \
interesttiling.cc interesttiling.hh \
stattiling.cc stattiling.hh \
partinsert.cc partinsert.hh \
diff --git a/rasodmg/alignedtiling.cc b/rasodmg/alignedtiling.cc
index 13313f4..1ddb21d 100644
--- a/rasodmg/alignedtiling.cc
+++ b/rasodmg/alignedtiling.cc
@@ -66,7 +66,7 @@ r_Aligned_Tiling::r_Aligned_Tiling(const char* encoded) throw (r_Error)
char *pToConvert=NULL;
pStart=encoded;
pEnd=pStart+strlen(pStart);
- pRes=strstr(pStart, COLON);
+ pRes=strstr(pStart, TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Aligned_Tiling::r_Aligned_Tiling(" << encoded << "): Error decoding tile configuration from tilingparams." << std::endl;
diff --git a/rasodmg/dirdecompose.cc b/rasodmg/dirdecompose.cc
index d00b9b4..a230b52 100644
--- a/rasodmg/dirdecompose.cc
+++ b/rasodmg/dirdecompose.cc
@@ -139,6 +139,17 @@ std::ostream& operator<<(std::ostream& os, const r_Dir_Decompose& d)
return os;
}
+std::ostream& operator<<(std::ostream& os, const std::vector<r_Dir_Decompose>& vec)
+{
+ os << " Vector { ";
+
+ int size = vec.size();
+ for (int i = 0; i < size; i++)
+ os << vec[i] << std::endl;
+
+ os << " } ";
+}
+
r_Sinterval
r_Dir_Decompose::get_total_interval( )
{
diff --git a/rasodmg/dirdecompose.hh b/rasodmg/dirdecompose.hh
index c183fd0..96d4bb0 100644
--- a/rasodmg/dirdecompose.hh
+++ b/rasodmg/dirdecompose.hh
@@ -36,7 +36,9 @@ rasdaman GmbH.
// Include statements
#include <iostream>
+#include <vector>
using std::cout;
+using std::vector;
#include "raslib/error.hh"
#include "raslib/sinterval.hh"
@@ -70,7 +72,7 @@ class r_Dir_Decompose
r_Dir_Decompose();
virtual ~r_Dir_Decompose();
-
+
/// Copy constructor
r_Dir_Decompose(const r_Dir_Decompose& other);
@@ -110,5 +112,6 @@ protected:
Prints the status of an r_Dir_Decompose object to a stream
*/
extern std::ostream& operator<<(std::ostream& os, const r_Dir_Decompose& d);
+extern std::ostream& operator<<(std::ostream& os, const std::vector<r_Dir_Decompose>& vec);
#endif
diff --git a/rasodmg/dirtiling.cc b/rasodmg/dirtiling.cc
index f0bf682..fda8ddc 100644
--- a/rasodmg/dirtiling.cc
+++ b/rasodmg/dirtiling.cc
@@ -134,7 +134,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
pEnd=pTemp+strlen(pStart);
//deal with dimension
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Dir_Tiling::r_Dir_Tiling(" << encoded << "): Error decoding tile dimension." << endl;
@@ -173,7 +173,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
pTemp=pRes;
//deal with directional decompose
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Dir_Tiling::r_Dir_Tiling(" << encoded << "): Error decoding directional decompose." << endl;
@@ -223,7 +223,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
if(*pDirToConvert != *ASTERIX)
{
- pDirRes=strstr(pDirToConvert, COMMA);
+ pDirRes=strstr(pDirToConvert, TCOMMA);
if(!pDirRes)
{
RMInit::logOut << "r_Dir_Tiling::r_Dir_Tiling(" << encoded << "): Error decoding directional decompose for dimension " << dirIndex+1 << " from \"" << pToConvert << "\"." << endl;
@@ -265,7 +265,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
pDirTemp=pDirRes;
//next decomp
- pDirRes=strstr(pDirTemp, COMMA);
+ pDirRes=strstr(pDirTemp, TCOMMA);
if(!pDirRes)
{
decomp=strtoul(pDirTemp, (char**)&pDirRes, DefaultBase);
@@ -295,7 +295,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
else
pDirStart++;
- pDirRes=strstr(pDirStart, COMMA);
+ pDirRes=strstr(pDirStart, TCOMMA);
if(!pDirRes)
{
RMInit::logOut << "r_Dir_Tiling::r_Dir_Tiling(" << encoded << "): Error decoding directional decompose for dimension " << dirIndex+1 << " from \"" << pToConvert << "\", end of stream." << endl;
@@ -328,7 +328,7 @@ r_Dir_Tiling::r_Dir_Tiling(const char* encoded) throw (r_Error)
pTemp=pRes;
//deal with tilesize
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Dir_Tiling::r_Dir_Tiling(" << encoded << "): Error decoding tile size from \"" << pTemp << "\", end of stream." << endl;
diff --git a/rasodmg/interesttiling.cc b/rasodmg/interesttiling.cc
index aad8841..3e25818 100644
--- a/rasodmg/interesttiling.cc
+++ b/rasodmg/interesttiling.cc
@@ -149,7 +149,7 @@ r_Interest_Tiling::r_Interest_Tiling(const char* encoded) throw (r_Error)
pStart=encoded;
pEnd=pStart+strlen(pStart);
pTemp=pStart;
- pRes=strstr(pTemp,COLON);
+ pRes=strstr(pTemp,TCOLON);
if(!pRes)
{
@@ -189,7 +189,7 @@ r_Interest_Tiling::r_Interest_Tiling(const char* encoded) throw (r_Error)
//parse interest areas
pTemp=pRes;
- pRes=strstr(pTemp,COLON);
+ pRes=strstr(pTemp,TCOLON);
if(!pRes)
{
@@ -235,7 +235,7 @@ r_Interest_Tiling::r_Interest_Tiling(const char* encoded) throw (r_Error)
//try next item
pTemp=pRes;
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
}
if(vectInterestAreas.empty())
diff --git a/rasodmg/stattiling.cc b/rasodmg/stattiling.cc
index d99df04..f9163b6 100644
--- a/rasodmg/stattiling.cc
+++ b/rasodmg/stattiling.cc
@@ -91,7 +91,7 @@ r_Stat_Tiling::r_Stat_Tiling(const char* encoded) throw (r_Error)
pEnd=pStart+strlen(pStart);
pTemp=pStart;
- pRes=strstr(pTemp,COLON);
+ pRes=strstr(pTemp,TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Stat_Tiling::r_Stat_Tiling(" << encoded << "): Error decoding tile dimension from \"" << pTemp << "\"." << endl;
@@ -130,7 +130,7 @@ r_Stat_Tiling::r_Stat_Tiling(const char* encoded) throw (r_Error)
//deal with access informations
pTemp=pRes;
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Stat_Tiling::r_Stat_Tiling(" << encoded << "): Error decoding access information from \"" << pTemp << "\"." << endl;
@@ -179,7 +179,7 @@ r_Stat_Tiling::r_Stat_Tiling(const char* encoded) throw (r_Error)
}
//deal with access Times
- pInRes=strstr(pInRes, COMMA);
+ pInRes=strstr(pInRes, TCOMMA);
if(!pInRes)
{
RMInit::logOut << "r_Stat_Tiling::r_Stat_Tiling(" << encoded << "): Error decoding access times \"" << pInRes << "\" from acess information \"" << pToConvert << "\", not specified." << endl;
@@ -230,7 +230,7 @@ r_Stat_Tiling::r_Stat_Tiling(const char* encoded) throw (r_Error)
//deal with next item
pTemp=pRes;
- pRes=strstr(pTemp, COLON);
+ pRes=strstr(pTemp, TCOLON);
}
if(vectAccessInfo.empty())
@@ -271,7 +271,7 @@ r_Stat_Tiling::r_Stat_Tiling(const char* encoded) throw (r_Error)
//deal with interestTH
pTemp=pRes;
- pRes=strstr(pTemp,COLON);
+ pRes=strstr(pTemp,TCOLON);
if(!pRes)
{
RMInit::logOut << "r_Stat_Tiling::r_Stat_Tiling(" << encoded << "): Error decoding interesting threshold." << endl;
diff --git a/rasodmg/tiling.cc b/rasodmg/tiling.cc
index 89801c3..3d3d01d 100644
--- a/rasodmg/tiling.cc
+++ b/rasodmg/tiling.cc
@@ -46,9 +46,9 @@ rasdaman GmbH.
const char*
r_Tiling::ASTERIX = "*";
const char*
-r_Tiling::COLON = ";";
+r_Tiling::TCOLON = ";";
const char*
-r_Tiling::COMMA = ",";
+r_Tiling::TCOMMA = ",";
const char*
r_Tiling::LSQRBRA = "[";
const char*
diff --git a/rasodmg/tiling.hh b/rasodmg/tiling.hh
index e178e0a..d78ecbe 100644
--- a/rasodmg/tiling.hh
+++ b/rasodmg/tiling.hh
@@ -98,8 +98,8 @@ class r_Tiling
*/
static const char* ASTERIX;
- static const char* COLON;
- static const char* COMMA;
+ static const char* TCOLON;
+ static const char* TCOMMA;
static const char* LSQRBRA;
static const char* RSQRBRA;
static const long DefaultBase;
diff --git a/server/Makefile.am b/server/Makefile.am
index b9bbba9..a1c6ea6 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -40,6 +40,7 @@ rasserver_SOURCES=rasserver_main.cc rasserver_config.cc rasserver_entry.cc \
../include/bool.h ../include/globals.hh ../include/rasdaman.hh \
../include/stdexcept.h
rasserver_LDADD=../servercomm/libservercomm.a ../qlparser/libqlparser.a ../conversion/libconversion.a \
+ ../rasodmg/librasodmg.a \
../raslib/libraslib.a ../storagemgr/libstoragemgr.a ../reladminif/libreladminif.a \
../tilemgr/libtilemgr.a ../mddmgr/libmddmgr.a \
../catalogmgr/libcatalogmgr.a ../relmddif/librelmddif.a ../relstorageif/librelstorageif.a \
diff --git a/storagemgr/Makefile.am b/storagemgr/Makefile.am
index f019320..53d93c0 100644
--- a/storagemgr/Makefile.am
+++ b/storagemgr/Makefile.am
@@ -29,7 +29,8 @@
##################################################################
lib_LIBRARIES = libstoragemgr.a
-libstoragemgr_a_SOURCES = sstoragelayout.cc sstoragelayout.hh
+libstoragemgr_a_SOURCES = sstoragelayout.cc sstoragelayout.hh \
+ stgmddconfig.cc stgmddconfig.hh
CLEANFILES= core client.bm client.dbg client.log ir.out
diff --git a/storagemgr/sstoragelayout.cc b/storagemgr/sstoragelayout.cc
index fc7a793..0dcef0c 100644
--- a/storagemgr/sstoragelayout.cc
+++ b/storagemgr/sstoragelayout.cc
@@ -1,29 +1,21 @@
-/*
-* 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: sstoragelayout.cc
+ *
+ * MODULE: indexmgr
+ * CLASS: StorageLayout
*
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * -----------------------------------------------------------------------
+ * 10-Sep-97 furtado creation of preliminary version.
+ * 09-Oct-97 sivan set, get functions
+ * 13-Oct-97 furtado extended functionality, class hierarchy
+ * 4-Nov-98 furtado added RegDirIx< >.
+ * 13-Nov-00 hoefner startet to do something with this class
+ * 07-Jan-09 Shams add tiling set to the getLayout method
+ * 07-Jan-09 Shams add some methods for supporting tiling
* COMMENTS:
* none
*
@@ -32,6 +24,9 @@ rasdaman GmbH.
#include "sstoragelayout.hh"
#include <stdlib.h>
#include "raslib/rmdebug.hh"
+#include "rasodmg/alignedtiling.hh"
+#include "rasodmg/dirtiling.hh"
+#include "rasodmg/stattiling.hh"
const r_Bytes StorageLayout::DBSPageSize = 4096;
@@ -55,18 +50,21 @@ StorageLayout::StorageLayout(r_Index_Type ixType)
: myLayout(new DBStorageLayout())
{
setIndexType(ixType);
+ extraFeatures = new StgMddConfig();
RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout(" << ixType << ")")
}
StorageLayout::StorageLayout()
: myLayout(new DBStorageLayout())
{
+ extraFeatures = new StgMddConfig();
RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout()")
}
StorageLayout::StorageLayout(const DBStorageLayoutId& id)
: myLayout(id)
{
+ extraFeatures = new StgMddConfig();
RMDBGONCE(4, RMDebug::module_storagemgr, "StorageLayout", "StorageLayout(" << id.getOId() << ")")
}
@@ -84,6 +82,7 @@ StorageLayout::getDBStorageLayout() const
return myLayout;
}
+
r_Index_Type
StorageLayout::getIndexType() const
{
@@ -152,6 +151,45 @@ StorageLayout::getDataFormat(const r_Point& where) const
return myLayout->getDataFormat();
}
+void
+StorageLayout::setBBoxes(const vector<r_Minterval>& input) {
+ extraFeatures->setBBoxes(input);
+}
+
+void
+StorageLayout::setSubTiling()
+{extraFeatures->setSubTiling();}
+
+void
+StorageLayout::resetSubTiling()
+{extraFeatures->resetSubTiling();}
+
+void
+StorageLayout::setInterestThreshold(double i){
+ extraFeatures->setInterestThreshold(i);
+}
+
+void
+StorageLayout::setBorderThreshold(unsigned int b){
+ extraFeatures->setBorderThreshold(b);
+}
+
+void
+StorageLayout::setCellSize(int i){
+ extraFeatures->setCellSize(i);
+}
+
+
+void
+StorageLayout::setDirDecomp(vector<r_Dir_Decompose>* dir){
+ vector<r_Dir_Decompose> dec;
+ for(int i = 0 ; i < dir->size() ; ++i){
+ dec.push_back(dir->at(i));
+ }
+ extraFeatures->setDirDecompose(dec);
+}
+
+
std::vector< r_Minterval >
StorageLayout::getLayout(const r_Minterval& tileDomain)
{
@@ -169,11 +207,36 @@ StorageLayout::getLayout(const r_Minterval& tileDomain)
retval.push_back(tileDomain);
}
break;
- case r_InterestTiling:
- case r_StatisticalTiling:
- case r_AlignedTiling:
- case r_DirectionalTiling:
- case r_SizeTiling:
+ case r_InterestTiling:
+ retval = calcInterestLayout(tileDomain);
+ RMInit::logOut << "Interest Tiling chosen Everything is OK" << endl;
+ RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") Interest Tiling");
+ break;
+ case r_StatisticalTiling:
+ retval = calcStatisticLayout(tileDomain);
+ RMInit::logOut << "Statistical Tiling chosen" << endl;
+ break;
+ case r_AlignedTiling:
+ if (myLayout->getTileConfiguration().dimension() == tileDomain.dimension())
+ retval = calcAlignedLayout(tileDomain);
+ else {
+ RMInit::logOut << "Aligned Tiling chosen without Tiling Domain!\nPlease specify a Tiling Domain.\nNow using no tiling." << endl;
+ RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") Aligned Tiling without Tiling Domain");
+ retval.push_back(tileDomain);
+ }
+ break;
+
+ case r_DirectionalTiling:
+// if (myLayout->getTileConfiguration().dimension() == tileDomain.dimension())
+ retval = calcDirectionalLayout(tileDomain);
+// else {
+ RMInit::logOut << "Directional Tiling chosen. Everything is OK." << endl;
+// RMDBGMIDDLE(0, RMDebug::module_storagemgr, "StorageLayout", "getLayout(" << tileDomain << ") Directional Tiling without Tiling Domain");
+// retval.push_back(tileDomain);
+ // }
+ break;
+
+ 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);
@@ -255,6 +318,104 @@ RMDBGIF(5, RMDebug::module_storagemgr, "StorageLayout", \
RMDBGMIDDLE(1, RMDebug::module_storagemgr, "StorageLayout", *i); \
);
RMDBGEXIT(4, RMDebug::module_storagemgr, "StorageLayout", "calcRegLayout(" << tileDomain << ") " << myLayout->getOId());
+ RMInit::logOut << "CalcReg Tiling: tile number: " << retval.size() << endl;
return retval;
}
+std::vector< r_Minterval >
+StorageLayout::calcInterestLayout(const r_Minterval& tileDomain) {
+ RMInit::logOut << "Entering CalcInterest Tiling" << endl;
+ r_Interest_Tiling* tiling = new r_Interest_Tiling
+ (tileDomain.dimension(), extraFeatures->getBBoxes(), myLayout->getTileSize(), r_Interest_Tiling::SUB_TILING);
+ std::vector<r_Minterval> ret;
+ std::vector<r_Minterval>* ret1 = tiling->compute_tiles
+ (tileDomain, extraFeatures->getCellSize());
+ RMInit::logOut << "CalcInterest Tiling: tile number: " << ret1->size() << endl;
+ for (int i = 0; i < ret1->size(); i++) {
+ ret.push_back(ret1->at(i));
+ }
+ RMInit::logOut << "CalcInterest Tiling: tile number2: " << ret.size() << endl;
+ return ret;
+}
+
+std::vector< r_Minterval >
+StorageLayout::calcAlignedLayout(const r_Minterval& tileDomain) {
+ RMInit::logOut << "Entering CalcAligned Tiling" << endl;
+ r_Aligned_Tiling* tiling = new r_Aligned_Tiling
+ (myLayout->getTileConfiguration(),myLayout->getTileSize());
+ std::vector<r_Minterval> ret;
+ std::vector<r_Minterval>* ret1 = tiling->compute_tiles
+ (tileDomain, extraFeatures->getCellSize());
+ RMInit::logOut << "CalcAligned Tiling: tile number: " << ret1->size() << endl;
+ for (int i = 0; i < ret1->size(); i++) {
+ ret.push_back(ret1->at(i));
+ }
+ RMInit::logOut << "CalcAligned Tiling: tile number2: " << ret.size() << endl;
+ return ret;
+}
+
+std::vector< r_Minterval >
+StorageLayout::calcDirectionalLayout(const r_Minterval& tileDomain){
+ RMInit::logOut << "Entering CalcDir Tiling" << endl;
+ r_Dir_Tiling* dirTile ;
+ if(!extraFeatures->getSubTiling())
+ dirTile = new r_Dir_Tiling(tileDomain.dimension(),
+ extraFeatures->getDirDecompose(),myLayout->getTileSize(),
+ r_Dir_Tiling::WITHOUT_SUBTILING);
+ else
+ dirTile = new r_Dir_Tiling(tileDomain.dimension(),
+ extraFeatures->getDirDecompose(),myLayout->getTileSize(),
+ r_Dir_Tiling::WITH_SUBTILING);
+
+ std::vector<r_Minterval> ret;
+ std::vector<r_Minterval>* ret1 = dirTile->compute_tiles
+ (tileDomain, extraFeatures->getCellSize());
+ RMInit::logOut << "CalcDir Tiling: tile number: " << ret1->size() << endl;
+ for (int i = 0; i < ret1->size(); i++) {
+ ret.push_back(ret1->at(i));
+ }
+ RMInit::logOut << "End of dirTiling Method Tile numbers = "<< ret.size();
+ return ret;
+}
+
+std::vector< r_Minterval >
+StorageLayout::calcStatisticLayout(const r_Minterval& tileDomain){
+ RMInit::logOut << "Entering CalcStatistic Tiling" << endl;
+ std::vector<r_Minterval> ret;
+ RMInit::logOut << "ret is created" << endl;
+ RMInit::logOut << "bboxes are " << extraFeatures->getBBoxes().size() << endl;
+ vector<r_Minterval> temp = extraFeatures->getBBoxes();
+ RMInit::logOut << "bboxes are ok " << temp.size() << endl;
+ RMInit::logOut << "Statistic areas are "<< endl;
+ std::vector<r_Access> accesses;
+ RMInit::logOut << "Beginning of For"<< endl;
+ for(int i = 0 ; i < temp.size() ; ++i){
+ r_Minterval area = temp.at(i);
+ r_Access ac(area);
+ RMInit::logOut << ac;
+ accesses.push_back(ac);
+ }
+ RMInit::logOut << "\nStatistic End of for"<<endl;
+ unsigned int borderT;
+ double interestT;
+ if(extraFeatures->getBorderThreshold() < 0)
+ borderT = r_Stat_Tiling::DEF_BORDER_THR;
+ else
+ borderT = extraFeatures->getBorderThreshold();
+ if(extraFeatures->getInterestThreshold() < 0)
+ interestT = r_Stat_Tiling::DEF_INTERESTING_THR;
+ else
+ interestT = extraFeatures->getInterestThreshold();
+ RMInit::logOut << "Object is : " <<tileDomain.dimension() <<" "<< accesses.size() << " "<<myLayout->getTileSize()<<" "<< borderT<< " "<< interestT <<endl;
+ r_Stat_Tiling* stat = new r_Stat_Tiling(tileDomain.dimension(),accesses,
+ myLayout->getTileSize(), borderT,
+ interestT);
+ RMInit::logOut << "Object created" << endl;
+ std::vector<r_Minterval>* ret1 = stat->compute_tiles(tileDomain,extraFeatures->getCellSize());
+ RMInit::logOut << "End of CalcStatistic Tiling tile numbers = "<< ret.size() << endl;
+ for (int i = 0; i < ret1->size(); i++) {
+ ret.push_back(ret1->at(i));
+ }
+
+ return ret;
+}
diff --git a/storagemgr/sstoragelayout.hh b/storagemgr/sstoragelayout.hh
index 4ac9e79..b3e2a25 100644
--- a/storagemgr/sstoragelayout.hh
+++ b/storagemgr/sstoragelayout.hh
@@ -5,6 +5,10 @@
#include "raslib/minterval.hh"
#include "relstorageif/dbstoragelayout.hh"
+#include "rasodmg/interesttiling.hh"
+#include "rasodmg/stattiling.hh"
+#include "rasodmg/dirdecompose.hh"
+#include "storagemgr/stgmddconfig.hh"
/*
@@ -32,7 +36,16 @@ rasdaman GmbH.
/****************************************************************************
*
*
+ * INCLUDE: storagelayout.hh
*
+ * MODULE: storagemgr
+ * CLASS: StorageLayout
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * -----------------------------------------------------------------------
+ * 13-Nov-00 hoefner creation of preliminary version
+ * 07-Jan-09 Shams add tiling attributes
* COMMENTS:
*
****************************************************************************/
@@ -215,6 +228,16 @@ class StorageLayout
return the object which actually stores the option values.
*/
+ // Functions added by Andrei Aiordachioaie, to match function definitions. (17-08-2009)
+ void setBBoxes(const vector<r_Minterval>& input);
+ void setSubTiling();
+ void resetSubTiling();
+ void setInterestThreshold(double i);
+ void setBorderThreshold(unsigned int b);
+ void setCellSize(int size);
+ void setDirDecomp(vector<r_Dir_Decompose>*);
+
+
protected:
std::vector< r_Minterval > calcRegLayout(const r_Minterval& layout) const;
/*@Doc:
@@ -224,11 +247,27 @@ class StorageLayout
//@Man: Actual Parameters:
//@{
+ StgMddConfig* extraFeatures;
+ /*@Doc: actual features */
+
DBStorageLayoutId myLayout;
//@Man: Persistent Representation of a StorageLayout object.
//@{
///All parameters are stored there.
//@}
+ std::vector< r_Minterval >
+ calcInterestLayout(const r_Minterval& tileDomain);
+
+ //@Man: Actual Parameters:
+ //@{
+ std::vector< r_Minterval >
+ calcAlignedLayout(const r_Minterval&);
+
+ std::vector< r_Minterval >
+ calcDirectionalLayout(const r_Minterval&);
+
+ std::vector< r_Minterval >
+ calcStatisticLayout(const r_Minterval&);
//@}
diff --git a/storagemgr/stgmddconfig.cc b/storagemgr/stgmddconfig.cc
new file mode 100755
index 0000000..c008479
--- /dev/null
+++ b/storagemgr/stgmddconfig.cc
@@ -0,0 +1,92 @@
+#include "storagemgr/stgmddconfig.hh"
+
+using namespace std;
+
+/****************************************************************************
+ *
+ *
+ * INCLUDE: stgmddconfig.hh
+ *
+ * MODULE: qlparser
+ * CLASS: StgMddConfig
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * -----------------------------------------------------------------------
+ * 17-Aug-09 aaiordachi create class (for adding rasql tiling options)
+ * COMMENTS:
+ *
+ ****************************************************************************/
+
+StgMddConfig::StgMddConfig()
+{}
+StgMddConfig::~StgMddConfig()
+{}
+
+// Setter functions
+void StgMddConfig::setBBoxes(const vector<r_Minterval>& input)
+{
+ bboxes = input;
+}
+
+void StgMddConfig::setSubTiling()
+{
+ subTiling = true;
+}
+
+void StgMddConfig::resetSubTiling()
+{
+ subTiling = false;
+}
+
+void StgMddConfig::setInterestThreshold(double i)
+{
+ interestThreshold = i;
+}
+
+void StgMddConfig::setBorderThreshold(unsigned int b)
+{
+ borderThreshold = b;
+}
+
+void StgMddConfig::setCellSize(int size)
+{
+ cellSize = size;
+}
+
+void StgMddConfig::setDirDecompose(const vector<r_Dir_Decompose>& input)
+{
+ dirDecomp = input;
+}
+
+// Getter functions
+vector<r_Minterval>& StgMddConfig::getBBoxes()
+{
+ return bboxes;
+}
+
+bool StgMddConfig::getSubTiling()
+{
+ return subTiling;
+}
+
+double StgMddConfig::getInterestThreshold()
+{
+ return interestThreshold;
+}
+
+unsigned int StgMddConfig::getBorderThreshold()
+{
+ return borderThreshold;
+}
+
+int StgMddConfig::getCellSize()
+{
+ return cellSize;
+}
+
+vector<r_Dir_Decompose>& StgMddConfig::getDirDecompose()
+{
+ return dirDecomp;
+}
+
diff --git a/storagemgr/stgmddconfig.hh b/storagemgr/stgmddconfig.hh
new file mode 100755
index 0000000..4588715
--- /dev/null
+++ b/storagemgr/stgmddconfig.hh
@@ -0,0 +1,57 @@
+#ifndef _STORAGE_MDD_CONFIG_HH_
+#define _STORAGE_MDD_CONFIG_HH_
+
+#include <vector>
+#include "rasodmg/dirdecompose.hh"
+#include "raslib/minterval.hh"
+
+/****************************************************************************
+ *
+ *
+ * INCLUDE: stgmddconfig.hh
+ *
+ * MODULE: qlparser
+ * CLASS: StgMddConfig
+ *
+ * CHANGE HISTORY (append further entries):
+ * when who what
+ * -----------------------------------------------------------------------
+ * 17-Aug-09 aaiordachi create class (for adding rasql tiling options)
+ * COMMENTS:
+ *
+ ****************************************************************************/
+
+class StgMddConfig
+ {
+ private:
+ std::vector<r_Minterval> bboxes;
+ double interestThreshold;
+ unsigned int borderThreshold;
+ bool subTiling;
+ int cellSize;
+ std::vector<r_Dir_Decompose> dirDecomp;
+
+ public:
+
+ StgMddConfig();
+ ~StgMddConfig();
+
+ // Setter functions
+ void setBBoxes(const std::vector<r_Minterval>& input);
+ void setSubTiling();
+ void resetSubTiling();
+ void setInterestThreshold(double i);
+ void setBorderThreshold(unsigned int b);
+ void setCellSize(int size);
+ void setDirDecompose(const std::vector<r_Dir_Decompose>& input);
+
+ // Getter functions
+ std::vector<r_Minterval>& getBBoxes();
+ bool getSubTiling();
+ double getInterestThreshold();
+ unsigned int getBorderThreshold();
+ int getCellSize();
+ std::vector<r_Dir_Decompose>& getDirDecompose();
+
+ };
+#endif