summaryrefslogtreecommitdiffstats
path: root/qlparser
diff options
context:
space:
mode:
authorAndrei Aiordachioaie <a.aiordachioaie@jacobs-university.de>2009-08-25 13:33:09 +0200
committerPeter Baumann <baumann@rasdaman.org>2009-08-27 09:38:08 +0200
commitfd66ca862d4499378719e2a635c9f97df28b763d (patch)
treee11e40b69e30b4d553cd0bcdedb435849c22e0d0 /qlparser
parentbb3139b97d956a8455649af82c0f3b705d2a8e55 (diff)
downloadrasdaman-upstream-fd66ca862d4499378719e2a635c9f97df28b763d.tar.gz
rasdaman-upstream-fd66ca862d4499378719e2a635c9f97df28b763d.tar.xz
rasdaman-upstream-fd66ca862d4499378719e2a635c9f97df28b763d.zip
Tiling & Indexing options added to rasql grammar
Diffstat (limited to 'qlparser')
-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
10 files changed, 1286 insertions, 318 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