Changeset: 271a1d899d42 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/271a1d899d42
Modified Files:
        monetdb5/modules/mal/mkey.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        sql/backends/monet5/sql_statement.c
        sql/common/sql_types.c
Branch: pushcands
Log Message:

mkey module cleanup. Added candidate list support and updated its ancient 
interface


diffs (truncated from 1036 to 300 lines):

diff --git a/monetdb5/modules/mal/mkey.c b/monetdb5/modules/mal/mkey.c
--- a/monetdb5/modules/mal/mkey.c
+++ b/monetdb5/modules/mal/mkey.c
@@ -113,35 +113,26 @@
 #include "mal_interpreter.h"
 #include "mal_exception.h"
 
-#define MKEYHASH_bte(valp)     ((ulng) (lng) *(const bte*)(valp))
-#define MKEYHASH_sht(valp)     ((ulng) (lng) *(const sht*)(valp))
-#define MKEYHASH_int(valp)     ((ulng) (lng) *(const int*)(valp))
-#define MKEYHASH_lng(valp)     ((ulng) (lng) *(const lng*)(valp))
+#define MKEYHASH_bte(valp)     ((lng) valp)
+#define MKEYHASH_sht(valp)     ((lng) valp)
+#define MKEYHASH_int(valp)     ((lng) valp)
+#define MKEYHASH_lng(valp)     (valp)
 #ifdef HAVE_HGE
-#define MKEYHASH_hge(valp)     ((ulng) (*(const uhge *)(valp) >> 64) ^ \
-                                                        (ulng) *(const uhge 
*)(valp))
+#define MKEYHASH_hge(valp)     ((lng) (valp >> 64) ^ (lng) (valp))
 #endif
 
-static inline ulng
-GDK_ROTATE(ulng x, int y, int z)
+static inline lng
+GDK_ROTATE(lng x, int y, int z)
 {
        return (x << y) | (x >> z);
 }
 
-/* TODO: nil handling. however; we do not want to lose time in 
bulk_rotate_xor_hash with that */
 static str
