Changeset: 1c79d78a1df8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1c79d78a1df8
Branch: default
Log Message:

Merge branch string_imprints into default.


diffs (truncated from 2851 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9167,6 +9167,8 @@
 [ "optimizer", "reorder",      "pattern optimizer.reorder():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "reorder",      "pattern optimizer.reorder(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Reorder by dataflow dependencies"      ]
 [ "optimizer", "sequential_pipe",      "function 
optimizer.sequential_pipe():void;",   "",     ""      ]
+[ "optimizer", "strimps",      "pattern optimizer.strimps():str ",     
"OPTwrapper;",  ""      ]
+[ "optimizer", "strimps",      "pattern optimizer.strimps(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Use strimps index if appropriate"      ]
 [ "optimizer", "volcano",      "pattern optimizer.volcano():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "volcano",      "pattern optimizer.volcano(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Simulate volcano style execution"      ]
 [ "optimizer", "volcano_pipe", "function optimizer.volcano_pipe():void;",      
"",     ""      ]
@@ -9316,6 +9318,7 @@
 [ "sql",       "covariancep",  "pattern sql.covariancep(X_0:lng, X_1:lng, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",  "SQLcovar_pop;",        
"return the covariance population value of groups"      ]
 [ "sql",       "covariancep",  "pattern sql.covariancep(X_0:sht, X_1:sht, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",  "SQLcovar_pop;",        
"return the covariance population value of groups"      ]
 [ "sql",       "createorderindex",     "unsafe pattern 
sql.createorderindex(X_0:str, X_1:str, X_2:str):void ", 
"sql_createorderindex;",        "Instantiate the order index on a column"       
]
+[ "sql",       "createstrimps",        "unsafe pattern 
sql.createstrimps(X_0:str, X_1:str, X_2:str):void ",    "sql_createstrimps;",   
"Instantiate the strimps index on a column"     ]
 [ "sql",       "cume_dist",    "pattern sql.cume_dist(X_0:any_1, X_1:bit, 
X_2:bit):dbl ",      "SQLcume_dist;",        "return the accumulated 
distribution of the number of rows per group to the total number of partition 
rows"     ]
 [ "sql",       "current_time", "pattern sql.current_time():daytime ",  
"SQLcurrent_daytime;",  "Get the clients current daytime"       ]
 [ "sql",       "current_timestamp",    "pattern 
sql.current_timestamp():timestamp ",   "SQLcurrent_timestamp;",        "Get the 
clients current timestamp"     ]
@@ -9607,6 +9610,10 @@
 [ "streams",   "readStr",      "unsafe command 
streams.readStr(X_0:streams):str ",     "mnstr_read_stringwrap;",       "read 
string data from the stream"      ]
 [ "streams",   "writeInt",     "unsafe command streams.writeInt(X_0:streams, 
X_1:int):void ",  "mnstr_writeIntwrap;",  "write data on the stream"      ]
 [ "streams",   "writeStr",     "unsafe command streams.writeStr(X_0:streams, 
X_1:str):void ",  "mnstr_write_stringwrap;",      "write data on the stream"    
  ]
+[ "strimps",   "mkstrimp",     "unsafe pattern strimps.mkstrimp(X_0:bat[:str], 
X_1:bat[:oid]):void ",  "PATstrimpCreate;",     "construct the strimp a BAT"    
]
+[ "strimps",   "strimpfilter", "pattern strimps.strimpfilter(X_0:str, 
X_1:str):bit ",  "PATstrimpFilter;",     ""      ]
+[ "strimps",   "strimpfilterjoin",     "pattern 
strimps.strimpfilterjoin(X_0:str, X_1:any, X_2:any, X_3:any, X_4:any, X_5:any) 
(X_6:bat[:oid], X_7:bat[:str]) ",       "PATstrimpFilter;",     ""      ]
+[ "strimps",   "strimpfilterselect",   "pattern 
strimps.strimpfilterselect(X_0:bat[:str], X_1:bat[:oid], X_2:str, 
X_3:bit):bat[:oid] ",        "PATstrimpFilterSelect;",       ""      ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:int):void ",   
"SYSMONpause;", "Suspend a running query"       ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:lng):void ",   
"SYSMONpause;", "Suspend a running query"       ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:sht):void ",   
"SYSMONpause;", "Suspend a running query"       ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12467,6 +12467,8 @@
 [ "optimizer", "reorder",      "pattern optimizer.reorder():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "reorder",      "pattern optimizer.reorder(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Reorder by dataflow dependencies"      ]
 [ "optimizer", "sequential_pipe",      "function 
optimizer.sequential_pipe():void;",   "",     ""      ]
+[ "optimizer", "strimps",      "pattern optimizer.strimps():str ",     
"OPTwrapper;",  ""      ]
+[ "optimizer", "strimps",      "pattern optimizer.strimps(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Use strimps index if appropriate"      ]
 [ "optimizer", "volcano",      "pattern optimizer.volcano():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "volcano",      "pattern optimizer.volcano(X_0:str, 
X_1:str):str ",     "OPTwrapper;",  "Simulate volcano style execution"      ]
 [ "optimizer", "volcano_pipe", "function optimizer.volcano_pipe():void;",      
"",     ""      ]
@@ -12621,6 +12623,7 @@
 [ "sql",       "covariancep",  "pattern sql.covariancep(X_0:lng, X_1:lng, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",  "SQLcovar_pop;",        
"return the covariance population value of groups"      ]
 [ "sql",       "covariancep",  "pattern sql.covariancep(X_0:sht, X_1:sht, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",  "SQLcovar_pop;",        
"return the covariance population value of groups"      ]
 [ "sql",       "createorderindex",     "unsafe pattern 
sql.createorderindex(X_0:str, X_1:str, X_2:str):void ", 
"sql_createorderindex;",        "Instantiate the order index on a column"       
]
+[ "sql",       "createstrimps",        "unsafe pattern 
sql.createstrimps(X_0:str, X_1:str, X_2:str):void ",    "sql_createstrimps;",   
"Instantiate the strimps index on a column"     ]
 [ "sql",       "cume_dist",    "pattern sql.cume_dist(X_0:any_1, X_1:bit, 
X_2:bit):dbl ",      "SQLcume_dist;",        "return the accumulated 
distribution of the number of rows per group to the total number of partition 
rows"     ]
 [ "sql",       "current_time", "pattern sql.current_time():daytime ",  
"SQLcurrent_daytime;",  "Get the clients current daytime"       ]
 [ "sql",       "current_timestamp",    "pattern 
sql.current_timestamp():timestamp ",   "SQLcurrent_timestamp;",        "Get the 
clients current timestamp"     ]
@@ -12928,6 +12931,10 @@
 [ "streams",   "readStr",      "unsafe command 
streams.readStr(X_0:streams):str ",     "mnstr_read_stringwrap;",       "read 
string data from the stream"      ]
 [ "streams",   "writeInt",     "unsafe command streams.writeInt(X_0:streams, 
X_1:int):void ",  "mnstr_writeIntwrap;",  "write data on the stream"      ]
 [ "streams",   "writeStr",     "unsafe command streams.writeStr(X_0:streams, 
X_1:str):void ",  "mnstr_write_stringwrap;",      "write data on the stream"    
  ]
+[ "strimps",   "mkstrimp",     "unsafe pattern strimps.mkstrimp(X_0:bat[:str], 
X_1:bat[:oid]):void ",  "PATstrimpCreate;",     "construct the strimp a BAT"    
]
+[ "strimps",   "strimpfilter", "pattern strimps.strimpfilter(X_0:str, 
X_1:str):bit ",  "PATstrimpFilter;",     ""      ]
+[ "strimps",   "strimpfilterjoin",     "pattern 
strimps.strimpfilterjoin(X_0:str, X_1:any, X_2:any, X_3:any, X_4:any, X_5:any) 
(X_6:bat[:oid], X_7:bat[:str]) ",       "PATstrimpFilter;",     ""      ]
+[ "strimps",   "strimpfilterselect",   "pattern 
strimps.strimpfilterselect(X_0:bat[:str], X_1:bat[:oid], X_2:str, 
X_3:bit):bat[:oid] ",        "PATstrimpFilterSelect;",       ""      ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:int):void ",   
"SYSMONpause;", "Suspend a running query"       ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:lng):void ",   
"SYSMONpause;", "Suspend a running query"       ]
 [ "sysmon",    "pause",        "unsafe pattern sysmon.pause(X_0:sht):void ",   
"SYSMONpause;", "Suspend a running query"       ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -393,6 +393,9 @@ BUN ORDERfndlast(BAT *b, Heap *oidxh, co
 BUN SORTfnd(BAT *b, const void *v);
 BUN SORTfndfirst(BAT *b, const void *v);
 BUN SORTfndlast(BAT *b, const void *v);
+gdk_return STRMPappendBitstring(BAT *b, const str s);
+gdk_return STRMPcreate(BAT *b, BAT *s);
+BAT *STRMPfilter(BAT *b, BAT *s, const str q);
 MT_Id THRcreate(void (*f)(void *), void *arg, enum MT_thr_detach d, const char 
*name);
 void *THRdata[THREADDATA];
 void THRdel(Thread t);
@@ -1152,6 +1155,7 @@ const char *minusRef;
 const char *mirrorRef;
 const char *mitosisRef;
 const char *mkeyRef;
+const char *mkstrimpsRef;
 const char *mmathRef;
 const char *modRef;
 char monet_characteristics[4096];
@@ -1374,6 +1378,8 @@ void strAfterCall(ValPtr v, ValPtr bak);
 void strBeforeCall(ValPtr v, ValPtr bak);
 const char *strRef;
 const char *streamsRef;
+const char *strimpFilterSelectRef;
+const char *strimpsRef;
 const char *subavgRef;
 const char *subcountRef;
 const char *subdeltaRef;
diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt
--- a/gdk/CMakeLists.txt
+++ b/gdk/CMakeLists.txt
@@ -81,6 +81,7 @@ target_sources(bat
   gdk_analytic_func.c
   gdk_analytic.h
   gdk_tracer.c gdk_tracer.h
+  gdk_strimps.c gdk_strimps.h
   PUBLIC
   ${gdk_public_headers})
 
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -570,6 +570,7 @@ typedef struct {
 
 typedef struct Hash Hash;
 typedef struct Imprints Imprints;
+typedef struct Strimps Strimps;
 
 /*
  * @+ Binary Association Tables
@@ -736,6 +737,7 @@ typedef struct {
        Hash *hash;             /* hash table */
        Imprints *imprints;     /* column imprints index */
        Heap *orderidx;         /* order oid index */
+       Strimps *strimps;       /* string imprint index  */
 
        PROPrec *props;         /* list of dynamic properties stored in the bat 
descriptor */
 } COLrec;
@@ -806,6 +808,7 @@ typedef struct BAT {
 #define thash          T.hash
 #define timprints      T.imprints
 #define tprops         T.props
+#define tstrimps       T.strimps
 
 
 /* some access functions for the bitmask type */
@@ -2384,6 +2387,11 @@ gdk_export BAT *BATsample_with_seed(BAT 
                        CALLBACK;               \
        } while (0)
 
+/*
+ * String Imprints Development/Testing. TODO: remove the following.
+ */
+
+#include "gdk_strimps.h"
 typedef struct gdk_callback {
        char *name;
        int argc;
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -133,6 +133,8 @@ VIEWcreate(oid seq, BAT *b)
        bn->timprints = NULL;
        /* Order OID index */
        bn->torderidx = NULL;
+       /* Only the parent should have a pointer to the strimp */
+       bn->tstrimps = NULL;
        if (BBPcacheit(bn, true) != GDK_SUCCEED) {      /* enter in BBP */
                if (tp) {
                        BBPunshare(tp);
@@ -377,6 +379,7 @@ VIEWdestroy(BAT *b)
        HASHdestroy(b);
        IMPSdestroy(b);
        OIDXdestroy(b);
+       STRMPdestroy(b);
        PROPdestroy(b);
        VIEWunlink(b);
 
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -583,6 +583,7 @@ BATclear(BAT *b, bool force)
        HASHdestroy(b);
        IMPSdestroy(b);
        OIDXdestroy(b);
+       STRMPdestroy(b);
        PROPdestroy(b);
 
        /* we must dispose of all inserted atoms */
@@ -669,6 +670,7 @@ BATfree(BAT *b)
        HASHfree(b);
        IMPSfree(b);
        OIDXfree(b);
+       STRMPfree(b);
        MT_lock_set(&b->theaplock);
        if (nunique != BUN_NONE) {
                b->tunique_est = (double) nunique;
@@ -1268,6 +1270,7 @@ BUNappendmulti(BAT *b, const void *value
 
        IMPSdestroy(b); /* no support for inserts in imprints yet */
        OIDXdestroy(b);
+       STRMPdestroy(b);        /* TODO: use STRMPappendBitstring */
        return GDK_SUCCEED;
 }
 
@@ -1494,6 +1497,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                }
                OIDXdestroy(b);
                IMPSdestroy(b);
+               STRMPdestroy(b);
 
                if (b->tvarsized && b->ttype) {
                        var_t _d;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -693,6 +693,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
 
        IMPSdestroy(b);         /* imprints do not support updates yet */
        OIDXdestroy(b);
+       STRMPdestroy(b);        /* TODO: use STRMPappendBitString */
        MT_lock_set(&b->theaplock);
        if (BATcount(b) == 0 || b->tmaxpos != BUN_NONE) {
                if (ni.maxpos != BUN_NONE) {
@@ -906,6 +907,7 @@ BATdel(BAT *b, BAT *d)
        OIDXdestroy(b);
        HASHdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
        if (BATtdense(d)) {
                oid o = d->tseqbase;
                BUN c = BATcount(d);
@@ -1107,6 +1109,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
 
        OIDXdestroy(b);
        IMPSdestroy(b);
+       STRMPdestroy(b);
        MT_lock_set(&b->theaplock);
        if (ni.count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION) {
                b->tunique_est = 0;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1113,6 +1113,7 @@ fixhashashbat(BAT *b)
        IMPSdestroy(b);
        OIDXdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
 
        /* make backup of heaps */
        const char *t;
@@ -4447,6 +4448,11 @@ BBPdiskscan(const char *parent, size_t b
 #else
                                delete = true;
 #endif
+                       } else if (strncmp(p + 1, "tstrimps", 8) == 0) {
+                               BAT *b = getdesc(bid);
+                               delete = b == NULL;
+                               if (!delete)
+                                       b->tstrimps = (Strimps *)1;
                        } else if (strncmp(p + 1, "new", 3) != 0) {
                                ok = false;
                        }
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -18,6 +18,9 @@
 /* persist order index heaps for persistent BATs */
 #define PERSISTENTIDX 1
 
+/* persist strimp heaps for persistent BATs */
+#define PERSISTENTSTRIMP 1
+
 #include "gdk_system_private.h"
 
 enum heaptype {
@@ -25,7 +28,8 @@ enum heaptype {
        varheap,
        hashheap,
        imprintsheap,
-       orderidxheap
+       orderidxheap,
+       strimpheap
 };
 
 gdk_return ATOMheap(int id, Heap *hp, size_t cap)
@@ -225,6 +229,14 @@ void IMPSincref(Imprints *imprints)
 void IMPSprint(BAT *b)         /* never called: for debugging only */
        __attribute__((__cold__));
 #endif
+void STRMPincref(Strimps *strimps)
+       __attribute__((__visibility__("hidden")));
+void STRMPdecref(Strimps *strimps, bool remove)
+       __attribute__((__visibility__("hidden")));
+void STRMPdestroy(BAT *b)
+       __attribute__((__visibility__("hidden")));
+void STRMPfree(BAT *b)
+       __attribute__((__visibility__("hidden")));
 void MT_init_posix(void)
        __attribute__((__visibility__("hidden")));
 void *MT_mmap(const char *path, int mode, size_t len)
@@ -406,6 +418,17 @@ struct Imprints {
        BUN dictcnt;            /* counter for cache dictionary               */
 };
 
+struct Strimps {
+       Heap strimps;
+       uint8_t *sizes_base;    /* pointer into strimps heap (pair sizes)  */
+       uint8_t *pairs_base;    /* pointer into strimps heap (pairs start)   */
+       void *bitstrings_base;  /* pointer into strimps heap (bitstrings start) 
*/
+       size_t rec_cnt;         /* reconstruction counter: how many
+                                  bitstrings were added after header
+                                  construction */
+       /* bitstrings_base is a pointer to uint64_t */
+};
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to