Changeset: 45ea23a3053c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45ea23a3053c
Modified Files:
        monetdb5/modules/mal/Tests/mosaic_zone_joins.mal
        monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out
        monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal
        monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out
        monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal
        monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out
        monetdb5/modules/mal/mosaic.c
        monetdb5/modules/mal/mosaic.h
        monetdb5/modules/mal/mosaic_zone.c
        monetdb5/modules/mal/mosaic_zone.h
Branch: mosaic
Log Message:

Use the correct tests to fix errors


diffs (268 lines):

diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal 
b/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal
--- a/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal
@@ -7,7 +7,7 @@ bat.append(b,9);
 b:= bat.append(b,b);
 
 io.print(b);
-x:= mosaic.compress(b,"none");
+x:= mosaic.compress(b,"zone");
 
 c:= bat.new(:oid,:oid);
 bat.append(c,0@0);
diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out 
b/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out
--- a/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out
@@ -25,7 +25,7 @@ function user.main():void;
     bat.append(b,9);
     b := bat.append(b,b);
     io.print(b);
-    x := mosaic.compress(b,"none");
+    x := mosaic.compress(b,"zone");
     c := bat.new(:oid,:oid);
     bat.append(c,0@0);
     bat.append(c,2@0);
diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal 
b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal
--- a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal
@@ -8,7 +8,7 @@ bat.append(b,9);
 b:= bat.append(b,b);
 
 io.print(b);
-x:= mosaic.compress(b,"none");
+x:= mosaic.compress(b,"zone");
 #mosaic.dump(x);
 s:= algebra.subselect(b,0,50,false,false,false);
 io.print(s);
diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out 
b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out
--- a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out
@@ -25,7 +25,7 @@ function user.main():void;
     bat.append(b,9);
     b := bat.append(b,b);
     io.print(b);
-    x := mosaic.compress(b,"none");
+    x := mosaic.compress(b,"zone");
 #mosaic.dump(x); 
     s := algebra.subselect(b,0,50,false,false,false);
     io.print(s);
diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal 
b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal
--- a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal
@@ -7,7 +7,7 @@ bat.append(b,9);
 b:= bat.append(b,b);
 
 io.print(b);
-x:= mosaic.compress(b,"none");
+x:= mosaic.compress(b,"zone");
 
 s:= algebra.thetasubselect(b,50,"<");
 io.print(s);
diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out 
b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out
--- a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out
+++ b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out
@@ -25,7 +25,7 @@ function user.main():void;
     bat.append(b,9);
     b := bat.append(b,b);
     io.print(b);
-    x := mosaic.compress(b,"none");
+    x := mosaic.compress(b,"zone");
     s := algebra.thetasubselect(b,50,"<");
     io.print(s);
     xs := mosaic.thetasubselect(x,50,"<");
