Hi,
After reviewing all the other alternatives like SQL and Python UDF, I was
either stuck on performance with SQL UDF or on usability with Python UDF
(unable to use with aggregation, and not such great performance with
dates),
so I decided to go the hard way with C functions, as a bonus it will give
me the possibility to change the functionalities without worrying about
dependencies, which was not the case in other languages.
The purpose is to create a set of formatting functions for Year, Quarter,
Month, Week and Day brackets, and of course i need to create the bulk
version of each function for performance.
Starting from the MTIMEdate_extract_year_bulk, now i have the simple
function working, and successfully calling it from mclient:
*str*
*UDFyearbracket(str *ret, const date *v)*
*{*
* if (*v == date_nil) {*
* *ret = GDKstrdup(str_nil);*
* } else {*
* int year;*
* fromdate(*v, NULL, NULL, &year);*
* *ret = (str) GDKmalloc(15);*
* sprintf(*ret, "%d", year);*
* }*
* return MAL_SUCCEED;*
*}*
For the bulk version i get an error in the log: gdk_atoms.c:1345: strPut:
Assertion `(v[i] & 0x80) == 0' failed.
*str*
*UDFBATyearbracket(bat *ret, const bat *bid)*
*{*
* BAT *b, *bn;*
* BUN i,n;*
* str *y;*
* const date *t;*
* if ((b = BATdescriptor(*bid)) == NULL)*
* throw(MAL, "UDF.BATyearbracket", "Cannot access descriptor");*
* n = BATcount(b);*
* bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT);*
* if (bn == NULL) {*
* BBPunfix(b->batCacheid);*
* throw(MAL, "UDF.BATyearbracket", "memory allocation failure");*
* }*
* bn->tnonil = 1;*
* bn->tnil = 0;*
* t = (const date *) Tloc(b, 0);*
* y = (str *) Tloc(bn, 0);*
* for (i = 0; i < n; i++) {*
* if (*t == date_nil) {*
* *y = GDKstrdup(str_nil);*
* } else*
* UDFyearbracket(y, t);*
* if (strcmp(*y, str_nil) == 0) {*
* bn->tnonil = 0;*
* bn->tnil = 1;*
* }*
* y++;*
* t++;*
* }*
* BATsetcount(bn, (BUN) (y - (str *) Tloc(bn, 0)));*
* bn->tsorted = BATcount(bn)<2;*
* bn->trevsorted = BATcount(bn)<2;*
* BBPkeepref(*ret = bn->batCacheid);*
* BBPunfix(b->batCacheid);*
* return MAL_SUCCEED;*
*}*
PS: I am not a c expert but i can find my way with basic operations and
pointers.
Any help or suggestions is appreciated.
Thank you.