Changeset: 392772020e3d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=392772020e3d
Modified Files:
gdk/gdk.h
gdk/gdk_select.c
monetdb5/modules/kernel/algebra.mx
Branch: default
Log Message:
Implemented algebra.thetasubselect similar to algebra.subselect.
diffs (129 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -3139,6 +3139,7 @@ gdk_export int BATtopN(BAT *b, BUN topN)
#define JOIN_BAND 3
gdk_export BAT *BATsubselect(BAT *b, BAT *s, const void *tl, const void *th,
int li, int hi, int anti);
+gdk_export BAT *BATthetasubselect(BAT *b, BAT *s, const void *val, const char
*op);
gdk_export BAT *BATselect_(BAT *b, const void *tl, const void *th, bit li, bit
hi);
gdk_export BAT *BATuselect_(BAT *b, const void *tl, const void *th, bit li,
bit hi);
gdk_export BAT *BATantiuselect_(BAT *b, const void *tl, const void *th, bit
li, bit hi);
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -730,3 +730,41 @@ BATuselect(BAT *b, const void *h, const
{
return BATuselect_(b, h, t, TRUE, TRUE);
}
+
+BAT *
+BATthetasubselect(BAT *b, BAT *s, const void *val, const char *op)
+{
+ const void *nil;
+
+ BATcheck(b, "BATthetasubselect");
+ BATcheck(val, "BATthetasubselect");
+ BATcheck(op, "BATthetasubselect");
+
+ if (op[0] == '=' && ((op[1] == '=' && op[2] == 0) || op[2] == 0)) {
+ /* "=" or "==" */
+ return BATsubselect(b, s, val, NULL, 1, 1, 0);
+ }
+ nil = ATOMnilptr(b->ttype);
+ if (op[0] == '<') {
+ if (op[1] == 0) {
+ /* "<" */
+ return BATsubselect(b, s, nil, val, 0, 0, 0);
+ }
+ if (op[1] == '=' && op[2] == 0) {
+ /* "<=" */
+ return BATsubselect(b, s, nil, val, 0, 1, 0);
+ }
+ }
+ if (op[0] == '>') {
+ if (op[1] == 0) {
+ /* ">" */
+ return BATsubselect(b, s, val, nil, 0, 0, 0);
+ }
+ if (op[1] == '=' && op[2] == 0) {
+ /* ">=" */
+ return BATsubselect(b, s, val, nil, 1, 0, 0);
+ }
+ }
+ GDKerror("BATthetasubselect: unknown operator.\n");
+ return NULL;
+}
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
@@ -135,6 +135,23 @@ comment "Select all head values of the f
Note that the output is suitable as second input for this
function.";
+command thetasubselect(b:bat[:oid,:any_1], val:any_1, op:str) :bat[:oid,:oid]
+address ALGthetasubselect1
+comment "Select all head values for which the tail value obeys the relation
+ value OP VAL.
+ Input is a dense-headed BAT, output is a dense-headed BAT with in
+ the tail the head value of the input BAT for which the
+ relationship holds. The output BAT is sorted on the tail value.";
+
+command thetasubselect(b:bat[:oid,:any_1], s:bat[:oid,:oid], val:any_1,
op:str) :bat[:oid,:oid]
+address ALGthetasubselect2
+comment "Select all head values of the first input BAT for which the tail value
+ obeys the relation value OP VAL and for which the head value occurs in
+ the tail of the second input BAT.
+ Input is a dense-headed BAT, output is a dense-headed BAT with in
+ the tail the head value of the input BAT for which the
+ relationship holds. The output BAT is sorted on the tail value.";
+
command select(b:bat[:any_1,:any_2], low:any_2, high:any_2)
:bat[:any_1,:any_2]
address ALGselect
@@ -981,6 +998,8 @@ algebra_export str ALGBATminimum(ptr *re
algebra_export str ALGBATmaximum(ptr *result, int *bid);
algebra_export str ALGsubselect1(bat *result, bat *bid, const void *low, const
void *high, const bit *li, const bit *hi, const bit *anti);
algebra_export str ALGsubselect2(bat *result, bat *bid, bat *sid, const void
*low, const void *high, const bit *li, const bit *hi, const bit *anti);
+algebra_export str ALGthetasubselect1(bat *result, bat *bid, const void *val,
const char **op);
+algebra_export str ALGthetasubselect2(bat *result, bat *bid, bat *sid, const
void *val, const char **op);
algebra_export str ALGselect1(int *result, int *bid, ptr value);
algebra_export str ALGselect1Head(int *result, int *bid, ptr value);
algebra_export str ALGuselect1(int *result, int *bid, ptr value);
@@ -1969,6 +1988,36 @@ ALGsubselect1(bat *result, bat *bid, con
}
str
+ALGthetasubselect2(bat *result, bat *bid, bat *sid, const void *val, const
char **op)
+{
+ BAT *b, *s = NULL, *bn;
+
+ if ((b = BATdescriptor(*bid)) == NULL) {
+ throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
+ }
+ if (sid && (s = BATdescriptor(*sid)) == NULL) {
+ BBPreleaseref(b->batCacheid);
+ throw(MAL, "algebra.select", RUNTIME_OBJECT_MISSING);
+ }
+ @:derefStr(b,t,val)@
+ bn = BATthetasubselect(b, s, val, *op);
+ BBPreleaseref(b->batCacheid);
+ if (s)
+ BBPreleaseref(s->batCacheid);
+ if (bn == NULL)
+ throw(MAL, "algebra.subselect", GDK_EXCEPTION);
+ *result = bn->batCacheid;
+ BBPkeepref(bn->batCacheid);
+ return MAL_SUCCEED;
+}
+
+str
+ALGthetasubselect1(bat *result, bat *bid, const void *val, const char **op)
+{
+ return ALGthetasubselect2(result, bid, NULL, val, op);
+}
+
+str
ALGselect1(int *result, int *bid, ptr value)
{
BAT *b, *bn = NULL;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list