Changeset: 6f031ca329fa for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f031ca329fa
Added Files:
monetdb5/modules/kernel/batifthen.c
monetdb5/modules/kernel/batifthen.h
monetdb5/modules/kernel/batifthen.mal
Modified Files:
monetdb5/modules/kernel/Makefile.ag
Branch: default
Log Message:
De-mx BAT ifthen module
diffs (truncated from 1235 to 300 lines):
diff --git a/monetdb5/modules/kernel/Makefile.ag
b/monetdb5/modules/kernel/Makefile.ag
--- a/monetdb5/modules/kernel/Makefile.ag
+++ b/monetdb5/modules/kernel/Makefile.ag
@@ -44,7 +44,7 @@ lib_kernel = {
bat5.c bat5.h \
batcalc.c \
batcolor.c batcolor.h \
- batifthen.mx \
+ batifthen.c batifthen.h \
batmmath.c batmmath.h \
batmtime.mx \
batstr.c batstr.h \
@@ -65,7 +65,7 @@ headers_mal = {
DIR = libdir/monetdb5
SOURCES = calc.mal bat5.mal algebra.mx status.mal unix.mal \
mmath.mal lock.mal sema.mal alarm.mal batstr.mal batmtime.mx \
- batcolor.mal batifthen.mx batcalc.mal batmmath.mal \
+ batcolor.mal batifthen.mal batcalc.mal batmmath.mal \
group.mx aggr.mx array.mal \
counters.mal logger.mal microbenchmark.mal
}
diff --git a/monetdb5/modules/kernel/batifthen.mx
b/monetdb5/modules/kernel/batifthen.c
copy from monetdb5/modules/kernel/batifthen.mx
copy to monetdb5/modules/kernel/batifthen.c
--- a/monetdb5/modules/kernel/batifthen.mx
+++ b/monetdb5/modules/kernel/batifthen.c
@@ -1,140 +1,146 @@
-@/
-The contents of this file are subject to the MonetDB Public License
-Version 1.1 (the "License"); you may not use this file except in
-compliance with the License. You may obtain a copy of the License at
-http://www.monetdb.org/Legal/MonetDBLicense
+/*
+ *The contents of this file are subject to the MonetDB Public License
+ *Version 1.1 (the "License"); you may not use this file except in
+ *compliance with the License. You may obtain a copy of the License at
+ *http://www.monetdb.org/Legal/MonetDBLicense
+ *
+ *Software distributed under the License is distributed on an "AS IS"
+ *basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *License for the specific language governing rights and limitations
+ *under the License.
+ *
+ *The Original Code is the MonetDB Database System.
+ *
+ *The Initial Developer of the Original Code is CWI.
+ *Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
+ *Copyright August 2008-2012 MonetDB B.V.
+ *All Rights Reserved.
+*/
-Software distributed under the License is distributed on an "AS IS"
-basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-License for the specific language governing rights and limitations
-under the License.
-
-The Original Code is the MonetDB Database System.
-
-The Initial Developer of the Original Code is CWI.
-Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
-Copyright August 2008-2012 MonetDB B.V.
-All Rights Reserved.
-@
-
-@f batifthen
-
-@c
/*
- * @a M.L. Kersten
- * @+ BAT if-then-else multiplex expressions.
+ * M.L. Kersten
+ * BAT if-then-else multiplex expressions.
* The assembled code for IF-THEN-ELSE multiplex operations.
* Again we assume that the BAT arguments are aligned.
- * @-
*/
-@= ifthenGrp
-command batcalc.ifthen(b:bat[:oid,:bit], t:bat[:oid,:@1]) :bat[:oid,:@1]
-address CMDifThen_@1
-comment "If-then operation to assemble a conditional result ";
-command batcalc.ifthen(b:bat[:oid,:bit], v:@1) :bat[:oid,:@1]
-address CMDifThenCst_@1
-comment "Ifthen operation to assemble a conditional result ";
+#define resBAT2(X1,X2)\
+ bn = BATnew(ATOMtype(b->htype), X1, BATcount(b));\
+ if (bn == NULL)\
+ throw(MAL, X2, MAL_MALLOC_FAIL);\
+ bn->hsorted = b->hsorted;\
+ bn->hrevsorted = b->hrevsorted;\
+ bn->tsorted = b->tsorted;\
+ bn->trevsorted = b->trevsorted;\
+ bn->H->nonil = b->H->nonil;\
+ bn->T->nonil = b->T->nonil;\
+ BATkey(bn, BAThkey(b));
-command batcalc.ifthenelse(b:bat[:oid,:bit], v:@1, w:@1) :bat[:oid,:@1]
-address CMDifThenElseCst_@1
-comment "Ifthen operation to assemble a conditional result ";
+#define resBAT(X1,X2)\
+ bn = BATnew(ATOMtype(b->htype), TYPE_##X1, BATcount(b));\
+ if (bn == NULL)\
+ throw(MAL, X2, MAL_MALLOC_FAIL);\
+ bn->hsorted = b->hsorted;\
+ bn->hrevsorted = b->hrevsorted;\
+ bn->tsorted = b->tsorted;\
+ bn->trevsorted = b->trevsorted;\
+ bn->H->nonil = b->H->nonil;\
+ bn->T->nonil = b->T->nonil;\
+ BATkey(bn, BAThkey(b));
-command batcalc.ifthenelse(b:bat[:oid,:bit], t:bat[:oid,:@1],
- e:bat[:oid,:@1]) :bat[:oid,:@1]
-address CMDifThenElse_@1
-comment "If-then-else operation to assemble a conditional result ";
+#define resultBAT(X1,X2)\
+ if (BAThvoid(b)) {\
+ bn = BATnew(TYPE_void, TYPE_##X1, BATcount(b));\
+ BATseqbase(bn, b->hseqbase);\
+ } else {\
+ bn = BATnew(b->htype, TYPE_##X1, BATcount(b));\
+ }\
+ if (bn == NULL) {\
+ throw(MAL, X2, MAL_MALLOC_FAIL);\
+ }\
+ bn->hsorted = b->hsorted;\
+ bn->hrevsorted = b->hrevsorted;\
+ bn->tsorted = b->tsorted;\
+ bn->trevsorted = b->trevsorted;\
+ if (!BAThvoid(b))\
+ bn->H->nonil = b->H->nonil;\
+ bn->T->nonil = b->T->nonil;\
+ BATkey(bn, BAThkey(b));
-command batcalc.ifthenelse(b:bat[:oid,:bit], e:@1, t:bat[:oid,:@1])
- :bat[:oid,:@1]
-address CMDifThenElseCst1_@1
-comment "If-then-else operation to assemble a conditional result ";
+#define voidresultBAT(X1,X2)\
+ bn = BATnew(TYPE_void, X1, BATcount(b));\
+ BATseqbase(bn, b->hseqbase);\
+ if (bn == NULL) {\
+ throw(MAL, X2, MAL_MALLOC_FAIL);\
+ }\
+ bn->hsorted = b->hsorted;\
+ bn->hrevsorted = b->hrevsorted;\
+ bn->tsorted = b->tsorted;\
+ bn->trevsorted = b->trevsorted;\
+ bn->H->nonil = 1;\
+ bn->T->nonil = b->T->nonil;
-command batcalc.ifthenelse(b:bat[:oid,:bit], t:bat[:any_1,:@1], e:@1)
- :bat[:oid,:@1]
-address CMDifThenElseCst2_@1
-comment "If-then-else operation to assemble a conditional result ";
-@
-@mal
- @:ifthenGrp(bit)@
- @:ifthenGrp(bte)@
- @:ifthenGrp(sht)@
- @:ifthenGrp(int)@
- @:ifthenGrp(lng)@
- @:ifthenGrp(oid)@
- @:ifthenGrp(flt)@
- @:ifthenGrp(dbl)@
- @:ifthenGrp(str)@
- # @- Implementation
-@include kprelude.mx
-@h
-#ifndef _BATIFTHEN_
-#define _BATIFTHEN_
-#include "gdk.h"
-#include "math.h"
-#include "mal_exception.h"
-
-#ifdef WIN32
-#if !defined(LIBMAL) && !defined(LIBATOMS) && !defined(LIBKERNEL) &&
!defined(LIBMAL) && !defined(LIBOPTIMIZER) && !defined(LIBSCHEDULER) &&
!defined(LIBMONETDB5)
-#define batifthen_export extern __declspec(dllimport)
-#else
-#define batifthen_export extern __declspec(dllexport)
-#endif
-#else
-#define batifthen_export extern
-#endif
-#endif /* _BATIFTHEN_ */
+#include "monetdb_config.h"
+#include "batifthen.h"
/*
- * @-
* A general assumption in all cases is the bats are synchronized on their
* head column. This is not checked and may be mis-used to deploy the
* implementation for shifted window arithmetic as well.
*/
-@= chkSize
- if( BATcount(@1) != BATcount(@2) )
- throw(MAL, "batcalc.@3", ILLEGAL_ARGUMENT " Requires bats of identical
size");
-@= wrapup
- if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ);
- *ret= bn->batCacheid;
- BBPkeepref(*ret);
- BBPreleaseref(b->batCacheid);
+#define wrapup\
+ if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ);\
+ *ret= bn->batCacheid;\
+ BBPkeepref(*ret);\
+ BBPreleaseref(b->batCacheid);\
return MAL_SUCCEED;
-@= void_wrapup
- if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ);
- if (b->htype != bn->htype) {
- BAT *r = VIEWcreate(b,bn);
-
- BBPreleaseref(bn->batCacheid);
- bn = r;
- }
- BBPkeepref(*ret = bn->batCacheid);
- BBPreleaseref(b->batCacheid);
+#define void_wrapup\
+ if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ);\
+ if (b->htype != bn->htype) {\
+ BAT *r = VIEWcreate(b,bn);\
+ BBPreleaseref(bn->batCacheid);\
+ bn = r;\
+ }\
+ BBPkeepref(*ret = bn->batCacheid);\
+ BBPreleaseref(b->batCacheid);\
return MAL_SUCCEED;
-@
- * @- IfThenElse
- * The conditional multiplex operations .
- * @-
- * The constant versions are typed by the parser
- * String arguments call for an extra type casting. In combination
- * with type resolution and runtime checks it provides a dense
- * definitoin.
-@= ifthenImpl
-batifthen_export str CMDifThen_@1(int *ret, int *bid, int *tid);
+/* The constant versions are typed by the parser
+* String arguments call for an extra type casting. In combination
+* with type resolution and runtime checks it provides a dense definition.
+*/
+#define ifthenImpl(X1,X2,X3)\
+ { X1 nilval= (X1) X3, *val;\
+ resBAT2(X2,"batcalc.ifThen")\
+ bn->T->nonil = (b->T->nonil && tb->T->nonil);\
+ BATloop(b, p, q) {\
+ if (*t == bit_nil) {\
+ BUNfastins(bn, BUNhead(bi,p), (ptr) &
nilval);\
+ bn->T->nonil = 0;\
+ bn->T->nil = 1;\
+ } else if (*t) {\
+ val = (X1*) BUNtail(tbi,p);\
+ BUNfastins(bn, BUNhead(bi,p), val);\
+ }\
+ t++;\
+ }\
+ }
str
-CMDifThen_@1(int *ret, int *bid, int *tid)
+CMDifThen(int *ret, int *bid, int *tid)
{
BATiter bi, tbi;
BAT *b, *tb, *bn;
- @1 nilval= (@1) @1_nil, *val;
BUN p,q;
bit *t;
- @:getBATdescriptor(bid,b,"batcalc.ifThen")@
-
@:getBATdescriptor(tid,tb,"batcalc.ifThen",BBPreleaseref(b->batCacheid))@
- @:chkSize(b,tb,CMDifThen)@
- @:resBAT(@1,"batcalc.ifThen")@
+ if ((b = BATdescriptor(*bid)) == NULL)
+ throw(MAL, "batcalc.ifthen", RUNTIME_OBJECT_MISSING);
+ if ((tb = BATdescriptor(*tid)) == NULL) {
+ BBPreleaseref(b->batCacheid);
+ throw(MAL, "batcalc.ifthen", RUNTIME_OBJECT_MISSING);
+ }
+ if( BATcount(b) != BATcount(tb) )
+ throw(MAL, "batcalc.ifthen", ILLEGAL_ARGUMENT " Requires bats
of identical size");
bi = bat_iterator(b);
tbi = bat_iterator(tb);
@@ -142,407 +148,464 @@ CMDifThen_@1(int *ret, int *bid, int *ti
BATaccessBegin(b,USE_HEAD, MMAP_SEQUENTIAL);
BATaccessBegin(tb,USE_TAIL, MMAP_SEQUENTIAL);
- BATloop(b, p, q) {
- if (*t == bit_nil) {
- BUNfastins(bn, BUNhead(bi,p), (ptr) & nilval);
- } else if (*t) {
- val = (@1*) BUNtail(tbi,p);
- BUNfastins(bn, BUNhead(bi,p), val);
+ switch(tb->ttype){
+ case TYPE_bit: ifthenImpl(bit,TYPE_bit,bit_nil); break;
+ case TYPE_bte: ifthenImpl(bte,TYPE_bte,bte_nil); break;
+ case TYPE_sht: ifthenImpl(sht,TYPE_sht,sht_nil); break;
+ case TYPE_int: ifthenImpl(int,TYPE_int,int_nil); break;
+ case TYPE_lng: ifthenImpl(lng,TYPE_lng,lng_nil); break;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list