Changeset: d991920e8b2b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d991920e8b2b
Added Files:
        geom/sql/Tests/lineFromText.sql
        geom/sql/Tests/lineFromText.stable.err
        geom/sql/Tests/lineFromText.stable.out
        geom/sql/Tests/mlineFromText.sql
        geom/sql/Tests/mlineFromText.stable.err
        geom/sql/Tests/mlineFromText.stable.out
        geom/sql/Tests/mpointFromText.sql
        geom/sql/Tests/mpointFromText.stable.err
        geom/sql/Tests/mpointFromText.stable.out
        geom/sql/Tests/mpolygonFromText.sql
        geom/sql/Tests/mpolygonFromText.stable.err
        geom/sql/Tests/mpolygonFromText.stable.out
        geom/sql/Tests/pointFromText.sql
        geom/sql/Tests/pointFromText.stable.err
        geom/sql/Tests/pointFromText.stable.out
        geom/sql/Tests/polygonFromText.sql
        geom/sql/Tests/polygonFromText.stable.err
        geom/sql/Tests/polygonFromText.stable.out
Modified Files:
        geom/lib/libgeom.h
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/Tests/All
        monetdb5/modules/mal/tablet.c
        sql/backends/monet5/sql_gencode.c
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_parser.y
        sql/storage/store.c
Branch: geo
Log Message:

mTests for (m)Point, (m)Line, (m)Polygon From Text


diffs (truncated from 1820 to 300 lines):

diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -101,10 +101,10 @@ typedef enum wkb_type {
        wkbPoint = 1,
        wkbLineString = 2,
        wkbPolygon = 3,
-       wkbMultiPoint = 4,
-       wkbMultiLineString = 5,
-       wkbMultiPolygon = 6,
-       wkbGeometryCollection = 7
+       wkbMultiPoint = 5,
+       wkbMultiLineString = 6,
+       wkbMultiPolygon = 7,
+       wkbGeometryCollection = 8
 } wkb_type;
 
 libgeom_export const char *geom_type2str(int t, int flag);
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -74,9 +74,9 @@ geom_export wkb* geos2wkb(GEOSGeom geosG
 
 geom_export int mbrFROMSTR(char *src, int *len, mbr **atom);
 geom_export int mbrTOSTR(char **dst, int *len, mbr *atom);
-geom_export int wkbFROMSTR(char *src, int srid, int *len, wkb **atom);
+geom_export int wkbFROMSTR(char* geomWKT, wkb** geomWKB, int srid);
 geom_export int wkbTOSTR(char **dst, int *len, wkb *atom);
-geom_export str wkbFromText(wkb **w, str *wkt, int srid, int *tpe);
+geom_export str wkbFromText(wkb **w, str *wkt, int* srid, int *tpe);
 geom_export str wkbAsText(str *r, wkb **w);
 //geom_export str wkbFromString(wkb**, str*); 
 
@@ -110,40 +110,35 @@ geom_export str wkbIsValidReason(char** 
 geom_export str wkbIsValidDetail(char** out, wkb **geom);
 
 
-geom_export str A_2_B(wkb **res, wkb **geo, int* columnType, int* columnSRID); 
+geom_export str A_2_B(wkb** resWKB, wkb **valueWKB, int* columnType, int* 
columnSRID, int* Type, int* SRID); 
 
-str A_2_B(wkb **res, wkb **geo, int* columnType, int* columnSRID) {
+str A_2_B(wkb** resWKB, wkb **valueWKB, int* columnType, int* columnSRID, int* 
Type, int* SRID) {
        GEOSGeom geosGeometry;
        int geoCoordinatesNum = 2;
        int valueType = 0;
-       int valueSRID = 0;
-
-       if(valueSRID != *columnSRID)
-               throw(MAL, "geom.A_2_B", "Geometry should be expressed in SRID 
%d and it is expressed in SRID %d\n", *columnSRID, valueSRID);
+       
+       int valueSRID = (*valueWKB)->srid;
 
        /* get the geosGeometry from the wkb */
-       geosGeometry = wkb2geos(*geo);
+       geosGeometry = wkb2geos(*valueWKB);
        /* get the number of coordinates the geometry has */
        geoCoordinatesNum = GEOSGeom_getCoordinateDimension(geosGeometry);
        /* get the type of the geometry */
-       valueType = (GEOSGeomTypeId(geosGeometry)+1) << 2;
+       (valueType) = (GEOSGeomTypeId(geosGeometry)+1) << 2;
 
        if(geoCoordinatesNum > 2)
-               valueType += (1<<1);
+               (valueType) += (1<<1);
        if(geoCoordinatesNum > 3)
-               valueType += 1;
+               (valueType) += 1;
        
-       //fprintf(stderr, "SRDI: %d, type:%d - coordinates:%d\n", *valueSRID, 
*valueType, geoCoordinatesNum);
+       if(valueSRID != *columnSRID || valueType != *columnType)
+               throw(MAL, "geom.A_2_B", "column needs geometry(%d, %d) and 
value is geometry(%d, %d)\n", *columnType, *columnSRID, valueType, valueSRID);
 
-       if(valueType != *columnType)
-               throw(MAL, "geom.A_2_B", "Geometry should be of type %d and it 
is of type %d\n", *columnType, valueType);
+       *SRID = valueSRID;
+       *Type = valueType;
 
        /* get the wkb from the geosGeometry */
-       *res = geos2wkb(geosGeometry);
-
-
-
-       //fprintf(stderr, "%d - %d vs %d\n", *columnSRID, *columnType, 
*valueType);
+       *resWKB = geos2wkb(geosGeometry);
        
        return MAL_SUCCEED;
 }
@@ -339,9 +334,9 @@ int mbrTOSTR(char **dst, int *len, mbr *
        return (int) dstStrLen;
 }
 
-/* FROMSTR: parse string to @1. */
+/* Creates WKB representation (including srid) from WKT representation */
 /* return number of parsed characters. */
-int wkbFROMSTR(char *src, int srid, int *len, wkb **atom) {
+int wkbFROMSTR(char* geomWKT, wkb **geomWKB, int srid) {
        GEOSGeom geosGeometry = NULL;   /* The geometry object that is parsed 
from the src string. */
        //unsigned char *geometry_TO_wkb = NULL;        /* The "well known 
binary" serialization of the geometry object. */
        //size_t wkbLen = 0;            /* The length of the wkbSer string. */
@@ -349,19 +344,19 @@ int wkbFROMSTR(char *src, int srid, int 
        //int coordinateDimensions = 0;
        GEOSWKTReader *WKT_reader;
 
-       if (strcmp(src, str_nil) == 0) {
-               **atom = *wkbNULL();
+       if (strcmp(geomWKT, str_nil) == 0) {
+               **geomWKB = *wkbNULL();
                return 0;
        }
                //nil = 1;
 
        //if (!nil) {
        WKT_reader = GEOSWKTReader_create();
-       geosGeometry = GEOSWKTReader_read(WKT_reader, src); // 
GEOSGeomFromWKT(src)) == NULL) {
+       geosGeometry = GEOSWKTReader_read(WKT_reader, geomWKT); 
        GEOSWKTReader_destroy(WKT_reader);
 
        if(geosGeometry == NULL){
-               **atom = *wkbNULL();
+               **geomWKB = *wkbNULL();
                return 0;
        }
        //      goto return_nil;
@@ -372,15 +367,15 @@ int wkbFROMSTR(char *src, int srid, int 
 
        if (GEOSGeomTypeId(geosGeometry) == -1) {
                GEOSGeom_destroy(geosGeometry);
-               **atom = *wkbNULL();
+               **geomWKB = *wkbNULL();
                return 0;
        }
 
 //     if (!nil) {
        //add the srid
-       if(srid == 0 )
-               GEOSSetSRID(geosGeometry, 4326);
-       else //should we check whether the srid exists in spatial_ref_sys?
+       //if(srid == 0 )
+       //      GEOSSetSRID(geosGeometry, 4326);
+       //else //should we check whether the srid exists in spatial_ref_sys?
                GEOSSetSRID(geosGeometry, srid);
        /* the srid was lost with the transformation of the GEOSGeom to wkb
        * so we decided to store it in the wkb */ 
@@ -390,7 +385,7 @@ int wkbFROMSTR(char *src, int srid, int 
 
        /* we have a GEOSGeometry will number of coordinates and SRID and we 
        * want to get the wkb out of it */
-       *atom = geos2wkb(geosGeometry);
+       *geomWKB = geos2wkb(geosGeometry);
 /*
 //             geometry_TO_wkb = GEOSGeomToWKB_buf(geometry_FROM_wkt, &wkbLen);
 //             GEOSGeom_destroy(geometry_FROM_wkt);
@@ -419,12 +414,10 @@ int wkbFROMSTR(char *src, int srid, int 
                *atom = GDKmalloc(*len = (int) sizeof(wkb));
        }
        **atom = *wkbNULL();
-*/     *len = (*atom)->len;
-
-       return 0;
+*/     return (*geomWKB)->len;
 }
 
-/* TOSTR: print atom in a string. */
+/* Creates the string representation (WKT) of a WKB */
 /* return length of resulting string. */
 int wkbTOSTR(char **dst, int *len, wkb *atom) {
        char *wkt = NULL;
@@ -465,19 +458,18 @@ int wkbTOSTR(char **dst, int *len, wkb *
 /* creates a wkb from the given textual representation */
 /*int* tpe is needed to verify that the type of the FromText function used is 
the
  * same with the type of the geometry created from the wkt representation */
-str wkbFromText(wkb **w, str *wkt, int srid, int *tpe) {
-       int len = 0, te = *tpe;
+str wkbFromText(wkb **geomWKB, str *geomWKT, int* srid, int *tpe) {
+       int te = *tpe;
        char *errbuf;
        str ex;
 
-       *w = NULL;
-       if (wkbFROMSTR(*wkt, srid, &len, w) &&
-           (wkb_isnil(*w) || *tpe == wkbGeometryCollection ||
-            (te = *((*w)->data + 1) & 0x0f) == *tpe))
+       *geomWKB = NULL;
+       if (wkbFROMSTR(*geomWKT, geomWKB, *srid) &&
+           (wkb_isnil(*geomWKB) || *tpe==0 || *tpe == wkbGeometryCollection || 
(te = *((*geomWKB)->data + 1) & 0x0f) == *tpe))
                return MAL_SUCCEED;
-       if (*w == NULL)
-               *w = (wkb *) GDKmalloc(sizeof(wkb));
-       **w = *wkbNULL();
+       if (*geomWKB == NULL)
+               *geomWKB = (wkb *) GDKmalloc(sizeof(wkb));
+       **geomWKB = *wkbNULL();
        if (*tpe > 0 && te != *tpe)
                throw(MAL, "wkb.FromText", "Trying to read Geometry type '%s' 
with function for Geometry type '%s'", geom_type2str(te,0), 
geom_type2str(*tpe,0));
        errbuf = GDKerrbuf;
@@ -1319,14 +1311,18 @@ wkb *
 wkbREAD(wkb *a, stream *s, size_t cnt)
 {
        int len;
+       int srid;
 
        (void) cnt;
        assert(cnt == 1);
        if (mnstr_readInt(s, &len) != 1)
                return NULL;
+       if (mnstr_readInt(s, &srid) != 1)
+               return NULL;
        if ((a = GDKmalloc(wkb_size(len))) == NULL)
                return NULL;
        a->len = len;
+       a->srid = srid;
        if (len > 0 && mnstr_read(s, (char *) a->data, len, 1) != 1) {
                GDKfree(a);
                return NULL;
@@ -1338,11 +1334,14 @@ int
 wkbWRITE(wkb *a, stream *s, size_t cnt)
 {
        int len = a->len;
+       int srid = a->srid;
 
        (void) cnt;
        assert(cnt == 1);
        if (!mnstr_writeInt(s, len))    /* 64bit: check for overflow */
                return GDK_FAIL;
+       if (!mnstr_writeInt(s, srid))   /* 64bit: check for overflow */
+               return GDK_FAIL;
        if (len > 0 &&                  /* 64bit: check for overflow */
            mnstr_write(s, (char *) a->data, len, 1) < 0)
                return GDK_FAIL;
diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal
--- a/geom/monetdb5/geom.mal
+++ b/geom/monetdb5/geom.mal
@@ -57,7 +57,7 @@ comment "returns 1 if the geometry has m
 command getType{unsafe}(flags:int) :str address geoGetType
 comment "returns the str representation of the geometry type";
 
-command calc.wkb(geo:wkb, columnType:int, columnSRID:int) :wkb address A_2_B;
+command calc.wkb(geo:wkb, columnType:int, columnSRID:int, type:int, srid:int) 
:wkb address A_2_B;
 
 #Geometry Constructors
 command AsText(w:wkb) :str address wkbAsText
diff --git a/geom/sql/Tests/All b/geom/sql/Tests/All
--- a/geom/sql/Tests/All
+++ b/geom/sql/Tests/All
@@ -1,79 +1,7 @@
-geom_point
-geom_geometry
-geom_curve
-geom_linestring
-geom_surface
-geom_polygon
-geom_multi
-geom_mbr
-basic
-relation
-spatial
-example
+pointFromText
+lineFromText
+polygonFromText
+mpointFromText
+mlineFromText
+mpolygonFromText
 
-null-mbr.Bug-2814
-geom-null-tests
-
-normalized
-binary
-
-conformance_load       //PointFromText, LineFromText, 
PolyFromTextMPointFromText, MLineFromText, MPolyFromText
-
-#query the geometry_columns table 
-T1
-T2
-T3
-T4
-
-T5     //query the spatial_ref_sys table
-
-#Geometry Constructors
-
-T6     //Dimension
-# T7   //GeometryType
-T8     //AsText
-# T9   //PolyFromWKB   no such unary operator 'asbinary(polygon)'
-T10    //SRID
-T11    //IsEmpty
-T12    //IsSimple
-T13    //Boundary
-T14    //Envelope
-T15    //X
-T16    //Y
-T17    //StartPoint
-T18    //EndPoint
-# T19  //IsClosed      no such unary operator 'asbinary(geometry)'
-# T20  //IsRing        no such unary operator 'asbinary(geometry)'
-T21    //Length
-T22    //NumPoints
-T23    //PointN
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to