Changeset: c5ac7168a551 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5ac7168a551 Modified Files: clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_batop.c geom/lib/libgeom.c monetdb5/modules/kernel/algebra.c Branch: Oct2020 Log Message:
Take candidate lists into account in aggr.count variants. diffs (298 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -119,7 +119,7 @@ gdk_return BATclear(BAT *b, bool force); void BATcommit(BAT *b); BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, role_t role); BAT *BATconvert(BAT *b, BAT *s, int tp, bool abort_on_error, uint8_t scale1, uint8_t scale2, uint8_t precision); -BUN BATcount_no_nil(BAT *b); +BUN BATcount_no_nil(BAT *b, BAT *s); gdk_return BATdel(BAT *b, BAT *d) __attribute__((__warn_unused_result__)); BAT *BATdense(oid hseq, oid tseq, BUN cnt) __attribute__((__warn_unused_result__)); BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches, bool not_in, BUN estimate); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1040,7 +1040,7 @@ BUNtoid(BAT *b, BUN p) * to insert BUNs at the end of the BAT, but not to modify anything * that already was in there. */ -gdk_export BUN BATcount_no_nil(BAT *b); +gdk_export BUN BATcount_no_nil(BAT *b, BAT *s); gdk_export void BATsetcapacity(BAT *b, BUN cnt); gdk_export void BATsetcount(BAT *b, BUN cnt); gdk_export BUN BATgrows(BAT *b); diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -2324,7 +2324,7 @@ BATrmprop(BAT *b, enum prop_t idx) * non-nil tail value. */ BUN -BATcount_no_nil(BAT *b) +BATcount_no_nil(BAT *b, BAT *s) { BUN cnt = 0; BUN i, n; @@ -2332,9 +2332,11 @@ BATcount_no_nil(BAT *b) const char *restrict base; int t; int (*cmp)(const void *, const void *); + struct canditer ci; + oid hseq = b->hseqbase; BATcheck(b, 0); - n = BATcount(b); + n = canditer_init(&ci, b, s); if (b->tnonil) return n; p = Tloc(b, 0); @@ -2345,54 +2347,54 @@ BATcount_no_nil(BAT *b) break; case TYPE_bte: for (i = 0; i < n; i++) - cnt += !is_bte_nil(((const bte *) p)[i]); + cnt += !is_bte_nil(((const bte *) p)[canditer_next(&ci) - hseq]); break; case TYPE_sht: for (i = 0; i < n; i++) - cnt += !is_sht_nil(((const sht *) p)[i]); + cnt += !is_sht_nil(((const sht *) p)[canditer_next(&ci) - hseq]); break; case TYPE_int: for (i = 0; i < n; i++) - cnt += !is_int_nil(((const int *) p)[i]); + cnt += !is_int_nil(((const int *) p)[canditer_next(&ci) - hseq]); break; case TYPE_lng: for (i = 0; i < n; i++) - cnt += !is_lng_nil(((const lng *) p)[i]); + cnt += !is_lng_nil(((const lng *) p)[canditer_next(&ci) - hseq]); break; #ifdef HAVE_HGE case TYPE_hge: for (i = 0; i < n; i++) - cnt += !is_hge_nil(((const hge *) p)[i]); + cnt += !is_hge_nil(((const hge *) p)[canditer_next(&ci) - hseq]); break; #endif case TYPE_flt: for (i = 0; i < n; i++) - cnt += !is_flt_nil(((const flt *) p)[i]); + cnt += !is_flt_nil(((const flt *) p)[canditer_next(&ci) - hseq]); break; case TYPE_dbl: for (i = 0; i < n; i++) - cnt += !is_dbl_nil(((const dbl *) p)[i]); + cnt += !is_dbl_nil(((const dbl *) p)[canditer_next(&ci) - hseq]); break; case TYPE_str: base = b->tvheap->base; switch (b->twidth) { case 1: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned char *) p)[i] + GDK_VAROFFSET] != '\200'; + cnt += base[(var_t) ((const unsigned char *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; break; case 2: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned short *) p)[i] + GDK_VAROFFSET] != '\200'; + cnt += base[(var_t) ((const unsigned short *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; break; #if SIZEOF_VAR_T != SIZEOF_INT case 4: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned int *) p)[i]] != '\200'; + cnt += base[(var_t) ((const unsigned int *) p)[canditer_next(&ci) - hseq]] != '\200'; break; #endif default: for (i = 0; i < n; i++) - cnt += base[((const var_t *) p)[i]] != '\200'; + cnt += base[((const var_t *) p)[canditer_next(&ci) - hseq]] != '\200'; break; } break; @@ -2402,10 +2404,10 @@ BATcount_no_nil(BAT *b) if (b->tvarsized) { base = b->tvheap->base; for (i = 0; i < n; i++) - cnt += (*cmp)(nil, base + ((const var_t *) p)[i]) != 0; + cnt += (*cmp)(nil, base + ((const var_t *) p)[canditer_next(&ci) - hseq]) != 0; } else { for (i = 0, n += i; i < n; i++) - cnt += (*cmp)(Tloc(b, i), nil) != 0; + cnt += (*cmp)(Tloc(b, canditer_next(&ci) - hseq), nil) != 0; } break; } diff --git a/geom/lib/libgeom.c b/geom/lib/libgeom.c --- a/geom/lib/libgeom.c +++ b/geom/lib/libgeom.c @@ -56,7 +56,7 @@ is_wkb_nil(const wkb *w) * Creates an mbr holding the lower left and upper right coordinates * of a GEOSGeom. */ -/* +#if 0 int getMbrGeos(mbr *res, const GEOSGeom geosGeometry) { @@ -113,7 +113,7 @@ getMbrGeos(mbr *res, const GEOSGeom geos GEOSGeom_destroy(envelope); return 1; } -*/ +#endif GEOSGeom wkb2geos(const wkb *geomWKB) @@ -134,7 +134,7 @@ wkb2geos(const wkb *geomWKB) /* Function getMbrGeom * A wrapper for getMbrGeos on a geom_geometry. */ -/* +#if 0 int getMbrGeom(mbr *res, wkb *geom) { @@ -147,7 +147,7 @@ getMbrGeom(mbr *res, wkb *geom) } return 0; } -*/ +#endif const char * geom_type2str(int t, int flag) @@ -199,7 +199,7 @@ geom_type2str(int t, int flag) } -/* +#if 0 str geomerty_2_geometry(wkb *res, wkb **geom, int *columnType, int *columnSRID, int *valueSRID) { @@ -217,4 +217,4 @@ geomerty_2_geometry(wkb *res, wkb **geom fprintf(stderr, "%d vs %d\n", *columnSRID, *valueSRID); return "0"; } -*/ +#endif diff --git a/monetdb5/modules/kernel/algebra.c b/monetdb5/modules/kernel/algebra.c --- a/monetdb5/modules/kernel/algebra.c +++ b/monetdb5/modules/kernel/algebra.c @@ -367,15 +367,14 @@ ALGthetaselect1(bat *result, const bat * static str ALGselectNotNil(bat *result, const bat *bid) { - BAT *b, *bn = NULL; + BAT *b; if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "algebra.selectNotNil", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - if( BATcount_no_nil(b) != BATcount(b) ){ - BAT *s = NULL; - - s = BATselect(b, s, ATOMnilptr(b->ttype), NULL, true, true, true); + if (!b->tnonil) { + BAT *bn, *s; + s = BATselect(b, NULL, ATOMnilptr(b->ttype), NULL, true, true, true); if (s) { bn = BATproject(s, b); BBPunfix(s->batCacheid); @@ -986,7 +985,7 @@ ALGcount_nil(lng *result, const bat *bid throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } if (*ignore_nils) - cnt = BATcount_no_nil(b); + cnt = BATcount_no_nil(b, NULL); else cnt = BATcount(b); *result = (lng) cnt; @@ -1007,18 +1006,20 @@ ALGcountCND_bat(lng *result, const bat * { BAT *b; - if ( *cnd) { - if ((b = BATdescriptor(*cnd)) == NULL) { - throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - } - *result = (lng) BATcount(b); - BBPunfix(b->batCacheid); - return MAL_SUCCEED; - } if ((b = BATdescriptor(*bid)) == NULL) { throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } - *result = (lng) BATcount(b); + if (*cnd) { + struct canditer ci; + BAT *s; + if ((s = BATdescriptor(*cnd)) == NULL) { + BBPunfix(b->batCacheid); + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + *result = (lng) canditer_init(&ci, b, s); + BBPunfix(s->batCacheid); + } else + *result = (lng) BATcount(b); BBPunfix(b->batCacheid); return MAL_SUCCEED; } @@ -1026,39 +1027,29 @@ ALGcountCND_bat(lng *result, const bat * static str ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit *ignore_nils) { - BAT *b; - BUN cnt; + BAT *b, *s = NULL; - if (*ignore_nils){ - if ((b = BATdescriptor(*bid)) == NULL) { - throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - } - cnt = BATcount_no_nil(b); - } else{ - if ( *cnd) { - if ((b = BATdescriptor(*cnd)) == NULL) { - throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - } - *result = (lng) BATcount(b); - BBPunfix(b->batCacheid); - return MAL_SUCCEED; - } - if ((b = BATdescriptor(*bid)) == NULL) { - throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - } - cnt = BATcount(b); + if (!*ignore_nils) + return ALGcountCND_bat(result, bid, cnd); + if (*cnd && (s = BATdescriptor(*cnd)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } - *result = (lng) cnt; + if ((b = BATdescriptor(*bid)) == NULL) { + if (s) + BBPunfix(s->batCacheid); + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + *result = (lng) BATcount_no_nil(b, s); BBPunfix(b->batCacheid); + if (s) + BBPunfix(s->batCacheid); return MAL_SUCCEED; } static str ALGcountCND_no_nil(lng *result, const bat *bid, const bat *cnd) { - bit ignore_nils = 1; - - return ALGcountCND_nil(result, bid, cnd, &ignore_nils); + return ALGcountCND_nil(result, bid, cnd, &(bit){1}); } static str _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list