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

Reply via email to