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

Reply via email to