Changeset: f2f0c9f97f5b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f2f0c9f97f5b
Modified Files:
        gdk/gdk_imprints.c
        gdk/gdk_select.c
Branch: Oct2014
Log Message:

Check min/max before starting imprints scan.


diffs (76 lines):

diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -568,7 +568,7 @@ BATimprints(BAT *b)
 {
        BAT *o = NULL;
        Imprints *imprints;
-       lng t0 =0,t1=0;
+       lng t0 = 0, t1 = 0;
 
        assert(BAThdense(b));   /* assert void head */
 
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -341,6 +341,28 @@ do {                                                       
                \
        }                                                               \
 } while (0)
 
+#define checkMINMAX(B)                                                         
                                        \
+do {                                                                           
                                                        \
+       int ii;                                                                 
                                                        \
+       BUN *imp_cnt = (BUN *) (((oid *)imprints->stats)+128);                  
        \
+       imp_min = imp_max = nil;                                                
                                        \
+       for (ii = 0; ii < B; ii++) {                                            
                                \
+               if ((imp_min == nil) && (imp_cnt[ii])) {                        
                        \
+                       imp_min = src[((oid *)imprints->stats)[ii]];            
                \
+               }                                                               
                                                                \
+               if ((imp_max == nil) && (imp_cnt[B-1-ii])) {                    
                \
+                       imp_max = src[(((oid *)imprints->stats)+64)[B-1-ii]];   
        \
+               }                                                               
                                                                \
+       }                                                                       
                                                                \
+       assert((imp_min != nil) && (imp_max != nil));                           
                \
+       if (!s && VIEWtparent(b)) { /* no candidate list and no views*/         
\
+               if ((vl > imp_max || vh < imp_min) ||                           
                        \
+                       (anti && (vl < imp_min && vh > imp_max))) {             
                        \
+               return BUN_NONE;                                                
                                                \
+               }                                                               
                                                                \
+       }                                                                       
                                                                \
+} while (0)                                                                    
                                                        \
+
 /* choose number of bits */
 #define bitswitch(CAND,TEST)                                           \
 do {                                                                   \
@@ -352,10 +374,10 @@ do {                                                      
                \
                          s && BATtdense(s) ? "(dense)" : "",           \
                          anti, #TEST);                                 \
        switch (imprints->bits) {                                       \
-       case 8:  impsmask(CAND,TEST,8); break;                          \
-       case 16: impsmask(CAND,TEST,16); break;                         \
-       case 32: impsmask(CAND,TEST,32); break;                         \
-       case 64: impsmask(CAND,TEST,64); break;                         \
+       case 8:  checkMINMAX(8); impsmask(CAND,TEST,8); break;                  
        \
+       case 16: checkMINMAX(16); impsmask(CAND,TEST,16); break;                
                \
+       case 32: checkMINMAX(32); impsmask(CAND,TEST,32); break;                
                \
+       case 64: checkMINMAX(64); impsmask(CAND,TEST,64); break;                
                \
        default: assert(0); break;                                      \
        }                                                               \
 } while (0)
@@ -450,11 +472,13 @@ NAME##_##TYPE (BAT *b, BAT *s, BAT *bn, 
 {                                                                      \
        TYPE vl = *(const TYPE *) tl;                                   \
        TYPE vh = *(const TYPE *) th;                                   \
-       TYPE v;                                                         \
-       TYPE nil = TYPE##_nil;                                          \
+       TYPE imp_min;                                                           
        \
+       TYPE imp_max;                                                           
        \
+       TYPE v;                                                                 
                \
+       TYPE nil = TYPE##_nil;                                                  
\
        TYPE minval = MINVALUE##TYPE;                                   \
        TYPE maxval = MAXVALUE##TYPE;                                   \
-       const TYPE *src = (const TYPE *) Tloc(b, 0);                    \
+       const TYPE *src = (const TYPE *) Tloc(b, 0);    \
        oid o;                                                          \
        BUN w, p = r;                                                   \
        BUN pr_off = 0;                                                 \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to