-MKEYrotate(lng *res, const lng *val, const int *n)
+MKEYhash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       *res = (lng) GDK_ROTATE((ulng) *val, *n, (sizeof(lng)*8) - *n);
-       return MAL_SUCCEED;
-}
-
-static str
-MKEYhash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
-{
-       lng *res = getArgReference_lng(stk,p,0);
-       ptr val = getArgReference(stk,p,1);
-       int tpe = getArgType(mb,p,1);
+       lng *res = getArgReference_lng(stk,pci,0);
+       ptr val = getArgReference(stk,pci,1);
+       int tpe = getArgType(mb,pci,1);
 
        (void) cntxt;
        switch (ATOMstorage(tpe)) {
@@ -153,22 +144,22 @@ MKEYhash(Client cntxt, MalBlkPtr mb, Mal
                // illegal types, avoid falling into the default case.
                assert(0);
        case TYPE_bte:
-               *res = (lng) MKEYHASH_bte(val);
+               *res = MKEYHASH_bte((*(bte*)val));
                break;
        case TYPE_sht:
-               *res = (lng) MKEYHASH_sht(val);
+               *res = MKEYHASH_sht((*(sht*)val));
                break;
        case TYPE_int:
        case TYPE_flt:
-               *res = (lng) MKEYHASH_int(val);
+               *res = MKEYHASH_int((*(int*)val));
                break;
        case TYPE_lng:
        case TYPE_dbl:
-               *res = (lng) MKEYHASH_lng(val);
+               *res = MKEYHASH_lng((*(lng*)val));
                break;
 #ifdef HAVE_HGE
        case TYPE_hge:
-               *res = (lng) MKEYHASH_hge(val);
+               *res = MKEYHASH_hge((*(hge*)val));
                break;
 #endif
        default:
@@ -181,230 +172,259 @@ MKEYhash(Client cntxt, MalBlkPtr mb, Mal
        return MAL_SUCCEED;
 }
 
-static str
-MKEYbathash(bat *res, const bat *bid)
-{
-       BAT *b, *dst;
-       ulng *restrict r;
-       BUN n;
-
-       if ((b = BATdescriptor(*bid)) == NULL)
-               throw(SQL, "mkey.bathash", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+#define MKEYbathashloop(TPE) \
+       do { \
+               const TPE *restrict v = (const TPE *) Tloc(b, 0); \
+               if (ci.tpe == cand_dense) { \
+                       for (BUN i = 0; i < n; i++) { \
+                               oid p = (canditer_next_dense(&ci) - off); \
+                               r[i] = (lng) MKEYHASH_##TPE(v[p]); \
+                       } \
+               } else { \
+                       for (BUN i = 0; i < n; i++) { \
+                               oid p = (canditer_next(&ci) - off); \
+                               r[i] = (lng) MKEYHASH_##TPE(v[p]); \
+                       } \
+               } \
+       } while (0)
 
-       n = BATcount(b);
-       dst = COLnew(b->hseqbase, TYPE_lng, n, TRANSIENT);
-       if (dst == NULL) {
-               BBPunfix(b->batCacheid);
-               throw(SQL, "mkey.bathash", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+static str
+MKEYbathash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       bat *res = getArgReference_bat(stk, pci, 0), *bid = 
getArgReference_bat(stk, pci, 1),
+               *sid1 = pci->argc == 3 ? getArgReference_bat(stk, pci, 2) : 
NULL;
+       BAT *bn = NULL, *b = NULL, *bs = NULL;
+       str msg = MAL_SUCCEED;
+       struct canditer ci = {0};
+       oid off;
+       BUN n = 0;
+       lng *restrict r;
+
+       (void) cntxt;
+       (void) mb;
+       if (!(b = BATdescriptor(*bid))) {
+               msg = createException(MAL, "mkey.bathash", SQLSTATE(HY005) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
        }
-       BATsetcount(dst, n);
-
-       r = (ulng *) Tloc(dst, 0);
+       if (sid1 && !is_bat_nil(*sid1) && !(bs = BATdescriptor(*sid1))) {
+               msg = createException(MAL, "mkey.bathash", SQLSTATE(HY005) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       n = canditer_init(&ci, b, bs);
+       if (!(bn = COLnew(ci.hseq, TYPE_lng, n, TRANSIENT))) {
+               msg = createException(MAL, "mkey.bathash", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+       off = b->hseqbase;
+       r = (lng *) Tloc(bn, 0);
 
        switch (ATOMstorage(b->ttype)) {
        case TYPE_void: {
                oid o = b->tseqbase;
-               if (is_oid_nil(o))
-                       for (BUN i = 0; i < n; i++)
-                               r[i] = (ulng) lng_nil;
-               else
-                       for (BUN i = 0; i < n; i++)
-                               r[i] = o + i;
+               if (is_oid_nil(o)) {
+                       for (BUN i = 0; i < n; i++) {
+                               r[i] = lng_nil;
+                       }
+               } else {
+                       for (BUN i = 0; i < n; i++) {
+                               oid p = (canditer_next(&ci) - off);
+                               r[i] = (lng) (o + p);
+                       }
+               }
+       } break;
+       case TYPE_bte:
+               MKEYbathashloop(bte);
                break;
-       }
-       case TYPE_bte: {
-               const bte *restrict v = (const bte *) Tloc(b, 0);
-               for (BUN i = 0; i < n; i++)
-                       r[i] = MKEYHASH_bte(v + i);
+       case TYPE_sht:
+               MKEYbathashloop(sht);
                break;
-       }
-       case TYPE_sht: {
-               const sht *restrict v = (const sht *) Tloc(b, 0);
-               for (BUN i = 0; i < n; i++)
-                       r[i] = MKEYHASH_sht(v + i);
-               break;
-       }
        case TYPE_int:
-       case TYPE_flt: {
-               const int *restrict v = (const int *) Tloc(b, 0);
-               for (BUN i = 0; i < n; i++)
-                       r[i] = MKEYHASH_int(v + i);
+       case TYPE_flt:
+               MKEYbathashloop(int);
                break;
-       }
        case TYPE_lng:
-       case TYPE_dbl: {
-               const lng *restrict v = (const lng *) Tloc(b, 0);
-               for (BUN i = 0; i < n; i++)
-                       r[i] = MKEYHASH_lng(v + i);
+       case TYPE_dbl:
+               MKEYbathashloop(lng);
                break;
-       }
 #ifdef HAVE_HGE
-       case TYPE_hge: {
-               const hge *restrict v = (const hge *) Tloc(b, 0);
-               for (BUN i = 0; i < n; i++)
-                       r[i] = MKEYHASH_hge(v + i);
+       case TYPE_hge:
+               MKEYbathashloop(hge);
                break;
-       }
 #endif
        default: {
                BATiter bi = bat_iterator(b);
                BUN (*hash)(const void *) = BATatoms[b->ttype].atomHash;
-               int (*cmp)(const void *, const void *) = ATOMcompare(b->ttype);
-               const void *nil = ATOMnilptr(b->ttype);
 
-               for (BUN i = 0; i < n; i++) {
-                       const void *restrict v = BUNtail(bi, i);
-                       if ((*cmp)(v, nil) == 0)
-                               r[i] = (ulng) lng_nil;
-                       else
-                               r[i] = (ulng) (*hash)(v);
+               if (ci.tpe == cand_dense) {
+                       for (BUN i = 0; i < n; i++) {
+                               oid p = (canditer_next_dense(&ci) - off);
+                               r[i] = (lng) hash(BUNtail(bi, p));
+                       }
+               } else {
+                       for (BUN i = 0; i < n; i++) {
+                               oid p = (canditer_next(&ci) - off);
+                               r[i] = (lng) hash(BUNtail(bi, p));
+                       }
                }
-               break;
        }
        }
 
-       if (dst->batCount <= 1) {
-               BATkey(dst, true);
-               dst->tsorted = dst->trevsorted = true;
-       } else {
-               BATkey(dst, false);
-               dst->tsorted = dst->trevsorted = false;
+bailout:
+       if (bn && !msg) {
+               BATsetcount(bn, n);
+               bn->tnonil = false;
+               bn->tnil = false;
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*res = bn->batCacheid);
+       } else if (bn) {
+               BBPreclaim(bn);
        }
-       dst->tnonil = false;
-       dst->tnil = false;
-
-       BBPkeepref(*res = dst->batCacheid);
-       BBPunfix(b->batCacheid);
-       return MAL_SUCCEED;
+       if (b)
+               BBPunfix(b->batCacheid);
+       if (bs)
+               BBPunfix(bs->batCacheid);
+       return msg;
 }
 
 static str
-MKEYrotate_xor_hash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
+MKEYrotate_xor_hash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       lng *dst = getArgReference_lng(stk, p, 0);
-       ulng h = (ulng) *getArgReference_lng(stk, p, 1);
-       int lbit = *getArgReference_int(stk, p, 2);
-       int rbit = (int) sizeof(lng) * 8 - lbit;
-       int tpe = getArgType(mb, p, 3);
-       ptr pval = getArgReference(stk, p, 3);
-       ulng val;
+       lng *res = getArgReference_lng(stk, pci, 0), h = 
*getArgReference_lng(stk, pci, 1), val;
+       int lbit = *getArgReference_int(stk, pci, 2), rbit = (int) sizeof(lng) 
* 8 - lbit, tpe = getArgType(mb, pci, 3);
+       ptr pval = getArgReference(stk, pci, 3);
 
        (void) cntxt;
        switch (ATOMstorage(tpe)) {
        case TYPE_bte:
-               val = MKEYHASH_bte(pval);
+               val = MKEYHASH_bte((*(bte*)pval));
                break;
        case TYPE_sht:
-               val = MKEYHASH_sht(pval);
+               val = MKEYHASH_sht((*(sht*)pval));
                break;
        case TYPE_int:
        case TYPE_flt:
-               val = MKEYHASH_int(pval);
+               val = MKEYHASH_int((*(int*)pval));
                break;
        case TYPE_lng:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to