X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java diff --git a/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java b/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java new file mode 100644 index 0000000..ed73936 --- /dev/null +++ b/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java @@ -0,0 +1,151 @@ +/** + * 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.lucene.spatial.tier; + +import org.apache.lucene.search.ConstantScoreQuery; +import org.apache.lucene.search.ChainedFilter; +import org.apache.lucene.search.Filter; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.QueryWrapperFilter; +import org.apache.lucene.spatial.geohash.GeoHashDistanceFilter; + +/** + *

NOTE: This API is still in + * flux and might change in incompatible ways in the next + * release. + */ +public class DistanceQueryBuilder { + + private static final long serialVersionUID = 1L; + + private final double lat; + private final double lng; + private final double miles; + private final Filter filter; + final DistanceFilter distanceFilter; + + /** + * Create a distance query using + * a boundary box wrapper around a more precise + * DistanceFilter. + * + * @param lat The latitude to search around + * @param lng the Longitude to search around + * @param miles The radius to search within + * @param latField The name of the field containing the latitude + * @param lngField The name of the field containing the longitude + * @param tierFieldPrefix The prefix of the tier + * @param needPrecise if true, then distance is calculated in addition to tier info + * @param minTierIndexed The minimum tier level indexed + * @param maxTierIndexed The maximum tier level indexed + */ + public DistanceQueryBuilder (double lat, double lng, double miles, + String latField, String lngField, String tierFieldPrefix, boolean needPrecise, int minTierIndexed, int maxTierIndexed) { + + this.lat = lat; + this.lng = lng; + this.miles = miles; + + CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix, minTierIndexed, maxTierIndexed); + Filter cartesianFilter = cpf.getBoundingArea(lat, lng, miles); + + /* create precise distance filter */ + if (needPrecise) { + filter = distanceFilter = new LatLongDistanceFilter(cartesianFilter, lat, lng, miles, latField, lngField); + } else { + filter = cartesianFilter; + distanceFilter = null; + } + } + + /** + * Create a distance query using + * a boundary box wrapper around a more precise + * DistanceFilter. + * + * @param lat + * @param lng + * @param miles + */ + public DistanceQueryBuilder (double lat, double lng, double miles, + String geoHashFieldPrefix, String tierFieldPrefix, boolean needPrecise, int minTierIndexed, int maxTierIndexed){ + + this.lat = lat; + this.lng = lng; + this.miles = miles; + + CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix, minTierIndexed, maxTierIndexed); + Filter cartesianFilter = cpf.getBoundingArea(lat, lng, miles); + + /* create precise distance filter */ + if (needPrecise) { + filter = distanceFilter = new GeoHashDistanceFilter(cartesianFilter, lat, lng, miles, geoHashFieldPrefix); + } else { + filter = cartesianFilter; + distanceFilter = null; + } + } + + + /** + * Create a distance query using + * a boundary box wrapper around a more precise + * DistanceFilter. + */ + public Filter getFilter() { + if (distanceFilter != null) { + distanceFilter.reset(); + } + return filter; + } + + public Filter getFilter(Query query) { + // Chain the Query (as filter) with our distance filter + if (distanceFilter != null) { + distanceFilter.reset(); + } + QueryWrapperFilter qf = new QueryWrapperFilter(query); + return new ChainedFilter(new Filter[] {qf, filter}, + ChainedFilter.AND); + } + + public DistanceFilter getDistanceFilter() { + return distanceFilter; + } + + public Query getQuery(Query query){ + return new ConstantScoreQuery(getFilter(query)); + } + + public double getLat() { + return lat; + } + + public double getLng() { + return lng; + } + + public double getMiles() { + return miles; + } + + @Override + public String toString() { + return "DistanceQuery lat: " + lat + " lng: " + lng + " miles: "+ miles; + } +}