Changeset: 9199673c5f52 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9199673c5f52
Modified Files:
gdk/gdk_calc.h
gdk/gdk_string.c
monetdb5/modules/kernel/aggr.c
monetdb5/modules/mal/calc.c
Branch: pushcands
Log Message:
Added candidate list cases for second arguments for quantile and string concat
with separator aggregates.
diffs (truncated from 1690 to 300 lines):
diff --git a/gdk/gdk_calc.h b/gdk/gdk_calc.h
--- a/gdk/gdk_calc.h
+++ b/gdk/gdk_calc.h
@@ -163,6 +163,6 @@ gdk_export BAT *BATgroupcovariance_sampl
gdk_export BAT *BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT
*e, BAT *s1, BAT *s2, int tp, bool skip_nils, bool abort_on_error);
gdk_export BAT *BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1,
BAT *s2, int tp, bool skip_nils, bool abort_on_error);
-gdk_export BAT *BATgroupstr_group_concat(BAT *b, BAT *g, BAT *e, BAT *s, BAT
*sep, bool skip_nils, bool abort_on_error, const char *restrict separator);
-gdk_export gdk_return BATstr_group_concat(ValPtr res, BAT *b, BAT *s, BAT
*sep, bool skip_nils, bool abort_on_error, bool nil_if_empty, const char
*restrict separator);
+gdk_export BAT *BATgroupstr_group_concat(BAT *b, BAT *g, BAT *e, BAT *s1, BAT
*sep, BAT *s2, bool skip_nils, bool abort_on_error, const char *restrict
separator);
+gdk_export gdk_return BATstr_group_concat(ValPtr res, BAT *b, BAT *s1, BAT
*sep, BAT *s2, bool skip_nils, bool abort_on_error, bool nil_if_empty, const
char *restrict separator);
gdk_export gdk_return GDKanalytical_str_group_concat(BAT *r, BAT *p, BAT *o,
BAT *b, BAT *sep, BAT *s, BAT *e, const char *restrict separator, int
frame_type);
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -741,13 +741,13 @@ strWrite(const char *a, stream *s, size_
}
static gdk_return
-concat_strings(BAT **bnp, ValPtr pt, BAT *b, oid seqb,
- BUN ngrp, struct canditer *restrict ci, BUN ncand,
+concat_strings(BAT **bnp, ValPtr pt, BAT *b, oid bhseq,
+ BUN ngrp, struct canditer *restrict ci1, struct canditer
*restrict ci2, BUN ncand,
const oid *restrict gids, oid min, oid max, bool skip_nils,
- BAT *sep, const char *restrict separator, BUN *has_nils)
+ BAT *sep, oid shseq, const char *restrict separator, BUN
*has_nils)
{
oid gid;
- BUN i, p, nils = 0;
+ BUN i1, i2, p1, p2, nils = 0;
size_t *restrict lengths = NULL, *restrict lastseplength = NULL,
separator_length = 0, next_length;
str *restrict astrings = NULL, s, sl;
BATiter bi, bis = (BATiter) {0};
@@ -778,9 +778,9 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
bool empty = true;
if (separator) {
- for (i = 0; i < ncand; i++) {
- p = canditer_next(ci) - seqb;
- s = BUNtvar(bi, p);
+ for (BUN i = 0; i < ncand; i++) {
+ p1 = canditer_next(ci1) - bhseq;
+ s = BUNtvar(bi, p1);
if (strNil(s)) {
if (!skip_nils) {
nils = 1;
@@ -795,10 +795,11 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
} else { /* sep case */
assert(sep != NULL);
- for (i = 0; i < ncand; i++) {
- p = canditer_next(ci) - seqb;
- s = BUNtvar(bi, p);
- sl = BUNtvar(bis, p);
+ for (BUN i = 0; i < ncand; i++) {
+ p1 = canditer_next(ci1) - bhseq;
+ p2 = canditer_next(ci2) - shseq;
+ s = BUNtvar(bi, p1);
+ sl = BUNtvar(bis, p2);
if (strNil(s)) {
if (!skip_nils) {
nils = 1;
@@ -819,7 +820,9 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
}
}
- canditer_reset(ci);
+ canditer_reset(ci1);
+ if (!separator) /* sep case */
+ canditer_reset(ci2);
if (nils == 0 && !empty) {
char *single_str = NULL;
@@ -832,9 +835,9 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
empty = true;
if (separator) {
- for (i = 0; i < ncand; i++) {
- p = canditer_next(ci) - seqb;
- s = BUNtvar(bi, p);
+ for (BUN i = 0; i < ncand; i++) {
+ p1 = canditer_next(ci1) - bhseq;
+ s = BUNtvar(bi, p1);
if (strNil(s))
continue;
if (!empty) {
@@ -848,10 +851,11 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
} else { /* sep case */
assert(sep != NULL);
- for (i = 0; i < ncand; i++) {
- p = canditer_next(ci) - seqb;
- s = BUNtvar(bi, p);
- sl = BUNtvar(bis, p);
+ for (BUN i = 0; i < ncand; i++) {
+ p1 = canditer_next(ci1) - bhseq;
+ p2 = canditer_next(ci2) - shseq;
+ s = BUNtvar(bi, p1);
+ sl = BUNtvar(bis, p2);
if (strNil(s))
continue;
if (!empty && !strNil(sl)) {
@@ -914,18 +918,18 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
/* at first, set astrings[i] to str_nil, then for each
* non-empty group (even if all strings in the group
* are empty), set to NULL */
- for (i = 0; i < ngrp; i++)
+ for (BUN i = 0; i < ngrp; i++)
astrings[i] = (char *) str_nil;
if (separator) {
- for (p = 0; p < ncand; p++) {
- gid = gids[ci->next];
- i = canditer_next(ci) - seqb;
+ for (BUN p = 0; p < ncand; p++) {
+ gid = gids[ci1->next];
+ i1 = canditer_next(ci1) - bhseq;
if (gid >= min && gid <= max) {
gid -= min;
if (lengths[gid] == (size_t) -1)
continue;
- s = BUNtvar(bi, i);
+ s = BUNtvar(bi, i1);
if (!strNil(s)) {
lengths[gid] += strlen(s) +
separator_length;
astrings[gid] = NULL;
@@ -938,15 +942,16 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
} else { /* sep case */
assert(sep != NULL);
- for (p = 0; p < ncand; p++) {
- gid = gids[ci->next];
- i = canditer_next(ci) - seqb;
+ for (BUN p = 0; p < ncand; p++) {
+ gid = gids[ci1->next];
+ i1 = canditer_next(ci1) - bhseq;
+ i2 = canditer_next(ci2) - shseq;
if (gid >= min && gid <= max) {
gid -= min;
if (lengths[gid] == (size_t) -1)
continue;
- s = BUNtvar(bi, i);
- sl = BUNtvar(bis, i);
+ s = BUNtvar(bi, i1);
+ sl = BUNtvar(bis, i2);
if (!strNil(s)) {
lengths[gid] += strlen(s);
if (!strNil(sl)) {
@@ -967,7 +972,7 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
if (separator) {
- for (i = 0; i < ngrp; i++) {
+ for (BUN i = 0; i < ngrp; i++) {
if (astrings[i] == NULL) {
if ((astrings[i] = GDKmalloc(lengths[i]
+ 1 - separator_length)) == NULL) {
rres = GDK_FAIL;
@@ -980,7 +985,7 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
} else { /* sep case */
assert(sep != NULL);
- for (i = 0; i < ngrp; i++) {
+ for (BUN i = 0; i < ngrp; i++) {
if (astrings[i] == NULL) {
if ((astrings[i] = GDKmalloc(lengths[i]
+ 1 - lastseplength[i])) == NULL) {
rres = GDK_FAIL;
@@ -992,16 +997,18 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
astrings[i] = NULL;
}
}
- canditer_reset(ci);
+ canditer_reset(ci1);
+ if (!separator) /* sep case */
+ canditer_reset(ci2);
if (separator) {
- for (p = 0; p < ncand; p++) {
- gid = gids[ci->next];
- i = canditer_next(ci) - seqb;
+ for (BUN p = 0; p < ncand; p++) {
+ gid = gids[ci1->next];
+ i1 = canditer_next(ci1) - bhseq;
if (gid >= min && gid <= max) {
gid -= min;
if (astrings[gid]) {
- s = BUNtvar(bi, i);
+ s = BUNtvar(bi, i1);
if (strNil(s))
continue;
if
(astrings[gid][lengths[gid]]) {
@@ -1017,14 +1024,15 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
} else { /* sep case */
assert(sep != NULL);
- for (p = 0; p < ncand; p++) {
- gid = gids[ci->next];
- i = canditer_next(ci) - seqb;
+ for (BUN p = 0; p < ncand; p++) {
+ gid = gids[ci1->next];
+ i1 = canditer_next(ci1) - bhseq;
+ i2 = canditer_next(ci2) - shseq;
if (gid >= min && gid <= max) {
gid -= min;
if (astrings[gid]) {
- s = BUNtvar(bi, i);
- sl = BUNtvar(bis, i);
+ s = BUNtvar(bi, i1);
+ sl = BUNtvar(bis, i2);
if (strNil(s))
continue;
if (astrings[gid][lengths[gid]]
&& !strNil(sl)) {
@@ -1041,7 +1049,7 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
}
- for (i = 0; i < ngrp; i++) {
+ for (BUN i = 0; i < ngrp; i++) {
if (astrings[i]) {
astrings[i][lengths[i]] = '\0';
if (BUNappend(bn, astrings[i], false) !=
GDK_SUCCEED) {
@@ -1064,7 +1072,7 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
GDKfree(lengths);
GDKfree(lastseplength);
if (astrings) {
- for (i = 0; i < ngrp; i++) {
+ for (BUN i = 0; i < ngrp; i++) {
if (astrings[i] != str_nil)
GDKfree(astrings[i]);
}
@@ -1077,23 +1085,32 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
}
gdk_return
-BATstr_group_concat(ValPtr res, BAT *b, BAT *s, BAT *sep, bool skip_nils,
+BATstr_group_concat(ValPtr res, BAT *b, BAT *s1, BAT *sep, BAT *s2, bool
skip_nils,
bool abort_on_error, bool nil_if_empty, const char
*restrict separator)
{
BUN ncand;
- struct canditer ci;
+ struct canditer ci1 = {0}, ci2 = {0};
+ oid bhseq = b->hseqbase, shseq = sep ? sep->hseqbase : 0;
(void) abort_on_error;
assert((separator && !sep) || (!separator && sep)); /* only one of them
must be set */
res->vtype = TYPE_str;
- ncand = canditer_init(&ci, b, s);
+ ncand = canditer_init(&ci1, b, s1);
- if (sep && BATcount(sep) == 1) { /* Only one element in sep */
- BATiter bi = bat_iterator(sep);
- separator = BUNtvar(bi, 0);
- bat_iterator_end(&bi);
- sep = NULL;
+ if (sep) {
+ BUN ncand2 = canditer_init(&ci2, sep, s2);
+ if (ncand != ncand2) {
+ GDKerror("b1, b2 must be aligned\n");
+ return GDK_FAIL;
+ }
+ if (ncand2 == 1) { /* Only one element in sep */
+ BATiter bi = bat_iterator(sep);
+ BUN p = canditer_next(&ci2) - shseq;
+ separator = BUNtvar(bi, p);
+ bat_iterator_end(&bi);
+ sep = NULL;
+ }
}
if (ncand == 0 || (separator && strNil(separator))) {
@@ -1102,41 +1119,47 @@ BATstr_group_concat(ValPtr res, BAT *b,
return GDK_SUCCEED;
}
- return concat_strings(NULL, res, b, b->hseqbase, 1, &ci, ncand, NULL,
0, 0,
- skip_nils, sep, separator, NULL);
+ return concat_strings(NULL, res, b, bhseq, 1, &ci1, &ci2, ncand, NULL,
0, 0,
+ skip_nils, sep, shseq, separator, NULL);
}
BAT *
-BATgroupstr_group_concat(BAT *b, BAT *g, BAT *e, BAT *s, BAT *sep, bool
skip_nils,
+BATgroupstr_group_concat(BAT *b, BAT *g, BAT *e, BAT *s1, BAT *sep, BAT *s2,
bool skip_nils,
bool abort_on_error, const char *restrict separator)
{
BAT *bn = NULL;
- oid min, max;
+ oid min, max, bhseq = b->hseqbase, shseq = sep ? sep->hseqbase : 0;
BUN ngrp, ncand, nils = 0;
- struct canditer ci;
+ struct canditer ci1 = {0}, ci2 = {0};
const char *err;
gdk_return res;
assert((separator && !sep) || (!separator && sep)); /* only one of them
must be set */
(void) skip_nils;
- if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp,
- &ci, &ncand)) !=NULL) {
+ if ((err = BATgroupaggrinit(b, g, e, s1, &min, &max, &ngrp,
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list