Changeset: 188164651dec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/188164651dec
Modified Files:
        geom/monetdb5/geomBulk.c
Branch: geo-update-dev
Log Message:

Small cleanups on geomBulk.c


diffs (193 lines):

diff --git a/geom/monetdb5/geomBulk.c b/geom/monetdb5/geomBulk.c
--- a/geom/monetdb5/geomBulk.c
+++ b/geom/monetdb5/geomBulk.c
@@ -15,9 +15,7 @@
 #include "geom_atoms.h"
 #include "gdk_rtree.h"
 
-/********** Geo Update **********/
-//TODO SRID check could come earlier?
-//TODO The BUN_NONE is not correctly retrieved in search function
+/********** Geo Update Start **********/
 static str
 filterSelectRTree(bat* outid, const bat *bid , const bat *sid, wkb *wkb_const, 
bit anti, char (*func) (const GEOSGeometry *, const GEOSGeometry *), const char 
*name)
 {
@@ -26,6 +24,7 @@ filterSelectRTree(bat* outid, const bat 
        struct canditer ci;
        GEOSGeom col_geom, const_geom;
 
+       //WKB constant is NULL
        if ((const_geom = wkb2geos(wkb_const)) == NULL) {
                if ((out = BATdense(0, 0, 0)) == NULL)
                        throw(MAL, name, GDK_EXCEPTION);
@@ -33,16 +32,18 @@ filterSelectRTree(bat* outid, const bat 
                BBPkeepref(out);
                return MAL_SUCCEED;
        }
+
+       //Get BAT, BATiter and candidate list
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, name, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
        if (sid && !is_bat_nil(*sid) && !(s = BATdescriptor(*sid))) {
                BBPunfix(b->batCacheid);
                throw(MAL, name, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
        }
-
        canditer_init(&ci, b, s);
        b_iter = bat_iterator(b);
 
+       //Result BAT
        if ((out = COLnew(0, ATOMindex("oid"), ci.ncand, TRANSIENT)) == NULL) {
                BBPunfix(b->batCacheid);
                if (s)
@@ -50,6 +51,8 @@ filterSelectRTree(bat* outid, const bat 
                throw(MAL, name, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
 
+       //TODO First thread that gets here should build the whole tree (using 
the parent BAT array)
+       //TODO The lock on the check should not be released
        if (!RTREEexists(b)) {
                if (RTREEcreate(b) != GDK_SUCCEED) {
                        //TODO What to do?
@@ -73,16 +76,19 @@ filterSelectRTree(bat* outid, const bat 
        wkbMBR(&const_mbr,&wkb_const);
 
        //Get a candidate list from searching on the rtree with the constant mbr
+       //Note: the candidates returned from RTREEsearch are BUNs not OIDs
        BUN* results_rtree = NULL;
        if (RTREEexists(b))
                results_rtree = RTREEsearch(b,(mbr_t*)const_mbr, b->batCount);
 
        //Cycle through rtree candidates
        //If there is a original candidate list, make sure the rtree cand is in 
there
-       //Then do the actual calculation for the geo predicate using the GEOS 
func
-       //TODO Change literal of BUN_NONE to BUN_NONE in loop condition
+       //Then do the actual calculation for the predicate using the GEOS 
function
+
+       //TODO Change literal value of BUN_NONE to BUN_NONE in loop condition
        for (int i = 0; results_rtree[i] != 18446744073709551615U && i < (int) 
b->batCount; i++) {
-               BUN cand = results_rtree[i];
+               oid cand = results_rtree[i];
+
                //If we have a candidate list that is not dense, we need to 
check if the rtree candidate is also on the original candidate list
                //TODO Check w Stefanos
                if (ci.tpe != cand_dense) {
@@ -90,7 +96,7 @@ filterSelectRTree(bat* outid, const bat 
                        if (!canditer_contains(&ci,cand))
                                continue;
                }
-               const wkb *col_wkb = BUNtvar(b_iter, cand + b->hseqbase);
+               const wkb *col_wkb = BUNtvar(b_iter, cand - b->hseqbase);
                if ((col_geom = wkb2geos(col_wkb)) == NULL)
                        throw(MAL, name, SQLSTATE(38000) "WKB2Geos operation 
failed");
                if (GEOSGetSRID(col_geom) != GEOSGetSRID(const_geom)) {
@@ -104,14 +110,11 @@ filterSelectRTree(bat* outid, const bat 
                        throw(MAL, name, SQLSTATE(38000) "Geometries of 
different SRID");
                }
                //GEOS function returns 1 on true, 0 on false and 2 on exception
-               //TODO Deal with exception of GEOS func?
                bit cond = ((*func)(col_geom, const_geom) == 1);
                if (cond != anti) {
                        if (BUNappend(out, (oid*) &cand, false) != GDK_SUCCEED) 
{
-                               if (col_geom)
-                                       GEOSGeom_destroy(col_geom);
-                               if (const_geom)
-                                       GEOSGeom_destroy(const_geom);
+                               GEOSGeom_destroy(col_geom);
+                               GEOSGeom_destroy(const_geom);
                                bat_iterator_end(&b_iter);
                                BBPunfix(b->batCacheid);
                                if (s)
@@ -140,6 +143,7 @@ filterSelectNoIndex(bat* outid, const ba
        struct canditer ci;
        GEOSGeom col_geom, const_geom;
 
+       //WKB constant is NULL
        if ((const_geom = wkb2geos(wkb_const)) == NULL) {
                if ((out = BATdense(0, 0, 0)) == NULL)
                        throw(MAL, name, GDK_EXCEPTION);
@@ -148,16 +152,17 @@ filterSelectNoIndex(bat* outid, const ba
                return MAL_SUCCEED;
        }
 
+       //Get BAT, BATiter and candidate list
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, name, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
        if (sid && !is_bat_nil(*sid) && !(s = BATdescriptor(*sid))) {
                BBPunfix(b->batCacheid);
                throw(MAL, name, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
        }
-
        canditer_init(&ci, b, s);
        b_iter = bat_iterator(b);
 
+       //Result BAT
        if ((out = COLnew(0, ATOMindex("oid"), ci.ncand, TRANSIENT)) == NULL) {
                BBPunfix(b->batCacheid);
                if (s)
@@ -166,8 +171,8 @@ filterSelectNoIndex(bat* outid, const ba
        }
 
        for (BUN i = 0; i < ci.ncand; i++) {
-               oid cand = canditer_next(&ci) - b->hseqbase;
-               const wkb *col_wkb = BUNtvar(b_iter, cand);
+               BUN cand = canditer_next(&ci);
+               const wkb *col_wkb = BUNtvar(b_iter, cand - b->hseqbase);
                if ((col_geom = wkb2geos(col_wkb)) == NULL)
                        throw(MAL, name, SQLSTATE(38000) "WKB2Geos operation 
failed");
                if (GEOSGetSRID(col_geom) != GEOSGetSRID(const_geom)) {
@@ -181,7 +186,6 @@ filterSelectNoIndex(bat* outid, const ba
                        throw(MAL, name, SQLSTATE(38000) "Geometries of 
different SRID");
                }
                //GEOS function returns 1 on true, 0 on false and 2 on exception
-               //TODO Deal with exception of GEOS func?
                bit cond = ((*func)(col_geom, const_geom) == 1);
                if (cond != anti) {
                        if (BUNappend(out, (oid*) &cand, false) != GDK_SUCCEED) 
{
@@ -395,8 +399,9 @@ wkbIntersectsJoinNoIndex(bat *lres_id, b
        return 
filterJoinNoIndex(lres_id,rres_id,l_id,r_id,0,ls_id,rs_id,*nil_matches,estimate,GEOSIntersects,"geom.wkbIntersectsJoinNoIndex");
 }
 
-/* mbr bulk function */
-/* Creates the BAT with mbrs from the BAT with geometries. */
+//MBR bulk function
+//Creates the BAT with MBRs from the input BAT with WKB geometries
+//Also creates the RTree structure and saves it on the WKB input BAT
 str
 wkbMBR_bat(bat *outBAT_id, bat *inBAT_id)
 {
@@ -406,12 +411,9 @@ wkbMBR_bat(bat *outBAT_id, bat *inBAT_id
        BUN p = 0, q = 0;
        BATiter inBAT_iter;
 
-       //get the descriptor of the BAT
        if ((inBAT = BATdescriptor(*inBAT_id)) == NULL) {
                throw(MAL, "batgeom.mbr", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
        }
-
-       //create a new BAT for the output
        if ((outBAT = COLnew(inBAT->hseqbase, ATOMindex("mbr"), 
BATcount(inBAT), TRANSIENT)) == NULL) {
                BBPunfix(inBAT->batCacheid);
                throw(MAL, "batgeom.mbr", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -443,10 +445,10 @@ wkbMBR_bat(bat *outBAT_id, bat *inBAT_id
 
        *outBAT_id = outBAT->batCacheid;
 
-       //Build RTree index using the mbr's we just calculated, on the wkb BAT
+       //Build RTree index using the mbr's we just calculated, and save it on 
the wkb BAT
        BATrtree(inBAT,outBAT);
+
        BBPkeepref(outBAT);
-
        return MAL_SUCCEED;
 }
 
@@ -671,7 +673,7 @@ clean:
        return msg;
 }
 
-/********** Geo Update **********/
+/********** Geo Update End **********/
 
 /*******************************/
 /********** One input **********/
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to