Changeset: 6a4619ae35a3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6a4619ae35a3
Modified Files:
monetdb5/modules/mal/Tests/xidlist.stable.out
monetdb5/modules/mal/xid.c
Branch: xid
Log Message:
xid.c: also detect decreasing ranges
diffs (134 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
@@ -161,12 +161,11 @@ p:70
p:188
s+:[188] 024
p:9999
+r:50 49
p:50
-r:49 50
p:50
p:48
-p:1003
-s-:[1003] 016
+r:1003 1000
p:95
p:99
p:96
@@ -187,12 +186,11 @@ p:70
p:188
s+:[188] 024
p:9999
+r:50 49
p:50
-r:49 50
p:50
p:48
-p:1003
-s-:[1003] 016
+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
@@ -26,12 +26,13 @@
#include "mal_interpreter.h"
#include "xid.h"
-#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 */
+#define XIDBASE 0
+#define XIDSETINC 1
+#define XIDSETDEC 2
+#define XIDRANGEINC 3
+#define XIDRANGEDEC 4
+#define XIDPOINT 5
+#define XIDMASK 7 /* we keep some reserve for runlength compression */
typedef oid xid;
#define SIZEOF_XID SIZEOF_OID
@@ -108,7 +109,7 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
//point++;
}
break;
- case XIDRANGE:
+ case XIDRANGEINC:
if ( (xid) col[i].value + 1 == v){
col[i].value = v;
//mnstr_printf(GDKout,"xidrange " BUNFMT " "
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
@@ -121,11 +122,32 @@ XIDencode(BUN *rtrn, XIDcolumn col, oid
//point++;
}
break;
+ case XIDRANGEDEC:
+ if ( (xid) col[i].value - 1 == v){
+ col[i].value = v;
+ //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 XIDPOINT:
if ( (xid) col[i].value + 1 == v){
- /* make a new range */
- col[i].tag = XIDRANGE;
- col[++i].tag = XIDRANGE;
+ /* make a new inc-range */
+ col[i].tag = XIDRANGEINC;
+ col[++i].tag = XIDRANGEINC;
+ col[i].value = v;
+ //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 dec-range */
+ col[i].tag = XIDRANGEDEC;
+ col[++i].tag = XIDRANGEDEC;
col[i].value = v;
//mnstr_printf(GDKout,"xidrange " BUNFMT " "
XIDFMT " " XIDFMT "\n",i, (xid) col[i-1].value, v);
//range++;
@@ -303,12 +325,18 @@ XIDdecode(BUN *rtrn, XIDcolumn col, oid
cnt++;
}
break;
- case XIDRANGE:
+ case XIDRANGEINC:
for( j = col[i].value, i++; j <= col[i].value; j++,
v++){
*o++ = v;
cnt++;
}
break;
+ case XIDRANGEDEC:
+ for( j = col[i].value, i++; j >= col[i].value; j--,
v--){
+ *o++ = v;
+ cnt++;
+ }
+ break;
case XIDPOINT:
*o++ = v;
cnt++;
@@ -434,7 +462,11 @@ XIDcolumndump(stream *f, XIDcolumn col,
case XIDSETDEC:
mnstr_printf(f,"s-:[" XIDFMT "] 0%llo",(xid)
col[i-1].value,(lng)v);
break;
- case XIDRANGE:
+ case XIDRANGEINC:
+ 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);
i++;
break;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list