OracleSpatialDBDefinition.java

  1. /*
  2.  * Copyright 2015 gregorygraham.
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *      http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. package nz.co.gregs.dbvolution.databases.definitions;

  17. import com.vividsolutions.jts.geom.Coordinate;
  18. import com.vividsolutions.jts.geom.LineSegment;
  19. import com.vividsolutions.jts.geom.LineString;
  20. import com.vividsolutions.jts.geom.MultiPoint;
  21. import com.vividsolutions.jts.geom.Point;
  22. import com.vividsolutions.jts.geom.Polygon;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. import nz.co.gregs.dbvolution.databases.DBDatabase;
  26. import nz.co.gregs.dbvolution.datatypes.QueryableDatatype;
  27. import nz.co.gregs.dbvolution.datatypes.spatial2D.DBLine2D;
  28. import nz.co.gregs.dbvolution.datatypes.spatial2D.DBLineSegment2D;
  29. import nz.co.gregs.dbvolution.datatypes.spatial2D.DBMultiPoint2D;
  30. import nz.co.gregs.dbvolution.datatypes.spatial2D.DBPoint2D;
  31. import nz.co.gregs.dbvolution.datatypes.spatial2D.DBPolygon2D;
  32. import nz.co.gregs.dbvolution.internal.oracle.xe.Line2DFunctions;
  33. import nz.co.gregs.dbvolution.results.Spatial2DResult;
  34. import nz.co.gregs.separatedstring.SeparatedString;
  35. import nz.co.gregs.separatedstring.SeparatedStringBuilder;

  36. /**
  37.  * A subclass of OracleDB that contains definitions of standard Spatial
  38.  * functions shared by Oracle databases with Spatial functions.
  39.  *
  40.  * <p style="color: #F90;">Support DBvolution at
  41.  * <a href="http://patreon.com/dbvolution" target=new>Patreon</a></p>
  42.  *
  43.  * @author gregorygraham
  44.  */
  45. public class OracleSpatialDBDefinition extends OracleDBDefinition {

  46.     public static final long serialVersionUID = 1L;

  47.     @Override
  48.     public String getDatabaseDataTypeOfQueryableDatatype(QueryableDatatype<?> qdt) {
  49.         if (qdt instanceof Spatial2DResult) {
  50.             return " SDO_GEOMETRY ";
  51. //      } else if (qdt instanceof DBLine2D) {
  52. //          return " SDO_GEOMETRY ";
  53. //      } else if (qdt instanceof DBLineSegment2D) {
  54. //          return " SDO_GEOMETRY ";
  55. //      } else if (qdt instanceof DBPolygon2D) {
  56. //          return " SDO_GEOMETRY ";
  57.         } else {
  58.             return super.getDatabaseDataTypeOfQueryableDatatype(qdt);
  59.         }
  60.     }

  61.     @Override
  62.     public String doColumnTransformForSelect(QueryableDatatype<?> qdt, String selectableName) {
  63.         if (qdt instanceof DBPolygon2D) {
  64.             return doPolygon2DAsTextTransform(selectableName);
  65.         } else if (qdt instanceof DBLine2D) {
  66.             return doLine2DAsTextTransform(selectableName);
  67.         } else if (qdt instanceof DBPoint2D) {
  68.             return doPoint2DAsTextTransform(selectableName);
  69.         } else if (qdt instanceof DBLineSegment2D) {
  70.             return doLineSegment2DAsTextTransform(selectableName);
  71.         } else if (qdt instanceof DBMultiPoint2D) {
  72.             return doMultiPoint2DAsTextTransform(selectableName);
  73.         } else {
  74.             return super.doColumnTransformForSelect(qdt, selectableName);
  75.         }
  76.     }

  77.     @Override
  78.     public boolean requiresSpatial2DIndexes() {
  79.         return true;
  80.     }

  81.     @Override
  82.     public List<String> getSpatial2DIndexSQL(DBDatabase aThis, final String formatTableName, final String formatColumnName) {
  83.         return new ArrayList<String>() {
  84.             public static final long serialVersionUID = 1;

  85.             {
  86.                 //add("DROP INDEX " + formatNameForDatabase("DBV_" + formatTableName + "_" + formatColumnName + "_sp2didx")+"");
  87.                 add("delete from USER_SDO_GEOM_METADATA "
  88.                         + "where table_name = '" + formatTableName.toUpperCase() + "' "
  89.                         + "and column_name = '" + formatColumnName.toUpperCase() + "'");
  90.                 add(
  91.                         "INSERT INTO USER_SDO_GEOM_METADATA \n"
  92.                         + "  select \n"
  93.                         + "  '" + formatTableName + "',\n"
  94.                         + "  '" + formatColumnName + "',\n"
  95.                         + "  MDSYS.SDO_DIM_ARRAY(\n"
  96.                         + "    MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  97.                         + "    MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  98.                         + "     ),\n"
  99.                         + "  NULL   -- SRID\n"
  100.                         + " from dual where not exists ("
  101.                         + "select * from USER_SDO_GEOM_METADATA  "
  102.                         + "where table_name = '" + formatTableName.toUpperCase() + "' "
  103.                         + "and column_name = '" + formatColumnName.toUpperCase() + "')");
  104.                 add("CREATE INDEX " + formatNameForDatabase("DBV_" + formatTableName + "_" + formatColumnName + "_sp2didx") + " ON " + formatTableName + " (" + formatColumnName + ") INDEXTYPE IS MDSYS.SPATIAL_INDEX");
  105.             }
  106.         };
  107.     }

  108.     @Override
  109.     public String transformPoint2DIntoDatabaseFormat(Point point) {
  110.         final Coordinate coordinate = point.getCoordinate();
  111.         return transformCoordinatesIntoDatabasePoint2DFormat("" + coordinate.x, "" + coordinate.y);
  112.     }

  113.     @Override
  114.     public String transformCoordinatesIntoDatabasePoint2DFormat(String xValue, String yValue) {
  115.         return "SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(" + xValue + ", " + yValue + ",NULL), NULL, NULL)";
  116. //      return "SDO_UTIL.FROM_WKTGEOMETRY('"+point.toText()+"')";
  117.     }

  118.     @Override
  119.     public String transformLineStringIntoDatabaseLine2DFormat(LineString point) {
  120. //      final Coordinate coordinate = point.getCoordinate();
  121. //      return "SDO_GEOMETRY(2002, NULL, SDO_POINT_TYPE(" + coordinate.x + ", " + coordinate.y + ",NULL), NULL, NULL)";
  122.         return "SDO_UTIL.FROM_WKTGEOMETRY('" + point.toText() + "')";
  123.     }

  124. //  @Override
  125. //  public String OldtransformPolygonIntoDatabasePolygon2DFormat(Polygon point) {
  126. ////        final Coordinate coordinate = point.getCoordinate();
  127. ////        return "SDO_GEOMETRY(2003, NULL, SDO_POINT_TYPE(" + coordinate.x + ", " + coordinate.y + ",NULL), NULL, NULL)";
  128. //      return "SDO_UTIL.FROM_WKTGEOMETRY('" + point.toText() + "')";
  129. //  }
  130.     @Override
  131.     public String transformMultiPoint2DToDatabaseMultiPoint2DValue(MultiPoint point) {
  132. //      final Coordinate coordinate = point.getCoordinate();
  133. //      return "SDO_GEOMETRY(2005, NULL, SDO_POINT_TYPE(" + coordinate.x + ", " + coordinate.y + ",NULL), NULL, NULL)";
  134.         return "SDO_UTIL.FROM_WKTGEOMETRY('" + point.toText() + "')";
  135.     }

  136.     @Override
  137.     public String transformLineSegmentIntoDatabaseLineSegment2DFormat(LineSegment lineSegment) {
  138. //      final Coordinate coordinate = point.p0;
  139. //      final Coordinate otherCoord = point.p1;

  140.         //MDSYS.SDO_GEOMETRY(2002, NULL, NULL,
  141.         //MDSYS.SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 9,2,2),
  142.         //MDSYS.SDO_ORDINATE_ARRAY(15,10, 25,10, 30,5, 38,5, 38,10, 35,15, 25,20))
  143.         return "MDSYS.SDO_GEOMETRY(2002, NULL, NULL,"
  144.                 + "MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1),"
  145.                 + "MDSYS.SDO_ORDINATE_ARRAY(" + lineSegment.p0.x + ", " + lineSegment.p0.y + ", " + lineSegment.p1.x + ", " + lineSegment.p1.y + ")"
  146.                 + ")";
  147.     }

  148.     @Override
  149.     public String doPoint2DDistanceBetweenTransform(String polygon2DSQL, String otherPolygon2DSQL) {
  150.         return "SDO_GEOM.SDO_DISTANCE(" + polygon2DSQL + ", " + otherPolygon2DSQL + ", 0.000001)"; //To change body of generated methods, choose Tools | Templates.
  151.     }

  152.     @Override
  153.     public String transformPoint2DArrayToDatabasePolygon2DFormat(List<String> pointSQL) {
  154.         SeparatedString sepStr;
  155.         sepStr = SeparatedStringBuilder
  156.                 .byCommas()
  157.                 .withPrefix("MDSYS.SDO_GEOMETRY(2003, NULL, NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,2003,1),MDSYS.SDO_ORDINATE_ARRAY(")
  158.                 .withSuffix("))")
  159.                 .withClosedLoop()
  160.                 .addAll(
  161.                         (t)->{return doPoint2DGetXTransform(t) + ", " + doPoint2DGetYTransform(t);},
  162.                         pointSQL
  163.                 );
  164.         return sepStr.toString();
  165.     }

  166.     @Override
  167.     public String transformCoordinateArrayToDatabasePolygon2DFormat(List<String> pointSQL) {
  168.         StringBuilder ordinateArray = new StringBuilder("MDSYS.SDO_ORDINATE_ARRAY(");
  169.         final String ordinateSep = ", ";
  170.         String pairSep = "";
  171.         String sep = pairSep;
  172.         for (String pointish : pointSQL) {
  173.             ordinateArray
  174.                     .append(sep)
  175.                     .append(pointish);
  176.             pairSep = ", ";
  177.             if (sep.equals(ordinateSep)) {
  178.                 sep = pairSep;
  179.             } else {
  180.                 sep = ordinateSep;
  181.             }
  182.         }
  183.         //+ lineSegment.p0.x + ", " + lineSegment.p0.y + ", " + lineSegment.p1.x + ", " + lineSegment.p1.y
  184.         ordinateArray.append(")");
  185.         return "MDSYS.SDO_GEOMETRY(2003, NULL, NULL,"
  186.                 + "MDSYS.SDO_ELEM_INFO_ARRAY(1,2003,1),"
  187.                 + ordinateArray
  188.                 + ")";
  189.     }

  190.     @Override
  191.     public String doPoint2DAsTextTransform(String point2DSQL) {
  192.         return "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" + point2DSQL + "))";
  193.     }

  194.     @Override
  195.     public String doPoint2DGetBoundingBoxTransform(String point2DSQL) {
  196.         return "SDO_GEOM.SDO_MBR(" + point2DSQL + ")";
  197.     }

  198.     @Override
  199.     public String doPoint2DMeasurableDimensionsTransform(String point2DSQL) {
  200.         return "0";
  201.         //return "(" + point2DSQL + ").GET_DIMS()"; get_dims() will return 2 as in 2D, whereas we require 0
  202.     }

  203.     @Override
  204.     public String doPoint2DGetYTransform(String point2DSQL) {
  205.         return "(" + point2DSQL + ").SDO_POINT.Y";
  206.     }

  207.     @Override
  208.     public String doPoint2DGetXTransform(String point2DSQL) {
  209.         return "(" + point2DSQL + ").SDO_POINT.X";
  210.     }

  211.     @Override
  212.     public String doPoint2DEqualsTransform(String firstPoint, String secondPoint) {
  213.         return "SDO_GEOM.RELATE(" + firstPoint + ", 'equal', " + secondPoint + ", 0.0000005)='EQUAL'";
  214.     }

  215.     @Override
  216.     public String doLineSegment2DIntersectsLineSegment2DTransform(String firstSQL, String secondSQL) {
  217.         return "SDO_GEOM.RELATE(" + firstSQL + ", 'ANYINTERACT', " + secondSQL + ", 0.0000005)='TRUE'";
  218.     }

  219.     @Override
  220.     public String doLineSegment2DGetMaxXTransform(String lineSegment) {
  221.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + lineSegment + ", MDSYS.SDO_DIM_ARRAY(\n"
  222.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  223.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  224.                 + "                     ), 1)";
  225.     }

  226.     @Override
  227.     public String doLineSegment2DGetMinXTransform(String lineSegment) {
  228.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + lineSegment + ", MDSYS.SDO_DIM_ARRAY(\n"
  229.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  230.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  231.                 + "                     ), 1)";
  232.     }

  233.     @Override
  234.     public String doLineSegment2DGetMaxYTransform(String lineSegment) {
  235.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + lineSegment + ", MDSYS.SDO_DIM_ARRAY(\n"
  236.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  237.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  238.                 + "                     ), 2)";
  239.     }

  240.     @Override
  241.     public String doLineSegment2DGetMinYTransform(String lineSegment) {
  242.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + lineSegment + ", MDSYS.SDO_DIM_ARRAY(\n"
  243.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  244.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  245.                 + "                     ), 2)";
  246.     }

  247.     @Override
  248.     public String doLineSegment2DGetBoundingBoxTransform(String lineSegment) {
  249.         return "SDO_GEOM.SDO_MBR(" + lineSegment + ")";
  250.     }

  251.     @Override
  252.     public String doLineSegment2DDimensionTransform(String lineSegment) {
  253.         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  254.     }

  255.     @Override
  256.     public String doLineSegment2DNotEqualsTransform(String firstLineSegment, String secondLineSegment) {
  257.         return "SDO_GEOM.RELATE(" + firstLineSegment + ", 'equal', " + secondLineSegment + ", 0.0000005)='FALSE'";
  258.     }

  259.     @Override
  260.     public String doLineSegment2DEqualsTransform(String firstLineSegment, String secondLineSegment) {
  261.         return "SDO_GEOM.RELATE(" + firstLineSegment + ", 'equal', " + secondLineSegment + ", 0.0000005)='EQUAL'";
  262.     }

  263.     @Override
  264.     public String doLineSegment2DAsTextTransform(String lineSegment) {
  265.         return "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" + lineSegment + "))";
  266.     }

  267.     @Override
  268.     public String doLineSegment2DIntersectionPointWithLineSegment2DTransform(String firstLineSegment, String secondLineSegment) {
  269.         return "SDO_GEOM.SDO_INTERSECTION(" + firstLineSegment + ", " + secondLineSegment + ", 0.0000005)";
  270.     }

  271.     @Override
  272.     public String doMultiPoint2DEqualsTransform(String first, String second) {
  273.         return "SDO_GEOM.RELATE(" + first + ", 'equal', " + second + ", 0.0000005)='EQUAL'";
  274.     }

  275.     @Override
  276.     public String doMultiPoint2DNotEqualsTransform(String first, String second) {
  277.         return "SDO_GEOM.RELATE(" + first + ", 'equal', " + second + ", 0.0000005)='FALSE'";
  278.     }

  279.     @Override
  280.     public String doMultiPoint2DGetPointAtIndexTransform(String first, String index) {
  281.         return "(" + first + ").SDO_ORDINATES(" + index + ")";
  282.     }

  283.     @Override
  284.     public String doMultiPoint2DGetNumberOfPointsTransform(String multiPoint2D) {
  285.         return "(" + multiPoint2D + ").SDO_ORDINATES.count";
  286.     }

  287.     @Override
  288.     public String doMultiPoint2DMeasurableDimensionsTransform(String multipoint2D) {
  289.         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  290.     }

  291.     @Override
  292.     public String doMultiPoint2DGetBoundingBoxTransform(String multiPoint2D) {
  293.         return "SDO_GEOM.SDO_MBR(" + multiPoint2D + ")";
  294.     }

  295.     @Override
  296.     public String doMultiPoint2DAsTextTransform(String multiPoint2D) {
  297.         return "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" + multiPoint2D + "))";
  298.     }

  299.     @Override
  300.     public String doMultiPoint2DToLine2DTransform(String multiPoint2D) {
  301.         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  302.     }

  303.     @Override
  304.     public String doMultiPoint2DGetMinYTransform(String multiPoint2D) {
  305.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + multiPoint2D + ", MDSYS.SDO_DIM_ARRAY(\n"
  306.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  307.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  308.                 + "                     ), 2)";
  309.     }

  310.     @Override
  311.     public String doMultiPoint2DGetMinXTransform(String multiPoint2D) {
  312.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + multiPoint2D + ", MDSYS.SDO_DIM_ARRAY(\n"
  313.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  314.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  315.                 + "                     ), 1)";
  316.     }

  317.     @Override
  318.     public String doMultiPoint2DGetMaxYTransform(String multiPoint2D) {
  319.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + multiPoint2D + ", MDSYS.SDO_DIM_ARRAY(\n"
  320.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  321.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  322.                 + "                     ), 2)";
  323.     }

  324.     @Override
  325.     public String doMultiPoint2DGetMaxXTransform(String multiPoint2D) {
  326.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + multiPoint2D + ", MDSYS.SDO_DIM_ARRAY(\n"
  327.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  328.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  329.                 + "                     ), 1)";
  330.     }

  331.     @Override
  332.     public String doLine2DGetMagnitudeTransform(String line2DSQL) {
  333.         return super.doLine2DGetMagnitudeTransform(line2DSQL); //To change body of generated methods, choose Tools | Templates.
  334.     }

  335.     @Override
  336.     public String doLine2DHasMagnitudeTransform(String line2DSQL) {
  337.         return super.doLine2DHasMagnitudeTransform(line2DSQL); //To change body of generated methods, choose Tools | Templates.
  338.     }

  339.     @Override
  340.     public String doLine2DSpatialDimensionsTransform(String line2DSQL) {
  341.         return "(" + line2DSQL + ").GET_DIMS()";
  342.     }

  343.     @Override
  344.     public String doLine2DAllIntersectionPointsWithLine2DTransform(String firstGeometry, String secondGeometry) {
  345.         return "SDO_GEOM.SDO_INTERSECTION(" + firstGeometry + ", " + secondGeometry + ", 0.0000005)";
  346.     }

  347.     @Override
  348.     public String doLine2DIntersectionPointWithLine2DTransform(String firstLine, String secondLine) {
  349.         return Line2DFunctions.GETPOINTFROMORDARRAY.toString()+"(SDO_GEOM.SDO_INTERSECTION(" + firstLine + ", " + secondLine + ", 0.0000005))";
  350.     }

  351.     @Override
  352.     public String doLine2DIntersectsLine2DTransform(String firstLine, String secondLine) {
  353.         return "SDO_GEOM.RELATE(" + firstLine + ", 'ANYINTERACT', " + secondLine + ", 0.0000005)='TRUE'";
  354.     }

  355.     @Override
  356.     public String doLine2DGetMinYTransform(String line2DSQL) {
  357.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + line2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  358.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  359.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  360.                 + "                     ), 2)";
  361.     }

  362.     @Override
  363.     public String doLine2DGetMaxYTransform(String line2DSQL) {
  364.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + line2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  365.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  366.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  367.                 + "                     ), 2)";
  368.     }

  369.     @Override
  370.     public String doLine2DGetMinXTransform(String line2DSQL) {
  371.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + line2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  372.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  373.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  374.                 + "                     ), 1)";
  375.     }

  376.     @Override
  377.     public String doLine2DGetMaxXTransform(String line2DSQL) {
  378.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + line2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  379.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  380.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  381.                 + "                     ), 1)";
  382.     }

  383.     @Override
  384.     public String doLine2DGetBoundingBoxTransform(String line2DSQL) {
  385.         return "SDO_GEOM.SDO_MBR(" + line2DSQL + ")";
  386.     }

  387.     @Override
  388.     public String doLine2DMeasurableDimensionsTransform(String line2DSQL) {
  389.         return super.doLine2DMeasurableDimensionsTransform(line2DSQL); //To change body of generated methods, choose Tools | Templates.
  390.     }

  391.     @Override
  392.     public String doLine2DNotEqualsTransform(String line2DSQL, String otherLine2DSQL) {
  393.         return "SDO_GEOM.RELATE(" + line2DSQL + ", 'equal', " + otherLine2DSQL + ", 0.0000005)='FALSE'";
  394.     }

  395.     @Override
  396.     public String doLine2DEqualsTransform(String line2DSQL, String otherLine2DSQL) {
  397.         return "SDO_GEOM.RELATE(" + line2DSQL + ", 'equal', " + otherLine2DSQL + ", 0.0000005)='EQUAL'";
  398.     }

  399.     @Override
  400.     public String doLine2DAsTextTransform(String line2DSQL) {
  401.         return "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" + line2DSQL + "))";
  402.     }

  403.     @Override
  404.     public String doPolygon2DGetMagnitudeTransform(String polygon2DSQL) {
  405.         return super.doPolygon2DGetMagnitudeTransform(polygon2DSQL); //To change body of generated methods, choose Tools | Templates.
  406.     }

  407.     @Override
  408.     public String doPolygon2DSpatialDimensionsTransform(String polygon2DSQL) {
  409.         return "(" + polygon2DSQL + ").GET_DIMS()";
  410.     }

  411.     @Override
  412.     public String doPolygon2DAsTextTransform(String polygonSQL) {
  413.         return "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" + polygonSQL + "))";
  414.     }

  415.     @Override
  416.     public String doPolygon2DContainsPoint2DTransform(String polygon2DSQL, String point2DSQL) {
  417.         return "SDO_GEOM.RELATE(" + polygon2DSQL + ", 'CONTAINS', " + point2DSQL + ", 0.0000005)='CONTAINS'";
  418.     }

  419.     @Override
  420.     public String transformPolygonIntoDatabasePolygon2DFormat(Polygon polygon2D) {
  421.         return "SDO_UTIL.FROM_WKTGEOMETRY(" + polygon2D.toText() + ")";
  422.     }

  423.     @Override
  424.     public String doPolygon2DGetMinYTransform(String polygon2DSQL) {
  425.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + polygon2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  426.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  427.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  428.                 + "                     ), 2)";
  429.     }

  430.     @Override
  431.     public String doPolygon2DGetMaxYTransform(String polygon2DSQL) {
  432.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + polygon2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  433.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  434.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  435.                 + "                     ), 2)";
  436.     }

  437.     @Override
  438.     public String doPolygon2DGetMinXTransform(String polygon2DSQL) {
  439.         return "SDO_GEOM.SDO_MIN_MBR_ORDINATE(" + polygon2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  440.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  441.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  442.                 + "                     ), 1)";
  443.     }

  444.     @Override
  445.     public String doPolygon2DGetMaxXTransform(String polygon2DSQL) {
  446.         return "SDO_GEOM.SDO_MAX_MBR_ORDINATE(" + polygon2DSQL + ", MDSYS.SDO_DIM_ARRAY(\n"
  447.                 + "                     MDSYS.SDO_DIM_ELEMENT('X', -9999999999, 9999999999, 0.0000000001),\n"
  448.                 + "                            MDSYS.SDO_DIM_ELEMENT('Y', -9999999999, 9999999999, 0.0000000001)\n"
  449.                 + "                     ), 1)";
  450.     }

  451.     @Override
  452.     public String doPolygon2DGetExteriorRingTransform(String polygon2DSQL) {
  453.         return "SDO_UTIL.POLYGONTOLINE(" + polygon2DSQL + ")";
  454.     }

  455.     @Override
  456.     public String doPolygon2DGetAreaTransform(String polygon2DSQL) {
  457.         return "ABS(SDO_GEOM.SDO_AREA(" + polygon2DSQL + ", 0.0000005))";
  458.     }

  459.     @Override
  460.     public String doPolygon2DGetBoundingBoxTransform(String polygon2DSQL) {
  461.         return "SDO_GEOM.SDO_MBR(" + polygon2DSQL + ")";
  462.     }

  463.     @Override
  464.     public String doPolygon2DMeasurableDimensionsTransform(String toSQLString) {
  465.         return "2";
  466.     }

  467.     @Override
  468.     public String doPolygon2DWithinTransform(String firstGeometry, String secondGeometry) {
  469.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'COVEREDBY+INSIDE', " + secondGeometry + ", 0.0000005)<>'FALSE'";
  470.     }

  471.     @Override
  472.     public String doPolygon2DTouchesTransform(String firstGeometry, String secondGeometry) {
  473.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'TOUCH', " + secondGeometry + ", 0.0000005)='TOUCH'";
  474.     }

  475.     @Override
  476.     public String doPolygon2DOverlapsTransform(String firstGeometry, String secondGeometry) {
  477.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'OVERLAPBDYINTERSECT', " + secondGeometry + ", 0.0000005)='OVERLAPBDYINTERSECT'";
  478.     }

  479.     @Override
  480.     public String doPolygon2DDoesNotIntersectTransform(String firstGeometry, String secondGeometry) {
  481.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'DISJOINT', " + secondGeometry + ", 0.0000005)='DISJOINT'";
  482.     }

  483.     @Override
  484.     public String doPolygon2DContainsPolygon2DTransform(String firstGeometry, String secondGeometry) {
  485.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'COVERS+CONTAINS', " + secondGeometry + ", 0.0000005)<>'FALSE'";
  486.     }

  487.     @Override
  488.     public String doPolygon2DIntersectsTransform(String firstGeometry, String secondGeometry) {
  489.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'ANYINTERACT', " + secondGeometry + ", 0.0000005)='TRUE'";
  490.     }

  491.     @Override
  492.     public String doPolygon2DIntersectionTransform(String firstGeometry, String secondGeometry) {
  493.         return "SDO_GEOM.SDO_INTERSECTION(" + firstGeometry + ", " + secondGeometry + ", 0.0000005)";
  494.     }

  495.     @Override
  496.     public String doPolygon2DEqualsTransform(String firstGeometry, String secondGeometry) {
  497.         return "SDO_GEOM.RELATE(" + firstGeometry + ", 'EQUAL', " + secondGeometry + ", 0.0000005)='EQUAL'";
  498.     }

  499. }