Changeset: 6dac84827ce4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6dac84827ce4
Modified Files:
        gdk/gdk.h
        gdk/gdk_rtree.c
        geom/monetdb5/geom.c
        geom/monetdb5/geomBulk.c
Branch: geo-update-dev
Log Message:

Added RTREEdestroy to free the rtree structure in memory and delete the 
associated file in the bat dir. Changed RTree create/persist condition.


diffs (141 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -746,7 +746,7 @@ typedef struct {
        Heap *vheap;            /* space for the varsized data. */
        Hash *hash;             /* hash table */
        rtree_t *rtree;
-       
+
        Imprints *imprints;     /* column imprints index */
        Heap *orderidx;         /* order oid index */
        Strimps *strimps;       /* string imprint index  */
@@ -1861,6 +1861,22 @@ gdk_export void STRMPdestroy(BAT *b);
 gdk_export bool BAThasstrimps(BAT *b);
 gdk_export gdk_return BATsetstrimps(BAT *b);
 
+/* Rtree structure functions */
+//TODO REMOVE
+typedef struct mbr_t {
+       float xmin;
+       float ymin;
+       float xmax;
+       float ymax;
+
+} mbr_t;
+
+gdk_export bool RTREEexists(BAT *b);
+gdk_export gdk_return BATrtree(BAT *wkb, BAT* mbr);
+gdk_export void RTREEdestroy(BAT *b);
+gdk_export BUN* RTREEsearch(BAT *b, mbr_t *inMBR, int result_limit);
+gdk_export void RTREEdestroy(BAT *b);
+
 /* The ordered index structure */
 
 gdk_export gdk_return BATorderidx(BAT *b, bool stable);
diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c
--- a/gdk/gdk_rtree.c
+++ b/gdk/gdk_rtree.c
@@ -1,24 +1,30 @@
 #include "monetdb_config.h"
 #include "gdk.h"
 #include "gdk_private.h"
-#include "gdk_rtree.h"
 
 //TODO Why use BBPselectfarm?
+//TODO Do we need to guard against dirty heap and deleted rows?
+//TODO Where do put the RTREEdestroy calls? We should invalidate on updates, 
deletes and inserts
+
+/* Conditions to create and persist the RTree:
+ * - BAT has to be persistent
+ * - No deleted rows (when does batInserted update?)
+ * - The heap is not dirty -> no new values
+ * - DB Farm is persistent i.e. not in memory
+ */
+static bool
+RTreecreatecheck (BAT *b) {
+       return ((BBP_status(b->batCacheid) & BBPEXISTING)
+               && b->batInserted == b->batCount
+               && !b->theap->dirty
+               && !GDKinmemory(b->theap->farmid));
+}
 
 // Persist rtree to disk if the conditions are right
 static gdk_return
 persistRtree (BAT *b)
 {
-       /* Conditions to persist the RTree:
-        * - BAT has to be persistent
-        * - No deleted rows (when does batInserted update?)
-        * - The heap is not dirty -> no new values
-        * - DB Farm is persistent i.e. not in memory
-        */
-       if ((BBP_status(b->batCacheid) & BBPEXISTING)
-            && b->batInserted == b->batCount
-            && !b->theap->dirty
-            && !GDKinmemory(b->theap->farmid)) {
+       if (RTreecreatecheck(b)) {
                //TODO Necessary?
                BBPfix(b->batCacheid);
                rtree_t *rtree = b->T.rtree;
@@ -129,7 +135,7 @@ BATrtree(BAT *wkb, BAT *mbr)
        }
 
        //Check if rtree already exists
-       if (pb->T.rtree == NULL) {
+       if (pb->T.rtree == NULL && RTreecreatecheck(pb)) {
                //If it doesn't exist, take the lock to create/get the rtree
                MT_lock_set(&pb->batIdxLock);
 
@@ -168,6 +174,29 @@ BATrtree(BAT *wkb, BAT *mbr)
        return GDK_SUCCEED;
 }
 
+void
+RTREEdestroy(BAT *b)
+{
+       BAT *pb;
+       if (VIEWtparent(b)) {
+               pb = BBP_cache(VIEWtparent(b));
+               assert(pb);
+       } else {
+               pb = b;
+       }
+
+       if (pb && pb->T.rtree) {
+               MT_lock_set(&pb->batIdxLock);
+               rtree_destroy(pb->T.rtree);
+               pb->T.rtree = NULL;
+               GDKunlink(pb->theap->farmid,
+                         BATDIR,
+                         BBP_physical(b->batCacheid),
+                         "bsrt");
+               MT_lock_unset(&b->batIdxLock);
+       }
+}
+
 struct results_rtree {
        int results_next;
        int results_left;
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -16,7 +16,6 @@
 #include "geom_atoms.h"
 #include "gdk_logger.h"
 #include "mal_exception.h"
-#include "gdk_rtree.h"
 
 mbr mbrNIL = {0}; // will be initialized properly by geom prelude
 
diff --git a/geom/monetdb5/geomBulk.c b/geom/monetdb5/geomBulk.c
--- a/geom/monetdb5/geomBulk.c
+++ b/geom/monetdb5/geomBulk.c
@@ -13,7 +13,6 @@
 #include "geom.h"
 #include "geod.h"
 #include "geom_atoms.h"
-#include "gdk_rtree.h"
 
 /********** Geo Update Start **********/
 static str
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to