Changeset: c9bb76c454ec for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c9bb76c454ec
Modified Files:
        MonetDB5/src/modules/mal/Tests/zorder.mal
        MonetDB5/src/modules/mal/zorder.mx
Branch: default
Log Message:

[mq]: zorder.patch


diffs (237 lines):

diff -r e9d9b58d5f1e -r c9bb76c454ec MonetDB5/src/modules/mal/Tests/zorder.mal
--- a/MonetDB5/src/modules/mal/Tests/zorder.mal Thu Aug 05 16:56:34 2010 +0200
+++ b/MonetDB5/src/modules/mal/Tests/zorder.mal Thu Aug 05 17:06:49 2010 +0200
@@ -21,6 +21,15 @@
 (x,y):= zorder.decode(z3); io.print(x,y);
 (x,y):= zorder.decode(z4); io.print(x,y);
 
+x := zorder.decode_x(z1);
+y := zorder.decode_y(z1); io.print(x, y);
+x := zorder.decode_x(z2);
+y := zorder.decode_y(z2); io.print(x, y);
+x := zorder.decode_x(z3);
+y := zorder.decode_y(z3); io.print(x, y);
+x := zorder.decode_x(z4);
+y := zorder.decode_y(z4); io.print(x, y);
+
 bx:= bat.new(:oid,:int);
 bat.append(bx,0);
 bat.append(bx,1);
@@ -62,6 +71,9 @@
 io.print(bz);
 (cx,cy):= zorder.decode(bz);
 io.print(cx,cy);
+dx:= zorder.decode_x(bz);
+dy:= zorder.decode_y(bz);
+io.print(dx,dy);
 
 # taking a slice
 bs:= zorder.slice(1,1,3,3);
diff -r e9d9b58d5f1e -r c9bb76c454ec MonetDB5/src/modules/mal/zorder.mx
--- a/MonetDB5/src/modules/mal/zorder.mx        Thu Aug 05 16:56:34 2010 +0200
+++ b/MonetDB5/src/modules/mal/zorder.mx        Thu Aug 05 17:06:49 2010 +0200
@@ -49,6 +49,22 @@
 address ZORDbatdecode_int_oid
 comment "Derive the z-order pair";
 
+command decode_x(z:oid)(x:int)
+address ZORDdecode_int_oid_x
+comment "Derive the z-order x-coordinate";
+
+command decode_x(z:bat[:oid,:oid]):bat[:oid,:int]
+address ZORDbatdecode_int_oid_x
+comment "Derive the z-order x-coordinate";
+
+command decode_y(z:oid)(y:int)
+address ZORDdecode_int_oid_y
+comment "Derive the z-order y-coordinate";
+
+command decode_y(z:bat[:oid,:oid]):bat[:oid,:int]
+address ZORDbatdecode_int_oid_y
+comment "Derive the z-order y-coordinate";
+
 command slice(xb:int, yb:int, xt:int, yt:int ):bat[:oid,:oid]
 address ZORDslice_int
 comment "Extract the Z-order indices between two points";
@@ -71,7 +87,11 @@
 zorder_export str ZORDencode_int_oid(oid *z, int *x, int *y);
 zorder_export str ZORDbatencode_int_oid(int *z, int *x, int *y);
 zorder_export str ZORDdecode_int_oid(int *x, int *y, oid *z);
+zorder_export str ZORDdecode_int_oid_x(int *x, oid *z);
+zorder_export str ZORDdecode_int_oid_y(int *y, oid *z);
 zorder_export str ZORDbatdecode_int_oid(int *x, int *y, int *z);
+zorder_export str ZORDbatdecode_int_oid_x(int *x, int *z);
+zorder_export str ZORDbatdecode_int_oid_y(int *y, int *z);
 zorder_export str ZORDslice_int(int *r, int *xb, int *yb, int *xt, int *yt);
 
 #endif /* _ZORDER_H */
@@ -113,6 +133,31 @@
        *x = xv;
        *y = yv;
 }
+static inline void zdeco...@1_@2_x(@1 *x, @2 *z)
+{
+       @1 xv = 0, mask =1;
+       @2 zv = *z;
+       int i;
+       for ( i = 0; i < (int) (8 * sizeof(@2)); i+= 2) {
+               xv |= ((zv & 1) * mask);
+               zv >>= 2;
+               mask <<=1;
+       }
+       *x = xv;
+}
+static inline void zdeco...@1_@2_y(@1 *y, @2 *z)
+{
+       @1 yv=0, mask =1;
+       @2 zv = *z;
+       int i;
+       for ( i = 0; i < (int) (8 * sizeof(@2)); i+= 2) {
+               zv >>= 1;
+               yv |= ((zv & 1) * mask);
+               zv >>= 1;
+               mask <<=1;
+       }
+       *y = yv;
+}
 @c
 @:Zcode(int,oid)@
 
@@ -130,6 +175,20 @@
        return MAL_SUCCEED;
 }
 
