Changeset: 9afaa1d718df for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9afaa1d718df Modified Files: gdk/gdk_project.c Branch: Jun2020 Log Message:
Added missing implementation for dense left column with two right columns.
diffs (116 lines):
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -58,20 +58,34 @@ project_##TYPE(BAT *restrict bn, BAT *re
v = r2t[o - r2seq]; \
bt[lo] = v; \
} \
+ } else if (BATtdense(l)) { \
+ for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \
+ oid o = l->tseqbase + lo; \
+ if (o < r1seq || o >= r2end) { \
+ GDKerror("BATproject: does not match
always\n"); \
+ return GDK_FAIL; \
+ } \
+ if (o < r1end) \
+ v = r1t[o - r1seq]; \
+ else \
+ v = r2t[o - r2seq]; \
+ bt[lo] = v; \
+ } \
} else { \
- const oid *restrict o = (const oid *) Tloc(l, 0); \
+ const oid *restrict ot = (const oid *) Tloc(l, 0); \
for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \
- if (is_oid_nil(o[lo])) { \
+ oid o = ot[lo]; \
+ if (is_oid_nil(o)) { \
bt[lo] = v = TYPE##_nil; \
bn->tnil = true; \
- } else if (o[lo] < r1seq || o[lo] >= r2end) { \
+ } else if (o < r1seq || o >= r2end) { \
GDKerror("BATproject: does not match
always\n"); \
return GDK_FAIL; \
- } else if (o[lo] < r1end) { \
- v = r1t[o[lo] - r1seq]; \
+ } else if (o < r1end) { \
+ v = r1t[o - r1seq]; \
bt[lo] = v; \
} else { \
- v = r2t[o[lo] - r2seq]; \
+ v = r2t[o - r2seq]; \
bt[lo] = v; \
} \
} \
@@ -144,6 +158,29 @@ project_oid(BAT *restrict bn, BAT *restr
bt[lo] = o - r2seq + r2->tseqbase;
}
}
+ } else if (BATtdense(l)) {
+ for (lo = 0, hi = BATcount(l); lo < hi; lo++) {
+ oid o = l->tseqbase + lo;
+ if (o < r1seq || o >= r2end) {
+ GDKerror("BATproject: does not match always\n");
+ return GDK_FAIL;
+ }
+ if (o < r1end) {
+ if (r1ci.s)
+ bt[lo] = canditer_idx(&r1ci, o - r1seq);
+ else if (r1t)
+ bt[lo] = r1t[o - r1seq];
+ else
+ bt[lo] = o - r1seq + r1->tseqbase;
+ } else {
+ if (r2ci.s)
+ bt[lo] = canditer_idx(&r2ci, o - r2seq);
+ else if (r2t)
+ bt[lo] = r2t[o - r2seq];
+ else
+ bt[lo] = o - r2seq + r2->tseqbase;
+ }
+ }
} else {
const oid *ot = (const oid *) Tloc(l, 0);
for (lo = 0, hi = BATcount(l); lo < hi; lo++) {
@@ -211,20 +248,35 @@ project_any(BAT *restrict bn, BAT *restr
if (tfastins_nocheck(bn, lo, v, Tsize(bn)) !=
GDK_SUCCEED)
return GDK_FAIL;
}
+ } else if (BATtdense(l)) {
+ for (lo = 0, hi = BATcount(l); lo < hi; lo++) {
+ oid o = l->tseqbase + lo;
+ if (o < r1seq || o >= r2end) {
+ GDKerror("BATproject: does not match always\n");
+ return GDK_FAIL;
+ }
+ if (o < r1end)
+ v = BUNtail(r1i, o - r1seq);
+ else
+ v = BUNtail(r2i, o - r2seq);
+ if (tfastins_nocheck(bn, lo, v, Tsize(bn)) !=
GDK_SUCCEED)
+ return GDK_FAIL;
+ }
} else {
- const oid *restrict o = (const oid *) Tloc(l, 0);
+ const oid *restrict ot = (const oid *) Tloc(l, 0);
for (lo = 0, hi = BATcount(l); lo < hi; lo++) {
- if (is_oid_nil(o[lo])) {
+ oid o = ot[lo];
+ if (is_oid_nil(o)) {
v = nil;
bn->tnil = true;
- } else if (o[lo] < r1seq || o[lo] >= r2end) {
+ } else if (o < r1seq || o >= r2end) {
GDKerror("BATproject: does not match always\n");
return GDK_FAIL;
- } else if (o[lo] < r1end) {
- v = BUNtail(r1i, o[lo] - r1seq);
+ } else if (o < r1end) {
+ v = BUNtail(r1i, o - r1seq);
} else {
- v = BUNtail(r2i, o[lo] - r2seq);
+ v = BUNtail(r2i, o - r2seq);
}
if (tfastins_nocheck(bn, lo, v, Tsize(bn)) !=
GDK_SUCCEED)
return GDK_FAIL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
