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