+str 
+ZORDdecode_int_oid_x(int *x, oid *z)
+{
+       Zdecode_int_oid_x(x,z);
+       return MAL_SUCCEED;
+}
+
+str 
+ZORDdecode_int_oid_y(int *y, oid *z)
+{
+       Zdecode_int_oid_y(y,z);
+       return MAL_SUCCEED;
+}
+
 str
 ZORDbatencode_int_oid(int *zbid, int *xbid, int *ybid)
 {
@@ -291,6 +350,116 @@
        return MAL_SUCCEED;
 }
 
+str
+ZORDbatdecode_int_oid_x(int *xbid, int *zbid)
+{
+       BAT *bx,*bz;
+       oid *z, *q;
+       int *x;
+
+       bz = BATdescriptor(*zbid);
+       if ( bz == 0 )
+               throw(OPTIMIZER, "zorder.decode", RUNTIME_OBJECT_MISSING);
+       
+       bx = BATnew(TYPE_void, TYPE_int, BATcount(bz));
+       if ( bx == 0 ){
+               BBPunfix(bz->batCacheid);
+               throw(OPTIMIZER, "zorder.decode", RUNTIME_OBJECT_MISSING);
+       }
+       
+       z = (oid *) Tloc(bz, BUNfirst(bz));
+       q = (oid *) Tloc(bz, BUNlast(bz));
+       x = (int *) Tloc(bx, BUNfirst(bx));
+
+       BATaccessBegin(bz, USE_TAIL, MMAP_SEQUENTIAL);
+       if ( bz->T->nonil ){
+               for ( ; z<q; z++,x++)
+                       Zdecode_int_oid_x(x,z);
+       } else {
+               for ( ; z<q; z++,x++)
+               if ( *z == oid_nil) {
+                       *x = int_nil;
+               } else
+                       Zdecode_int_oid_x(x,z);
+       } 
+
+       BATaccessEnd(bz, USE_TAIL, MMAP_SEQUENTIAL);
+
+       if (!(bx->batDirty&2)) 
+               bx = BATsetaccess(bx, BAT_READ);
+       BATsetcount(bx, BATcount(bz));
+       BATseqbase(bx, bz->hseqbase);
+       bx->hsorted = 1;
+       bx->tsorted = 0;
+       bx->H->nonil = 1;
+       bx->T->nonil = bz->T->nonil;
+
+       if (bx->htype != bz->htype) {
+        BAT *r = VIEWcreate(bz,bx);
+        BBPreleaseref(bx->batCacheid);
+        bx = r;
+    }
+
+       BBPunfix(bz->batCacheid);
+       BBPkeepref(*xbid = bx->batCacheid);
+       return MAL_SUCCEED;
+}
+
+str
+ZORDbatdecode_int_oid_y(int *ybid, int *zbid)
+{
+       BAT *by,*bz;
+       oid *z, *q;
+       int *y;
+
+       bz = BATdescriptor(*zbid);
+       if ( bz == 0 )
+               throw(OPTIMIZER, "zorder.decode", RUNTIME_OBJECT_MISSING);
+       
+       by = BATnew(TYPE_void, TYPE_int, BATcount(bz));
+       if ( by == 0 ){
+               BBPunfix(bz->batCacheid);
+               throw(OPTIMIZER, "zorder.decode", RUNTIME_OBJECT_MISSING);
+       }
+       
+       z = (oid *) Tloc(bz, BUNfirst(bz));
+       q = (oid *) Tloc(bz, BUNlast(bz));
+       y = (int *) Tloc(by, BUNfirst(by));
+
+       BATaccessBegin(bz, USE_TAIL, MMAP_SEQUENTIAL);
+       if ( bz->T->nonil ){
+               for ( ; z<q; z++,y++)
+                       Zdecode_int_oid_y(y,z);
+       } else {
+               for ( ; z<q; z++,y++)
+               if ( *z == oid_nil) {
+                       *y = int_nil;
+               } else
+                       Zdecode_int_oid_y(y,z);
+       } 
+
+       BATaccessEnd(bz, USE_TAIL, MMAP_SEQUENTIAL);
+
+       if (!(by->batDirty&2)) 
+               by = BATsetaccess(by, BAT_READ);
+       BATsetcount(by, BATcount(bz));
+       BATseqbase(by, bz->hseqbase);
+       by->hsorted = 1;
+       by->tsorted = 0;
+       by->H->nonil = 1;
+       by->T->nonil = bz->T->nonil;
+
+       if (by->htype != bz->htype) {
+        BAT *r = VIEWcreate(bz,by);
+        BBPreleaseref(by->batCacheid);
+        by = r;
+    }
+
+       BBPunfix(bz->batCacheid);
+       BBPkeepref(*ybid = by->batCacheid);
+       return MAL_SUCCEED;
+}
+
 zorder_export 
 str ZORDslice_int(int *r, int *xb, int *yb, int *xt, int *yt)
 {
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to