diff --git a/monetdb5/modules/mal/mosaic.c b/monetdb5/modules/mal/mosaic.c
--- a/monetdb5/modules/mal/mosaic.c
+++ b/monetdb5/modules/mal/mosaic.c
@@ -311,6 +311,13 @@ MOScompressInternal(Client cntxt, int *r
                case MOSAIC_ZONE:
                        if( task->blk->cnt == 0)
                                task->dst += 2 * MosaicBlkSize;
+                       if ( task->blk->cnt > MAXZONESIZE){
+                               MOSupdateHeader(cntxt,task);
+                               MOSadvance_zone(task);
+                               task->dst = ((char*) task->blk)+ MosaicBlkSize;
+                               task->blk->tag = MOSAIC_EOL;
+                               task->blk->cnt = 0;
+                       }
                        MOScompress_zone(cntxt,task);
                        break;
                default :
@@ -588,6 +595,11 @@ MOSsubselect(Client cntxt, MalBlkPtr mb,
                        first += task->blk->cnt;
                        MOSskip_dict(task);
                        break;
+               case MOSAIC_ZONE:
+                       MOSsubselect_zone(cntxt,task,first,first + 
task->blk->cnt,low,hgh,li,hi,anti);
+                       first += task->blk->cnt;
+                       MOSskip_zone(task);
+                       break;
                case MOSAIC_NONE:
                default:
                        MOSsubselect_none(cntxt,task,first,first + 
task->blk->cnt,low,hgh,li,hi,anti);
@@ -688,6 +700,11 @@ str MOSthetasubselect(Client cntxt, MalB
                        first += task->blk->cnt;
                        MOSskip_dict(task);
                        break;
+               case MOSAIC_ZONE:
+                       MOSthetasubselect_zone(cntxt,task,first,first + 
task->blk->cnt,low,*oper);
+                       first += task->blk->cnt;
+                       MOSskip_zone(task);
+                       break;
                case MOSAIC_NONE:
                default:
                        MOSthetasubselect_none(cntxt,task,first,first + 
task->blk->cnt,low,*oper);
@@ -785,6 +802,11 @@ str MOSleftfetchjoin(Client cntxt, MalBl
                        first += task->blk->cnt;
                        MOSskip_dict(task);
                        break;
+               case MOSAIC_ZONE:
+                       MOSleftfetchjoin_zone(cntxt, task, first, first + 
task->blk->cnt);
+                       first += task->blk->cnt;
+                       MOSskip_zone(task);
+                       break;
                case MOSAIC_NONE:
                        MOSleftfetchjoin_none(cntxt, task, first, first + 
task->blk->cnt);
                        first += task->blk->cnt;
@@ -888,6 +910,11 @@ MOSjoin(Client cntxt, MalBlkPtr mb, MalS
                        first += (BUN) task->blk->cnt;
                        MOSskip_dict(task);
                        break;
+               case MOSAIC_ZONE:
+                       MOSjoin_zone(cntxt, task, first, first + 
task->blk->cnt);
+                       first += (BUN) task->blk->cnt;
+                       MOSskip_zone(task);
+                       break;
                case MOSAIC_NONE:
                        MOSjoin_none(cntxt, task, first, first + 
task->blk->cnt);
                        first += (BUN) task->blk->cnt;
diff --git a/monetdb5/modules/mal/mosaic.h b/monetdb5/modules/mal/mosaic.h
--- a/monetdb5/modules/mal/mosaic.h
+++ b/monetdb5/modules/mal/mosaic.h
@@ -85,6 +85,8 @@ typedef struct MOSTASK{
        BUN     elm;            // elements left to compress
        char *src;              // read pointer into source
 
+       void *min, *max;// space for zones
+
        oid *lb, *rb;   // Collected oids from operations
        oid *cl;                // candidate admin
        lng     n;                      // element count in candidate list
diff --git a/monetdb5/modules/mal/mosaic_zone.c 
b/monetdb5/modules/mal/mosaic_zone.c
--- a/monetdb5/modules/mal/mosaic_zone.c
+++ b/monetdb5/modules/mal/mosaic_zone.c
@@ -98,6 +98,14 @@ MOSestimate_zone(Client cntxt, MOStask t
        return 2;
 }
 
+#define ZONEbreak(TPE)\
+{      TPE *min,*max;\
+       min = (TPE*)zone_min(blk);\
+       max = (TPE*)zone_max(blk);\
+       if ( task->min ==0 || *(TPE*)task->min > *min) task->min = (void*) min;\
+       if ( task->max ==0 || *(TPE*)task->max < *max ) task->max = (void*) 
max;\
+}
+
 // rather expensive simple value non-compressed store
 void
 MOScompress_zone(Client cntxt, MOStask task)
@@ -129,6 +137,25 @@ MOScompress_zone(Client cntxt, MOStask t
        case TYPE_flt: ZONEcompress(flt); break;
        case TYPE_dbl: ZONEcompress(dbl); break;
        }
+       // maintain a global min-max pair
+       // break the zone when it covers too many elements
+       switch(ATOMstorage(task->type)){
+       case TYPE_bte: ZONEbreak(bte); break ;
+       case TYPE_bit: ZONEbreak(bit); break ;
+       case TYPE_sht: ZONEbreak(sht); break;
+       case TYPE_int:
+       {       int *min,*max;
+               min = (int*)zone_min(blk);
+               max = (int*)zone_max(blk);
+               if ( task->min ==0 || *(int*)task->min > *min) task->min = 
(void*) min;
+               if ( task->max ==0 || *(int*)task->max < *max ) task->max = 
(void*) max;
+       }
+               break;
+       case TYPE_lng: ZONEbreak(lng); break;
+       case TYPE_flt: ZONEbreak(flt); break;
+       case TYPE_dbl: ZONEbreak(dbl); break;
+       }
+       
        MOSdump_zone(cntxt, task);
 #ifdef _DEBUG_MOSAIC_
 #endif
@@ -183,7 +210,7 @@ MOSdecompress_zone(Client cntxt, MOStask
                min = (TPE*)zone_min(task->blk);\
                max = (TPE*)zone_max(task->blk);\
                if( !*anti){\
-                       if ( *(int*)low > *max || *(int*) hgh < *min)\
+                       if ( (*(TPE*)low != TPE##_nil && *(TPE *)low > *max) || 
(*(TPE *)hgh != TPE##_nil && *(TPE *) hgh < *min))\
                                break;\
                        if( *(TPE*) low == TPE##_nil && *(TPE*) hgh == 
TPE##_nil){\
                                for( ; first < last; first++){\
@@ -216,7 +243,7 @@ MOSdecompress_zone(Client cntxt, MOStask
                                }\
                        }\
                } else {\
-                       if ( *(int*)low >= *min && *(int*) hgh <= *max)\
+                       if ( *(TPE*)low != TPE##_nil && *(TPE*)low >= *min && 
*(TPE*)hgh != TPE##_nil && *(TPE*) hgh <= *max)\
                                break;\
                        if( *(TPE*) low == TPE##_nil && *(TPE*) hgh == 
TPE##_nil){\
                                /* nothing is matching */\
@@ -280,7 +307,7 @@ MOSsubselect_zone(Client cntxt,  MOStask
 
                        if( !*anti){
                                // prefilter based on zone map
-                               if ( *(int*)low > *max || *(int*) hgh < *min)
+                               if ( (*(int*) low != int_nil && *(int*)low > 
*max) || (*(int*)hgh != int_nil && *(int*) hgh < *min))
                                        break;
 
                                if( *(int*) low == int_nil && *(int*) hgh == 
int_nil){
@@ -315,7 +342,7 @@ MOSsubselect_zone(Client cntxt,  MOStask
                                }
                        } else {
                                // prefilter based on zone map
-                               if ( *(int*)low >= *min && *(int*) hgh <= *max)
+                               if ( *(int*)low != int_nil && *(int*)low >= 
*min && *(int*)hgh != int_nil && *(int*) hgh <= *max)
                                        break;
                                if( *(int*) low == int_nil && *(int*) hgh == 
int_nil){
                                        /* nothing is matching */
@@ -446,10 +473,10 @@ MOSsubselect_zone(Client cntxt,  MOStask
                hgh= low= *(TPE*) val;\
        } \
        if(!anti){\
-               if  (*min > hgh || low < *max )\
+               if  ( (hgh != TPE##_nil && *min > hgh) || (low !=TPE##_nil && 
*max <low) )\
                        break;\
        } else{\
-               if  (*min >= low && hgh <= *max )\
+               if  ( low != TPE##_nil && *min >= low && hgh != TPE##_nil && 
hgh <= *max )\
                        break;\
        }\
        v = (TPE*) (((char*)task->blk) + 3 * MosaicBlkSize);\
@@ -514,10 +541,10 @@ MOSthetasubselect_zone(Client cntxt,  MO
                                hgh= low= *(int*) val;
                        } 
                        if(!anti){
-                               if  (*min > hgh || low < *max )
+                               if  ( (hgh != int_nil && *min > hgh) || (low 
!=int_nil && *max <low) )
                                        break;
                        } else{
-                               if  (*min >= low && hgh <= *max )
+                               if  ( low != int_nil && *min >= low && hgh != 
int_nil && hgh <= *max )
                                        break;
                        }
                        v = (int*) (((char*)task->blk) + 3 * MosaicBlkSize);
diff --git a/monetdb5/modules/mal/mosaic_zone.h 
b/monetdb5/modules/mal/mosaic_zone.h
--- a/monetdb5/modules/mal/mosaic_zone.h
+++ b/monetdb5/modules/mal/mosaic_zone.h
@@ -29,6 +29,9 @@
 #include "mal_interpreter.h"
 #include "mal_client.h"
 
+// limit the size of a zone based on count 
+#define MAXZONESIZE 32*1024
+
 mosaic_export void MOSdump_zone(Client cntxt, MOStask task);
 mosaic_export void MOSadvance_zone(MOStask task);
 mosaic_export void MOSskip_zone(MOStask task);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to