Changeset: d07bec002673 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d07bec002673
Modified Files:
gdk/gdk.h
gdk/gdk_cross.c
Branch: groupjoin
Log Message:
added outercrossproduct
diffs (225 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2326,6 +2326,8 @@ gdk_export BAT *BATthetaselect(BAT *b, B
gdk_export BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, role_t
role);
gdk_export gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, bool max_one)
__attribute__((__warn_unused_result__));
+gdk_export gdk_return BAToutercross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, bool max_one)
+ __attribute__((__warn_unused_result__));
gdk_export gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, bool nil_matches, BUN estimate)
__attribute__((__warn_unused_result__));
diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c
--- a/gdk/gdk_cross.c
+++ b/gdk/gdk_cross.c
@@ -17,29 +17,21 @@
* The result is two bats r1 and r2 which contain the OID (head
* values) of the input bats l and r.
* If max_one is set, r can have at most one row. */
-gdk_return
-BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, bool
max_one)
+static gdk_return
+BATcrossci(BAT **r1p, BAT **r2p, struct canditer *ci1, struct canditer *ci2)
{
BAT *bn1, *bn2 = NULL;
- struct canditer ci1, ci2;
oid *restrict p;
BUN i, j;
- canditer_init(&ci1, l, sl);
- canditer_init(&ci2, r, sr);
lng timeoffset = 0;
QryCtx *qry_ctx = MT_thread_get_qry_ctx();
if (qry_ctx != NULL) {
timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ?
(qry_ctx->starttime + qry_ctx->querytimeout) : 0;
}
- if (max_one && ci1.ncand > 0 && ci2.ncand > 1) {
- GDKerror("more than one match");
- return GDK_FAIL;
- }
-
/* first some special cases */
- if (ci1.ncand == 0 || ci2.ncand == 0) {
+ if (ci1->ncand == 0 || ci2->ncand == 0) {
if ((bn1 = BATdense(0, 0, 0)) == NULL)
return GDK_FAIL;
if (r2p) {
@@ -52,14 +44,14 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
*r1p = bn1;
return GDK_SUCCEED;
}
- if (ci2.ncand == 1) {
- if ((bn1 = canditer_slice(&ci1, 0, ci1.ncand)) == NULL)
+ if (ci2->ncand == 1) {
+ if ((bn1 = canditer_slice(ci1, 0, ci1->ncand)) == NULL)
return GDK_FAIL;
if (r2p) {
- if (ci1.ncand == 1) {
- bn2 = canditer_slice(&ci2, 0, ci2.ncand);
+ if (ci1->ncand == 1) {
+ bn2 = canditer_slice(ci2, 0, ci2->ncand);
} else {
- bn2 = BATconstant(0, TYPE_oid, &ci2.seq,
ci1.ncand, TRANSIENT);
+ bn2 = BATconstant(0, TYPE_oid, &ci2->seq,
ci1->ncand, TRANSIENT);
}
if (bn2 == NULL) {
BBPreclaim(bn1);
@@ -70,12 +62,12 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
*r1p = bn1;
return GDK_SUCCEED;
}
- if (ci1.ncand == 1) {
- bn1 = BATconstant(0, TYPE_oid, &ci1.seq, ci2.ncand, TRANSIENT);
+ if (ci1->ncand == 1) {
+ bn1 = BATconstant(0, TYPE_oid, &ci1->seq, ci2->ncand,
TRANSIENT);
if (bn1 == NULL)
return GDK_FAIL;
if (r2p) {
- bn2 = canditer_slice(&ci2, 0, ci2.ncand);
+ bn2 = canditer_slice(ci2, 0, ci2->ncand);
if (bn2 == NULL) {
BBPreclaim(bn1);
return GDK_FAIL;
@@ -86,48 +78,48 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
return GDK_SUCCEED;
}
- bn1 = COLnew(0, TYPE_oid, ci1.ncand * ci2.ncand, TRANSIENT);
+ bn1 = COLnew(0, TYPE_oid, ci1->ncand * ci2->ncand, TRANSIENT);
if (r2p)
- bn2 = COLnew(0, TYPE_oid, ci1.ncand * ci2.ncand, TRANSIENT);
+ bn2 = COLnew(0, TYPE_oid, ci1->ncand * ci2->ncand, TRANSIENT);
if (!bn1 || (r2p && !bn2)) {
BBPreclaim(bn1);
if (bn2)
BBPreclaim(bn2);
return GDK_FAIL;
}
- if (ci1.ncand > 0 && ci2.ncand > 0) {
- BATsetcount(bn1, ci1.ncand * ci2.ncand);
+ if (ci1->ncand > 0 && ci2->ncand > 0) {
+ BATsetcount(bn1, ci1->ncand * ci2->ncand);
bn1->tsorted = true;
- bn1->trevsorted = ci1.ncand <= 1;
- bn1->tkey = ci2.ncand <= 1;
+ bn1->trevsorted = ci1->ncand <= 1;
+ bn1->tkey = ci2->ncand <= 1;
bn1->tnil = false;
bn1->tnonil = true;
p = (oid *) Tloc(bn1, 0);
- for (i = 0; i < ci1.ncand; i++) {
+ for (i = 0; i < ci1->ncand; i++) {
GDK_CHECK_TIMEOUT_BODY(timeoffset,
GOTO_LABEL_TIMEOUT_HANDLER(bailout));
- oid x = canditer_next(&ci1);
- for (j = 0; j < ci2.ncand; j++) {
+ oid x = canditer_next(ci1);
+ for (j = 0; j < ci2->ncand; j++) {
*p++ = x;
}
}
- BATtseqbase(bn1, ci2.ncand == 1 ? *(oid *) Tloc(bn1, 0) :
oid_nil);
+ BATtseqbase(bn1, ci2->ncand == 1 ? *(oid *) Tloc(bn1, 0) :
oid_nil);
if (bn2) {
- BATsetcount(bn2, ci1.ncand * ci2.ncand);
- bn2->tsorted = ci1.ncand <= 1 || ci2.ncand <= 1;
- bn2->trevsorted = ci2.ncand <= 1;
- bn2->tkey = ci1.ncand <= 1;
+ BATsetcount(bn2, ci1->ncand * ci2->ncand);
+ bn2->tsorted = ci1->ncand <= 1 || ci2->ncand <= 1;
+ bn2->trevsorted = ci2->ncand <= 1;
+ bn2->tkey = ci1->ncand <= 1;
bn2->tnil = false;
bn2->tnonil = true;
p = (oid *) Tloc(bn2, 0);
- for (i = 0; i < ci1.ncand; i++) {
+ for (i = 0; i < ci1->ncand; i++) {
GDK_CHECK_TIMEOUT_BODY(timeoffset,
GOTO_LABEL_TIMEOUT_HANDLER(bailout));
- for (j = 0; j < ci2.ncand; j++) {
- *p++ = canditer_next(&ci2);
+ for (j = 0; j < ci2->ncand; j++) {
+ *p++ = canditer_next(ci2);
}
- canditer_reset(&ci2);
+ canditer_reset(ci2);
}
- BATtseqbase(bn2, ci1.ncand == 1 ? *(oid *) Tloc(bn2, 0)
: oid_nil);
+ BATtseqbase(bn2, ci1->ncand == 1 ? *(oid *) Tloc(bn2,
0) : oid_nil);
}
}
*r1p = bn1;
@@ -144,3 +136,72 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
BBPreclaim(bn2);
return GDK_FAIL;
}
+
+gdk_return
+BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, bool
max_one)
+{
+ struct canditer ci1, ci2;
+
+ canditer_init(&ci1, l, sl);
+ canditer_init(&ci2, r, sr);
+ if (max_one && ci1.ncand > 0 && ci2.ncand > 1) {
+ GDKerror("more than one match");
+ return GDK_FAIL;
+ }
+ return BATcrossci(r1p, r2p, &ci1, &ci2);
+}
+
+gdk_return
+BAToutercross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, bool
max_one)
+{
+ struct canditer ci1, ci2;
+
+ canditer_init(&ci1, l, sl);
+ canditer_init(&ci2, r, sr);
+ if (max_one && ci1.ncand > 0 && ci2.ncand > 1) {
+ GDKerror("more than one match");
+ return GDK_FAIL;
+ }
+
+ if (ci1.ncand == 0) {
+ BAT *bn = COLnew(0, TYPE_void, ci2.ncand, TRANSIENT);
+ if (bn == NULL)
+ return GDK_FAIL;
+ BATtseqbase(bn, oid_nil);
+ BATsetcount(bn, ci2.ncand);
+ *r1p = bn;
+ if (r2p) {
+ if (ci2.ncand == 0) {
+ bn = COLnew(0, TYPE_void, ci2.ncand, TRANSIENT);
+ if (bn != NULL) {
+ BATtseqbase(bn, oid_nil);
+ BATsetcount(bn, ci2.ncand);
+ }
+ } else {
+ bn = canditer_slice(&ci2, 0, ci2.ncand);
+ }
+ if (bn == NULL) {
+ BBPreclaim(*r1p);
+ return GDK_FAIL;
+ }
+ *r2p = bn;
+ }
+ return GDK_SUCCEED;
+ }
+ if (ci2.ncand == 0) {
+ BAT *bn = canditer_slice(&ci1, 0, ci1.ncand);
+ if (bn == NULL)
+ return GDK_FAIL;
+ *r1p = bn;
+ if (r2p) {
+ BAT *bn = COLnew(0, TYPE_void, ci1.ncand, TRANSIENT);
+ if (bn == NULL)
+ return GDK_FAIL;
+ BATtseqbase(bn, oid_nil);
+ BATsetcount(bn, ci1.ncand);
+ *r2p = bn;
+ }
+ return GDK_SUCCEED;
+ }
+ return BATcrossci(r1p, r2p, &ci1, &ci2);
+}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]