Changeset: 546580fc280a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=546580fc280a
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.h
        geom/monetdb5/geom.mal
        geom/monetdb5/geomBulk.c
        geom/sql/40_geom.sql
Branch: sfcgal
Log Message:

Clean generic function for DumpPoints and Dump. Create DumpRings(geom) and 
DumpRingsP(geom, parent) and their bulk version. The path returned by DumpRings 
is the ring index.


diffs (truncated from 514 to 300 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -1723,53 +1723,38 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i
        unsigned int num_geoms = 0, i;
        str err;
 
-       if (wkb_isnil(*geomWKB)) {
-
-               //create new empty BAT for the output
-               if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
-                       *idBAT_id = bat_nil;
-                       throw(MAL, "geom.Dump", "Error creating new BAT");
-               }
-
-               if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == 
NULL) {
-                       BBPunfix(idBAT->batCacheid);
-                       *geomBAT_id = bat_nil;
-                       throw(MAL, "geom.Dump", "Error creating new BAT");
-               }
-
-        if (parent) {
-            if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == 
NULL) {
-                BBPunfix(idBAT->batCacheid);
-                BBPunfix(geomBAT->batCacheid);
-                *parentBAT_id = bat_nil;
-                throw(MAL, "geom.Dump", "Error creating new BAT");
-            }
+    if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
+        *idBAT_id = bat_nil;
+        throw(MAL, "geom.Dump", "Error creating new BAT");
+    }
+
+    if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
+        BBPunfix(idBAT->batCacheid);
+        *geomBAT_id = bat_nil;
+        throw(MAL, "geom.Dump", "Error creating new BAT");
+    }
+
+    if (parent) {
+        if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) {
+            BBPunfix(idBAT->batCacheid);
+            BBPunfix(geomBAT->batCacheid);
+            *parentBAT_id = bat_nil;
+            throw(MAL, "geom.Dump", "Error creating new BAT");
         }
-
+    }
+
+    if (wkb_isnil(*geomWKB)) {
+        //create new empty BAT for the output
                BBPkeepref(*idBAT_id = idBAT->batCacheid);
-
                BBPkeepref(*geomBAT_id = geomBAT->batCacheid);
-
         if (parent) {
                BBPkeepref(*parentBAT_id = parentBAT->batCacheid);
         }
-
                return MAL_SUCCEED;
        }
 
        geosGeometry = wkb2geos(*geomWKB);
 
-       if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
-               GEOSGeom_destroy(geosGeometry);
-               throw(MAL, "geom.Dump", "Error creating new BAT");
-       }
-
-       if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
-               BBPunfix(idBAT->batCacheid);
-               GEOSGeom_destroy(geosGeometry);
-               throw(MAL, "geom.Dump", "Error creating new BAT");
-       }
-
        if ((err = dumpGeometriesGeometry_(idBAT, geomBAT, geosGeometry, 
&num_geoms, "")) != MAL_SUCCEED) {
                BBPunfix(idBAT->batCacheid);
                BBPunfix(geomBAT->batCacheid);
@@ -1779,11 +1764,6 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i
        }
 
     if (parent) {
-        if ((parentBAT = COLnew(0, ATOMindex("int"), num_geoms, TRANSIENT)) == 
NULL) {
-            BBPunfix(idBAT->batCacheid);
-            BBPunfix(geomBAT->batCacheid);
-            throw(MAL, "geom.Dump", "Error creating new BAT");
-        }
         /*Get the tail and add parentID geometriesNum types*/
         for (i = 0; i < num_geoms; i++) {
             if (BUNappend(parentBAT, parent, TRUE) != GDK_SUCCEED) {
@@ -1995,55 +1975,44 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i
        str err;
     uint32_t num_points = 0;
 
+    if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
+        *idBAT_id = int_nil;
+        throw(MAL, "geom.DumpPoints", "Error creating new BAT");
+    }
+
+    if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
+        BBPunfix(idBAT->batCacheid);
+        *geomBAT_id = int_nil;
+        throw(MAL, "geom.DumpPoints", "Error creating new BAT");
+    }
+
+    if (parent) {
+        if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) {
+            BBPunfix(idBAT->batCacheid);
+            BBPunfix(geomBAT->batCacheid);
+            *parentBAT_id = bat_nil;
+            throw(MAL, "geom.DumpPoints", "Error creating new BAT");
+        }
+    }
        if (wkb_isnil(*geomWKB)) {
-
                //create new empty BAT for the output
-               if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
-                       *idBAT_id = int_nil;
-                       throw(MAL, "geom.DumpPoints", "Error creating new BAT");
-               }
-
-               if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == 
NULL) {
-                       BBPunfix(idBAT->batCacheid);
-                       *geomBAT_id = int_nil;
-                       throw(MAL, "geom.DumpPoints", "Error creating new BAT");
-               }
-
-        if (parent) {
-            if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == 
NULL) {
-                BBPunfix(idBAT->batCacheid);
-                BBPunfix(geomBAT->batCacheid);
-                *parentBAT_id = bat_nil;
-                throw(MAL, "geom.DumpPoints", "Error creating new BAT");
-            }
-        }
-
                BBPkeepref(*idBAT_id = idBAT->batCacheid);
