Changeset: 289aa78c09de for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=289aa78c09de
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/modules/kernel/algebra.mx
Branch: default
Log Message:

Rationalized algebra.sub*join functions, added algebra.subjoin.
The MAL interfaces now require all arguments, including the candidate
lists, but "optional" arguments can be nil:bat (and the size estimate
nil:lng).


diffs (281 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
@@ -812,10 +812,9 @@ str ALGssort(int *result, int *bid);
 str ALGssort_rev(int *result, int *bid);
 str ALGstdev(dbl *res, int *bid);
 str ALGstdevp(dbl *res, int *bid);
-str ALGsubleftjoin(bat *r1, bat *r2, bat *l, bat *r);
-str ALGsubleftjoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr);
-str ALGsubouterjoin(bat *r1, bat *r2, bat *l, bat *r);
-str ALGsubouterjoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr);
+str ALGsubjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr, lng 
*estimate);
+str ALGsubleftjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr, lng 
*estimate);
+str ALGsubouterjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr, lng 
*estimate);
 str ALGsubsample(int *result, int *bid, int *param);
 str ALGsubselect1(bat *result, bat *bid, const void *low, const void *high, 
const bit *li, const bit *hi, const bit *anti);
 str ALGsubselect2(bat *result, bat *bid, bat *sid, const void *low, const void 
*high, const bit *li, const bit *hi, const bit *anti);
@@ -829,8 +828,7 @@ str ALGsubsort23(bat *result, bat *norde
 str ALGsubsort31(bat *result, bat *bid, bat *order, bat *group, bit *reverse, 
bit *stable);
 str ALGsubsort32(bat *result, bat *norder, bat *bid, bat *order, bat *group, 
bit *reverse, bit *stable);
 str ALGsubsort33(bat *result, bat *norder, bat *ngroup, bat *bid, bat *order, 
bat *group, bit *reverse, bit *stable);
-str ALGsubthetajoin(bat *r1, bat *r2, bat *l, bat *r, str *op);
-str ALGsubthetajoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr, str 
*op);
+str ALGsubthetajoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat *sr, str 
*op, lng *estimate);
 str ALGsunion(int *result, int *lid, int *rid);
 str ALGsunique(int *result, int *bid);
 str ALGtdiff(int *result, int *lid, int *rid);
diff --git a/monetdb5/modules/kernel/algebra.mx 
b/monetdb5/modules/kernel/algebra.mx
--- a/monetdb5/modules/kernel/algebra.mx
+++ b/monetdb5/modules/kernel/algebra.mx
@@ -679,25 +679,20 @@ comment "This is a join() for which the 
 command join(l:bat[:any_1,:any_2], rl:bat[:any_3,:any_2], 
rh:bat[:any_3,:any_2], li:bit, hi:bit) :bat[:any_1,:any_3] 
 address ALGrangejoin;
 
-command subleftjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1]) 
(:bat[:oid,:oid],:bat[:oid,:oid])
+command 
subjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid],estimate:lng)
 (:bat[:oid,:oid],:bat[:oid,:oid])
+address ALGsubjoin
+comment "Join";
+
+command 
subleftjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid],estimate:lng)
 (:bat[:oid,:oid],:bat[:oid,:oid])
 address ALGsubleftjoin
-comment "Left join";
-command 
subleftjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid])
 (:bat[:oid,:oid],:bat[:oid,:oid])
-address ALGsubleftjoin4
 comment "Left join with candidate lists";
 
-command subouterjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1]) 
(:bat[:oid,:oid],:bat[:oid,:oid])
+command 
subouterjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid],estimate:lng)
 (:bat[:oid,:oid],:bat[:oid,:oid])
 address ALGsubouterjoin
-comment "Left outer join";
-command 
subouterjoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid])
 (:bat[:oid,:oid],:bat[:oid,:oid])
-address ALGsubouterjoin4
 comment "Left outer join with candidate lists";
 
-command subthetajoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],op:str) 
(:bat[:oid,:oid],:bat[:oid,:oid])
+command 
subthetajoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid],op:str,estimate:lng)
 (:bat[:oid,:oid],:bat[:oid,:oid])
 address ALGsubthetajoin
-comment "Theta join";
-command 
subthetajoin(l:bat[:oid,:any_1],r:bat[:oid,:any_1],sl:bat[:oid,:oid],sr:bat[:oid,:oid],op:str)
 (:bat[:oid,:oid],:bat[:oid,:oid])
-address ALGsubthetajoin4
 comment "Theta join with candidate lists";
 
 # @+ Projection operations
