http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/pom.xml ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/pom.xml b/asterixdb/asterix-geo/pom.xml new file mode 100644 index 0000000..671e57e --- /dev/null +++ b/asterixdb/asterix-geo/pom.xml @@ -0,0 +1,147 @@ +<!-- + ! 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. + !--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>apache-asterixdb</artifactId> + <groupId>org.apache.asterix</groupId> + <version>0.9.4-SNAPSHOT</version> + </parent> + <artifactId>asterix-geo</artifactId> + + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + <distribution>repo</distribution> + <comments>A business-friendly OSS license</comments> + </license> + </licenses> + + <properties> + <root.dir>${basedir}/..</root.dir> + </properties> + + <build> + <plugins> + <plugin> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-evaluator-generator-maven-plugin</artifactId> + <version>${project.version}</version> + <configuration> + <evaluatorPackagePrefix>org.apache.asterix.runtime.evaluators</evaluatorPackagePrefix> + </configuration> + <executions> + <execution> + <id>generate-evaluator</id> + <phase>process-classes</phase> + <goals> + <goal>generate-evaluator</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + <phase>test-compile</phase> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <executions> + <execution> + <phase>validate</phase> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + <configuration> + <excludes combine.children="append"> + <exclude>data/**</exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>algebricks-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-data-std</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-util</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>algebricks-core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>algebricks-runtime</artifactId> + </dependency> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-common</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.hyracks</groupId> + <artifactId>hyracks-dataflow-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-om</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-runtime</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.esri.geometry</groupId> + <artifactId>esri-geometry-api</artifactId> + <version>2.0.0</version> + </dependency> + </dependencies> + +</project>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateDescriptor.java new file mode 100644 index 0000000..ec45877 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateDescriptor.java @@ -0,0 +1,61 @@ +/* + * 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.aggregates; + +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.runtime.aggregates.base.AbstractAggregateFunctionDynamicDescriptor; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IAggregateEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IAggregateEvaluatorFactory; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; + +/** + * NULLs are also counted. + */ +public class STUnionAggregateDescriptor extends AbstractAggregateFunctionDynamicDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STUnionAggregateDescriptor(); + } + }; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_UNION_AGG; + } + + @Override + public IAggregateEvaluatorFactory createAggregateEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IAggregateEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IAggregateEvaluator createAggregateEvaluator(IHyracksTaskContext ctx) throws HyracksDataException { + return new STUnionAggregateFunction(args, ctx); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateFunction.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateFunction.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateFunction.java new file mode 100644 index 0000000..c9c2eca --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/STUnionAggregateFunction.java @@ -0,0 +1,115 @@ +/* + * 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.aggregates; + +import com.esri.core.geometry.Point; +import com.esri.core.geometry.SpatialReference; +import com.esri.core.geometry.ogc.OGCGeometry; +import com.esri.core.geometry.ogc.OGCPoint; +import org.apache.asterix.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer; +import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; +import org.apache.asterix.om.base.AGeometry; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.om.types.EnumDeserializer; +import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException; +import org.apache.hyracks.algebricks.runtime.base.IAggregateEvaluator; +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.dataflow.value.ISerializerDeserializer; +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.DataInput; +import java.io.DataInputStream; +import java.io.IOException; + +/** + * STUnion aggregates a set of objects into one object. If the input is a set of overlapping polygons, their union is + * computed and returned as a multipolygon. Similarly, if the input is a set of points or linestring, a multipoint or + * multilinestring is created. Is the result contains geometries of different types, e.g., points and linestring, the + * output is a GeometryCollection. + */ +public class STUnionAggregateFunction implements IAggregateEvaluator { + /**Use WGS 84 (EPSG:4326) as the default coordinate reference system*/ + public static final SpatialReference DEFAULT_CRS = SpatialReference.create(4326); + @SuppressWarnings("unchecked") + private ISerializerDeserializer<AGeometry> geometrySerde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AGEOMETRY); + private IPointable inputVal = new VoidPointable(); + private IScalarEvaluator eval; + protected OGCGeometry geometry; + + private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage(); + + public STUnionAggregateFunction(IScalarEvaluatorFactory[] args, IHyracksTaskContext context) + throws HyracksDataException { + eval = args[0].createScalarEvaluator(context); + } + + @Override + public void init() throws HyracksDataException { + // Initialize the resulting geometry with an empty point. + geometry = new OGCPoint(new Point(), DEFAULT_CRS); + } + + @Override + public void step(IFrameTupleReference tuple) throws HyracksDataException { + eval.evaluate(tuple, inputVal); + byte[] data = inputVal.getByteArray(); + int offset = inputVal.getStartOffset(); + int len = inputVal.getLength(); + ATypeTag typeTag = + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]); + // Ignore SYSTEM_NULL. + if (typeTag == ATypeTag.NULL || typeTag == ATypeTag.MISSING) { + processNull(); + } else if (typeTag == ATypeTag.GEOMETRY) { + DataInput dataIn = new DataInputStream(new ByteArrayInputStream(data, offset + 1, len - 1)); + OGCGeometry geometry1 = AGeometrySerializerDeserializer.INSTANCE.deserialize(dataIn).getGeometry(); + geometry = geometry.union(geometry1); + } + } + + @Override + public void finish(IPointable resultPointable) throws HyracksDataException { + resultStorage.reset(); + try { + geometrySerde.serialize(new AGeometry(geometry), resultStorage.getDataOutput()); + } catch (IOException e) { + throw HyracksDataException.create(e); + } + resultPointable.set(resultStorage); + } + + @Override + public void finishPartial(IPointable resultPointable) throws HyracksDataException { + finish(resultPointable); + } + + protected void processNull() throws UnsupportedItemTypeException { + throw new UnsupportedItemTypeException(BuiltinFunctions.ST_UNION, ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/ScalarSTUnionAggregateDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/ScalarSTUnionAggregateDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/ScalarSTUnionAggregateDescriptor.java new file mode 100644 index 0000000..96b6478 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/aggregates/ScalarSTUnionAggregateDescriptor.java @@ -0,0 +1,46 @@ +/* + * 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.aggregates; + +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.runtime.aggregates.scalar.AbstractScalarAggregateDescriptor; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; + +public class ScalarSTUnionAggregateDescriptor extends AbstractScalarAggregateDescriptor { + + private static final long serialVersionUID = 1L; + public final static FunctionIdentifier FID = BuiltinFunctions.SCALAR_ST_UNION_AGG; + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + public IFunctionDescriptor createFunctionDescriptor() { + return new ScalarSTUnionAggregateDescriptor(STUnionAggregateDescriptor.FACTORY.createFunctionDescriptor()); + } + }; + + private ScalarSTUnionAggregateDescriptor(IFunctionDescriptor aggFuncDesc) { + super(aggFuncDesc); + } + + @Override + public FunctionIdentifier getIdentifier() { + return FID; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionRegistrant.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionRegistrant.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionRegistrant.java new file mode 100644 index 0000000..1644b99 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionRegistrant.java @@ -0,0 +1,155 @@ +/* + * 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; + +import org.apache.asterix.geo.aggregates.STUnionAggregateDescriptor; +import org.apache.asterix.geo.aggregates.ScalarSTUnionAggregateDescriptor; +import org.apache.asterix.geo.evaluators.functions.ParseGeoJSONDescriptor; +import org.apache.asterix.geo.evaluators.functions.STAreaDescriptor; +import org.apache.asterix.geo.evaluators.functions.STAsBinaryDescriptor; +import org.apache.asterix.geo.evaluators.functions.STAsGeoJSONDescriptor; +import org.apache.asterix.geo.evaluators.functions.STAsTextDescriptor; +import org.apache.asterix.geo.evaluators.functions.STBoundaryDescriptor; +import org.apache.asterix.geo.evaluators.functions.STContainsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STCoordDimDescriptor; +import org.apache.asterix.geo.evaluators.functions.STCrossesDescriptor; +import org.apache.asterix.geo.evaluators.functions.STDifferenceDescriptor; +import org.apache.asterix.geo.evaluators.functions.STDimensionDescriptor; +import org.apache.asterix.geo.evaluators.functions.STDisjointDescriptor; +import org.apache.asterix.geo.evaluators.functions.STDistanceDescriptor; +import org.apache.asterix.geo.evaluators.functions.STEndPointDescriptor; +import org.apache.asterix.geo.evaluators.functions.STEnvelopeDescriptor; +import org.apache.asterix.geo.evaluators.functions.STEqualsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STExteriorRingDescriptor; +import org.apache.asterix.geo.evaluators.functions.STGeomFromTextDescriptor; +import org.apache.asterix.geo.evaluators.functions.STGeomFromTextSRIDDescriptor; +import org.apache.asterix.geo.evaluators.functions.STGeomFromWKBDescriptor; +import org.apache.asterix.geo.evaluators.functions.STGeomentryTypeDescriptor; +import org.apache.asterix.geo.evaluators.functions.STGeometryNDescriptor; +import org.apache.asterix.geo.evaluators.functions.STInteriorRingNDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIntersectionDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIntersectsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIsClosedDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIsCollectionDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIsEmptyDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIsRingDescriptor; +import org.apache.asterix.geo.evaluators.functions.STIsSimpleDescriptor; +import org.apache.asterix.geo.evaluators.functions.STLengthDescriptor; +import org.apache.asterix.geo.evaluators.functions.STLineFromMultiPointDescriptor; +import org.apache.asterix.geo.evaluators.functions.STMDescriptor; +import org.apache.asterix.geo.evaluators.functions.STMakeEnvelopeDescriptorSRID; +import org.apache.asterix.geo.evaluators.functions.STMakePoint3DDescriptor; +import org.apache.asterix.geo.evaluators.functions.STMakePoint3DWithMDescriptor; +import org.apache.asterix.geo.evaluators.functions.STMakePointDescriptor; +import org.apache.asterix.geo.evaluators.functions.STNPointsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STNRingsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STNumGeometriesDescriptor; +import org.apache.asterix.geo.evaluators.functions.STNumInteriorRingsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STOverlapsDescriptor; +import org.apache.asterix.geo.evaluators.functions.STPointNDescriptor; +import org.apache.asterix.geo.evaluators.functions.STPolygonizeDescriptor; +import org.apache.asterix.geo.evaluators.functions.STRelateDescriptor; +import org.apache.asterix.geo.evaluators.functions.STSRIDDescriptor; +import org.apache.asterix.geo.evaluators.functions.STStartPointDescriptor; +import org.apache.asterix.geo.evaluators.functions.STSymDifferenceDescriptor; +import org.apache.asterix.geo.evaluators.functions.STTouchesDescriptor; +import org.apache.asterix.geo.evaluators.functions.STUnionDescriptor; +import org.apache.asterix.geo.evaluators.functions.STWithinDescriptor; +import org.apache.asterix.geo.evaluators.functions.STXDescriptor; +import org.apache.asterix.geo.evaluators.functions.STXMaxDescriptor; +import org.apache.asterix.geo.evaluators.functions.STXMinDescriptor; +import org.apache.asterix.geo.evaluators.functions.STYDescriptor; +import org.apache.asterix.geo.evaluators.functions.STYMaxDescriptor; +import org.apache.asterix.geo.evaluators.functions.STYMinDescriptor; +import org.apache.asterix.geo.evaluators.functions.STZDescriptor; +import org.apache.asterix.geo.evaluators.functions.STZMaxDescriptor; +import org.apache.asterix.geo.evaluators.functions.STZMinDescriptor; +import org.apache.asterix.om.functions.IFunctionCollection; +import org.apache.asterix.om.functions.IFunctionRegistrant; + +public class GeoFunctionRegistrant implements IFunctionRegistrant { + @Override + public void register(IFunctionCollection fc) { + //Geo functions + fc.add(ScalarSTUnionAggregateDescriptor.FACTORY); + fc.add(STUnionAggregateDescriptor.FACTORY); + + //GeoJSON + fc.add(ParseGeoJSONDescriptor.FACTORY); + fc.add(STAreaDescriptor.FACTORY); + fc.add(STMakePointDescriptor.FACTORY); + fc.add(STMakePoint3DDescriptor.FACTORY); + fc.add(STMakePoint3DWithMDescriptor.FACTORY); + fc.add(STIntersectsDescriptor.FACTORY); + fc.add(STUnionDescriptor.FACTORY); + fc.add(STIsCollectionDescriptor.FACTORY); + fc.add(STContainsDescriptor.FACTORY); + fc.add(STCrossesDescriptor.FACTORY); + fc.add(STDisjointDescriptor.FACTORY); + fc.add(STEqualsDescriptor.FACTORY); + fc.add(STOverlapsDescriptor.FACTORY); + fc.add(STTouchesDescriptor.FACTORY); + fc.add(STWithinDescriptor.FACTORY); + fc.add(STIsEmptyDescriptor.FACTORY); + fc.add(STIsSimpleDescriptor.FACTORY); + fc.add(STCoordDimDescriptor.FACTORY); + fc.add(STDimensionDescriptor.FACTORY); + fc.add(STGeomentryTypeDescriptor.FACTORY); + fc.add(STMDescriptor.FACTORY); + fc.add(STNRingsDescriptor.FACTORY); + fc.add(STNPointsDescriptor.FACTORY); + fc.add(STNumGeometriesDescriptor.FACTORY); + fc.add(STNumInteriorRingsDescriptor.FACTORY); + fc.add(STSRIDDescriptor.FACTORY); + fc.add(STXDescriptor.FACTORY); + fc.add(STYDescriptor.FACTORY); + fc.add(STXMaxDescriptor.FACTORY); + fc.add(STXMinDescriptor.FACTORY); + fc.add(STYMaxDescriptor.FACTORY); + fc.add(STYMinDescriptor.FACTORY); + fc.add(STZDescriptor.FACTORY); + fc.add(STZMaxDescriptor.FACTORY); + fc.add(STZMinDescriptor.FACTORY); + fc.add(STAsBinaryDescriptor.FACTORY); + fc.add(STAsTextDescriptor.FACTORY); + fc.add(STAsGeoJSONDescriptor.FACTORY); + fc.add(STDistanceDescriptor.FACTORY); + fc.add(STLengthDescriptor.FACTORY); + fc.add(STGeomFromTextDescriptor.FACTORY); + fc.add(STGeomFromTextSRIDDescriptor.FACTORY); + fc.add(STGeomFromWKBDescriptor.FACTORY); + fc.add(STLineFromMultiPointDescriptor.FACTORY); + fc.add(STMakeEnvelopeDescriptorSRID.FACTORY); + fc.add(STIsClosedDescriptor.FACTORY); + fc.add(STIsRingDescriptor.FACTORY); + fc.add(STRelateDescriptor.FACTORY); + fc.add(STBoundaryDescriptor.FACTORY); + fc.add(STEndPointDescriptor.FACTORY); + fc.add(STEnvelopeDescriptor.FACTORY); + fc.add(STExteriorRingDescriptor.FACTORY); + fc.add(STGeometryNDescriptor.FACTORY); + fc.add(STInteriorRingNDescriptor.FACTORY); + fc.add(STPointNDescriptor.FACTORY); + fc.add(STStartPointDescriptor.FACTORY); + fc.add(STDifferenceDescriptor.FACTORY); + fc.add(STIntersectionDescriptor.FACTORY); + fc.add(STSymDifferenceDescriptor.FACTORY); + fc.add(STPolygonizeDescriptor.FACTORY); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionTypeInferers.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionTypeInferers.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionTypeInferers.java new file mode 100644 index 0000000..f609beb --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/GeoFunctionTypeInferers.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; + +import org.apache.asterix.common.config.CompilerProperties; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionTypeInferer; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.IAType; +import org.apache.asterix.om.utils.RecordUtil; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; + +public class GeoFunctionTypeInferers { + private GeoFunctionTypeInferers() { + } + + public static final class GeometryConstructorTypeInferer implements IFunctionTypeInferer { + @Override + public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context, + CompilerProperties compilerProps) throws AlgebricksException { + AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr; + IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue()); + ATypeTag typeTag = t.getTypeTag(); + if (typeTag.equals(ATypeTag.OBJECT)) { + fd.setImmutableStates(t); + } else if (typeTag.equals(ATypeTag.ANY)) { + fd.setImmutableStates(RecordUtil.FULLY_OPEN_RECORD_TYPE); + } else { + throw new NotImplementedException("parse-geojson for data of type " + t); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractGetValDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractGetValDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractGetValDescriptor.java new file mode 100644 index 0000000..325b10a --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractGetValDescriptor.java @@ -0,0 +1,39 @@ +/* + * 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.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; + +public abstract class AbstractGetValDescriptor extends AbstractScalarFunctionDynamicDescriptor { + public double getVal(byte[] bytes, int offset) throws TypeMismatchException { + if (bytes[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) { + return ADoubleSerializerDeserializer.getDouble(bytes, offset + 1); + } else if (bytes[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) { + return AInt64SerializerDeserializer.getLong(bytes, offset + 1); + } else { + throw new TypeMismatchException(getIdentifier(), 1, bytes[offset], ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG, + ATypeTag.SERIALIZED_INT64_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/AbstractSTDoubleGeometryDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTDoubleGeometryDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTDoubleGeometryDescriptor.java new file mode 100644 index 0000000..83925a1 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTDoubleGeometryDescriptor.java @@ -0,0 +1,129 @@ +/* + * 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.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer; +import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; +import org.apache.asterix.om.base.ABoolean; +import org.apache.asterix.om.base.AGeometry; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.om.types.EnumDeserializer; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; +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; + +public abstract class AbstractSTDoubleGeometryDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + abstract protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) + throws HyracksDataException; + + @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 AbstractSTDoubleGeometryEvaluator(args, ctx); + } + }; + } + + private class AbstractSTDoubleGeometryEvaluator implements IScalarEvaluator { + + private final ArrayBackedValueStorage resultStorage; + private final DataOutput out; + private final IPointable argPtr0; + private final IPointable argPtr1; + private final IScalarEvaluator eval0; + private final IScalarEvaluator eval1; + + public AbstractSTDoubleGeometryEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + argPtr0 = new VoidPointable(); + argPtr1 = new VoidPointable(); + eval0 = args[0].createScalarEvaluator(ctx); + eval1 = args[1].createScalarEvaluator(ctx); + } + + @Override + @SuppressWarnings("unchecked") + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + resultStorage.reset(); + eval0.evaluate(tuple, argPtr0); + eval1.evaluate(tuple, argPtr1); + + try { + byte[] bytes0 = argPtr0.getByteArray(); + int offset0 = argPtr0.getStartOffset(); + int len0 = argPtr0.getLength(); + byte[] bytes1 = argPtr1.getByteArray(); + int offset1 = argPtr1.getStartOffset(); + int len1 = argPtr1.getLength(); + + ATypeTag tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes0[offset0]); + if (tag != ATypeTag.GEOMETRY) { + throw new TypeMismatchException(getIdentifier(), 0, bytes0[offset0], + ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes1[offset1]); + if (tag != ATypeTag.GEOMETRY) { + throw new TypeMismatchException(getIdentifier(), 0, bytes1[offset1], + ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + DataInputStream dataIn0 = new DataInputStream(new ByteArrayInputStream(bytes0, offset0 + 1, len0 - 1)); + OGCGeometry geometry0 = AGeometrySerializerDeserializer.INSTANCE.deserialize(dataIn0).getGeometry(); + DataInputStream dataIn1 = new DataInputStream(new ByteArrayInputStream(bytes1, offset1 + 1, len1 - 1)); + OGCGeometry geometry1 = AGeometrySerializerDeserializer.INSTANCE.deserialize(dataIn1).getGeometry(); + Object finalResult = evaluateOGCGeometry(geometry0, geometry1); + if (finalResult instanceof OGCGeometry) { + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + AGeometrySerializerDeserializer.INSTANCE.serialize(new AGeometry((OGCGeometry) finalResult), out); + } else if (finalResult instanceof Boolean) { + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN) + .serialize((boolean) finalResult ? ABoolean.TRUE : ABoolean.FALSE, out); + } else if (finalResult instanceof Double) { + out.writeByte(ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG); + out.writeDouble((double) finalResult); + } + + } catch (IOException e) { + throw HyracksDataException.create(e); + } + result.set(resultStorage); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTGeometryNDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTGeometryNDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTGeometryNDescriptor.java new file mode 100644 index 0000000..62e8db9 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTGeometryNDescriptor.java @@ -0,0 +1,115 @@ +/* + * 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.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer; +import org.apache.asterix.om.base.AGeometry; +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.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; + +public abstract class AbstractSTGeometryNDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + private static final long serialVersionUID = 1L; + + abstract protected OGCGeometry evaluateOGCGeometry(OGCGeometry geometry, int n) throws HyracksDataException; + + @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 AbstractSTGeometryNEvaluator(args, ctx); + } + }; + } + + private class AbstractSTGeometryNEvaluator implements IScalarEvaluator { + + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg; + private IScalarEvaluator eval; + private IPointable inputArg0; + private IScalarEvaluator eval0; + + public AbstractSTGeometryNEvaluator(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); + } + + @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_GEOMETRY_TYPE_TAG) { + throw new TypeMismatchException(getIdentifier(), 0, data[offset], + ATypeTag.SERIALIZED_GEOMETRY_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); + OGCGeometry geometry = AGeometrySerializerDeserializer.INSTANCE.deserialize(dataIn).getGeometry(); + int n = (int) AInt64SerializerDeserializer.getLong(data0, offset0 + 1); + + OGCGeometry geometryN = evaluateOGCGeometry(geometry, n); + try { + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + AGeometrySerializerDeserializer.INSTANCE.serialize(new AGeometry(geometryN), out); + 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/AbstractSTSingleGeometryDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTSingleGeometryDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTSingleGeometryDescriptor.java new file mode 100644 index 0000000..0acf731 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/AbstractSTSingleGeometryDescriptor.java @@ -0,0 +1,131 @@ +/* + * 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.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer; +import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; +import org.apache.asterix.om.base.ABinary; +import org.apache.asterix.om.base.ABoolean; +import org.apache.asterix.om.base.AGeometry; +import org.apache.asterix.om.base.AMutableInt32; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.om.types.EnumDeserializer; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.exceptions.TypeMismatchException; +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.util.string.UTF8StringUtil; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.IOException; + +public abstract class AbstractSTSingleGeometryDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + abstract protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException; + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + @SuppressWarnings("unchecked") + public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { + return new AbstractSTSingleGeometryEvaluator(args, ctx); + } + }; + } + + private class AbstractSTSingleGeometryEvaluator implements IScalarEvaluator { + + private final ArrayBackedValueStorage resultStorage; + private final DataOutput out; + private final IPointable argPtr0; + private final IScalarEvaluator eval0; + + private final AMutableInt32 intRes; + + public AbstractSTSingleGeometryEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + argPtr0 = new VoidPointable(); + eval0 = args[0].createScalarEvaluator(ctx); + intRes = new AMutableInt32(0); + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + resultStorage.reset(); + eval0.evaluate(tuple, argPtr0); + + try { + byte[] bytes0 = argPtr0.getByteArray(); + int offset0 = argPtr0.getStartOffset(); + int len0 = argPtr0.getLength(); + + ATypeTag tag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes0[offset0]); + if (tag != ATypeTag.GEOMETRY) { + throw new TypeMismatchException(getIdentifier(), 0, bytes0[offset0], + ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + } + + DataInputStream dataIn0 = new DataInputStream(new ByteArrayInputStream(bytes0, offset0 + 1, len0 - 1)); + OGCGeometry geometry0 = AGeometrySerializerDeserializer.INSTANCE.deserialize(dataIn0).getGeometry(); + + Object finalResult = evaluateOGCGeometry(geometry0); + if (finalResult == null) { + out.writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG); + } else if (finalResult instanceof Double) { + out.writeByte(ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG); + out.writeDouble((double) finalResult); + } else if (finalResult instanceof Boolean) { + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN) + .serialize((boolean) finalResult ? ABoolean.TRUE : ABoolean.FALSE, out); + } else if (finalResult instanceof Integer) { + intRes.setValue((int) finalResult); + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32) + .serialize(intRes, out); + } else if (finalResult instanceof String) { + out.write(ATypeTag.SERIALIZED_STRING_TYPE_TAG); + out.write(UTF8StringUtil.writeStringToBytes((String) finalResult)); + } else if (finalResult instanceof byte[]) { + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABINARY) + .serialize(new ABinary((byte[]) finalResult), out); + } else if (finalResult instanceof OGCGeometry) { + out.writeByte(ATypeTag.SERIALIZED_GEOMETRY_TYPE_TAG); + AGeometrySerializerDeserializer.INSTANCE.serialize(new AGeometry((OGCGeometry) finalResult), out); + } + } catch (IOException e) { + throw HyracksDataException.create(e); + } + result.set(resultStorage); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/ParseGeoJSONDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/ParseGeoJSONDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/ParseGeoJSONDescriptor.java new file mode 100644 index 0000000..e59c3f8 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/ParseGeoJSONDescriptor.java @@ -0,0 +1,190 @@ +/* + * 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.MapOGCStructure; +import com.esri.core.geometry.OperatorImportFromGeoJson; +import com.esri.core.geometry.ogc.OGCGeometry; +import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer; +import org.apache.asterix.geo.evaluators.GeoFunctionTypeInferers; +import org.apache.asterix.om.base.AOrderedList; +import org.apache.asterix.om.base.ARecord; +import org.apache.asterix.om.base.IAObject; +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.functions.IFunctionTypeInferer; +import org.apache.asterix.om.types.ARecordType; +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.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class ParseGeoJSONDescriptor extends AbstractScalarFunctionDynamicDescriptor { + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new ParseGeoJSONDescriptor(); + } + + @Override + public IFunctionTypeInferer createFunctionTypeInferer() { + return new GeoFunctionTypeInferers.GeometryConstructorTypeInferer(); + } + }; + + private static final long serialVersionUID = 1L; + private ARecordType recType; + + @Override + public void setImmutableStates(Object... states) { + this.recType = (ARecordType) states[0]; + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.GEOMETRY_CONSTRUCTOR; + } + + @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 ParseGeoJSONEvaluator(args[0], ctx); + } + }; + } + + private class ParseGeoJSONEvaluator implements IScalarEvaluator { + private ArrayBackedValueStorage resultStorage; + private DataOutput out; + private IPointable inputArg; + private IScalarEvaluator eval; + private OperatorImportFromGeoJson geoJsonImporter; + + public ParseGeoJSONEvaluator(IScalarEvaluatorFactory factory, IHyracksTaskContext ctx) + throws HyracksDataException { + resultStorage = new ArrayBackedValueStorage(); + out = resultStorage.getDataOutput(); + inputArg = new VoidPointable(); + eval = factory.createScalarEvaluator(ctx); + geoJsonImporter = OperatorImportFromGeoJson.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_RECORD_TYPE_TAG) { + throw new TypeMismatchException(BuiltinFunctions.GEOMETRY_CONSTRUCTOR, 0, data[offset], + ATypeTag.SERIALIZED_RECORD_TYPE_TAG); + } + ByteArrayInputStream inStream = new ByteArrayInputStream(data, offset + 1, len - 1); + DataInput dataIn = new DataInputStream(inStream); + try { + String geometry = recordToString(new ARecordSerializerDeserializer(recType).deserialize(dataIn)); + MapOGCStructure structure = geoJsonImporter.executeOGC(0, geometry, null); + OGCGeometry ogcGeometry = + OGCGeometry.createFromOGCStructure(structure.m_ogcStructure, structure.m_spatialReference); + 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); + } + + } + + public String recordToString(ARecord record) { + StringBuilder sb = new StringBuilder(); + sb.append("{ "); + String[] fieldNames = record.getType().getFieldNames(); + IAObject val; + if (fieldNames != null) { + for (int i = 0; i < fieldNames.length; i++) { + if (i > 0) { + sb.append(", "); + } + sb.append("\"").append(fieldNames[i]).append("\"").append(": "); + val = record.getValueByPos(i); + if (val instanceof ARecord) { + sb.append(recordToString((ARecord) val)); + } else if (val instanceof AOrderedList) { + sb.append(listToString((AOrderedList) val)); + } else { + sb.append(val); + } + } + } + sb.append(" }"); + return sb.toString(); + } + + public String listToString(AOrderedList list) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + IAObject val; + sb.append("[ "); + for (int i = 0; i < list.size(); i++) { + if (first) { + first = false; + } else { + sb.append(", "); + } + val = list.getItem(i); + if (val instanceof ARecord) { + sb.append(recordToString((ARecord) val)); + } else if (val instanceof AOrderedList) { + sb.append(listToString((AOrderedList) val)); + } else { + sb.append(val); + } + } + sb.append(" ]"); + return sb.toString(); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAreaDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAreaDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAreaDescriptor.java new file mode 100644 index 0000000..caf0b89 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAreaDescriptor.java @@ -0,0 +1,62 @@ +/* + * 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 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 STAreaDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STAreaDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + double area; + if (!"GeometryCollection".equals(geometry.geometryType())) { + area = geometry.getEsriGeometry().calculateArea2D(); + } else { + GeometryCursor cursor = geometry.getEsriGeometryCursor(); + Geometry geometry1 = cursor.next(); + area = 0; + while (geometry1 != null) { + area += geometry1.calculateArea2D(); + geometry1 = cursor.next(); + } + } + return area; + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_AREA; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsBinaryDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsBinaryDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsBinaryDescriptor.java new file mode 100644 index 0000000..387d07c --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsBinaryDescriptor.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 STAsBinaryDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STAsBinaryDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.asBinary().array(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_AS_BINARY; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsGeoJSONDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsGeoJSONDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsGeoJSONDescriptor.java new file mode 100644 index 0000000..b12b851 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsGeoJSONDescriptor.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 STAsGeoJSONDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STAsGeoJSONDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.asGeoJson(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_AS_GEOJSON; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsTextDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsTextDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsTextDescriptor.java new file mode 100644 index 0000000..3e310d9 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STAsTextDescriptor.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 STAsTextDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STAsTextDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.asText(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_AS_TEXT; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STBoundaryDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STBoundaryDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STBoundaryDescriptor.java new file mode 100644 index 0000000..55c5212 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STBoundaryDescriptor.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 STBoundaryDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STBoundaryDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.boundary(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_BOUNDARY; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STContainsDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STContainsDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STContainsDescriptor.java new file mode 100644 index 0000000..f9f692f --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STContainsDescriptor.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 STContainsDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STContainsDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.contains(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_CONTAINS; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCoordDimDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCoordDimDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCoordDimDescriptor.java new file mode 100644 index 0000000..d1a3efd --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCoordDimDescriptor.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 STCoordDimDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STCoordDimDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.coordinateDimension(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_COORD_DIM; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCrossesDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCrossesDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCrossesDescriptor.java new file mode 100644 index 0000000..1ac67fe --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STCrossesDescriptor.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 STCrossesDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STCrossesDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.crosses(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_CROSSES; + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDifferenceDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDifferenceDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDifferenceDescriptor.java new file mode 100644 index 0000000..a0209f9 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDifferenceDescriptor.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 STDifferenceDescriptor extends AbstractSTDoubleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STDifferenceDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry0, OGCGeometry geometry1) throws HyracksDataException { + return geometry0.difference(geometry1); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_DIFFERENCE; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cc88253/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDimensionDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDimensionDescriptor.java b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDimensionDescriptor.java new file mode 100644 index 0000000..492d045 --- /dev/null +++ b/asterixdb/asterix-geo/src/main/java/org/apache/asterix/geo/evaluators/functions/STDimensionDescriptor.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 STDimensionDescriptor extends AbstractSTSingleGeometryDescriptor { + + private static final long serialVersionUID = 1L; + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new STDimensionDescriptor(); + } + }; + + @Override + protected Object evaluateOGCGeometry(OGCGeometry geometry) throws HyracksDataException { + return geometry.dimension(); + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ST_DIMENSION; + } + +}
