Changeset: b3f9ce57fd22 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b3f9ce57fd22
Modified Files:
monetdb5/modules/mal/Tests/xidlist.stable.out
monetdb5/modules/mal/xid.c
Branch: xid
Log Message:
xid.c: also detect constant/equality ranges, i.e., runlength compression
diffs (131 lines):
diff --git a/monetdb5/modules/mal/Tests/xidlist.stable.out
b/monetdb5/modules/mal/Tests/xidlist.stable.out
--- a/monetdb5/modules/mal/Tests/xidlist.stable.out
+++ b/monetdb5/modules/mal/Tests/xidlist.stable.out
@@ -154,18 +154,17 @@ end main;
[ 79@0, 1290@0 ]
#xid, 83, tail compress, 80,56, clk 3 usec
column first 57, size 57,
-r:0 3
+r+:0 3
p:5
p:7
p:70
p:188
s+:[188] 024
p:9999
-r:50 49
-p:50
-p:50
+r-:50 49
+r=:50 2
p:48
-r:1003 1000
+r-:1003 1000
p:95
p:99
p:96
@@ -179,18 +178,17 @@ p:1140
s-:[1140] 020010004002000
p:1250
s+:[1250] 020010004002000
-r:0 3
+r+:0 3
p:5
p:7
p:70
p:188
s+:[188] 024
p:9999
-r:50 49
-p:50
-p:50
+r-:50 49
+r=:50 2
p:48
-r:1003 1000
+r-:1003 1000
p:95
p:99
p:96
diff --git a/monetdb5/modules/mal/xid.c b/monetdb5/modules/mal/xid.c
--- a/monetdb5/modules/mal/xid.c
+++ b/monetdb5/modules/mal/xid.c
@@ -31,9 +31,9 @@
#define XIDSETDEC 2
#define XIDRANGEINC 3
#define XIDRANGEDEC 4
-#define XIDPOINT 5
+#define XIDRANGEEQ 5
+#define XIDPOINT 6
/* must be < 2^XID_TAG_BITS i.e. < 1<<XID_TAG_BITS */
-/* we keep some reserve for runlength compression */
typedef oid xid;
#define SIZEOF_XID SIZEOF_OID
@@ -110,6 +110,19 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
//point++;
}
break;
+ case XIDRANGEEQ:
+ if ( (xid) col[i-1].value == v && col[i].value <
XID_VAL_MAX){
+ col[i].value++;
+ //mnstr_printf(GDKout,"xidrange " BUNFMT " "
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+ } else {
+ /* fall back to point if spread to large */
+ i++;
+ col[i].tag = XIDPOINT;
+ col[i].value = v;
+ //mnstr_printf(GDKout,"xidpoint " BUNFMT " "
XIDFMT "\n",i,v);
+ //point++;
+ }
+ break;
case XIDRANGEINC:
if ( (xid) col[i].value + 1 == v){
col[i].value = v;
@@ -137,6 +150,14 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
}
break;
case XIDPOINT:
+ if ( (xid) col[i].value == v){
+ /* make a new inc-range */
+ col[i].tag = XIDRANGEEQ;
+ col[++i].tag = XIDRANGEEQ;
+ col[i].value = 2;
+ //mnstr_printf(GDKout,"xidrange " BUNFMT " "
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
+ //range++;
+ } else
if ( (xid) col[i].value + 1 == v){
/* make a new inc-range */
col[i].tag = XIDRANGEINC;
@@ -326,6 +347,12 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid
cnt++;
}
break;
+ case XIDRANGEEQ:
+ for( j = 0, i++; j < col[i].value; j++){
+ *o++ = v;
+ cnt++;
+ }
+ break;
case XIDRANGEINC:
for( j = col[i].value, i++; j <= col[i].value; j++,
v++){
*o++ = v;
@@ -463,12 +490,16 @@ XIDcolumndump(stream *f, XIDcolumn col,
case XIDSETDEC:
mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid)
col[i-1].value,(lng)v);
break;
+ case XIDRANGEEQ:
+ mnstr_printf(f,"r=:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
+ i++;
+ break;
case XIDRANGEINC:
- mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
+ mnstr_printf(f,"r+:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
i++;
break;
case XIDRANGEDEC:
- mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
+ mnstr_printf(f,"r-:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
i++;
break;
case XIDPOINT:
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list