@@ -1004,12 +999,10 @@ algebra_export str ALGthetajoin(int *res
 algebra_export str ALGbandjoin_default(int *result, int *lid, int *rid, ptr 
*minus, ptr *plus);
 algebra_export str ALGbandjoin(int *result, int *lid, int *rid, ptr *minus, 
ptr *plus, bit *li, bit *hi);
 algebra_export str ALGrangejoin(int *result, int *lid, int *rlid, int *rhid, 
bit *li, bit *hi);
-algebra_export str ALGsubleftjoin(bat *r1, bat *r2, bat *l, bat *r);
-algebra_export str ALGsubleftjoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr);
-algebra_export str ALGsubouterjoin(bat *r1, bat *r2, bat *l, bat *r);
-algebra_export str ALGsubouterjoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr);
-algebra_export str ALGsubthetajoin(bat *r1, bat *r2, bat *l, bat *r, str *op);
-algebra_export str ALGsubthetajoin4(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr, str *op);
+algebra_export str ALGsubjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, bat 
*sr, lng *estimate);
+algebra_export str ALGsubleftjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr, lng *estimate);
+algebra_export str ALGsubouterjoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr, lng *estimate);
+algebra_export str ALGsubthetajoin(bat *r1, bat *r2, bat *l, bat *r, bat *sl, 
bat *sr, str *op, lng *estimate);
 
 @= ALGunaryExport
 algebra_export str ALG@1(int *result, int *bid);
@@ -1675,7 +1668,7 @@ ALGsubselect2(bat *result, bat *bid, bat
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
        }
