Changeset: 105cc0b8a397 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=105cc0b8a397
Added Files:
        monetdb5/modules/mal/Tests/mosaic_prefix.mal
        monetdb5/modules/mal/mosaic_prefix.c
        monetdb5/modules/mal/mosaic_prefix.h
Modified Files:
        monetdb5/modules/mal/Makefile.ag
        monetdb5/modules/mal/Tests/All
        monetdb5/modules/mal/mosaic.c
        monetdb5/modules/mal/mosaic.h
Branch: mosaic
Log Message:

Checkpoint of prefix compression


diffs (truncated from 980 to 300 lines):

diff --git a/monetdb5/modules/mal/Makefile.ag b/monetdb5/modules/mal/Makefile.ag
--- a/monetdb5/modules/mal/Makefile.ag
+++ b/monetdb5/modules/mal/Makefile.ag
@@ -71,6 +71,7 @@ lib_mal = {
                mosaic_delta.c mosaic_delta.h \
                mosaic_linear.c mosaic_linear.h \
                mosaic_variance.c mosaic_variance.h \
+               mosaic_prefix.c mosaic_prefix.h \
                calc.c batcalc.c
 }
 
diff --git a/monetdb5/modules/mal/Tests/All b/monetdb5/modules/mal/Tests/All
--- a/monetdb5/modules/mal/Tests/All
+++ b/monetdb5/modules/mal/Tests/All
@@ -75,6 +75,7 @@ mosaic_dictionary
 mosaic_zone
 mosaic_delta
 mosaic_linear
+mosaic_prefix
 
 mosaic_literal_double
 
diff --git a/monetdb5/modules/mal/Tests/mosaic_prefix.mal 
b/monetdb5/modules/mal/Tests/mosaic_prefix.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/mal/Tests/mosaic_prefix.mal
@@ -0,0 +1,33 @@
+b:= bat.new(:oid,:int);
+#bat.append(b,50);
+#bat.append(b,51);
+#bat.append(b,51);
+#bat.append(b,51);
+#bat.append(b,51);
+#bat.append(b,51);
+#bat.append(b,51);
+#bat.append(b,60);
+#bat.append(b,67);
+#bat.append(b,67);
+#bat.append(b,67);
+#bat.append(b,67);
+#bat.append(b,67);
+#bat.append(b,67);
+#bat.append(b,67);
+bat.append(b,255);
+bat.append(b,256);
+bat.append(b,256);
+bat.append(b,256);
+bat.append(b,256);
+bat.append(b,256);
+bat.append(b,255);
+bat.append(b,255);
+bat.append(b,255);
+bat.append(b,255);
+bat.append(b,255);
+
+io.print(b);
+x:= mosaic.compress(b,"prefix");
+#mosaic.dump(x);
+z:= mosaic.decompress(x);
+io.print(z);
diff --git a/monetdb5/modules/mal/mosaic.c b/monetdb5/modules/mal/mosaic.c
--- a/monetdb5/modules/mal/mosaic.c
+++ b/monetdb5/modules/mal/mosaic.c
@@ -33,8 +33,9 @@
 #include "mosaic_delta.h"
 #include "mosaic_linear.h"
 #include "mosaic_variance.h"
+#include "mosaic_prefix.h"
 
