blob: 2a20cc2e7e15e0b77387db526776b7119b3aff89 [file] [log] [blame]
/*
* 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.rya.indexing;
import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
import org.apache.rya.indexing.accumulo.geo.GeoTupleSet.GeoSearchFunctionFactory.NearQuery;
import org.eclipse.rdf4j.common.iteration.CloseableIteration;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.query.QueryEvaluationException;
import com.vividsolutions.jts.geom.Geometry;
/**
* A repository to store, index, and retrieve {@link Statement}s based on geospatial features.
*/
public interface GeoIndexer extends RyaSecondaryIndexer {
/**
* Returns statements that contain a geometry that is equal to the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>
* "Two geometries are topologically equal if their interiors intersect and no part of the interior or boundary of one geometry intersects the exterior of the other"
* <li>"A is equal to B if A is within B and A contains B"
* </ul>
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryEquals(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that is disjoint to the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>"A and B are disjoint if they have no point in common. They form a set of disconnected geometries."
* <li>"A and B are disjoint if A does not intersect B"
* </ul>
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryDisjoint(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that Intersects the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>"a intersects b: geometries a and b have at least one point in common."
* <li>"not Disjoint"
* </ul>
*
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntersects(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that Touches the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>"a touches b, they have at least one boundary point in common, but no interior points."
* </ul>
*
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryTouches(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that crosses the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>
* "a crosses b, they have some but not all interior points in common (and the dimension of the intersection is less than that of at least one of them)."
* </ul>
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryCrosses(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that is Within the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>"a is within b, a lies in the interior of b"
* <li>Same as: "Contains(b,a)"
* </ul>
*
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryWithin(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that Contains the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>b is within a. Geometry b lies in the interior of a. Another definition:
* "a 'contains' b iff no points of b lie in the exterior of a, and at least one point of the interior of b lies in the interior of a"
* <li>Same: Within(b,a)
* </ul>
*
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryContains(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that Overlaps the queried {@link Geometry} and meet the {@link StatementConstraints}.
*
* <p>
* From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM):
* <ul>
* <li>a crosses b, they have some but not all interior points in common (and the dimension of the intersection is less than that of at
* least one of them).
* </ul>
*
*
* @param query
* the queried geometry
* @param contraints
* the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryOverlaps(Geometry query, StatementConstraints contraints);
/**
* Returns statements that contain a geometry that is near the queried {@link Geometry} and meet the {@link StatementConstraints}.
* <p>
* A geometry is considered near if it within the min/max distances specified in the provided {@link NearQuery}. This will make a disc (specify max),
* a donut(specify both), or a spheroid complement disc (specify min)
* <p>
* The distances are specified in meters and must be >= 0.
* <p>
* To specify max/min distances:
* <ul>
* <li>Enter parameters in order MAX, MIN -- Donut</li>
* <li>Omit the MIN -- Disc</li>
* <li>Enter 0 for MAX, and Enter parameter for MIN -- Spheroid complement Dist</li>
* <li>Omit both -- Default max/min [TODO: Find these values]</li>
* </ul>
* <p>
* Note: This query will not fail if the min is greater than the max, it will just return no results.
*
* @param query the queried geometry, with Optional min and max distance fields.
* @param contraints the {@link StatementConstraints}
* @return
*/
public abstract CloseableIteration<Statement, QueryEvaluationException> queryNear(NearQuery query, StatementConstraints contraints);
}