Changeset: 622d81b7f81c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=622d81b7f81c
Modified Files:
        sql/backends/monet5/UDF/80_udf.sql
        sql/backends/monet5/UDF/udf.c
        sql/backends/monet5/UDF/udf.h
        sql/backends/monet5/UDF/udf.mal
Branch: arrays
Log Message:

update of a column from q in qr decomposition


diffs (81 lines):

diff --git a/sql/backends/monet5/UDF/80_udf.sql 
b/sql/backends/monet5/UDF/80_udf.sql
--- a/sql/backends/monet5/UDF/80_udf.sql
+++ b/sql/backends/monet5/UDF/80_udf.sql
@@ -23,3 +23,8 @@ returns integer external name udf.fuse;
 -- fuse two (4-byte) integer values into one (8-byte) bigint value
 create function fuse(one integer, two integer)
 returns bigint external name udf.fuse;
+
+-- update column c of q
+CREATE FUNCTION qrq(c double, s double)
+RETURNS double external name udf.qrq;
+
diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c
--- a/sql/backends/monet5/UDF/udf.c
+++ b/sql/backends/monet5/UDF/udf.c
@@ -366,3 +366,46 @@ UDFBATfuse(bat *ires, const bat *ione, c
 
        return msg;
 }
+
+char* UDFqrq(bat *q, const bat *c, const double *s) {
+       BAT *cBAT, *qBAT;
+       BUN start, end, i;
+       BATiter c_iter;
+       double *qVals;
+       
+       if(!(cBAT = BATdescriptor(*c))) {
+               return createException(MAL, "batudf.qrq", "Problem retrieving 
BAT");
+       }
+
+    if( !BAThdense(cBAT) ) {
+               BBPunfix(cBAT->batCacheid);
+               return createException(MAL, "batudf.qrq", "BATs must have dense 
heads");
+    }
+
+       c_iter = bat_iterator(cBAT);
+       start = BUNfirst(cBAT);
+       end = BUNlast(cBAT);
+
+       if(!(qBAT = BATnew(TYPE_void, TYPE_dbl, BATcount(cBAT), TRANSIENT))) {
+               BBPunfix(cBAT->batCacheid);
+               return createException(MAL, "batudf.qrq", MAL_MALLOC_FAIL);
+       }
+
+       BATseqbase(qBAT, cBAT->hseqbase);
+
+       qVals = (double*)Tloc(qBAT, BUNfirst(qBAT));
+       for(i=start; i<end; i++) {
+               *(qVals++) = *(double*)BUNtail(c_iter, i)/(*s);
+       }
+
+       BATsetcount(qBAT, BATcount(cBAT));
+       qBAT->tsorted = 0;
+       qBAT->trevsorted = 0;
+       qBAT->tkey = 0;
+       qBAT->tdense = 0;
+
+       BBPunfix(cBAT->batCacheid);
+       BBPkeepref(*q = qBAT->batCacheid);
+
+       return MAL_SUCCEED;
+}
diff --git a/sql/backends/monet5/UDF/udf.h b/sql/backends/monet5/UDF/udf.h
--- a/sql/backends/monet5/UDF/udf.h
+++ b/sql/backends/monet5/UDF/udf.h
@@ -44,4 +44,5 @@ UDFfuse_scalar_decl(lng, hge);
 
 udf_export char * UDFBATfuse(bat *ret, const bat *one, const bat *two);
 
+udf_export char* UDFqrq(bat *q, const bat *c, const double *s);
 #endif /* _SQL_UDF_H_ */
diff --git a/sql/backends/monet5/UDF/udf.mal b/sql/backends/monet5/UDF/udf.mal
--- a/sql/backends/monet5/UDF/udf.mal
+++ b/sql/backends/monet5/UDF/udf.mal
@@ -51,3 +51,6 @@ comment "fuse two (2-byte) sht values in
 command fuse(one:bat[:oid,:int],two:bat[:oid,:int]):bat[:oid,:lng]
 address UDFBATfuse
 comment "fuse two (4-byte) int values into one (8-byte) lng value";
+
+command batudf.qrq(c:bat[:oid,:dbl], s:dbl) :bat[:oid,:dbl]
+address UDFqrq;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to