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