MultiPoint2DFunctions.java
/*
* Copyright 2015 gregory.graham.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nz.co.gregs.dbvolution.internal.sqlite;
import java.sql.Connection;
import java.sql.SQLException;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import org.sqlite.Function;
/**
*
* @author gregory.graham
*/
public class MultiPoint2DFunctions {
/**
*
*/
public final static String CREATE_FROM_COORDS_FUNCTION = "DBV_CREATE_MPOINT2D_FROM_COORDS";
/**
*
*/
public final static String EQUALS_FUNCTION = "DBV_MPOINT2D_EQUALS";
/**
*
*/
public final static String GETMAXX_FUNCTION = "DBV_MPOINT2D_GETMAXX";
/**
*
*/
public final static String GETMAXY_FUNCTION = "DBV_MPOINT2D_GETMAXY";
/**
*
*/
public final static String GETMINX_FUNCTION = "DBV_MPOINT2D_GETMINX";
/**
*
*/
public final static String GETMINY_FUNCTION = "DBV_MPOINT2D_GETMINY";
/**
*
*/
public final static String GETDIMENSION_FUNCTION = "DBV_MPOINT2D_GETDIMENSION";
/**
*
*/
public final static String GETBOUNDINGBOX_FUNCTION = "DBV_MPOINT2D_GETBOUNDINGBOX";
/**
*
*/
public final static String GETNUMBEROFPOINTS_FUNCTION = "DBV_MPOINT2D_GETNUMBEROFPOINTS";
/**
*
*/
public final static String GETPOINTATINDEX_FUNCTION = "DBV_MPOINT2D_GETPOINTATINDEX";
/**
*
*/
public final static String ASTEXT_FUNCTION = "DBV_MPOINT2D_ASTEXT";
/**
*
*/
public final static String ASLINE2D = "DBV_MPOINT2D_ASLINE2D";
private MultiPoint2DFunctions() {
}
/**
*
* @param connection the connection that needs functions added
* @throws SQLException database errors
*/
public static void addFunctions(Connection connection) throws SQLException {
Function.create(connection, CREATE_FROM_COORDS_FUNCTION, new CreateFromCoords());
Function.create(connection, EQUALS_FUNCTION, new Equals());
Function.create(connection, GETMAXX_FUNCTION, new GetMaxX());
Function.create(connection, GETMAXY_FUNCTION, new GetMaxY());
Function.create(connection, GETMINX_FUNCTION, new GetMinX());
Function.create(connection, GETMINY_FUNCTION, new GetMinY());
Function.create(connection, GETDIMENSION_FUNCTION, new GetDimension());
Function.create(connection, GETBOUNDINGBOX_FUNCTION, new GetBoundingBox());
Function.create(connection, GETNUMBEROFPOINTS_FUNCTION, new GetNumberOfPoints());
Function.create(connection, GETPOINTATINDEX_FUNCTION, new GetPointAtIndex());
Function.create(connection, ASTEXT_FUNCTION, new AsText());
Function.create(connection, ASLINE2D, new AsLine2D());
// Function.create(connection, ASPOLYGON2D, new AsPolygon2D());
}
private static class CreateFromCoords extends PolygonFunction {
//MULTIPOINT (2 3, 3 4)
@Override
protected void xFunc() throws SQLException {
Integer numberOfArguments = args();
if (numberOfArguments == 0) {
result();
} else {
StringBuilder resultStr = new StringBuilder("MULTIPOINT (");
String sep = "";
for (int i = 0; i < numberOfArguments; i += 2) {
Double x = value_double(i);
Double y = value_double(i + 1);
resultStr.append(sep).append(x).append(" ").append(y);
sep = ", ";
}
resultStr.append(")");
result(resultStr.toString());
}
}
}
private static class GetNumberOfPoints extends PolygonFunction {
//'MULTIPOINT ((2 3), (3 4), (4 5))'
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null || multipoint.equals("")) {
result();
} else {
Double maxX = null;
String[] split = multipoint.trim().split("[ (),]+");
result((split.length - 1) / 2);
}
}
}
private static class GetPointAtIndex extends PolygonFunction {
//MULTIPOINT (2 3, 3 4)
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
int index = value_int(1);
final int indexInMPoint = index * 2;
if (multipoint == null || indexInMPoint <= 0) {
result();
} else {
String[] split = multipoint.split("[ (),]+");
if (indexInMPoint > split.length) {
result();
} else {
String x = split[indexInMPoint - 1];
String y = split[indexInMPoint];
result("POINT (" + x + " " + y + ")");
}
}
}
}
private static class Equals extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String firstMPoint = value_text(0);
String secondMPoint = value_text(1);
if (firstMPoint == null || secondMPoint == null) {
result();
} else {
result(firstMPoint.equals(secondMPoint) ? 1 : 0);
}
}
}
private static class GetMaxX extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null) {
result();
} else {
Double maxX = null;
String[] split = multipoint.split("[ (),]+");
for (int i = 1; i < split.length; i += 2) {
double x = Double.parseDouble(split[i]);
// double y = Double.parseDouble(split[i + 1]);
if (maxX == null || maxX < x) {
maxX = x;
}
}
result(maxX);
}
}
}
private static class GetMaxY extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null) {
result();
} else {
Double maxY = null;
String[] split = multipoint.split("[ (),]+");
for (int i = 1; i < split.length; i += 2) {
// double x = Double.parseDouble(split[i]);
double y = Double.parseDouble(split[i + 1]);
if (maxY == null || maxY < y) {
maxY = y;
}
}
result(maxY);
}
}
}
private static class GetMinX extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null) {
result();
} else {
Double minX = null;
String[] split = multipoint.split("[ (),]+");
for (int i = 1; i < split.length; i += 2) {
double x = Double.parseDouble(split[i]);
// double y = Double.parseDouble(split[i + 1]);
if (minX == null || minX > x) {
minX = x;
}
}
result(minX);
}
}
}
private static class GetMinY extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null) {
result();
} else {
Double minY = null;
String[] split = multipoint.split("[ (),]+");
for (int i = 1; i < split.length; i += 2) {
// double x = Double.parseDouble(split[i]);
double y = Double.parseDouble(split[i + 1]);
if (minY == null || minY > y) {
minY = y;
}
}
result(minY);
}
}
}
private static class GetDimension extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
result(0);
}
}
private static class GetBoundingBox extends PolygonFunction {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
if (multipoint == null) {
result();
} else {
Double maxX = null;
Double maxY = null;
Double minX = null;
Double minY = null;
String[] split = multipoint.split("[ (),]+");
for (int i = 1; i < split.length; i += 2) {
double x = Double.parseDouble(split[i]);
double y = Double.parseDouble(split[i + 1]);
if (maxX == null || maxX < x) {
maxX = x;
}
if (maxY == null || maxY < y) {
maxY = y;
}
if (minX == null || minX > x) {
minX = x;
}
if (minY == null || minY > y) {
minY = y;
}
}
String resultString = "POLYGON ((" + minX + " " + minY + ", " + maxX + " " + minY + ", " + maxX + " " + maxY + ", " + minX + " " + maxY + ", " + minX + " " + minY + "))";
result(resultString);
}
}
}
private static class AsText extends Function {
@Override
protected void xFunc() throws SQLException {
String multipoint = value_text(0);
result(multipoint);
}
}
private static class AsLine2D extends Function {
@Override
protected void xFunc() throws SQLException {
if(value_text(0)==null){
result();
return;
}
String multipoint = value_text(0);
String line = multipoint.replace("), (", ", ").replace("MULTIPOINT", "LINESTRING").replace("((", "(").replace("))", ")");
result(line);
}
}
private static abstract class PolygonFunction extends Function {
Polygon getPolygon(String possiblePoly) throws ParseException {
WKTReader wktReader = new WKTReader();
Geometry firstGeom = wktReader.read(possiblePoly);
if (firstGeom instanceof Polygon) {
return (Polygon) firstGeom;
}
return null;
}
LineString getLineString(String possiblePoly) throws ParseException {
WKTReader wktReader = new WKTReader();
Geometry firstGeom = wktReader.read(possiblePoly);
if (firstGeom instanceof LineString) {
return (LineString) firstGeom;
}
return null;
}
Point getPoint(String possiblePoly) throws ParseException {
WKTReader wktReader = new WKTReader();
Geometry firstGeom = wktReader.read(possiblePoly);
if (firstGeom instanceof Point) {
return (Point) firstGeom;
}
return null;
}
MultiPoint getMultiPoint(String possiblePoly) throws ParseException {
WKTReader wktReader = new WKTReader();
Geometry firstGeom = wktReader.read(possiblePoly);
if (firstGeom instanceof MultiPoint) {
return (MultiPoint) firstGeom;
}
return null;
}
}
}