Changeset: 2f4aaddd7096 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2f4aaddd7096
Modified Files:
        sql/backends/monet5/BDCC/bdcc.c
        sql/backends/monet5/BDCC/bdcc.h
        sql/backends/monet5/BDCC/bdcc.mal
        sql/server/rel_optimizer.c
Branch: BDCC
Log Message:

removed xtrrev, created remap. Remap means extract bits according to oldMask, 
and map them into new clustering with newMask.


diffs (203 lines):

diff --git a/sql/backends/monet5/BDCC/bdcc.c b/sql/backends/monet5/BDCC/bdcc.c
--- a/sql/backends/monet5/BDCC/bdcc.c
+++ b/sql/backends/monet5/BDCC/bdcc.c
@@ -1,64 +1,107 @@
 #include "bdcc.h"
 
-int xtrRev (int n, int m);
+// remap n according to oldM (to extract) and newM (to map)
+static inline int remap (int n,
+                        int oldM, int oldMul,
+                        int newM, int newMul, int newMWeight);
 
-int xtrRev (int n, int m) {
-  int mul;
-  int res;
+// number of set bits
+static inline int weight (int n);
 
-  for (mul = 1, res = 0; n & m; n >>= 1, m >>= 1)
-    if (m % 2) {
-      if (n % 2) res |= mul;
+// most significant bit of n is 2^(result)
+static inline int msb (int n);
 
-      mul <<= 1;
-    }
+static inline int weight (int n) {
+  int res = 0;
+  
+  while (n > 0) {
+    res += n & 1;
+    n >>= 1;
+  }
 
   return res;
 }
 
-bdcc_export char * BDCCxtrRev (bat * res, bat * b, int * m) {
-  BAT * B = BATdescriptor(*b);
-  BAT * Res = BATcopy(B, TYPE_void, TYPE_int, TRUE, TRANSIENT);
-  
-  int mIsRShift;
-  int mCopy = *m;
-  int mVal = *m;
-  int seenOne;
-  int numRShift;
+static inline int msb (int n) {
+  int res;
 
-  BUN i;
-  BATiter ResI = bat_iterator(Res);
-  BUN ResL;
+  if (n == 0) return 0;
+  else res = 1;
 
-  if (BATcount(B) == 0 || Res == NULL) throw(MAL, "bdcc.xtrRev", "ERROR");
+  while (n >>= 1) res <<= 1;
 
-  for (mIsRShift = 1, seenOne = 0, numRShift = 0; mCopy; mCopy >>= 1) {
-    if (mCopy % 2) {
-      if (!seenOne) seenOne = 1;
-    }
-    else {
-      if (seenOne) {
-       mIsRShift = 0;
-       break;
-      }
-      else numRShift++;
-    }
+  return res;
+}
+
+static inline int remap (int n,
+                        int oldM, int oldMul,
+                        int newM, int newMul, int newMWeight) {
+  int res = 0;
+  int i = 0;
+
+  while (i < newMWeight) {
+    while (!(oldMul & oldM)) oldMul >>= 1;
+    while (!(newMul & newM)) newMul >>= 1;
+    
+    if (oldMul & n) res |= newMul;
+
+    oldMul >>= 1;
+    newMul >>= 1;
+    i++;
   }
 
-  if (mIsRShift)
-    for (i = BUNfirst(Res), ResL = BUNlast(Res); i < ResL; i++) {
-      int * ResLoc = (int *) BUNtail(ResI, i);
-      
-      *ResLoc = *ResLoc >> numRShift;
-    }
+  return res;
+}
+
+bdcc_export char * BDCCremap (bat * res, bat * b, bat * oldMasks, bat * 
newMasks) {
+  BAT * B = BATdescriptor(*b);
+  BAT * Res;
+  BAT * OldMasks = BATdescriptor(*oldMasks);
+  BAT * NewMasks = BATdescriptor(*newMasks);
+
+  BATiter OldMasksIter = bat_iterator(OldMasks);
+  BATiter NewMasksIter = bat_iterator(NewMasks);
+
+  BATiter BIter;
+  BATiter ResIter;
+
+  int * BStart;
+  int * ResStart;
+  BUN BCount = BATcount(B);
   
-  else for (i = BUNfirst(Res), ResL = BUNlast(Res); i < ResL; i++) {
-      int * ResLoc = (int *) BUNtail(ResI, i);
+  BUN i;
 
-      *ResLoc = xtrRev(*ResLoc, mVal);
-    }
+  int zero;
 
-  Res->tsorted = (B->tsorted && mIsRShift) ? 1 : 0;
+  Res = BATconst(B, TYPE_int, &zero, TRANSIENT);
+
+  if (Res == NULL) throw(MAL, "bdcc.remap", "ERROR");
+
+  BIter = bat_iterator(B);
+  ResIter = bat_iterator(Res);
+
+  BStart = (int *) BUNtail(BIter, BUNfirst(B));
+  ResStart = (int *) BUNtail(ResIter, BUNfirst(Res));
+
+  for (i = BUNfirst(OldMasks); i < BUNlast(OldMasks); i++) {
+    int oldM = *(int *) BUNtail(OldMasksIter, i);
+    int newM = *(int *) BUNtail(NewMasksIter, i);
+
+    int oldMul = msb(oldM);
+    int newMul = msb(newM);
+
+    int newMWeight = weight(newM);
+
+    BUN j;
+
+    for (j = 0; j < BCount; j++)
+      ResStart[j] |= remap(BStart[j],
+                          oldM, oldMul,
+                          newM, newMul, newMWeight);
+  }
+
+  Res->tsorted = 0;
+  Res->trevsorted = 0;
 
   BBPkeepref(*res = Res->batCacheid);
 
diff --git a/sql/backends/monet5/BDCC/bdcc.h b/sql/backends/monet5/BDCC/bdcc.h
--- a/sql/backends/monet5/BDCC/bdcc.h
+++ b/sql/backends/monet5/BDCC/bdcc.h
@@ -14,6 +14,6 @@
 #define bdcc_export extern
 #endif
 
-bdcc_export char * BDCCxtrRev (bat * res, bat * b, int * m);
+bdcc_export char * BDCCremap (bat * res, bat * b, bat * oldMasks, bat * 
newMasks);
 
 #endif
diff --git a/sql/backends/monet5/BDCC/bdcc.mal 
b/sql/backends/monet5/BDCC/bdcc.mal
--- a/sql/backends/monet5/BDCC/bdcc.mal
+++ b/sql/backends/monet5/BDCC/bdcc.mal
@@ -1,11 +1,12 @@
 module bdcc;
 
-command xtrRev(b:bat[:oid,:int], mask:int):bat[:oid,:int]
-address BDCCxtrRev;
+command remap(b:bat[:oid,:int], oldMasks:bat[:oid,:int], 
newMasks:bat[:oid,:int]):bat[:oid,:int]
+address BDCCremap;
 
-function xtrrevjoin(x:bat[:oid,:int], xM:int, y:bat[:oid,:int], yM:int) 
(l:bat[:oid,:oid],r:bat[:oid,:oid]);
-    xRev := xtrRev(x, xM);
-    yRev := xtrRev(y, yM);
-    (l, r) := algebra.join(xRev, yRev);
+function remapjoin(x:bat[:oid,:int], xOldMasks:bat[:oid,:int], 
xNewMasks:bat[:oid,:int],
+                   y:bat[:oid,:int], yOldMasks:bat[:oid,:int], 
yNewMasks:bat[:oid,:int]) (l:bat[:oid,:oid],r:bat[:oid,:oid]);
+    xRemap := remap(x, xOldMasks, xNewMasks);
+    yRemap := remap(y, yOldMasks, yNewMasks);
+    (l, r) := algebra.join(xRemap, yRemap);
     return (l, r);
-end xtrrevjoin;
+end remapjoin;
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -377,8 +377,8 @@ exp_count(int *cnt, int seqnr, sql_exp *
                        }
                        return 6;
                case cmp_filter:
-                       *cnt += 2;
-                       return 2;
+                       *cnt += 1000;
+                       return 1000;
                case cmp_in: 
                case cmp_notin: {
                        list *l = e->r;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to