Changeset: 9951282dfdb9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9951282dfdb9
Added Files:
        geom/sql/Tests/mbr_above.sql
        geom/sql/Tests/mbr_above.stable.err
        geom/sql/Tests/mbr_above.stable.out
        geom/sql/Tests/mbr_below.sql
        geom/sql/Tests/mbr_below.stable.err
        geom/sql/Tests/mbr_below.stable.out
        geom/sql/Tests/mbr_contained.sql
        geom/sql/Tests/mbr_contained.stable.err
        geom/sql/Tests/mbr_contained.stable.out
        geom/sql/Tests/mbr_contains.sql
        geom/sql/Tests/mbr_contains.stable.err
        geom/sql/Tests/mbr_contains.stable.out
        geom/sql/Tests/mbr_distance.sql
        geom/sql/Tests/mbr_distance.stable.err
        geom/sql/Tests/mbr_distance.stable.out
        geom/sql/Tests/mbr_equal.sql
        geom/sql/Tests/mbr_equal.stable.err
        geom/sql/Tests/mbr_equal.stable.out
        geom/sql/Tests/mbr_left.sql
        geom/sql/Tests/mbr_left.stable.err
        geom/sql/Tests/mbr_left.stable.out
        geom/sql/Tests/mbr_overlap.sql
        geom/sql/Tests/mbr_overlap.stable.err
        geom/sql/Tests/mbr_overlap.stable.out
        geom/sql/Tests/mbr_overlap_or_above.sql
        geom/sql/Tests/mbr_overlap_or_above.stable.err
        geom/sql/Tests/mbr_overlap_or_above.stable.out
        geom/sql/Tests/mbr_overlap_or_below.sql
        geom/sql/Tests/mbr_overlap_or_below.stable.err
        geom/sql/Tests/mbr_overlap_or_below.stable.out
        geom/sql/Tests/mbr_overlap_or_left.sql
        geom/sql/Tests/mbr_overlap_or_left.stable.err
        geom/sql/Tests/mbr_overlap_or_left.stable.out
        geom/sql/Tests/mbr_overlap_or_right.sql
        geom/sql/Tests/mbr_overlap_or_right.stable.err
        geom/sql/Tests/mbr_overlap_or_right.stable.out
        geom/sql/Tests/mbr_right.sql
        geom/sql/Tests/mbr_right.stable.err
        geom/sql/Tests/mbr_right.stable.out
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/40_geom.sql
        geom/sql/Tests/All
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
Branch: geo
Log Message:

mbr relation operators


