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