Changeset: 1aec5bc9342a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1aec5bc9342a
Modified Files:
        gdk/gdk_rtree.c
        gdk/gdk_rtree.h
Branch: geo-update-dev
Log Message:

Add RTREEexists and RTREEaddmbr to gdk_rtree, small improvements on search.


diffs (117 lines):

diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c
--- a/gdk/gdk_rtree.c
+++ b/gdk/gdk_rtree.c
@@ -25,10 +25,88 @@ persistRtree (BAT *b)
        }
 }*/
 
+bool
+RTREEexists(BAT *b)
+{
+       BAT *pb;
+       bool ret;
+       if (VIEWtparent(b)) {
+               pb = BBP_cache(VIEWtparent(b));
+               assert(pb);
+       } else {
+               pb = b;
+       }
+
+       MT_lock_set(&pb->batIdxLock);
+       ret = pb->T.rtree != NULL;
+       MT_lock_unset(&pb->batIdxLock);
+
+       return ret;
+
+}
+
+//Create the RTree index
+gdk_return
+RTREEcreate (BAT *b) {
+       BAT *pb = NULL;
+       //Check for a parent BAT of wkb, load if exists
+       if (VIEWtparent(b)) {
+               pb = BBP_cache(VIEWtparent(b));
+               assert(pb);
+       } else {
+               pb = b;
+       }
+       //Check if rtree already exists
+       //TODO Check if it is on disk
+       if (pb->T.rtree == NULL) {
+               //If it doesn't exist, take the lock to create/get the rtree
+               MT_lock_set(&pb->batIdxLock);
+
+               //Try to load it from disk
+               //TODO BATcheckrtree
+
+               //First arg are dimensions: we only allow x, y
+               //Second arg are flags: split strategy and nodes-per-page
+               if ((pb->T.rtree = rtree_new(2, RTREE_DEFAULT)) == NULL) {
+                       GDKerror("rtree_new failed\n");
+                       return GDK_FAIL;
+               }
+               //TODO persist rtree
+               MT_lock_unset(&pb->batIdxLock);
+       }
+       return GDK_SUCCEED;
+}
+
+//Add a rectangle to the previously created RTree index
+gdk_return
+RTREEaddmbr (BAT *b, mbr_t *inMBR, BUN i) {
+       BAT *pb = NULL;
+       if (VIEWtparent(b))
+               pb = BBP_cache(VIEWtparent(b));
+       else
+               pb = b;
+       //Check if rtree already exists
+       //TODO Check if it is on disk
+       if (pb->T.rtree != NULL) {
+               rtree_id_t rtree_id = i;
+               rtree_coord_t rect[4];
+               rect[0] = inMBR->xmin;
+               rect[1] = inMBR->ymin;
+               rect[2] = inMBR->xmax;
+               rect[3] = inMBR->ymax;
+               rtree_add_rect(pb->T.rtree,rtree_id,rect);
+       }
+       else {
+               GDKerror("Tried to insert mbr into RTree that was not 
initialized\n");
+               return GDK_FAIL;
+       }
+       return GDK_SUCCEED;
+}
+
 //TODO Make this multi-thread safe? -> Only allow one thread to do rtree_new 
and persist the BAT, but multiple threads can add new rects to the tree
 //MBR bat
 gdk_return
-BATrtree_wkb(BAT *wkb, BAT *mbr)
+BATrtree(BAT *wkb, BAT *mbr)
 {
        BAT *pb;
        BATiter bi;
@@ -110,7 +188,7 @@ RTREEsearch(BAT *b, mbr_t *inMBR, int re
        rtree_t *rtree = pb->T.rtree;
        if (rtree != NULL) {
                BUN *candidates = GDKmalloc(result_limit*sizeof(BUN));
-               memset(candidates,BUN_NONE,result_limit*sizeof(BUN));
+               memset(candidates,BUN_NONE,result_limit*sizeof(BUN*));
 
                rtree_coord_t rect[4];
                rect[0] = inMBR->xmin;
diff --git a/gdk/gdk_rtree.h b/gdk/gdk_rtree.h
--- a/gdk/gdk_rtree.h
+++ b/gdk/gdk_rtree.h
@@ -12,7 +12,9 @@ typedef struct mbr_t {
 } mbr_t;
 //TODO REMOVE
 
-gdk_export gdk_return BATrtree(BAT *b);
-gdk_export gdk_return BATrtree_wkb(BAT *wkb, BAT* mbr);
+gdk_export bool RTREEexists(BAT *b);
+gdk_export gdk_return RTREEcreate (BAT *b);
+gdk_export gdk_return RTREEaddmbr (BAT *pb, mbr_t *inMBR, BUN i);
+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);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to