diffs (truncated from 2787 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
@@ -179,19 +179,33 @@ geom_export str geom_2_geom(wkb** resWKB
 geom_export str geom_2_geom_bat(int* outBAT_id, int* inBAT_id, int* 
columnType, int* columnSRID);
 
 geom_export str wkbMBR(mbr **res, wkb **geom);
+
+geom_export str mbrOverlaps(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlaps_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
 geom_export str mbrAbove(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrAbove_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
 geom_export str mbrBelow(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrBelow_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
+geom_export str mbrLeft(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrLeft_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
+geom_export str mbrRight(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrRight_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
+geom_export str mbrOverlapOrAbove(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrAbove_wkb(bit *out, wkb **geom1WKB, wkb 
**geom2WKB);
+geom_export str mbrOverlapOrBelow(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrBelow_wkb(bit *out, wkb **geom1WKB, wkb 
**geom2WKB);
+geom_export str mbrOverlapOrLeft(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrLeft_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
+geom_export str mbrOverlapOrRight(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrRight_wkb(bit *out, wkb **geom1WKB, wkb 
**geom2WKB);
+geom_export str mbrContains(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrContains_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
 geom_export str mbrContained(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrContains(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrContained_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
+geom_export str mbrEqual(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrEqual_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB);
 geom_export str mbrDistance(double *out, mbr **b1, mbr **b2);
-geom_export str mbrEqual(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrLeft(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrOverlapOrAbove(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrOverlapOrBelow(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrOverlapOrLeft(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrOverlapOrRight(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrOverlaps(bit *out, mbr **b1, mbr **b2);
-geom_export str mbrRight(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrDistance_wkb(double *out, wkb **geom1WKB, wkb **geom2WKB);
 geom_export str wkbCoordinateFromWKB(dbl*, wkb**, int*);
 geom_export str wkbCoordinateFromMBR(dbl*, mbr**, int*);
 
@@ -2998,6 +3012,39 @@ str wkbMBR(mbr **geomMBR, wkb **geomWKB)
        return MAL_SUCCEED;     
 }
 
+/*returns true if the two mbrs overlap */
+str mbrOverlaps(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else //they cannot overlap if b2 is left, right, above or below b1
+               *out = !((*b2)->ymax < (*b1)->ymin || (*b2)->ymin > (*b1)->ymax 
|| (*b2)->xmax < (*b1)->xmin || (*b2)->xmin > (*b1)->xmax);
+       return MAL_SUCCEED;
+}
+
+/*returns true if the mbrs of the two geometris overlap */
+str mbrOverlaps_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrOverlaps(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
 /* returns true if b1 is above b2 */
 str mbrAbove(bit *out, mbr **b1, mbr **b2) {
        if (mbr_isnil(*b1) || mbr_isnil(*b2))
@@ -3007,6 +3054,30 @@ str mbrAbove(bit *out, mbr **b1, mbr **b
        return MAL_SUCCEED;
 }
 
+/*returns true if the mbrs of geom1 is above the mbr of geom2 */
+str mbrAbove_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrAbove(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
 /* returns true if b1 is below b2 */
 str mbrBelow(bit *out, mbr **b1, mbr **b2) {
        if (mbr_isnil(*b1) || mbr_isnil(*b2))
@@ -3016,6 +3087,30 @@ str mbrBelow(bit *out, mbr **b1, mbr **b
        return MAL_SUCCEED;
 }
 
+/*returns true if the mbrs of geom1 is below the mbr of geom2 */
+str mbrBelow_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrBelow(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
 /* returns true if box1 is left of box2 */
 str mbrLeft(bit *out, mbr **b1, mbr **b2) {
        if (mbr_isnil(*b1) || mbr_isnil(*b2))
@@ -3025,6 +3120,30 @@ str mbrLeft(bit *out, mbr **b1, mbr **b2
        return MAL_SUCCEED;
 }
 
+/*returns true if the mbrs of geom1 is on the left of the mbr of geom2 */
+str mbrLeft_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrLeft(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
 /* returns true if box1 is right of box2 */
 str mbrRight(bit *out, mbr **b1, mbr **b2) {
        if (mbr_isnil(*b1) || mbr_isnil(*b2))
@@ -3034,39 +3153,222 @@ str mbrRight(bit *out, mbr **b1, mbr **b
        return MAL_SUCCEED;
 }
 
+/*returns true if the mbrs of geom1 is on the right of the mbr of geom2 */
+str mbrRight_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrRight(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
+/* returns true if box1 overlaps or is above box2 when only the Y coordinate 
is considered*/
+str mbrOverlapOrAbove(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out =  ((*b1)->ymin >= (*b2)->ymin);
+       return MAL_SUCCEED;
+}
+
+/*returns true if the mbrs of geom1 overlaps or is above the mbr of geom2 */
+str mbrOverlapOrAbove_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrOverlapOrAbove(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
+/* returns true if box1 overlaps or is below box2 when only the Y coordinate 
is considered*/
+str mbrOverlapOrBelow(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->ymax <= (*b2)->ymax);
+       return MAL_SUCCEED;
+}
+
+/*returns true if the mbrs of geom1 overlaps or is below the mbr of geom2 */
+str mbrOverlapOrBelow_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrOverlapOrBelow(out, &geom1MBR, &geom2MBR);
+
+       GDKfree(geom1MBR);
+       GDKfree(geom2MBR);
+       
+       return ret;
+}
+
+/* returns true if box1 overlaps or is left of box2 when only the X coordinate 
is considered*/
+str mbrOverlapOrLeft(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->xmax <= (*b2)->xmax);
+       return MAL_SUCCEED;
+}
+
+/*returns true if the mbrs of geom1 overlaps or is on the left of the mbr of 
geom2 */
+str mbrOverlapOrLeft_wkb(bit *out, wkb **geom1WKB, wkb **geom2WKB) {
+       mbr *geom1MBR = NULL, *geom2MBR = NULL;
+       str ret = MAL_SUCCEED;
+
+       ret = wkbMBR(&geom1MBR, geom1WKB);
+       if(ret != MAL_SUCCEED) {
+               return ret;
+       }
+       
+       ret = wkbMBR(&geom2MBR, geom2WKB);
+       if(ret != MAL_SUCCEED) {
+               GDKfree(geom1MBR);
+               return ret;
+       }
+       
+       ret = mbrOverlapOrLeft(out, &geom1MBR, &geom2MBR);
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to