-       if (sid && (s = BATdescriptor(*sid)) == NULL) {
+       if (sid && *sid && (s = BATdescriptor(*sid)) == NULL) {
                BBPreleaseref(b->batCacheid);
                throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
        }
@@ -1713,7 +1706,7 @@ ALGthetasubselect2(bat *result, bat *bid
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
        }
-       if (sid && (s = BATdescriptor(*sid)) == NULL) {
+       if (sid && *sid && (s = BATdescriptor(*sid)) == NULL) {
                BBPreleaseref(b->batCacheid);
                throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
        }
@@ -2221,23 +2214,40 @@ ALGrangejoin(int *result, int *lid, int 
        throw(MAL, "algebra.rangejoin", GDK_EXCEPTION);
 }
 
-str
-ALGsubleftjoin4(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid)
+static str
+do_join(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid,
+               const char *op, lng *estimate,
+               gdk_return (*joinfunc)(BAT **, BAT **, BAT *, BAT *, BAT *, BAT 
*, BUN),
+               gdk_return (*thetafunc)(BAT **, BAT **, BAT *, BAT *, BAT *, 
BAT *, const char *, BUN),
+               const char *funcname)
 {
        BAT *left = NULL, *right = NULL, *candleft = NULL, *candright = NULL;
        BAT *result1, *result2;
+       BUN est;
 
        if ((left = BATdescriptor(*lid)) == NULL)
                goto fail;
        if ((right = BATdescriptor(*rid)) == NULL)
                goto fail;
-       if (slid && (candleft = BATdescriptor(*slid)) == NULL)
+       if (slid && *slid && (candleft = BATdescriptor(*slid)) == NULL)
                goto fail;
-       if (srid && (candright = BATdescriptor(*srid)) == NULL)
+       if (srid && *srid && (candright = BATdescriptor(*srid)) == NULL)
                goto fail;
-
-       if (BATsubleftjoin(&result1, &result2, left, right, candleft, 
candright, BUN_NONE) == GDK_FAIL)
-               goto fail;
+       if (estimate == NULL || *estimate < 0 || *estimate == lng_nil || 
*estimate > (lng) BUN_MAX)
+               est = BUN_NONE;
+       else
+               est = (BUN) *estimate;
+
+       if (thetafunc) {
+               assert(op != NULL);
+               assert(joinfunc == NULL);
+               if ((*thetafunc)(&result1, &result2, left, right, candleft, 
candright, op, est) == GDK_FAIL)
+                       goto fail;
+       } else {
+               assert(op == NULL);
+               if ((*joinfunc)(&result1, &result2, left, right, candleft, 
candright, est) == GDK_FAIL)
+                       goto fail;
+       }
        *r1 = result1->batCacheid;
        *r2 = result2->batCacheid;
        BBPkeepref(*r1);
@@ -2259,107 +2269,35 @@ ALGsubleftjoin4(bat *r1, bat *r2, bat *l
                BBPreclaim(candleft);
        if (candright)
                BBPreclaim(candright);
-       throw(MAL, "algebra.subleftjoin", RUNTIME_OBJECT_MISSING);
+       throw(MAL, funcname, RUNTIME_OBJECT_MISSING);
 }
 
 str
-ALGsubleftjoin(bat *r1, bat *r2, bat *l, bat *r)
+ALGsubjoin(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid, lng 
*estimate)
 {
-       return ALGsubleftjoin4(r1, r2, l, r, NULL, NULL);
+       return do_join(r1, r2, lid, rid, slid, srid, NULL, estimate,
+                                  BATsubjoin, NULL, "algebra.subjoin");
 }
 
 str
-ALGsubouterjoin4(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid)
+ALGsubleftjoin(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid, lng 
*estimate)
 {
-       BAT *left = NULL, *right = NULL, *candleft = NULL, *candright = NULL;
-       BAT *result1, *result2;
-
-       if ((left = BATdescriptor(*lid)) == NULL)
-               goto fail;
-       if ((right = BATdescriptor(*rid)) == NULL)
-               goto fail;
-       if (slid && (candleft = BATdescriptor(*slid)) == NULL)
-               goto fail;
-       if (srid && (candright = BATdescriptor(*srid)) == NULL)
-               goto fail;
-
-       if (BATsubouterjoin(&result1, &result2, left, right, candleft, 
candright, BUN_NONE) == GDK_FAIL)
-               goto fail;
-       *r1 = result1->batCacheid;
-       *r2 = result2->batCacheid;
-       BBPkeepref(*r1);
-       BBPkeepref(*r2);
-       BBPreleaseref(left->batCacheid);
-       BBPreleaseref(right->batCacheid);
-       if (candleft)
-               BBPreleaseref(candleft->batCacheid);
-       if (candright)
-               BBPreleaseref(candright->batCacheid);
-       return MAL_SUCCEED;
-
-  fail:
-       if (left)
-               BBPreclaim(left);
-       if (right)
-               BBPreclaim(right);
-       if (candleft)
-               BBPreclaim(candleft);
-       if (candright)
-               BBPreclaim(candright);
-       throw(MAL, "algebra.subouterjoin", RUNTIME_OBJECT_MISSING);
+       return do_join(r1, r2, lid, rid, slid, srid, NULL, estimate,
+                                  BATsubleftjoin, NULL, "algebra.subleftjoin");
 }
 
 str
-ALGsubouterjoin(bat *r1, bat *r2, bat *l, bat *r)
+ALGsubouterjoin(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid, 
lng *estimate)
 {
-       return ALGsubouterjoin4(r1, r2, l, r, NULL, NULL);
+       return do_join(r1, r2, lid, rid, slid, srid, NULL, estimate,
+                                  BATsubouterjoin, NULL, 
"algebra.subouterjoin");
 }
 
 str
-ALGsubthetajoin4(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid, 
str *op)
+ALGsubthetajoin(bat *r1, bat *r2, bat *lid, bat *rid, bat *slid, bat *srid, 
str *op, lng *estimate)
 {
-       BAT *left = NULL, *right = NULL, *candleft = NULL, *candright = NULL;
-       BAT *result1, *result2;
-
-       if ((left = BATdescriptor(*lid)) == NULL)
-               goto fail;
-       if ((right = BATdescriptor(*rid)) == NULL)
-               goto fail;
-       if (slid && (candleft = BATdescriptor(*slid)) == NULL)
-               goto fail;
-       if (srid && (candright = BATdescriptor(*srid)) == NULL)
-               goto fail;
-
-       if (BATsubthetajoin(&result1, &result2, left, right, candleft, 
candright, *op, BUN_NONE) == GDK_FAIL)
-               goto fail;
-       *r1 = result1->batCacheid;
-       *r2 = result2->batCacheid;
-       BBPkeepref(*r1);
-       BBPkeepref(*r2);
-       BBPreleaseref(left->batCacheid);
-       BBPreleaseref(right->batCacheid);
-       if (candleft)
-               BBPreleaseref(candleft->batCacheid);
-       if (candright)
-               BBPreleaseref(candright->batCacheid);
-       return MAL_SUCCEED;
-
-  fail:
-       if (left)
-               BBPreclaim(left);
-       if (right)
-               BBPreclaim(right);
-       if (candleft)
-               BBPreclaim(candleft);
-       if (candright)
-               BBPreclaim(candright);
-       throw(MAL, "algebra.subthetajoin", RUNTIME_OBJECT_MISSING);
-}
-
-str
-ALGsubthetajoin(bat *r1, bat *r2, bat *l, bat *r, str *op)
-{
-       return ALGsubthetajoin4(r1, r2, l, r, NULL, NULL, op);
+       return do_join(r1, r2, lid, rid, slid, srid, *op, estimate,
+                                  NULL, BATsubthetajoin, 
"algebra.subthetajoin");
 }
 
 static str
@@ -3152,11 +3090,11 @@ ALGsubsort33(bat *result, bat *norder, b
 
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "algebra.subsort", RUNTIME_OBJECT_MISSING);
-       if (order && (o = BATdescriptor(*order)) == NULL) {
+       if (order && *order && (o = BATdescriptor(*order)) == NULL) {
                BBPreleaseref(b->batCacheid);
                throw(MAL, "algebra.subsort", RUNTIME_OBJECT_MISSING);
        }
-       if (group && (g = BATdescriptor(*group)) == NULL) {
+       if (group && *group && (g = BATdescriptor(*group)) == NULL) {
                if (o)
                        BBPreleaseref(o->batCacheid);
                BBPreleaseref(b->batCacheid);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to