Changeset: edaf511f333f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=edaf511f333f
Modified Files:
monetdb5/modules/mal/Tests/xidlist.stable.out
monetdb5/modules/mal/xid.c
Branch: xid
Log Message:
xid.c: also detect strictly decreasing sets (sequences)
diffs (214 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
@@ -152,71 +152,61 @@ end main;
[ 77@0, 1270@0 ]
[ 78@0, 1280@0 ]
[ 79@0, 1290@0 ]
-#xid, 83, tail compress, 80,68, clk 3 usec
-column first 69, size 69,
+#xid, 83, tail compress, 80,56, clk 3 usec
+column first 57, size 57,
r:0 3
p:5
p:7
p:70
p:188
-s:[188] 024
+s+:[188] 024
p:9999
p:50
r:49 50
p:50
p:48
p:1003
-p:1002
-p:1001
-p:1000
+s-:[1003] 016
p:95
p:99
p:96
p:98
p:97
-p:94
-p:90
+s-:[97] 0210
p:93
-r:91 92
+p:91
+p:92
p:1140
-p:1130
-p:1120
-p:1110
-p:1100
+s-:[1140] 020010004002000
p:1250
-s:[1250] 020010004002000
+s+:[1250] 020010004002000
r:0 3
p:5
p:7
p:70
p:188
-s:[188] 024
+s+:[188] 024
p:9999
p:50
r:49 50
p:50
p:48
p:1003
-p:1002
-p:1001
-p:1000
+s-:[1003] 016
p:95
p:99
p:96
p:98
p:97
-p:94
-p:90
+s-:[97] 0210
p:93
-r:91 92
+p:91
+p:92
p:1140
-p:1130
-p:1120
-p:1110
-p:1100
+s-:[1140] 020010004002000
p:1250
-s:[1250] 020010004002000
-#xid, 83, decompress, 69, 80, clk 2 usec
+s+:[1250] 020010004002000
+#xid, 83, decompress, 57, 80, clk 2 usec
#-----------------#
# h t # name
# void oid # type
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
@@ -26,11 +26,12 @@
#include "mal_interpreter.h"
#include "xid.h"
-#define XIDBASE 0
-#define XIDSET 1
-#define XIDRANGE 2
-#define XIDPOINT 3
-#define XIDMASK 7 /* we keep some reserve for runlength compression */
+#define XIDBASE 0
+#define XIDSETINC 1
+#define XIDSETDEC 2
+#define XIDRANGE 3
+#define XIDPOINT 4
+#define XIDMASK 7 /* we keep some reserve for runlength compression */
typedef oid xid;
#define SIZEOF_XID SIZEOF_OID
@@ -63,7 +64,7 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
col[i].value = v;
//mnstr_printf(GDKout,"xidpoint " BUNFMT " " XIDFMT
"\n",i,v);
break;
- case XIDSET:
+ case XIDSETINC:
/* works only for strictly increasing sets (sequences);
* otherwise, we loose order information
*/
@@ -85,6 +86,28 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
//point++;
}
break;
+ case XIDSETDEC:
+ /* works only for strictly decreasing sets (sequences);
+ * otherwise, we loose order information
+ */
+ if ( v < prev && v > (xid) col[i-1].value -
XID_VAL_BITS ) {
+ col[i].value |= ( ((xid)1)<< (col[i-1].value -
v));
+ scnt++;
+ prev= v;
+ //mnstr_printf(GDKout,"xidset " BUNFMT " "
XIDFMT "\n",i,(xid) (v - col[i-1].value));
+ } else {
+ if (scnt == 1) {
+ col[i].tag = XIDPOINT;
+ col[i].value = prev;
+ scnt =0;
+ }
+ i++;
+ col[i].tag = XIDPOINT;
+ col[i].value = v;
+ //mnstr_printf(GDKout,"xidpoint " BUNFMT " "
XIDFMT "\n",i,v);
+ //point++;
+ }
+ break;
case XIDRANGE:
if ( (xid) col[i].value + 1 == v){
col[i].value = v;
@@ -110,12 +133,22 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
if ( v > (xid) col[i].value && v < (xid) col[i].value +
XID_VAL_BITS ){
/* make a new set */
i++;
- col[i].tag = XIDSET;
+ col[i].tag = XIDSETINC;
scnt = 1;
prev = v;
col[i].value = ((xid)1) << (v -col[i-1].value);
//mnstr_printf(GDKout,"xidset " BUNFMT " "
XIDFMT "\n",i,(xid) (v- col[i-1].value));
//set++;
+ } else
+ if ( v < (xid) col[i].value && v > (xid) col[i].value -
XID_VAL_BITS ){
+ /* make a new set */
+ i++;
+ col[i].tag = XIDSETDEC;
+ scnt = 1;
+ prev = v;
+ col[i].value = ((xid)1) << (col[i-1].value - v);
+ //mnstr_printf(GDKout,"xidset " BUNFMT " "
XIDFMT "\n",i,(xid) (v- col[i-1].value));
+ //set++;
} else {
i++;
col[i].tag = XIDPOINT;
@@ -252,7 +285,7 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid
throw(MAL, "xid.decompress", "result BAT capacity
exceeded in XIDdecode()");
v = col[i].value;
switch ( col[i].tag & XIDMASK ) {
- case XIDSET:
+ case XIDSETINC:
v= col[i-1].value;
for ( j=0; j< XID_VAL_BITS; j++)
if ( col[i].value & (((xid)1)<<j)){
@@ -261,6 +294,15 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid
cnt++;
}
break;
+ case XIDSETDEC:
+ v= col[i-1].value;
+ for ( j=0; j< XID_VAL_BITS; j++)
+ if ( col[i].value & (((xid)1)<<j)){
+ w= v-j;
+ *o++ = w;
+ cnt++;
+ }
+ break;
case XIDRANGE:
for( j = col[i].value, i++; j <= col[i].value; j++,
v++){
*o++ = v;
@@ -386,8 +428,11 @@ XIDcolumndump(stream *f, XIDcolumn col,
case XIDBASE:
mnstr_printf(f,"x:" XIDFMT "", v);
break;
- case XIDSET:
- mnstr_printf(f,"s:[" XIDFMT "] 0%llo",(xid)
col[i-1].value,(lng)v);
+ case XIDSETINC:
+ mnstr_printf(f,"s+:[" XIDFMT "] 0%llo",(xid)
col[i-1].value,(lng)v);
+ break;
+ case XIDSETDEC:
+ mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid)
col[i-1].value,(lng)v);
break;
case XIDRANGE:
mnstr_printf(f,"r:" XIDFMT " " XIDFMT "", v, (xid)
col[i+1].value);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list