-static char 
*filtername[]={"literal","runlength","dictionary","delta","linear","variance","zone","EOL"};
+static char 
*filtername[]={"literal","runlength","dictionary","delta","linear","variance","prefix","zone","EOL"};
 
 static void
 MOSinit(MOStask task, BAT *b){
@@ -100,6 +101,10 @@ MOSdumpInternal(Client cntxt, BAT *b){
                        MOSdump_delta(cntxt,task);
                        MOSadvance_delta(cntxt,task);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSdump_prefix(cntxt,task);
+                       MOSadvance_prefix(cntxt,task);
+                       break;
                case MOSAIC_VARIANCE:
                        MOSdump_variance(cntxt,task);
                        MOSadvance_variance(cntxt,task);
@@ -339,6 +344,7 @@ MOScompressInternal(Client cntxt, int *r
                                factor = fac;
                        }
                }
+/*
                if ( filter[MOSAIC_VARIANCE]){
                        fac = MOSestimate_variance(cntxt,task);
                        if (fac > factor){
@@ -346,7 +352,6 @@ MOScompressInternal(Client cntxt, int *r
                                factor = fac;
                        }
                }
-/*
                if ( filter[MOSAIC_ZONE]){
                        fac = MOSestimate_zone(cntxt,task);
                        if (fac > factor){
@@ -362,6 +367,13 @@ MOScompressInternal(Client cntxt, int *r
                                factor = fac;
                        }
                }
+               if ( filter[MOSAIC_PREFIX]){
+                       fac = MOSestimate_prefix(cntxt,task);
+                       if ( fac > factor ){
+                               cand = MOSAIC_PREFIX;
+                               factor = fac;
+                       }
+               }
                if ( filter[MOSAIC_LINEAR]){
                        fac = MOSestimate_linear(cntxt,task);
                        if ( fac >factor){
@@ -376,6 +388,7 @@ MOScompressInternal(Client cntxt, int *r
                case MOSAIC_DICT:
                case MOSAIC_DELTA:
                case MOSAIC_LINEAR:
+               case MOSAIC_PREFIX:
                        // close the non-compressed part
                        if( (MOSgetTag(task->blk) == MOSAIC_NONE || 
MOSgetTag(task->blk) == MOSAIC_ZONE) && MOSgetCnt(task->blk) ){
                                MOSupdateHeader(cntxt,task);
@@ -430,6 +443,15 @@ MOScompressInternal(Client cntxt, int *r
                        MOSsetTag(task->blk,MOSAIC_EOL);
                        task->dst = ((char*) task->blk)+ MosaicBlkSize;
                        break;
+               case MOSAIC_PREFIX:
+                       MOScompress_prefix(cntxt,task);
+                       MOSupdateHeader(cntxt,task);
+                       //prepare new block header
+                       task->elm -= MOSgetCnt(task->blk);
+                       MOSadvance_prefix(cntxt,task);
+                       MOSsetTag(task->blk,MOSAIC_EOL);
+                       task->dst = ((char*) task->blk)+ MosaicBlkSize;
+                       break;
                case MOSAIC_LINEAR:
                        MOScompress_linear(cntxt,task);
                        MOSupdateHeader(cntxt,task);
@@ -613,6 +635,10 @@ MOSdecompressInternal(Client cntxt, int 
                        MOSdecompress_delta(cntxt,task);
                        MOSskip_delta(cntxt,task);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSdecompress_prefix(cntxt,task);
+                       MOSskip_prefix(cntxt,task);
+                       break;
                case MOSAIC_LINEAR:
                        MOSdecompress_linear(cntxt,task);
                        MOSskip_linear(cntxt,task);
@@ -829,6 +855,9 @@ MOSsubselect(Client cntxt, MalBlkPtr mb,
                case MOSAIC_DELTA:
                        MOSsubselect_delta(cntxt,task,low,hgh,li,hi,anti);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSsubselect_prefix(cntxt,task,low,hgh,li,hi,anti);
+                       break;
                case MOSAIC_LINEAR:
                        MOSsubselect_linear(cntxt,task,low,hgh,li,hi,anti);
                        break;
@@ -953,6 +982,9 @@ str MOSthetasubselect(Client cntxt, MalB
                case MOSAIC_DELTA:
                        MOSthetasubselect_delta(cntxt,task,low,*oper);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSthetasubselect_prefix(cntxt,task,low,*oper);
+                       break;
                case MOSAIC_LINEAR:
                        MOSthetasubselect_linear(cntxt,task,low,*oper);
                        break;
@@ -1093,6 +1125,9 @@ str MOSleftfetchjoin(Client cntxt, MalBl
                case MOSAIC_DELTA:
                        MOSleftfetchjoin_delta(cntxt, task);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSleftfetchjoin_prefix(cntxt, task);
+                       break;
                case MOSAIC_LINEAR:
                        MOSleftfetchjoin_linear(cntxt, task);
                        break;
@@ -1218,6 +1253,9 @@ MOSjoin(Client cntxt, MalBlkPtr mb, MalS
                case MOSAIC_DELTA:
                        MOSjoin_delta(cntxt, task);
                        break;
+               case MOSAIC_PREFIX:
+                       MOSjoin_prefix(cntxt, task);
+                       break;
                case MOSAIC_LINEAR:
                        MOSjoin_linear(cntxt, task);
                        break;
diff --git a/monetdb5/modules/mal/mosaic.h b/monetdb5/modules/mal/mosaic.h
--- a/monetdb5/modules/mal/mosaic.h
+++ b/monetdb5/modules/mal/mosaic.h
@@ -39,15 +39,16 @@
 #define MIN_INPUT_COUNT 1
 
 /* The compressor kinds currently hardwired */
-#define MOSAIC_METHODS 7
+#define MOSAIC_METHODS 8
 #define MOSAIC_NONE     0              // no compression at all
 #define MOSAIC_RLE      1              // use run-length encoding
 #define MOSAIC_DICT     2              // local dictionary encoding
 #define MOSAIC_DELTA   3               // use delta encoding
 #define MOSAIC_LINEAR  4               // use an encoding for a linear sequence
 #define MOSAIC_VARIANCE        5               // adaptive dictionary over 
deltas
-#define MOSAIC_ZONE            6               // adaptive zone map over 
non-compressed data
-#define MOSAIC_EOL             7               // marker for the last block
+#define MOSAIC_PREFIX  6               // prefix/postfix bitwise compression
+#define MOSAIC_ZONE            7               // adaptive zone map over 
non-compressed data
+#define MOSAIC_EOL             9               // marker for the last block
 
 //Compression should have a significant reduction to apply.
 #define COMPRESS_THRESHOLD 50   //percent
diff --git a/monetdb5/modules/mal/mosaic_prefix.c 
b/monetdb5/modules/mal/mosaic_prefix.c
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/mal/mosaic_prefix.c
@@ -0,0 +1,715 @@
+/*
+ * The contents of this file are subject to the MonetDB Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.monetdb.org/Legal/MonetDBLicense
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is the MonetDB Database System.
+ *
+ * The Initial Developer of the Original Code is CWI.
+ * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
+ *                * Copyright August 2008-2014 MonetDB B.V.
+ * All Rights Reserved.
+ */
+
+/*
+ * (c)2014 author Martin Kersten
+ * Blocked bit_ prefix compression
+ */
+
+#include "monetdb_config.h"
+#include "mosaic.h"
+#include "mosaic_prefix.h"
+
+/* Beware, the dump routines use the compressed part of the task */
+void
+MOSdump_prefix(Client cntxt, MOStask task)
+{
+       MosaicBlk blk= task->blk;
+       void *val = (void*)(((char*) blk) + MosaicBlkSize);
+
+       mnstr_printf(cntxt->fdout,"#rle "BUNFMT" ", MOSgetCnt(blk));
+       switch(task->type){
+       case TYPE_bte:
+               mnstr_printf(cntxt->fdout,"bte %hhd", *(bte*) val); break;
+       case TYPE_sht:
+               mnstr_printf(cntxt->fdout,"sht %hd", *(sht*) val); break;
+       case TYPE_int:
+               mnstr_printf(cntxt->fdout,"int %d", *(int*) val); break;
+       case  TYPE_oid:
+               mnstr_printf(cntxt->fdout,"oid "OIDFMT, *(oid*) val); break;
+       case  TYPE_lng:
+               mnstr_printf(cntxt->fdout,"lng "LLFMT, *(lng*) val); break;
+#ifdef HAVE_HGE
+       case  TYPE_hge:
+               mnstr_printf(cntxt->fdout,"hge %.40g", (dbl) *(hge*) val); 
break;
+#endif
+       case  TYPE_wrd:
+               mnstr_printf(cntxt->fdout,"wrd "SZFMT, *(wrd*) val); break;
+       case TYPE_flt:
+               mnstr_printf(cntxt->fdout,"flt  %f", *(flt*) val); break;
+       case TYPE_dbl:
+               mnstr_printf(cntxt->fdout,"flt  %f", *(dbl*) val); break;
+       case TYPE_str:
+               mnstr_printf(cntxt->fdout,"str TBD"); break;
+       default:
+               if( task->type == TYPE_date)
+                       mnstr_printf(cntxt->fdout,"date %d ", *(int*) val); 
+               if( task->type == TYPE_daytime)
+                       mnstr_printf(cntxt->fdout,"daytime %d ", *(int*) val);
+               if( task->type == TYPE_timestamp)
+                       mnstr_printf(cntxt->fdout,"int "LLFMT, *(lng*) val); 
+       }
+       mnstr_printf(cntxt->fdout,"\n");
+}
+
+void
+MOSadvance_prefix(Client cntxt, MOStask task)
+{
+       int bits, bytes;
+       (void) cntxt;
+
+       task->start += MOSgetCnt(task->blk);
+       switch(ATOMsize(task->type)){
+       case 4:
+               { int *dst = (int*)  (((char*) task->blk) + MosaicBlkSize);
+                 int mask = *dst++;
+                 int val = *dst++;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to