http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDisjointDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDisjointDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDisjointDescriptor.java new file mode 100644 index 0000000..17272ce --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDisjointDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STDisjointDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STDisjointDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.disjoint(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_DISJOINT; + } + +}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDistanceDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDistanceDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDistanceDescriptor.java new file mode 100644 index 0000000..50cb129 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDistanceDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STDistanceDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STDistanceDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.distance(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_DISTANCE; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEndPointDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEndPointDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEndPointDescriptor.java new file mode 100644 index 0000000..6b8e43b --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEndPointDescriptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCCurve; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STEndPointDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STEndPointDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCCurve) { + return ((OGCCurve) geometry).endPoint(); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_END_POINT; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEnvelopeDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEnvelopeDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEnvelopeDescriptor.java new file mode 100644 index 0000000..f5d7d0d --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEnvelopeDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STEnvelopeDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STEnvelopeDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.envelope(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_ENVELOPE; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEqualsDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEqualsDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEqualsDescriptor.java new file mode 100644 index 0000000..66c2ab1 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STEqualsDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STEqualsDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STEqualsDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.equals(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_EQUALS; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STExteriorRingDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STExteriorRingDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STExteriorRingDescriptor.java new file mode 100644 index 0000000..bda2c90 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STExteriorRingDescriptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCPolygon; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STExteriorRingDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STExteriorRingDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCPolygon) { + return ((OGCPolygon) geometry).exteriorRing(); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_EXTERIOR_RING; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextDescriptor.java new file mode 100644 index 0000000..8676600 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextDescriptor.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.OGCStructure; +import com.esri.core.geometry.OperatorImportFromWkt; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.WktImportFlags; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.dataflow.data.nontagged.serde.AStringSerializerDeserializer; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.InvalidDataFormatException; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class STGeomFromTextDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STGeomFromTextDescriptor(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_GEOM_FROM_TEXT; + } + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException { + + return new STGeomFromTextEvaluator(args, ctx); + } + }; + } + + private class STGeomFromTextEvaluator implements IScalarEvaluator { + + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg; + private IScalarEvaluator eval; + private OperatorImportFromWkt wktImporter; + + public STGeomFromTextEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg = new VoidPointable(); + eval = args[0].createScalarEvaluator(ctx); + wktImporter = OperatorImportFromWkt.local(); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + eval.evaluate(tuple, inputArg); + byte[] data = inputArg.getByteArray(); + int offset = inputArg.getStartOffset(); + int len = inputArg.getLength(); + + if (data[offset] != ATypeTag.SERIALIZED_STRING_TYPE_TAG) { + throw new TypeMismatchException(BuiltinFunctions.ST_GEOM_FROM_TEXT, 0, data[offset], + ATypeTag.SERIALIZED_STRING_TYPE_TAG); + } + ByteArrayInputStream inStream = new ByteArrayInputStream(data, offset + 1, len - 1); + DataInputStream dataIn = new DataInputStream(inStream); + try { + String geometry = AStringSerializerDeserializer.INSTANCE.deserialize(dataIn).getStringValue(); + OGCStructure structure; + + structure = wktImporter.executeOGC(WktImportFlags.wktImportNonTrusted, geometry, null); + OGCGeometry ogcGeometry = OGCGeometry.createFromOGCStructure(structure, SpatialReference.create(4326)); + ByteBuffer buffer = ogcGeometry.asBinary(); + byte[] wKBGeometryBuffer = buffer.array(); + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + out.writeInt(wKBGeometryBuffer.length); + out.write(wKBGeometryBuffer); + result.set(resultStorage); + + } catch (IOException e) { + throw new InvalidDataFormatException(getIdentifier(), e, ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextSRIDDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextSRIDDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextSRIDDescriptor.java new file mode 100644 index 0000000..01f7438 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromTextSRIDDescriptor.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.OGCStructure; +import com.esri.core.geometry.OperatorImportFromWkt; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.WktImportFlags; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AStringSerializerDeserializer; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.InvalidDataFormatException; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class STGeomFromTextSRIDDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STGeomFromTextSRIDDescriptor(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_GEOM_FROM_TEXT_SRID; + } + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException { + + return new STGeomFromTextSRIDEvaluator(args, ctx); + } + }; + } + + private class STGeomFromTextSRIDEvaluator implements IScalarEvaluator { + + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg; + private IScalarEvaluator eval; + private IPointable inputArg0; + private IScalarEvaluator eval0; + private OperatorImportFromWkt wktImporter; + + public STGeomFromTextSRIDEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg = new VoidPointable(); + eval = args[0].createScalarEvaluator(ctx); + inputArg0 = new VoidPointable(); + eval0 = args[1].createScalarEvaluator(ctx); + wktImporter = OperatorImportFromWkt.local(); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + eval.evaluate(tuple, inputArg); + byte[] data = inputArg.getByteArray(); + int offset = inputArg.getStartOffset(); + int len = inputArg.getLength(); + + eval0.evaluate(tuple, inputArg0); + byte[] data0 = inputArg0.getByteArray(); + int offset0 = inputArg0.getStartOffset(); + + if (data[offset] != ATypeTag.SERIALIZED_STRING_TYPE_TAG) { + throw new TypeMismatchException(getIdentifier(), 0, data[offset], ATypeTag.SERIALIZED_STRING_TYPE_TAG); + } + if (data0[offset0] != ATypeTag.SERIALIZED_INT64_TYPE_TAG) { + throw new TypeMismatchException(getIdentifier(), 0, data0[offset0], ATypeTag.SERIALIZED_INT64_TYPE_TAG); + } + + ByteArrayInputStream inStream = new ByteArrayInputStream(data, offset + 1, len - 1); + DataInputStream dataIn = new DataInputStream(inStream); + try { + String geometry = AStringSerializerDeserializer.INSTANCE.deserialize(dataIn).getStringValue(); + int srid = (int) AInt64SerializerDeserializer.getLong(data0, offset0 + 1); + OGCStructure structure; + + structure = wktImporter.executeOGC(WktImportFlags.wktImportNonTrusted, geometry, null); + OGCGeometry ogcGeometry = OGCGeometry.createFromOGCStructure(structure, SpatialReference.create(srid)); + ByteBuffer buffer = ogcGeometry.asBinary(); + byte[] wKBGeometryBuffer = buffer.array(); + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + out.writeInt(wKBGeometryBuffer.length); + out.write(wKBGeometryBuffer); + result.set(resultStorage); + + } catch (IOException e) { + throw new InvalidDataFormatException(getIdentifier(), e, ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromWKBDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromWKBDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromWKBDescriptor.java new file mode 100644 index 0000000..ad3365e --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomFromWKBDescriptor.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.InvalidDataFormatException; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; +import org.apache.hyracks.dataflow.common.data.marshalling.ByteArraySerializerDeserializer; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.IOException; + +public class STGeomFromWKBDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STGeomFromWKBDescriptor(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_GEOM_FROM_WKB; + } + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException { + + return new STGeomFromWKBEvaulator(args, ctx); + } + }; + } + + private class STGeomFromWKBEvaulator implements IScalarEvaluator { + + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg; + private IScalarEvaluator eval; + + public STGeomFromWKBEvaulator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg = new VoidPointable(); + eval = args[0].createScalarEvaluator(ctx); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + eval.evaluate(tuple, inputArg); + byte[] data = inputArg.getByteArray(); + int offset = inputArg.getStartOffset(); + int len = inputArg.getLength(); + + if (data[offset] != ATypeTag.SERIALIZED_BINARY_TYPE_TAG) { + throw new TypeMismatchException(BuiltinFunctions.ST_GEOM_FROM_WKB, 0, data[offset], + ATypeTag.SERIALIZED_BINARY_TYPE_TAG); + } + try { + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + ByteArrayInputStream inStream = new ByteArrayInputStream(data, offset + 1, len - 1); + DataInputStream dataIn = new DataInputStream(inStream); + data = ByteArraySerializerDeserializer.read(dataIn); + out.writeInt(data.length); + out.write(data); + result.set(resultStorage); + } catch (IOException e) { + throw new InvalidDataFormatException(getIdentifier(), e, ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomentryTypeDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomentryTypeDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomentryTypeDescriptor.java new file mode 100644 index 0000000..8e7ae39 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeomentryTypeDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STGeomentryTypeDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STGeomentryTypeDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.geometryType(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.GEOMETRY_TYPE; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeometryNDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeometryNDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeometryNDescriptor.java new file mode 100644 index 0000000..9bf3699 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STGeometryNDescriptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCGeometryCollection; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STGeometryNDescriptor extends AbstractSTGeometryNDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STGeometryNDescriptor(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_GEOMETRY_N; + } + + @Override + protected OGCGeometry evaluateOGCGeometry(OGCGeometry geometry, int n) throws HyracksDataException { + if (geometry instanceof OGCGeometryCollection) { + return ((OGCGeometryCollection) geometry).geometryN(n); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STInteriorRingNDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STInteriorRingNDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STInteriorRingNDescriptor.java new file mode 100644 index 0000000..25df415 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STInteriorRingNDescriptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCPolygon; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STInteriorRingNDescriptor extends AbstractSTGeometryNDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STInteriorRingNDescriptor(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_INTERIOR_RING_N; + } + + @Override + protected OGCGeometry evaluateOGCGeometry(OGCGeometry geometry, int n) throws HyracksDataException { + if (geometry instanceof OGCPolygon) { + return ((OGCPolygon) geometry).interiorRingN(n); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectionDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectionDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectionDescriptor.java new file mode 100644 index 0000000..6f3314e --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectionDescriptor.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIntersectionDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIntersectionDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.intersection(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_INTERSECTION; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectsDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectsDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectsDescriptor.java new file mode 100644 index 0000000..1a4f37f --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIntersectsDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIntersectsDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIntersectsDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.intersects(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_INTERSECTS; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsClosedDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsClosedDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsClosedDescriptor.java new file mode 100644 index 0000000..59edb4e --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsClosedDescriptor.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCCurve; +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCGeometryCollection; +import com.esri.core.geometry.ogc.OGCMultiCurve; +import com.esri.core.geometry.ogc.OGCMultiPoint; +import com.esri.core.geometry.ogc.OGCMultiPolygon; +import com.esri.core.geometry.ogc.OGCPoint; +import com.esri.core.geometry.ogc.OGCPolygon; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIsClosedDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIsClosedDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return isClosed(geometry); + } + + private boolean isClosed(OGCGeometry geometry) { + if (geometry instanceof OGCCurve) { + return ((OGCCurve) geometry).isClosed(); + } else if (geometry instanceof OGCMultiCurve) { + return ((OGCMultiCurve) geometry).isClosed(); + } else if (geometry instanceof OGCMultiPoint || geometry instanceof OGCMultiPolygon + || geometry instanceof OGCPolygon || geometry instanceof OGCPoint) { + return true; + } else if (geometry instanceof OGCGeometryCollection) { + OGCGeometryCollection geometryCollection = (OGCGeometryCollection) geometry; + int num = geometryCollection.numGeometries(); + for (int i = 0; i < num; ++i) { + if (!isClosed(geometryCollection.geometryN(i))) { + return false; + } + } + return true; + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_IS_CLOSED; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsCollectionDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsCollectionDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsCollectionDescriptor.java new file mode 100644 index 0000000..92767e9 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsCollectionDescriptor.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIsCollectionDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIsCollectionDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + String type = geometry.geometryType(); + return "GeometryCollection".equals(type) || "MultiLineString".equals(type) || "MultiPoint".equals(type) + || "MultiPolygon".equals(type); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_IS_COLLECTION; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsEmptyDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsEmptyDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsEmptyDescriptor.java new file mode 100644 index 0000000..acf20b7 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsEmptyDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIsEmptyDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIsEmptyDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.isEmpty(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_IS_EMPTY; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsRingDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsRingDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsRingDescriptor.java new file mode 100644 index 0000000..3c9375a --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsRingDescriptor.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCCurve; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIsRingDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIsRingDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCCurve) { + return ((OGCCurve) geometry).isRing(); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_IS_RING; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsSimpleDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsSimpleDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsSimpleDescriptor.java new file mode 100644 index 0000000..fdb948f --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STIsSimpleDescriptor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STIsSimpleDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STIsSimpleDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.isSimple(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_IS_SIMPLE; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLengthDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLengthDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLengthDescriptor.java new file mode 100644 index 0000000..65fd085 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLengthDescriptor.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.Geometry; +import com.esri.core.geometry.GeometryCursor; +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCLineString; +import com.esri.core.geometry.ogc.OGCMultiLineString; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STLengthDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STLengthDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCLineString) { + return geometry.getEsriGeometry().calculateLength2D(); + } else if (geometry instanceof OGCMultiLineString) { + GeometryCursor cursor = geometry.getEsriGeometryCursor(); + double length = 0; + Geometry geometry1 = cursor.next(); + while (geometry1 != null) { + length += geometry1.calculateLength2D(); + geometry1 = cursor.next(); + } + return length; + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_LENGTH; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLineFromMultiPointDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLineFromMultiPointDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLineFromMultiPointDescriptor.java new file mode 100644 index 0000000..c783fe0 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STLineFromMultiPointDescriptor.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.Point; +import com.esri.core.geometry.Polyline; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCLineString; +import com.esri.core.geometry.ogc.OGCMultiPoint; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STLineFromMultiPointDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STLineFromMultiPointDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCMultiPoint) { + Polyline polyline = new Polyline(); + OGCMultiPoint multiPoint = (OGCMultiPoint) geometry; + int numPoints = multiPoint.numGeometries(); + polyline.startPath((Point) multiPoint.geometryN(0).getEsriGeometry()); + for (int i = 1; i < numPoints; i++) { + polyline.lineTo((Point) multiPoint.geometryN(i).getEsriGeometry()); + } + return new OGCLineString(polyline, 0, SpatialReference.create(4326)); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_LINE_FROM_MULTIPOINT; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMDescriptor.java new file mode 100644 index 0000000..46ce0fb --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMDescriptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCPoint; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +public class STMDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STMDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + if (geometry instanceof OGCPoint) { + return ((OGCPoint) geometry).M(); + } else { + throw new UnsupportedOperationException( + "The operation " + getIdentifier() + " is not supported for the type " + geometry.geometryType()); + } + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_M; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakeEnvelopeDescriptorSRID.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakeEnvelopeDescriptorSRID.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakeEnvelopeDescriptorSRID.java new file mode 100644 index 0000000..efb4032 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakeEnvelopeDescriptorSRID.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.Envelope; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.runtime.exceptions.InvalidDataFormatException; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; + +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class STMakeEnvelopeDescriptorSRID extends AbstractGetValDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STMakeEnvelopeDescriptorSRID(); + } + }; + + private static final long serialVersionUID = 1L; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_MAKE_ENVELOPE; + } + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException { + + return new STMakeEnvelopeEvaluator(args, ctx); + } + }; + } + + private class STMakeEnvelopeEvaluator implements IScalarEvaluator { + + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg0; + private IScalarEvaluator eval0; + private IPointable inputArg1; + private IScalarEvaluator eval1; + private IPointable inputArg2; + private IScalarEvaluator eval2; + private IPointable inputArg3; + private IScalarEvaluator eval3; + private IPointable inputArg4; + private IScalarEvaluator eval4; + + public STMakeEnvelopeEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg0 = new VoidPointable(); + eval0 = args[0].createScalarEvaluator(ctx); + inputArg1 = new VoidPointable(); + eval1 = args[1].createScalarEvaluator(ctx); + inputArg2 = new VoidPointable(); + eval2 = args[2].createScalarEvaluator(ctx); + inputArg3 = new VoidPointable(); + eval3 = args[3].createScalarEvaluator(ctx); + inputArg4 = new VoidPointable(); + eval4 = args[4].createScalarEvaluator(ctx); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + eval0.evaluate(tuple, inputArg0); + byte[] data0 = inputArg0.getByteArray(); + int offset0 = inputArg0.getStartOffset(); + + eval1.evaluate(tuple, inputArg1); + byte[] data1 = inputArg1.getByteArray(); + int offset1 = inputArg1.getStartOffset(); + + eval2.evaluate(tuple, inputArg2); + byte[] data2 = inputArg2.getByteArray(); + int offset2 = inputArg2.getStartOffset(); + + eval3.evaluate(tuple, inputArg3); + byte[] data3 = inputArg3.getByteArray(); + int offset3 = inputArg3.getStartOffset(); + + eval4.evaluate(tuple, inputArg4); + byte[] data4 = inputArg4.getByteArray(); + int offset4 = inputArg4.getStartOffset(); + + try { + + OGCGeometry ogcGeometry = + OGCGeometry + .createFromEsriGeometry( + new Envelope(getVal(data0, offset0), getVal(data1, offset1), + getVal(data2, offset2), getVal(data3, offset3)), + SpatialReference.create((int) getVal(data4, offset4))); + ByteBuffer buffer = ogcGeometry.asBinary(); + byte[] bytes = buffer.array(); + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + out.writeInt(bytes.length); + out.write(bytes); + result.set(resultStorage); + } catch (IOException e) { + throw new InvalidDataFormatException(getIdentifier(), e, ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakePoint3DDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakePoint3DDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakePoint3DDescriptor.java new file mode 100644 index 0000000..3c0ac97 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STMakePoint3DDescriptor.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.asterix.geo.evaluators.functions; + +import com.esri.core.geometry.Point; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.ogc.OGCPoint; +import org.apache.asterix.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer; +import org.apache.asterix.om.base.AGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; + +import java.io.DataOutput; +import java.io.IOException; + +public class STMakePoint3DDescriptor extends AbstractGetValDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STMakePoint3DDescriptor(); + } + }; + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { + return new STMakePoint3DEvaluator(args, ctx); + } + }; + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_MAKE_POINT3D; + } + + private class STMakePoint3DEvaluator implements IScalarEvaluator { + + private final ArrayBackedValueStorage resultStorage; + private final DataOutput out; + private IPointable inputArg0; + private IPointable inputArg1; + private IPointable inputArg2; + private final IScalarEvaluator eval0; + private final IScalarEvaluator eval1; + private final IScalarEvaluator eval2; + private Point point; + private AGeometry pointGeometry; + + public STMakePoint3DEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg0 = new VoidPointable(); + inputArg1 = new VoidPointable(); + inputArg2 = new VoidPointable(); + eval0 = args[0].createScalarEvaluator(ctx); + eval1 = args[1].createScalarEvaluator(ctx); + eval2 = args[2].createScalarEvaluator(ctx); + point = new Point(0, 0, 0); + pointGeometry = new AGeometry(new OGCPoint(point, SpatialReference.create(4326))); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + eval0.evaluate(tuple, inputArg0); + eval1.evaluate(tuple, inputArg1); + eval2.evaluate(tuple, inputArg2); + + byte[] bytes0 = inputArg0.getByteArray(); + int offset0 = inputArg0.getStartOffset(); + byte[] bytes1 = inputArg1.getByteArray(); + int offset1 = inputArg1.getStartOffset(); + byte[] bytes2 = inputArg2.getByteArray(); + int offset2 = inputArg2.getStartOffset(); + + resultStorage.reset(); + try { + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + point.setX(getVal(bytes0, offset0)); + point.setY(getVal(bytes1, offset1)); + point.setZ(getVal(bytes2, offset2)); + AGeometrySerializerDeserializer.INSTANCE.serialize(pointGeometry, out); + } catch (IOException e1) { + throw HyracksDataException.create(e1); + } + result.set(resultStorage); + } + } +}
