Changeset: 0777caac6997 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0777caac6997
Modified Files:
        monetdb5/modules/mal/extensions.c
        monetdb5/modules/mal/extensions.h
        monetdb5/modules/mal/extensions.mal
Branch: headless
Log Message:

Iterator over column elements
Should be furter improved!


diffs (186 lines):

diff --git a/monetdb5/modules/mal/extensions.c 
b/monetdb5/modules/mal/extensions.c
--- a/monetdb5/modules/mal/extensions.c
+++ b/monetdb5/modules/mal/extensions.c
@@ -175,7 +175,7 @@
  * The granule size may differ in each call.
 */
 str
-CHPhasMoreElements(oid *res, int *vid, int *bid, lng *granule)
+CHPhasMoreChunks(oid *res, int *vid, int *bid, lng *granule)
 {
        COL *b, *view;
        oid i;
@@ -195,7 +195,7 @@
                CBPreleaseref(view);
                return MAL_SUCCEED;
        }
-       /* printf("set bat chunk bound to " BUNFMT " - " BUNFMT " \n",
+       /* printf("set bat chunk bound to " OIDFMT " - " OIDFMT " \n",
           i, i+(oid) *granule-1); */
        VIEWbounds(b, view, i, i + (oid) * granule);
        COLseqbase(view, i - 1);
@@ -205,51 +205,94 @@
        return MAL_SUCCEED;
 }
 
-/* 
- * The  COL-stream manipulate a long handle, i.e.
+/*
+ * The OID- stream manipulate a long handle, i.e.
  * the destination variable. It assumes it has been set to
  * zero as part of runtime stack initialization. Subsequently,
  * it fetches a bun and returns the increment to the control
  * variable. If it returns zero the control variable has been reset
  * to zero and end of stream has been reached.
 */
-
+static ptr
+COLvalue(COL *b, oid o)
+{
+       switch( COLtype(b)){
+       case TYPE_bte:
+               return (ptr)(((bte*)COLbase(b))+o);
+       case TYPE_sht:
+               return (ptr)(((sht*)COLbase(b))+o);
+       case TYPE_int:
+               return (ptr)(((int*)COLbase(b))+o);
+       case TYPE_lng:
+               return (ptr)(((lng*)COLbase(b))+o);
+       case TYPE_flt:
+               return (ptr)(((flt*)COLbase(b))+o);
+       case TYPE_dbl:
+               return (ptr)(((dbl*)COLbase(b))+o);
+       case TYPE_str:
+               return (ptr)COLget_str(b,o);
+       default:
+               return NULL;
+       }
+}
 str
-CHPbunHasMoreElements(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+CHPnewIterator(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       COLiter bi;
        COL *b;
-       lng *cursor;
-       oid yy, o;
-       bat *bid;
-       ValPtr head;
+       oid *cursor;
+       int *bid;
+       ValPtr val;
+       oid o;
+       str msg;
 
        (void) cntxt;
-       cursor = (lng *) getArgReference(stk, pci, 0);
-       head = getArgReference(stk,pci,1); 
-       bid = (bat *) getArgReference(stk, pci, 2);
+       (void) mb;
+       cursor = (oid *) getArgReference(stk, pci, 0);
+       val = getArgReference(stk,pci,1); 
+       bid = (int *) getArgReference(stk, pci, 2);
 
-       if ((b = COLdescriptor(*bid)) == NULL) 
-               throw(MAL, "chop.newChunkMoreElements", INTERNAL_COL_ACCESS);
+       if (( msg= getCOLdescriptor(&b,bid)) ) 
+               throwagain(MAL, "chop.newChunkMoreElements", msg);
 
-       /* get head = ... tail = ... */
-       assert(0 <= *cursor && *cursor < (lng) BUN_MAX);
-       yy = (oid)*cursor + 1;
-       *cursor = yy;
-
-       if (yy >= COLlast(b)) {
-               *cursor = -1;
+       if (COLcount(b) == 0) {
+               *cursor = oid_nil;
                CBPreleaseref(b);
                return MAL_SUCCEED;
        }
-       bi = col_iterator(b);
-       if( COLtype(b) == TYPE_void){
-               o= (oid) (yy - COLfirst(b)+  b->seqbase);
-               VALinit(head, TYPE_oid, &o);
-       } else {
-               assert(b->type == getArgType(mb,pci,1).type);
-               VALinit(head, getArgType(mb, pci, 1).type, BUNhead(bi, yy));
-       }
+       *cursor = o =  COLfirst(b);
+       VALinit(val, COLtype(b), COLvalue(b, o));
        CBPreleaseref(b);
        return MAL_SUCCEED;
 }
+
+str
+CHPhasMoreElements(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       COL *b;
+       oid *cursor;
+       int *bid;
+       ValPtr val;
+       oid o;
+       str msg;
+
+       (void) cntxt;
+       (void) mb;
+       cursor = (oid *) getArgReference(stk, pci, 0);
+       val = getArgReference(stk,pci,1); 
+       bid = (int *) getArgReference(stk, pci, 2);
+
+       if (( msg= getCOLdescriptor(&b,bid)) ) 
+               throwagain(MAL, "chop.newChunkMoreElements", msg);
+
+       o = (oid)*cursor + 1;
+
+       if (o >= COLlast(b)) {
+               *cursor = oid_nil;
+               CBPreleaseref(b);
+               return MAL_SUCCEED;
+       }
+       *cursor = o;
+       VALinit(val, COLtype(b), COLvalue(b, o));
+       CBPreleaseref(b);
+       return MAL_SUCCEED;
+}
diff --git a/monetdb5/modules/mal/extensions.h 
b/monetdb5/modules/mal/extensions.h
--- a/monetdb5/modules/mal/extensions.h
+++ b/monetdb5/modules/mal/extensions.h
@@ -41,6 +41,8 @@
 be_export str CMDsetBase(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
 be_export str CHPnewChunkIterator(oid *res, int *vid, int *bid, lng *granule);
-be_export str CHPhasMoreElements(oid *res, int *vid, int *bid, lng *granule);
+be_export str CHPhasMoreChunks(oid *res, int *vid, int *bid, lng *granule);
+be_export str CHPnewIterator(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+be_export str CHPhasMoreElements(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
 #endif
diff --git a/monetdb5/modules/mal/extensions.mal 
b/monetdb5/modules/mal/extensions.mal
--- a/monetdb5/modules/mal/extensions.mal
+++ b/monetdb5/modules/mal/extensions.mal
@@ -31,13 +31,20 @@
 pattern column.new(b:col[:any_1], size:lng) :col[:any_1]       
 address CMDCOLderived;
 
-command column.newIterator(b:col[:any_2], size:lng)
-       (:oid,:col[:any_2])
+command column.newIterator(b:col[:any_1], size:lng) (:oid,:col[:any_1])
 address CHPnewChunkIterator
 comment "Create an iterator with fixed granule size.
          The result is a view.";
 
-command column.hasMoreElements(b:col[:any_1], size:lng)
-       (:oid, :col[:any_1])
+command column.hasMoreElements(b:col[:any_1], size:lng) (:oid, :col[:any_1])
+address CHPhasMoreChunks
+comment "Produce the next chunk for processing.";
+
+pattern column.newIterator(b:col[:any_1]) (:oid,:any_1)
+address CHPnewIterator
+comment "Create an iterator with fixed granule size.
+         The result is a view.";
+
+pattern column.hasMoreElements(b:col[:any_1]) (:oid, :any_1)
 address CHPhasMoreElements
 comment "Produce the next chunk for processing.";
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to