-
                BBPkeepref(*geomBAT_id = geomBAT->batCacheid);
-
         if (parent) {
                BBPkeepref(*parentBAT_id = parentBAT->batCacheid);
         }
-
                return MAL_SUCCEED;
        }
 
-       geosGeometry = wkb2geos(*geomWKB);
-
-       if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
-               GEOSGeom_destroy(geosGeometry);
-               throw(MAL, "geom.Dump", "Error creating new BAT");
-       }
-
-       if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
+       if ( (geosGeometry = wkb2geos(*geomWKB)) == NULL) {
                BBPunfix(idBAT->batCacheid);
-               GEOSGeom_destroy(geosGeometry);
-               throw(MAL, "geom.Dump", "Error creating new BAT");
-       }
-
-       if ( (err = dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, 
&num_points, "")) != MAL_SUCCEED )
-    {
+               BBPunfix(geomBAT->batCacheid);
+        if (parent)
+            BBPunfix(parentBAT->batCacheid);
+        throw(MAL, "geom.DumpPoints", "wkb2geos failed");
+    }
+
+       if ( (err = dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, 
&num_points, "")) != MAL_SUCCEED ) {
                BBPunfix(idBAT->batCacheid);
                BBPunfix(geomBAT->batCacheid);
         if (parent)
@@ -2051,11 +2020,6 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i
                return err;
        }
     if (parent) {
-        if ((parentBAT = COLnew(0, ATOMindex("int"), num_points, TRANSIENT)) 
== NULL) {
-            BBPunfix(idBAT->batCacheid);
-            BBPunfix(geomBAT->batCacheid);
-            throw(MAL, "geom.Dump", "Error creating new BAT");
-        }
         /*Get the tail and add parentID geometriesNum types*/
         for (i = 0; i < num_points; i++) {
             if (BUNappend(parentBAT, parent, TRUE) != GDK_SUCCEED) {
@@ -2089,109 +2053,156 @@ wkbDumpPointsP(bat *parentBAT_id, bat *i
 }
 
 static str
-wkbDumpRings_(bat *parentBAT_id, bat *geomBAT_id, wkb **geomWKB, int *parent)
-{
-       BAT *geomBAT = NULL, *parentBAT = NULL;
-       GEOSGeom geosGeometry;
+dumpRingsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry, 
unsigned *num_rings, const char *path)
+{
+       char *newPath = NULL;
     const GEOSGeometry *ring;
     wkb *geom;
        unsigned int numInteriorRings, i;
+    int lvlDigitsNum = 10, lvl=0;      //MAX_UNIT = 4,294,967,295
        str err;
-
-       if (wkb_isnil(*geomWKB)) {
-
+    (void) path;
+
+    /*Check Type*/
+       if ( (GEOSGeomTypeId(geosGeometry) + 1) != wkbPolygon_mdb ) {
+               return createException(MAL, "geom.DumpRings","Geometry is not a 
Polygon");
+    }
+    
+       ring = GEOSGetExteriorRing(geosGeometry);
+       if(!ring) {
+               return createException(MAL, 
"geom.DumpRings","GEOSGetExteriorRing failed");
+       }
+    if((geom = geos2wkb(ring)) == NULL) {
+        return createException(MAL, "geom.DumpRings","geos2wkb failed");
+    }
+    if (BUNappend(geomBAT, geom, TRUE) != GDK_SUCCEED) {
+        return createException(MAL, "geom.DumpRings","BUNappend failed");
+    }
+
+    lvl++;
+    if ( (newPath = GDKmalloc(lvlDigitsNum + 1)) == NULL) {
+        throw(MAL, "geom.DumpRings", MAL_MALLOC_FAIL);
+    }
+    snprintf(newPath, lvlDigitsNum + 1, "%u", lvl);
+    if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED) {
+           GDKfree(newPath);
+        throw(MAL, "geom.DumpRings", "BUNappend failed");
+    }
+       GDKfree(newPath);
+
+       //check the interior rings
+       if ((numInteriorRings = GEOSGetNumInteriorRings(geosGeometry) == -1)) {
+               return createException(MAL, 
"geom.DumpRings","GEOSGetNumInteriorRings failed");
+    }
+
+       for(i=0; i<numInteriorRings; i++) {
+               ring = GEOSGetInteriorRingN(geosGeometry, i);
+        if (ring == NULL) {
+               GDKfree(newPath);
+               return createException(MAL, 
"geom.DumpRings","GEOSGetInteriorRingN failed");
+        }
+        
+        if((geom = geos2wkb(ring)) == NULL) {
+               GDKfree(newPath);
+               return createException(MAL, "geom.DumpRings","geos2wkb failed");
+        }
+        if (BUNappend(geomBAT, geom, TRUE) != GDK_SUCCEED) {
+               GDKfree(newPath);
+               return createException(MAL, "geom.DumpRings","BUNappend 
failed");
+        }
+        lvl++;
+        if ( (newPath = GDKmalloc(lvlDigitsNum + 1)) == NULL) {
+            throw(MAL, "geom.DumpRings", MAL_MALLOC_FAIL);
+        }
+        snprintf(newPath, lvlDigitsNum + 1, "%u", lvl);
+        if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED) {
+            GDKfree(newPath);
+            throw(MAL, "geom.DumpRings", "BUNappend failed");
+        }
+        GDKfree(newPath);
+       }
+
+    *num_rings = lvl;
+       return MAL_SUCCEED;
+}
+
+str
+dumpRingsGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry, 
uint32_t *num_rings, const char *path) {
+    return dumpRingsGeometry_(idBAT, geomBAT, geosGeometry, num_rings, path);
+}
+
+static str
+wkbDumpRings_(bat *parentBAT_id, bat *idBAT_id, bat *geomBAT_id, wkb 
**geomWKB, int *parent)
+{
+       BAT *idBAT = NULL, *geomBAT = NULL, *parentBAT = NULL;
+       GEOSGeom geosGeometry;
+       char *path = NULL;
+    const GEOSGeometry *ring;
+    wkb *geom;
+       unsigned int numInteriorRings, i;
+    int num_rings=0;
+       str err;
+
+    if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
+        *idBAT_id = bat_nil;
+        throw(MAL, "geom.DumpRings", "Error creating new BAT");
+    }
+
+    if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
+        BBPunfix(idBAT->batCacheid);
+        *geomBAT_id = bat_nil;
+        throw(MAL, "geom.DumpRings", "Error creating new BAT");
+    }
+
+    if (parent) {
+        if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) {
+            BBPunfix(idBAT->batCacheid);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to