Changeset: 5461e2433098 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5461e2433098
Modified Files:
        gdk/gdk_private.h
        gdk/gdk_select.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_gencode.c
Branch: arrays
Log Message:

handling inequalities on dimensions.
At the moment <, <=, > and >= are handled but not combinations of
them (e.g. x<8 and x>4)


diffs (truncated from 518 to 300 lines):

diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -431,6 +431,7 @@ GDKreallocmax_debug(void *ptr, size_t si
 #define dimensionCharacteristics(TPE, dimensionBAT, min, max, step, 
elementRepeats, groupRepeats) \
 do {\
        TPE *vls; \
+       BUN i; \
        vls = (TPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
        *min = vls[0]; \
        *step = vls[BATcount(dimensionBAT)-1]; \
@@ -480,3 +481,16 @@ fprintf(stderr, "createDimension: %ld to
         BATderiveProps(resBAT,FALSE); \
                resBAT; \
        })
+
+#define dimensionElementsNum(min, max, step)\
+    ({\
+               long num = 1; \
+        if(!step) { \
+            if(min!=max) { \
+                GDKerror("dimensionElementsNum: step is 0 but min and max are 
not equal\n"); \
+                return NULL; \
+            } \
+        } else \
+            num = floor((max-min)/step) + 1; \
+               num; \
+    })
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1696,50 +1696,31 @@ BATsubselect(BAT *b, BAT *s, const void 
 }
 
 BAT *
-BATdimensionSubselect(BAT *inBAT, BAT *candBAT, const void *low, const void 
*high, int li, int hi, int anti) {
+BATdimensionSubselect(BAT *dimensionBAT, BAT *candBAT, const void *low, const 
void *high, int li, int hi, int anti) {
        oid elements_in_result =0;
        int type;
        const void *nil;
        BAT *b_tmp, *resBAT;
 
-       type = inBAT->ttype;
+       long elementRepeats, groupRepeats, elementsNum, qualifyingElementsNum;
+       long element_oid =0;
+       long i,j;
+       oid *res = NULL;
+
+       type = dimensionBAT->ttype;
        nil = ATOMnilptr(type);
        type = ATOMbasetype(type);
 
 
-(void)li;
 (void)hi;
-(void)anti;
-(void)*(int*)nil;
 
-       if(ATOMcmp(type, low, high) == 0) { //point selection
-               long repeat1, repeat2, elementsNum;
-               long element_oid =0, i, j;
-               oid *res = NULL;
-
-#define elements(TPE, el) \
+       if(ATOMcmp(type, low, high) == 0) { //point selection   
+#define equal(TPE, el) \
        do { \
                TPE min, max, step, it; \
-               TPE *el_in; \
-               oid i; \
 \
-               el_in = (TPE*)Tloc(inBAT, BUNfirst(inBAT)); \
-               min = el_in[0]; \
-               step = el_in[BATcount(inBAT)-1]; \
-\
-               repeat1 = 1; \
-               for(i=1; i<BATcount(inBAT); i++) { \
-                       if(min == el_in[i]) \
-                               repeat1++; \
-                       else { \
-                               max = el_in[i]; \
-                               break; \
-                       } \
-               } \
-\
-               repeat2 = BATcount(inBAT) - i -1; \
-\
-               elementsNum = floor((max-min)/step) + 1; \
+               dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
+               elementsNum = dimensionElementsNum(min, max, step); \
 \
                element_oid = 0; \
         for(it = min ; it <= max ; it += step) { \
@@ -1748,113 +1729,211 @@ BATdimensionSubselect(BAT *inBAT, BAT *c
             else \
                 break; \
         } \
-\
        } while(0)
                
                switch (ATOMtype(type)) {
                case TYPE_bte:
-               elements(bte, *(bte*)low);
+               equal(bte, *(bte*)low);
                break;
            case TYPE_sht:
-           elements(sht, *(sht*)low);
+           equal(sht, *(sht*)low);
                break;
        case TYPE_int:
-               elements(int, *(int*)low);
+               equal(int, *(int*)low);
                break;
        case TYPE_lng:
-               elements(lng, *(lng*)low);
+               equal(lng, *(lng*)low);
               break;
 #ifdef HAVE_HGE
        case TYPE_hge:
-               elements(hge, *(hge*)low);
+               equal(hge, *(hge*)low);
                break;
 #endif
        case TYPE_flt:
-               elements(flt, *(flt*)low);
+               equal(flt, *(flt*)low);
                break;
        case TYPE_dbl:
-               elements(dbl, *(dbl*)low);
+               equal(dbl, *(dbl*)low);
                break;
        case TYPE_oid:
-               elements(oid, *(oid*)low);
+               equal(oid, *(oid*)low);
                break;
                default:
                        fprintf(stderr, "BATdimensionSubselect: dimension type 
not handled\n");
             return NULL;
        }
 
-               if(element_oid >= elementsNum) { //the element dows not exist
-                       elements_in_result = 0;
+               if(element_oid >= elementsNum)//the element does not exist
+                       return newempty("BATdimensionSubselect");
+               qualifyingElementsNum = 1;      
+       } else if(ATOMcmp(type, high, nil) == 0) { //find values greater than 
low
+#define greater(TPE, el) \
+       do { \
+               TPE min, max, step, it; \
+\
+               dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
+               elementsNum = dimensionElementsNum(min, max, step); \
+\
+               element_oid = elementsNum; \
+        for(it = max ; it >= min ; it -= step) { \
+                       if(li && it >= el) \
+               element_oid--; \
+                       else if(!li && it > el) \
+                               element_oid--; \
+            else \
+                break; \
+        } \
+       } while(0)
+               
+               switch (ATOMtype(type)) {
+               case TYPE_bte:
+               greater(bte, *(bte*)low);
+               break;
+           case TYPE_sht:
+           greater(sht, *(sht*)low);
+               break;
+       case TYPE_int:
+               greater(int, *(int*)low);
+               break;
+       case TYPE_lng:
+               greater(lng, *(lng*)low);
+              break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               greater(hge, *(hge*)low);
+               break;
+#endif
+       case TYPE_flt:
+               greater(flt, *(flt*)low);
+               break;
+       case TYPE_dbl:
+               greater(dbl, *(dbl*)low);
+               break;
+       case TYPE_oid:
+               greater(oid, *(oid*)low);
+               break;
+               default:
+                       fprintf(stderr, "BATdimensionSubselect: dimension type 
not handled\n");
+            return NULL;
+       }
 
-                       //create new empty BAT
-                       if((b_tmp = BATnew(TYPE_void, TYPE_oid, 
elements_in_result, TRANSIENT)) == NULL)   \
-                               return NULL;
+               if(element_oid >= elementsNum) //low greater than max
+                       return newempty("BATdimensionSubselect");
+               qualifyingElementsNum = (elementsNum-element_oid);
+       } else if(ATOMcmp(type, low, nil) == 0) { //find values lower than high
+#define lower(TPE, el) \
+       do { \
+               TPE min, max, step, it; \
+\
+               dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
+               elementsNum = dimensionElementsNum(min, max, step); \
+\
+               element_oid = -1; \
+        for(it = min ; it <= max ; it += step) { \
+                       if(hi && it <= el) \
+               element_oid++; \
+                       else if(!hi && it < el) \
+                               element_oid++; \
+            else \
+                break; \
+        } \
+       } while(0)
+               
+               switch (ATOMtype(type)) {
+               case TYPE_bte:
+               lower(bte, *(bte*)high);
+               break;
+           case TYPE_sht:
+           lower(sht, *(sht*)high);
+               break;
+       case TYPE_int:
+               lower(int, *(int*)high);
+               break;
+       case TYPE_lng:
+               lower(lng, *(lng*)high);
+              break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               lower(hge, *(hge*)high);
+               break;
+#endif
+       case TYPE_flt:
+               lower(flt, *(flt*)high);
+               break;
+       case TYPE_dbl:
+               lower(dbl, *(dbl*)high);
+               break;
+       case TYPE_oid:
+               lower(oid, *(oid*)high);
+               break;
+               default:
+                       fprintf(stderr, "BATdimensionSubselect: dimension type 
not handled\n");
+            return NULL;
+       }
 
-               } else {
-                       element_oid *= repeat1;
+               if(element_oid < 0) //high lower than min
+                       return newempty("BATdimensionSubselect");
+               qualifyingElementsNum = element_oid+1;
+               element_oid=0; //it should add qualifying elementsNum from the 
beginning
+       } else
+               return newempty("BATdimensionSubselect");
 
-                       elements_in_result = repeat1*repeat2;
+       /*Add the qualifying oids to a BAT*/    
+       elements_in_result = qualifyingElementsNum*elementRepeats*groupRepeats;
+       element_oid *= elementRepeats;
 
-                       //create new BAT
-                       if((b_tmp = BATnew(TYPE_void, TYPE_oid, 
elements_in_result, TRANSIENT)) == NULL)   \
-                               return NULL;
+       //create new BAT
+       if((b_tmp = BATnew(TYPE_void, TYPE_oid, elements_in_result, TRANSIENT)) 
== NULL)   \
+               return NULL;
                
-                       res = (oid*) Tloc(b_tmp, BUNfirst(b_tmp));
-                       //add the oids in the result
-                       for(j=0; j<repeat2; j++) {
-                               for(i=0; i<repeat1; i++) {
-                                       fprintf(stderr, "Added oid: %ld\n", 
element_oid);
-                                       *res = element_oid;
-                                       res++;
-                                       element_oid++;
-                               }
-               
-                               element_oid += ((elementsNum*repeat1) - 
repeat1);
+       res = (oid*) Tloc(b_tmp, BUNfirst(b_tmp));
+       //add the oids in the result
+       for(j=0; j<groupRepeats; j++) {
+               for(i=0; i<qualifyingElementsNum*elementRepeats; i++) {
+                       fprintf(stderr, "Added oid: %ld\n", element_oid);
+                       *res = element_oid;
+                       res++;
+                       element_oid++;
+               }
+               //skip the non-qualifying elements
+               element_oid += 
(elementsNum-qualifyingElementsNum)*elementRepeats;
+       }
+       BATsetcount(b_tmp,elements_in_result);
+
+       if(ATOMcmp(type, low, high) == 0 && anti) { //the oids that do not 
qualify are those that should be kept
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to