diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoDistance.java b/src/main/java/org/elasticsearch/common/geo/GeoDistance.java similarity index 89% rename from src/main/java/org/elasticsearch/index/search/geo/GeoDistance.java rename to src/main/java/org/elasticsearch/common/geo/GeoDistance.java index 719a50c9001..0ded5587e84 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoDistance.java +++ b/src/main/java/org/elasticsearch/common/geo/GeoDistance.java @@ -17,7 +17,7 @@ * under the License. */ -package org.elasticsearch.index.search.geo; +package org.elasticsearch.common.geo; import org.elasticsearch.ElasticSearchIllegalArgumentException; import org.elasticsearch.common.unit.DistanceUnit; @@ -136,8 +136,8 @@ public enum GeoDistance { maxLon = MAX_LON; } - Point topLeft = new Point(Math.toDegrees(maxLat), Math.toDegrees(minLon)); - Point bottomRight = new Point(Math.toDegrees(minLat), Math.toDegrees(maxLon)); + GeoPoint topLeft = new GeoPoint(Math.toDegrees(maxLat), Math.toDegrees(minLon)); + GeoPoint bottomRight = new GeoPoint(Math.toDegrees(minLat), Math.toDegrees(maxLon)); if (minLon > maxLon) { return new Meridian180DistanceBoundingCheck(topLeft, bottomRight); } @@ -164,9 +164,9 @@ public enum GeoDistance { boolean isWithin(double targetLatitude, double targetLongitude); - Point topLeft(); + GeoPoint topLeft(); - Point bottomRight(); + GeoPoint bottomRight(); } public static AlwaysDistanceBoundingCheck ALWAYS_INSTANCE = new AlwaysDistanceBoundingCheck(); @@ -178,65 +178,65 @@ public enum GeoDistance { } @Override - public Point topLeft() { + public GeoPoint topLeft() { return null; } @Override - public Point bottomRight() { + public GeoPoint bottomRight() { return null; } } public static class Meridian180DistanceBoundingCheck implements DistanceBoundingCheck { - private final Point topLeft; - private final Point bottomRight; + private final GeoPoint topLeft; + private final GeoPoint bottomRight; - public Meridian180DistanceBoundingCheck(Point topLeft, Point bottomRight) { + public Meridian180DistanceBoundingCheck(GeoPoint topLeft, GeoPoint bottomRight) { this.topLeft = topLeft; this.bottomRight = bottomRight; } @Override public boolean isWithin(double targetLatitude, double targetLongitude) { - return (targetLatitude >= bottomRight.lat && targetLatitude <= topLeft.lat) && - (targetLongitude >= topLeft.lon || targetLongitude <= bottomRight.lon); + return (targetLatitude >= bottomRight.lat() && targetLatitude <= topLeft.lat()) && + (targetLongitude >= topLeft.lon() || targetLongitude <= bottomRight.lon()); } @Override - public Point topLeft() { + public GeoPoint topLeft() { return topLeft; } @Override - public Point bottomRight() { + public GeoPoint bottomRight() { return bottomRight; } } public static class SimpleDistanceBoundingCheck implements DistanceBoundingCheck { - private final Point topLeft; - private final Point bottomRight; + private final GeoPoint topLeft; + private final GeoPoint bottomRight; - public SimpleDistanceBoundingCheck(Point topLeft, Point bottomRight) { + public SimpleDistanceBoundingCheck(GeoPoint topLeft, GeoPoint bottomRight) { this.topLeft = topLeft; this.bottomRight = bottomRight; } @Override public boolean isWithin(double targetLatitude, double targetLongitude) { - return (targetLatitude >= bottomRight.lat && targetLatitude <= topLeft.lat) && - (targetLongitude >= topLeft.lon && targetLongitude <= bottomRight.lon); + return (targetLatitude >= bottomRight.lat() && targetLatitude <= topLeft.lat()) && + (targetLongitude >= topLeft.lon() && targetLongitude <= bottomRight.lon()); } @Override - public Point topLeft() { + public GeoPoint topLeft() { return topLeft; } @Override - public Point bottomRight() { + public GeoPoint bottomRight() { return bottomRight; } } diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoHashUtils.java b/src/main/java/org/elasticsearch/common/geo/GeoHashUtils.java similarity index 94% rename from src/main/java/org/elasticsearch/index/search/geo/GeoHashUtils.java rename to src/main/java/org/elasticsearch/common/geo/GeoHashUtils.java index af16ddc09f9..c6362e93ec6 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoHashUtils.java +++ b/src/main/java/org/elasticsearch/common/geo/GeoHashUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.elasticsearch.index.search.geo; +package org.elasticsearch.common.geo; import gnu.trove.map.hash.TIntIntHashMap; @@ -112,10 +112,10 @@ public class GeoHashUtils { return geohash.toString(); } - public static double[] decode(String geohash) { - double[] ret = new double[2]; - decode(geohash, ret); - return ret; + public static GeoPoint decode(String geohash) { + GeoPoint point = new GeoPoint(); + decode(geohash, point); + return point; } /** @@ -124,7 +124,7 @@ public class GeoHashUtils { * @param geohash Geohash to deocde * @return Array with the latitude at index 0, and longitude at index 1 */ - public static void decode(String geohash, double[] ret) { + public static void decode(String geohash, GeoPoint ret) { // double[] latInterval = {-90.0, 90.0}; // double[] lngInterval = {-180.0, 180.0}; double latInterval0 = -90.0; @@ -160,10 +160,9 @@ public class GeoHashUtils { } // latitude = (latInterval[0] + latInterval[1]) / 2D; - ret[0] = (latInterval0 + latInterval1) / 2D; // longitude = (lngInterval[0] + lngInterval[1]) / 2D; - ret[1] = (lngInterval0 + lngInterval1) / 2D; + ret.reset((latInterval0 + latInterval1) / 2D, (lngInterval0 + lngInterval1) / 2D); // return ret; } } \ No newline at end of file diff --git a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPoint.java b/src/main/java/org/elasticsearch/common/geo/GeoPoint.java similarity index 75% rename from src/main/java/org/elasticsearch/index/mapper/geo/GeoPoint.java rename to src/main/java/org/elasticsearch/common/geo/GeoPoint.java index 50918588546..37d79150842 100644 --- a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPoint.java +++ b/src/main/java/org/elasticsearch/common/geo/GeoPoint.java @@ -17,9 +17,7 @@ * under the License. */ -package org.elasticsearch.index.mapper.geo; - -import org.elasticsearch.index.search.geo.GeoHashUtils; +package org.elasticsearch.common.geo; /** * @@ -43,6 +41,32 @@ public class GeoPoint { return this; } + public GeoPoint resetLat(double lat) { + this.lat = lat; + return this; + } + + public GeoPoint resetLon(double lon) { + this.lon = lon; + return this; + } + + public GeoPoint resetFromString(String value) { + int comma = value.indexOf(','); + if (comma != -1) { + lat = Double.parseDouble(value.substring(0, comma).trim()); + lon = Double.parseDouble(value.substring(comma + 1).trim()); + } else { + resetFromGeoHash(value); + } + return this; + } + + public GeoPoint resetFromGeoHash(String hash) { + GeoHashUtils.decode(hash, this); + return this; + } + void latlon(double lat, double lon) { this.lat = lat; this.lon = lon; @@ -95,4 +119,8 @@ public class GeoPoint { result = 31 * result + (int) (temp ^ (temp >>> 32)); return result; } + + public String toString() { + return "[" + lat + ", " + lon + "]"; + } } diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoUtils.java b/src/main/java/org/elasticsearch/common/geo/GeoUtils.java similarity index 70% rename from src/main/java/org/elasticsearch/index/search/geo/GeoUtils.java rename to src/main/java/org/elasticsearch/common/geo/GeoUtils.java index 1bedff92b40..b56a95e0463 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoUtils.java +++ b/src/main/java/org/elasticsearch/common/geo/GeoUtils.java @@ -17,7 +17,7 @@ * under the License. */ -package org.elasticsearch.index.search.geo; +package org.elasticsearch.common.geo; /** */ @@ -27,7 +27,6 @@ public class GeoUtils { * Normalize longitude to lie within the -180 (exclusive) to 180 (inclusive) range. * * @param lon Longitude to normalize - * @see #normalizePoint(Point) * @return The normalized longitude. */ public static double normalizeLon(double lon) { @@ -36,16 +35,16 @@ public class GeoUtils { /** * Normalize latitude to lie within the -90 to 90 (both inclusive) range. - *

+ *

* Note: You should not normalize longitude and latitude separately, - * because when normalizing latitude it may be necessary to - * add a shift of 180° in the longitude. - * For this purpose, you should call the - * {@link #normalizePoint(Point)} function. + * because when normalizing latitude it may be necessary to + * add a shift of 180° in the longitude. + * For this purpose, you should call the + * {@link #normalizePoint(GeoPoint)} function. * * @param lat Latitude to normalize - * @see #normalizePoint(Point) * @return The normalized latitude. + * @see #normalizePoint(GeoPoint) */ public static double normalizeLat(double lat) { lat = centeredModulus(lat, 360); @@ -60,59 +59,62 @@ public class GeoUtils { /** * Normalize the geo {@code Point} for its coordinates to lie within their * respective normalized ranges. - *

+ *

* Note: A shift of 180° is applied in the longitude if necessary, - * in order to normalize properly the latitude. + * in order to normalize properly the latitude. * * @param point The point to normalize in-place. */ - public static void normalizePoint(Point point) { + public static void normalizePoint(GeoPoint point) { normalizePoint(point, true, true); } /** * Normalize the geo {@code Point} for the given coordinates to lie within * their respective normalized ranges. - * + *

* You can control which coordinate gets normalized with the two flags. - *

+ *

* Note: A shift of 180° is applied in the longitude if necessary, - * in order to normalize properly the latitude. - * If normalizing latitude but not longitude, it is assumed that - * the longitude is in the form x+k*360, with x in ]-180;180], - * and k is meaningful to the application. - * Therefore x will be adjusted while keeping k preserved. + * in order to normalize properly the latitude. + * If normalizing latitude but not longitude, it is assumed that + * the longitude is in the form x+k*360, with x in ]-180;180], + * and k is meaningful to the application. + * Therefore x will be adjusted while keeping k preserved. * - * @param point The point to normalize in-place. + * @param point The point to normalize in-place. * @param normLat Whether to normalize latitude or leave it as is. * @param normLon Whether to normalize longitude. */ - public static void normalizePoint(Point point, boolean normLat, boolean normLon) { + public static void normalizePoint(GeoPoint point, boolean normLat, boolean normLon) { + double lat = point.lat(); + double lon = point.lon(); if (normLat) { - point.lat = centeredModulus(point.lat, 360); + lat = centeredModulus(lat, 360); boolean shift = true; - if (point.lat < -90) { - point.lat = -180 - point.lat; - } else if (point.lat > 90) { - point.lat = 180 - point.lat; + if (lat < -90) { + lat = -180 - lat; + } else if (lat > 90) { + lat = 180 - lat; } else { // No need to shift the longitude, and the latitude is normalized shift = false; } if (shift) { if (normLon) { - point.lon += 180; + lon += 180; } else { // Longitude won't be normalized, // keep it in the form x+k*360 (with x in ]-180;180]) // by only changing x, assuming k is meaningful for the user application. - point.lon += normalizeLon(point.lon) > 0 ? -180 : 180; + lon += normalizeLon(lon) > 0 ? -180 : 180; } } } if (normLon) { - point.lon = centeredModulus(point.lon, 360); + lon = centeredModulus(lon, 360); } + point.reset(lat, lon); } private static double centeredModulus(double dividend, double divisor) { diff --git a/src/main/java/org/elasticsearch/index/fielddata/GeoPointValues.java b/src/main/java/org/elasticsearch/index/fielddata/GeoPointValues.java index a9f7bbe8b8e..159190393e8 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/GeoPointValues.java +++ b/src/main/java/org/elasticsearch/index/fielddata/GeoPointValues.java @@ -20,8 +20,8 @@ package org.elasticsearch.index.fielddata; import org.elasticsearch.ElasticSearchIllegalStateException; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.index.fielddata.util.GeoPointArrayRef; -import org.elasticsearch.index.mapper.geo.GeoPoint; /** */ diff --git a/src/main/java/org/elasticsearch/index/fielddata/ScriptDocValues.java b/src/main/java/org/elasticsearch/index/fielddata/ScriptDocValues.java index 5a88959b721..46ec03cbf21 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/ScriptDocValues.java +++ b/src/main/java/org/elasticsearch/index/fielddata/ScriptDocValues.java @@ -20,10 +20,10 @@ package org.elasticsearch.index.fielddata; import org.apache.lucene.util.BytesRef; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.util.*; -import org.elasticsearch.index.mapper.geo.GeoPoint; -import org.elasticsearch.index.search.geo.GeoDistance; import org.joda.time.MutableDateTime; /** diff --git a/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparator.java b/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparator.java index b415a8cebf9..7183e3b43c9 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparator.java +++ b/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparator.java @@ -21,11 +21,11 @@ package org.elasticsearch.index.fielddata.fieldcomparator; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.search.FieldComparator; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.mapper.geo.GeoPoint; -import org.elasticsearch.index.search.geo.GeoDistance; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparatorSource.java b/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparatorSource.java index c4266121fc9..f12177e92d3 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparatorSource.java +++ b/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/GeoDistanceComparatorSource.java @@ -21,10 +21,10 @@ package org.elasticsearch.index.fielddata.fieldcomparator; import org.apache.lucene.search.FieldComparator; import org.apache.lucene.search.SortField; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.search.geo.GeoDistance; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/index/fielddata/plain/GeoPointDoubleArrayAtomicFieldData.java b/src/main/java/org/elasticsearch/index/fielddata/plain/GeoPointDoubleArrayAtomicFieldData.java index 9aa3e104646..00096eb8e1b 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/plain/GeoPointDoubleArrayAtomicFieldData.java +++ b/src/main/java/org/elasticsearch/index/fielddata/plain/GeoPointDoubleArrayAtomicFieldData.java @@ -21,13 +21,13 @@ package org.elasticsearch.index.fielddata.plain; import org.apache.lucene.util.FixedBitSet; import org.elasticsearch.common.RamUsage; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.index.fielddata.*; import org.elasticsearch.index.fielddata.ordinals.Ordinals; import org.elasticsearch.index.fielddata.util.GeoPointArrayRef; import org.elasticsearch.index.fielddata.util.IntArrayRef; import org.elasticsearch.index.fielddata.util.StringArrayRef; -import org.elasticsearch.index.mapper.geo.GeoPoint; -import org.elasticsearch.index.search.geo.GeoHashUtils; /** */ diff --git a/src/main/java/org/elasticsearch/index/fielddata/util/GeoPointArrayRef.java b/src/main/java/org/elasticsearch/index/fielddata/util/GeoPointArrayRef.java index d4859f2dd3d..6dcb23f3b6c 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/util/GeoPointArrayRef.java +++ b/src/main/java/org/elasticsearch/index/fielddata/util/GeoPointArrayRef.java @@ -20,7 +20,7 @@ package org.elasticsearch.index.fielddata.util; import org.apache.lucene.util.ArrayUtil; -import org.elasticsearch.index.mapper.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoPoint; import java.util.AbstractList; import java.util.RandomAccess; diff --git a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java index 6434366f606..d9c553b9a27 100644 --- a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java @@ -23,6 +23,9 @@ import org.apache.lucene.document.FieldType; import org.apache.lucene.index.FieldInfo.IndexOptions; import org.elasticsearch.ElasticSearchIllegalArgumentException; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.support.XContentMapValues; @@ -34,9 +37,6 @@ import org.elasticsearch.index.mapper.core.DoubleFieldMapper; import org.elasticsearch.index.mapper.core.NumberFieldMapper; import org.elasticsearch.index.mapper.core.StringFieldMapper; import org.elasticsearch.index.mapper.object.ArrayValueMapperParser; -import org.elasticsearch.index.search.geo.GeoHashUtils; -import org.elasticsearch.index.search.geo.GeoUtils; -import org.elasticsearch.index.search.geo.Point; import java.io.IOException; import java.util.Map; @@ -387,10 +387,10 @@ public class GeoPointFieldMapper implements Mapper, ArrayValueMapperParser { private void parseLatLon(ParseContext context, double lat, double lon) throws IOException { if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); + GeoPoint point = new GeoPoint(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; + lat = point.lat(); + lon = point.lon(); } if (validateLat) { @@ -419,38 +419,33 @@ public class GeoPointFieldMapper implements Mapper, ArrayValueMapperParser { } private void parseGeohash(ParseContext context, String geohash) throws IOException { - double[] values = GeoHashUtils.decode(geohash); - double lat = values[0]; - double lon = values[1]; + GeoPoint point = GeoHashUtils.decode(geohash); if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; } if (validateLat) { - if (lat > 90.0 || lat < -90.0) { - throw new ElasticSearchIllegalArgumentException("illegal latitude value [" + lat + "] for " + name); + if (point.lat() > 90.0 || point.lat() < -90.0) { + throw new ElasticSearchIllegalArgumentException("illegal latitude value [" + point.lat() + "] for " + name); } } if (validateLon) { - if (lon > 180.0 || lon < -180) { - throw new ElasticSearchIllegalArgumentException("illegal longitude value [" + lon + "] for " + name); + if (point.lon() > 180.0 || point.lon() < -180) { + throw new ElasticSearchIllegalArgumentException("illegal longitude value [" + point.lon() + "] for " + name); } } - context.externalValue(Double.toString(lat) + ',' + Double.toString(lon)); + context.externalValue(Double.toString(point.lat()) + ',' + Double.toString(point.lat())); geoStringMapper.parse(context); if (enableGeoHash) { context.externalValue(geohash); geohashMapper.parse(context); } if (enableLatLon) { - context.externalValue(lat); + context.externalValue(point.lat()); latMapper.parse(context); - context.externalValue(lon); + context.externalValue(point.lon()); lonMapper.parse(context); } } diff --git a/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterBuilder.java b/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterBuilder.java index 0c141a6e911..44cfe1104ce 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterBuilder.java +++ b/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterBuilder.java @@ -19,8 +19,8 @@ package org.elasticsearch.index.query; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.search.geo.Point; import java.io.IOException; @@ -31,11 +31,11 @@ public class GeoBoundingBoxFilterBuilder extends BaseFilterBuilder { private final String name; - private Point topLeft; + private GeoPoint topLeft; private String topLeftGeohash; - private Point bottomRight; + private GeoPoint bottomRight; private String bottomRightGeohash; @@ -57,9 +57,7 @@ public class GeoBoundingBoxFilterBuilder extends BaseFilterBuilder { * @param lon The longitude */ public GeoBoundingBoxFilterBuilder topLeft(double lat, double lon) { - topLeft = new Point(); - topLeft.lat = lat; - topLeft.lon = lon; + topLeft = new GeoPoint(lat, lon); return this; } @@ -70,9 +68,7 @@ public class GeoBoundingBoxFilterBuilder extends BaseFilterBuilder { * @param lon The longitude */ public GeoBoundingBoxFilterBuilder bottomRight(double lat, double lon) { - bottomRight = new Point(); - bottomRight.lat = lat; - bottomRight.lon = lon; + bottomRight = new GeoPoint(lat, lon); return this; } @@ -124,7 +120,7 @@ public class GeoBoundingBoxFilterBuilder extends BaseFilterBuilder { if (topLeftGeohash != null) { builder.field("top_left", topLeftGeohash); } else if (topLeft != null) { - builder.startArray("top_left").value(topLeft.lon).value(topLeft.lat).endArray(); + builder.startArray("top_left").value(topLeft.lon()).value(topLeft.lat()).endArray(); } else { throw new QueryBuilderException("geo_bounding_box requires 'top_left' to be set"); } @@ -132,7 +128,7 @@ public class GeoBoundingBoxFilterBuilder extends BaseFilterBuilder { if (bottomRightGeohash != null) { builder.field("bottom_right", bottomRightGeohash); } else if (bottomRight != null) { - builder.startArray("bottom_right").value(bottomRight.lon).value(bottomRight.lat).endArray(); + builder.startArray("bottom_right").value(bottomRight.lon()).value(bottomRight.lat()).endArray(); } else { throw new QueryBuilderException("geo_bounding_box requires 'bottom_right' to be set"); } diff --git a/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterParser.java b/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterParser.java index 3bf595be882..ac43454b699 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterParser.java +++ b/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxFilterParser.java @@ -20,6 +20,9 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Filter; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.cache.filter.support.CacheKeyFilter; @@ -27,7 +30,8 @@ import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.*; +import org.elasticsearch.index.search.geo.InMemoryGeoBoundingBoxFilter; +import org.elasticsearch.index.search.geo.IndexedGeoBoundingBoxFilter; import java.io.IOException; @@ -56,8 +60,8 @@ public class GeoBoundingBoxFilterParser implements FilterParser { boolean cache = false; CacheKeyFilter.Key cacheKey = null; String fieldName = null; - Point topLeft = new Point(); - Point bottomRight = new Point(); + GeoPoint topLeft = new GeoPoint(); + GeoPoint bottomRight = new GeoPoint(); String filterName = null; String currentFieldName = null; @@ -76,7 +80,7 @@ public class GeoBoundingBoxFilterParser implements FilterParser { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_ARRAY) { - Point point = null; + GeoPoint point = null; if ("top_left".equals(currentFieldName) || "topLeft".equals(currentFieldName)) { point = topLeft; } else if ("bottom_right".equals(currentFieldName) || "bottomRight".equals(currentFieldName)) { @@ -85,15 +89,15 @@ public class GeoBoundingBoxFilterParser implements FilterParser { if (point != null) { token = parser.nextToken(); - point.lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); token = parser.nextToken(); - point.lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } } } else if (token == XContentParser.Token.START_OBJECT) { - Point point = null; + GeoPoint point = null; if ("top_left".equals(currentFieldName) || "topLeft".equals(currentFieldName)) { point = topLeft; } else if ("bottom_right".equals(currentFieldName) || "bottomRight".equals(currentFieldName)) { @@ -106,13 +110,11 @@ public class GeoBoundingBoxFilterParser implements FilterParser { currentFieldName = parser.currentName(); } else if (token.isValue()) { if (currentFieldName.equals(GeoPointFieldMapper.Names.LAT)) { - point.lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentFieldName.equals(GeoPointFieldMapper.Names.LON)) { - point.lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentFieldName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - point.lat = values[0]; - point.lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } } } @@ -121,7 +123,7 @@ public class GeoBoundingBoxFilterParser implements FilterParser { if ("field".equals(currentFieldName)) { fieldName = parser.text(); } else { - Point point = null; + GeoPoint point = null; if ("top_left".equals(currentFieldName) || "topLeft".equals(currentFieldName)) { point = topLeft; } else if ("bottom_right".equals(currentFieldName) || "bottomRight".equals(currentFieldName)) { @@ -130,15 +132,7 @@ public class GeoBoundingBoxFilterParser implements FilterParser { if (point != null) { String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - point.lat = Double.parseDouble(value.substring(0, comma).trim()); - point.lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - point.lat = values[0]; - point.lon = values[1]; - } + point.resetFromString(value); } } } diff --git a/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterBuilder.java b/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterBuilder.java index 9ebce3b95c0..1179edb3308 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterBuilder.java +++ b/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterBuilder.java @@ -19,9 +19,9 @@ package org.elasticsearch.index.query; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.search.geo.GeoDistance; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterParser.java b/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterParser.java index 75ecf780f87..9b6128b81db 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterParser.java +++ b/src/main/java/org/elasticsearch/index/query/GeoDistanceFilterParser.java @@ -20,6 +20,10 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Filter; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentParser; @@ -28,7 +32,7 @@ import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.*; +import org.elasticsearch.index.search.geo.GeoDistanceFilter; import java.io.IOException; @@ -65,8 +69,7 @@ public class GeoDistanceFilterParser implements FilterParser { CacheKeyFilter.Key cacheKey = null; String filterName = null; String currentFieldName = null; - double lat = 0; - double lon = 0; + GeoPoint point = new GeoPoint(); String fieldName = null; double distance = 0; Object vDistance = null; @@ -80,9 +83,9 @@ public class GeoDistanceFilterParser implements FilterParser { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_ARRAY) { token = parser.nextToken(); - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); token = parser.nextToken(); - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } @@ -96,13 +99,11 @@ public class GeoDistanceFilterParser implements FilterParser { currentName = parser.currentName(); } else if (token.isValue()) { if (currentName.equals(GeoPointFieldMapper.Names.LAT)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.LON)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } else { throw new QueryParsingException(parseContext.index(), "[geo_distance] filter does not support [" + currentFieldName + "]"); } @@ -120,15 +121,13 @@ public class GeoDistanceFilterParser implements FilterParser { } else if (currentFieldName.equals("distance_type") || currentFieldName.equals("distanceType")) { geoDistance = GeoDistance.fromString(parser.text()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.LAT_SUFFIX)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.LAT_SUFFIX.length()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.LON_SUFFIX)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.LON_SUFFIX.length()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.GEOHASH_SUFFIX)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.GEOHASH_SUFFIX.length()); } else if ("_name".equals(currentFieldName)) { filterName = parser.text(); @@ -142,17 +141,7 @@ public class GeoDistanceFilterParser implements FilterParser { normalizeLat = parser.booleanValue(); normalizeLon = parser.booleanValue(); } else { - // assume the value is the actual value - String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - lat = Double.parseDouble(value.substring(0, comma).trim()); - lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - lat = values[0]; - lon = values[1]; - } + point.resetFromString(parser.text()); fieldName = currentFieldName; } } @@ -166,10 +155,7 @@ public class GeoDistanceFilterParser implements FilterParser { distance = geoDistance.normalize(distance, DistanceUnit.MILES); if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; } MapperService.SmartNameFieldMappers smartMappers = parseContext.smartFieldMappers(fieldName); @@ -184,7 +170,7 @@ public class GeoDistanceFilterParser implements FilterParser { IndexGeoPointFieldData indexFieldData = parseContext.fieldData().getForField(mapper); - Filter filter = new GeoDistanceFilter(lat, lon, distance, geoDistance, indexFieldData, geoMapper, optimizeBbox); + Filter filter = new GeoDistanceFilter(point.lat(), point.lon(), distance, geoDistance, indexFieldData, geoMapper, optimizeBbox); if (cache) { filter = parseContext.cacheFilter(filter, cacheKey); } diff --git a/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterBuilder.java b/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterBuilder.java index 4bbe6145c9a..adc4734f02e 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterBuilder.java +++ b/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterBuilder.java @@ -19,8 +19,8 @@ package org.elasticsearch.index.query; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.search.geo.GeoDistance; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterParser.java b/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterParser.java index be4f8ffc5f5..36f30598f6a 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterParser.java +++ b/src/main/java/org/elasticsearch/index/query/GeoDistanceRangeFilterParser.java @@ -20,6 +20,10 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Filter; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentParser; @@ -28,7 +32,7 @@ import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.*; +import org.elasticsearch.index.search.geo.GeoDistanceRangeFilter; import java.io.IOException; @@ -65,8 +69,7 @@ public class GeoDistanceRangeFilterParser implements FilterParser { CacheKeyFilter.Key cacheKey = null; String filterName = null; String currentFieldName = null; - double lat = 0; - double lon = 0; + GeoPoint point = new GeoPoint(); String fieldName = null; Object vFrom = null; Object vTo = null; @@ -82,12 +85,13 @@ public class GeoDistanceRangeFilterParser implements FilterParser { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_ARRAY) { token = parser.nextToken(); - lon = parser.doubleValue(); + double lon = parser.doubleValue(); token = parser.nextToken(); - lat = parser.doubleValue(); + double lat = parser.doubleValue(); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } + point.reset(lat, lon); fieldName = currentFieldName; } else if (token == XContentParser.Token.START_OBJECT) { // the json in the format of -> field : { lat : 30, lon : 12 } @@ -98,13 +102,11 @@ public class GeoDistanceRangeFilterParser implements FilterParser { currentName = parser.currentName(); } else if (token.isValue()) { if (currentName.equals(GeoPointFieldMapper.Names.LAT)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.LON)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } } } @@ -164,15 +166,13 @@ public class GeoDistanceRangeFilterParser implements FilterParser { } else if (currentFieldName.equals("distance_type") || currentFieldName.equals("distanceType")) { geoDistance = GeoDistance.fromString(parser.text()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.LAT_SUFFIX)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.LAT_SUFFIX.length()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.LON_SUFFIX)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.LON_SUFFIX.length()); } else if (currentFieldName.endsWith(GeoPointFieldMapper.Names.GEOHASH_SUFFIX)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); fieldName = currentFieldName.substring(0, currentFieldName.length() - GeoPointFieldMapper.Names.GEOHASH_SUFFIX.length()); } else if ("_name".equals(currentFieldName)) { filterName = parser.text(); @@ -186,17 +186,7 @@ public class GeoDistanceRangeFilterParser implements FilterParser { normalizeLat = parser.booleanValue(); normalizeLon = parser.booleanValue(); } else { - // assume the value is the actual value - String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - lat = Double.parseDouble(value.substring(0, comma).trim()); - lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - lat = values[0]; - lon = values[1]; - } + point.resetFromString(parser.text()); fieldName = currentFieldName; } } @@ -222,10 +212,7 @@ public class GeoDistanceRangeFilterParser implements FilterParser { } if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; } MapperService.SmartNameFieldMappers smartMappers = parseContext.smartFieldMappers(fieldName); @@ -239,7 +226,7 @@ public class GeoDistanceRangeFilterParser implements FilterParser { GeoPointFieldMapper geoMapper = ((GeoPointFieldMapper.GeoStringFieldMapper) mapper).geoMapper(); IndexGeoPointFieldData indexFieldData = parseContext.fieldData().getForField(mapper); - Filter filter = new GeoDistanceRangeFilter(lat, lon, from, to, includeLower, includeUpper, geoDistance, geoMapper, indexFieldData, optimizeBbox); + Filter filter = new GeoDistanceRangeFilter(point, from, to, includeLower, includeUpper, geoDistance, geoMapper, indexFieldData, optimizeBbox); if (cache) { filter = parseContext.cacheFilter(filter, cacheKey); } diff --git a/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterBuilder.java b/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterBuilder.java index d622307a872..104fd545fcc 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterBuilder.java +++ b/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterBuilder.java @@ -20,9 +20,9 @@ package org.elasticsearch.index.query; import com.google.common.collect.Lists; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.search.geo.GeoHashUtils; -import org.elasticsearch.index.search.geo.Point; import java.io.IOException; import java.util.List; @@ -34,7 +34,7 @@ public class GeoPolygonFilterBuilder extends BaseFilterBuilder { private final String name; - private final List points = Lists.newArrayList(); + private final List points = Lists.newArrayList(); private Boolean cache; private String cacheKey; @@ -53,13 +53,13 @@ public class GeoPolygonFilterBuilder extends BaseFilterBuilder { * @return */ public GeoPolygonFilterBuilder addPoint(double lat, double lon) { - points.add(new Point(lat, lon)); + points.add(new GeoPoint(lat, lon)); return this; } public GeoPolygonFilterBuilder addPoint(String geohash) { - double[] values = GeoHashUtils.decode(geohash); - return addPoint(values[0], values[1]); + points.add(GeoHashUtils.decode(geohash)); + return this; } /** @@ -89,8 +89,8 @@ public class GeoPolygonFilterBuilder extends BaseFilterBuilder { builder.startObject(name); builder.startArray("points"); - for (Point point : points) { - builder.startArray().value(point.lon).value(point.lat).endArray(); + for (GeoPoint point : points) { + builder.startArray().value(point.lon()).value(point.lat()).endArray(); } builder.endArray(); builder.endObject(); diff --git a/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterParser.java b/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterParser.java index 05150896374..a7babddd1ee 100644 --- a/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterParser.java +++ b/src/main/java/org/elasticsearch/index/query/GeoPolygonFilterParser.java @@ -21,6 +21,9 @@ package org.elasticsearch.index.query; import com.google.common.collect.Lists; import org.apache.lucene.search.Filter; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.cache.filter.support.CacheKeyFilter; @@ -28,10 +31,7 @@ import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.GeoHashUtils; import org.elasticsearch.index.search.geo.GeoPolygonFilter; -import org.elasticsearch.index.search.geo.GeoUtils; -import org.elasticsearch.index.search.geo.Point; import java.io.IOException; import java.util.List; @@ -70,7 +70,7 @@ public class GeoPolygonFilterParser implements FilterParser { boolean cache = false; CacheKeyFilter.Key cacheKey = null; String fieldName = null; - List points = Lists.newArrayList(); + List points = Lists.newArrayList(); boolean normalizeLon = true; boolean normalizeLat = true; @@ -94,46 +94,32 @@ public class GeoPolygonFilterParser implements FilterParser { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token == XContentParser.Token.START_ARRAY) { - Point point = new Point(); token = parser.nextToken(); - point.lon = parser.doubleValue(); + double lon = parser.doubleValue(); token = parser.nextToken(); - point.lat = parser.doubleValue(); + double lat = parser.doubleValue(); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } - points.add(point); + points.add(new GeoPoint(lat, lon)); } else if (token == XContentParser.Token.START_OBJECT) { - Point point = new Point(); + GeoPoint point = new GeoPoint(); while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else if (token.isValue()) { if (currentFieldName.equals(GeoPointFieldMapper.Names.LAT)) { - point.lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentFieldName.equals(GeoPointFieldMapper.Names.LON)) { - point.lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentFieldName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - point.lat = values[0]; - point.lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } } } points.add(point); } else if (token.isValue()) { - Point point = new Point(); - String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - point.lat = Double.parseDouble(value.substring(0, comma).trim()); - point.lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - point.lat = values[0]; - point.lon = values[1]; - } - points.add(point); + points.add(new GeoPoint().resetFromString(parser.text())); } } } else { @@ -162,7 +148,7 @@ public class GeoPolygonFilterParser implements FilterParser { } if (normalizeLat || normalizeLon) { - for (Point point : points) { + for (GeoPoint point : points) { GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); } } @@ -177,7 +163,7 @@ public class GeoPolygonFilterParser implements FilterParser { } IndexGeoPointFieldData indexFieldData = parseContext.fieldData().getForField(mapper); - Filter filter = new GeoPolygonFilter(points.toArray(new Point[points.size()]), indexFieldData); + Filter filter = new GeoPolygonFilter(points.toArray(new GeoPoint[points.size()]), indexFieldData); if (cache) { filter = parseContext.cacheFilter(filter, cacheKey); } diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceFilter.java b/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceFilter.java index 648f39023aa..fdc091d4f32 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceFilter.java +++ b/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceFilter.java @@ -25,13 +25,14 @@ import org.apache.lucene.search.Filter; import org.apache.lucene.util.Bits; import org.elasticsearch.ElasticSearchIllegalArgumentException; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.lucene.docset.AndDocIdSet; import org.elasticsearch.common.lucene.docset.DocIdSets; import org.elasticsearch.common.lucene.docset.MatchDocIdSet; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.mapper.geo.GeoPoint; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceRangeFilter.java b/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceRangeFilter.java index e8c2b546ccc..e8918614920 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceRangeFilter.java +++ b/src/main/java/org/elasticsearch/index/search/geo/GeoDistanceRangeFilter.java @@ -26,13 +26,14 @@ import org.apache.lucene.util.Bits; import org.apache.lucene.util.NumericUtils; import org.elasticsearch.ElasticSearchIllegalArgumentException; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.lucene.docset.AndDocIdSet; import org.elasticsearch.common.lucene.docset.DocIdSets; import org.elasticsearch.common.lucene.docset.MatchDocIdSet; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.mapper.geo.GeoPoint; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; import java.io.IOException; @@ -55,10 +56,10 @@ public class GeoDistanceRangeFilter extends Filter { private final IndexGeoPointFieldData indexFieldData; - public GeoDistanceRangeFilter(double lat, double lon, Double lowerVal, Double upperVal, boolean includeLower, boolean includeUpper, GeoDistance geoDistance, GeoPointFieldMapper mapper, IndexGeoPointFieldData indexFieldData, + public GeoDistanceRangeFilter(GeoPoint point, Double lowerVal, Double upperVal, boolean includeLower, boolean includeUpper, GeoDistance geoDistance, GeoPointFieldMapper mapper, IndexGeoPointFieldData indexFieldData, String optimizeBbox) { - this.lat = lat; - this.lon = lon; + this.lat = point.lat(); + this.lon = point.lon(); this.geoDistance = geoDistance; this.indexFieldData = indexFieldData; diff --git a/src/main/java/org/elasticsearch/index/search/geo/GeoPolygonFilter.java b/src/main/java/org/elasticsearch/index/search/geo/GeoPolygonFilter.java index bb7e5b9a3df..c882fef231a 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/GeoPolygonFilter.java +++ b/src/main/java/org/elasticsearch/index/search/geo/GeoPolygonFilter.java @@ -24,10 +24,10 @@ import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.Filter; import org.apache.lucene.util.Bits; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.lucene.docset.MatchDocIdSet; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.mapper.geo.GeoPoint; import java.io.IOException; import java.util.Arrays; @@ -37,16 +37,16 @@ import java.util.Arrays; */ public class GeoPolygonFilter extends Filter { - private final Point[] points; + private final GeoPoint[] points; private final IndexGeoPointFieldData indexFieldData; - public GeoPolygonFilter(Point[] points, IndexGeoPointFieldData indexFieldData) { + public GeoPolygonFilter(GeoPoint[] points, IndexGeoPointFieldData indexFieldData) { this.points = points; this.indexFieldData = indexFieldData; } - public Point[] points() { + public GeoPoint[] points() { return points; } @@ -67,9 +67,9 @@ public class GeoPolygonFilter extends Filter { public static class GeoPolygonDocIdSet extends MatchDocIdSet { private final GeoPointValues values; - private final Point[] points; + private final GeoPoint[] points; - public GeoPolygonDocIdSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, Point[] points) { + public GeoPolygonDocIdSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, GeoPoint[] points) { super(maxDoc, acceptDocs); this.values = values; this.points = points; @@ -101,16 +101,16 @@ public class GeoPolygonFilter extends Filter { return false; } - private static boolean pointInPolygon(Point[] points, double lat, double lon) { + private static boolean pointInPolygon(GeoPoint[] points, double lat, double lon) { int i; int j = points.length - 1; boolean inPoly = false; for (i = 0; i < points.length; i++) { - if (points[i].lon < lon && points[j].lon >= lon - || points[j].lon < lon && points[i].lon >= lon) { - if (points[i].lat + (lon - points[i].lon) / - (points[j].lon - points[i].lon) * (points[j].lat - points[i].lat) < lat) { + if (points[i].lon() < lon && points[j].lon() >= lon + || points[j].lon() < lon && points[i].lon() >= lon) { + if (points[i].lat() + (lon - points[i].lon()) / + (points[j].lon() - points[i].lon()) * (points[j].lat() - points[i].lat()) < lat) { inPoly = !inPoly; } } diff --git a/src/main/java/org/elasticsearch/index/search/geo/InMemoryGeoBoundingBoxFilter.java b/src/main/java/org/elasticsearch/index/search/geo/InMemoryGeoBoundingBoxFilter.java index f97b98c5a13..291ec08e96f 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/InMemoryGeoBoundingBoxFilter.java +++ b/src/main/java/org/elasticsearch/index/search/geo/InMemoryGeoBoundingBoxFilter.java @@ -24,10 +24,10 @@ import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.Filter; import org.apache.lucene.util.Bits; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.lucene.docset.MatchDocIdSet; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.mapper.geo.GeoPoint; import java.io.IOException; @@ -36,22 +36,22 @@ import java.io.IOException; */ public class InMemoryGeoBoundingBoxFilter extends Filter { - private final Point topLeft; - private final Point bottomRight; + private final GeoPoint topLeft; + private final GeoPoint bottomRight; private final IndexGeoPointFieldData indexFieldData; - public InMemoryGeoBoundingBoxFilter(Point topLeft, Point bottomRight, IndexGeoPointFieldData indexFieldData) { + public InMemoryGeoBoundingBoxFilter(GeoPoint topLeft, GeoPoint bottomRight, IndexGeoPointFieldData indexFieldData) { this.topLeft = topLeft; this.bottomRight = bottomRight; this.indexFieldData = indexFieldData; } - public Point topLeft() { + public GeoPoint topLeft() { return topLeft; } - public Point bottomRight() { + public GeoPoint bottomRight() { return bottomRight; } @@ -64,7 +64,7 @@ public class InMemoryGeoBoundingBoxFilter extends Filter { final GeoPointValues values = indexFieldData.load(context).getGeoPointValues(); //checks to see if bounding box crosses 180 degrees - if (topLeft.lon > bottomRight.lon) { + if (topLeft.lon() > bottomRight.lon()) { return new Meridian180GeoBoundingBoxDocSet(context.reader().maxDoc(), acceptedDocs, values, topLeft, bottomRight); } else { return new GeoBoundingBoxDocSet(context.reader().maxDoc(), acceptedDocs, values, topLeft, bottomRight); @@ -78,10 +78,10 @@ public class InMemoryGeoBoundingBoxFilter extends Filter { public static class Meridian180GeoBoundingBoxDocSet extends MatchDocIdSet { private final GeoPointValues values; - private final Point topLeft; - private final Point bottomRight; + private final GeoPoint topLeft; + private final GeoPoint bottomRight; - public Meridian180GeoBoundingBoxDocSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, Point topLeft, Point bottomRight) { + public Meridian180GeoBoundingBoxDocSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, GeoPoint topLeft, GeoPoint bottomRight) { super(maxDoc, acceptDocs); this.values = values; this.topLeft = topLeft; @@ -103,16 +103,16 @@ public class InMemoryGeoBoundingBoxFilter extends Filter { GeoPointValues.Iter iter = values.getIter(doc); while (iter.hasNext()) { GeoPoint point = iter.next(); - if (((topLeft.lon <= point.lon() || bottomRight.lon >= point.lon())) && - (topLeft.lat >= point.lat() && bottomRight.lat <= point.lat())) { + if (((topLeft.lon() <= point.lon() || bottomRight.lon() >= point.lon())) && + (topLeft.lat() >= point.lat() && bottomRight.lat() <= point.lat())) { return true; } } } else { GeoPoint point = values.getValue(doc); - if (((topLeft.lon <= point.lon() || bottomRight.lon >= point.lon())) && - (topLeft.lat >= point.lat() && bottomRight.lat <= point.lat())) { + if (((topLeft.lon() <= point.lon() || bottomRight.lon() >= point.lon())) && + (topLeft.lat() >= point.lat() && bottomRight.lat() <= point.lat())) { return true; } } @@ -122,10 +122,10 @@ public class InMemoryGeoBoundingBoxFilter extends Filter { public static class GeoBoundingBoxDocSet extends MatchDocIdSet { private final GeoPointValues values; - private final Point topLeft; - private final Point bottomRight; + private final GeoPoint topLeft; + private final GeoPoint bottomRight; - public GeoBoundingBoxDocSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, Point topLeft, Point bottomRight) { + public GeoBoundingBoxDocSet(int maxDoc, @Nullable Bits acceptDocs, GeoPointValues values, GeoPoint topLeft, GeoPoint bottomRight) { super(maxDoc, acceptDocs); this.values = values; this.topLeft = topLeft; @@ -147,15 +147,15 @@ public class InMemoryGeoBoundingBoxFilter extends Filter { GeoPointValues.Iter iter = values.getIter(doc); while (iter.hasNext()) { GeoPoint point = iter.next(); - if (topLeft.lon <= point.lon() && bottomRight.lon >= point.lon() - && topLeft.lat >= point.lat() && bottomRight.lat <= point.lat()) { + if (topLeft.lon() <= point.lon() && bottomRight.lon() >= point.lon() + && topLeft.lat() >= point.lat() && bottomRight.lat() <= point.lat()) { return true; } } } else { GeoPoint point = values.getValue(doc); - if (topLeft.lon <= point.lon() && bottomRight.lon >= point.lon() - && topLeft.lat >= point.lat() && bottomRight.lat <= point.lat()) { + if (topLeft.lon() <= point.lon() && bottomRight.lon() >= point.lon() + && topLeft.lat() >= point.lat() && bottomRight.lat() <= point.lat()) { return true; } } diff --git a/src/main/java/org/elasticsearch/index/search/geo/IndexedGeoBoundingBoxFilter.java b/src/main/java/org/elasticsearch/index/search/geo/IndexedGeoBoundingBoxFilter.java index decee9ffd6f..7ed9549b747 100644 --- a/src/main/java/org/elasticsearch/index/search/geo/IndexedGeoBoundingBoxFilter.java +++ b/src/main/java/org/elasticsearch/index/search/geo/IndexedGeoBoundingBoxFilter.java @@ -25,6 +25,7 @@ import org.apache.lucene.search.Filter; import org.apache.lucene.util.Bits; import org.apache.lucene.util.FixedBitSet; import org.elasticsearch.ElasticSearchIllegalArgumentException; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.lucene.docset.DocIdSets; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; @@ -34,12 +35,12 @@ import java.io.IOException; */ public class IndexedGeoBoundingBoxFilter { - public static Filter create(Point topLeft, Point bottomRight, GeoPointFieldMapper fieldMapper) { + public static Filter create(GeoPoint topLeft, GeoPoint bottomRight, GeoPointFieldMapper fieldMapper) { if (!fieldMapper.isEnableLatLon()) { throw new ElasticSearchIllegalArgumentException("lat/lon is not enabled (indexed) for field [" + fieldMapper.name() + "], can't use indexed filter on it"); } //checks to see if bounding box crosses 180 degrees - if (topLeft.lon > bottomRight.lon) { + if (topLeft.lon() > bottomRight.lon()) { return new LeftGeoBoundingBoxFilter(topLeft, bottomRight, fieldMapper); } else { return new RightGeoBoundingBoxFilter(topLeft, bottomRight, fieldMapper); @@ -52,10 +53,10 @@ public class IndexedGeoBoundingBoxFilter { final Filter lonFilter2; final Filter latFilter; - public LeftGeoBoundingBoxFilter(Point topLeft, Point bottomRight, GeoPointFieldMapper fieldMapper) { - lonFilter1 = fieldMapper.lonMapper().rangeFilter(null, bottomRight.lon, true, true); - lonFilter2 = fieldMapper.lonMapper().rangeFilter(topLeft.lon, null, true, true); - latFilter = fieldMapper.latMapper().rangeFilter(bottomRight.lat, topLeft.lat, true, true); + public LeftGeoBoundingBoxFilter(GeoPoint topLeft, GeoPoint bottomRight, GeoPointFieldMapper fieldMapper) { + lonFilter1 = fieldMapper.lonMapper().rangeFilter(null, bottomRight.lon(), true, true); + lonFilter2 = fieldMapper.lonMapper().rangeFilter(topLeft.lon(), null, true, true); + latFilter = fieldMapper.latMapper().rangeFilter(bottomRight.lat(), topLeft.lat(), true, true); } @Override @@ -119,9 +120,9 @@ public class IndexedGeoBoundingBoxFilter { final Filter lonFilter; final Filter latFilter; - public RightGeoBoundingBoxFilter(Point topLeft, Point bottomRight, GeoPointFieldMapper fieldMapper) { - lonFilter = fieldMapper.lonMapper().rangeFilter(topLeft.lon, bottomRight.lon, true, true); - latFilter = fieldMapper.latMapper().rangeFilter(bottomRight.lat, topLeft.lat, true, true); + public RightGeoBoundingBoxFilter(GeoPoint topLeft, GeoPoint bottomRight, GeoPointFieldMapper fieldMapper) { + lonFilter = fieldMapper.lonMapper().rangeFilter(topLeft.lon(), bottomRight.lon(), true, true); + latFilter = fieldMapper.latMapper().rangeFilter(bottomRight.lat(), topLeft.lat(), true, true); } @Override diff --git a/src/main/java/org/elasticsearch/index/search/geo/Point.java b/src/main/java/org/elasticsearch/index/search/geo/Point.java deleted file mode 100644 index 4a1d7924037..00000000000 --- a/src/main/java/org/elasticsearch/index/search/geo/Point.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch 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.elasticsearch.index.search.geo; - -/** - */ -public class Point { - public double lat; - public double lon; - - public Point() { - } - - public Point(double lat, double lon) { - this.lat = lat; - this.lon = lon; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Point point = (Point) o; - - if (Double.compare(point.lat, lat) != 0) return false; - if (Double.compare(point.lon, lon) != 0) return false; - - return true; - } - - @Override - public int hashCode() { - int result; - long temp; - temp = lat != +0.0d ? Double.doubleToLongBits(lat) : 0L; - result = (int) (temp ^ (temp >>> 32)); - temp = lon != +0.0d ? Double.doubleToLongBits(lon) : 0L; - result = 31 * result + (int) (temp ^ (temp >>> 32)); - return result; - } - - public String toString() { - return "[" + lat + ", " + lon + "]"; - } -} diff --git a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetBuilder.java b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetBuilder.java index 72c2c3b4521..56031941c5b 100644 --- a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetBuilder.java +++ b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetBuilder.java @@ -21,10 +21,10 @@ package org.elasticsearch.search.facet.geodistance; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.search.builder.SearchSourceBuilderException; import org.elasticsearch.search.facet.AbstractFacetBuilder; @@ -36,8 +36,6 @@ import java.util.Map; * A geo distance builder allowing to create a facet of distances from a specific location including the * number of hits within each distance range, and aggregated data (like totals of either the distance or * cusotm value fields). - * - * */ public class GeoDistanceFacetBuilder extends AbstractFacetBuilder { diff --git a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetCollector.java b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetCollector.java index 21809970c9f..f7721bb6cd8 100644 --- a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetCollector.java +++ b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetCollector.java @@ -20,10 +20,10 @@ package org.elasticsearch.search.facet.geodistance; import org.apache.lucene.index.AtomicReaderContext; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.search.facet.AbstractFacetCollector; import org.elasticsearch.search.facet.Facet; import org.elasticsearch.search.internal.SearchContext; diff --git a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetProcessor.java b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetProcessor.java index 57404020491..a3a590bea60 100644 --- a/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetProcessor.java +++ b/src/main/java/org/elasticsearch/search/facet/geodistance/GeoDistanceFacetProcessor.java @@ -21,6 +21,10 @@ package org.elasticsearch.search.facet.geodistance; import com.google.common.collect.Lists; import org.elasticsearch.common.component.AbstractComponent; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.DistanceUnit; @@ -29,10 +33,6 @@ import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.fielddata.IndexNumericFieldData; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.GeoDistance; -import org.elasticsearch.index.search.geo.GeoHashUtils; -import org.elasticsearch.index.search.geo.GeoUtils; -import org.elasticsearch.index.search.geo.Point; import org.elasticsearch.search.facet.Facet; import org.elasticsearch.search.facet.FacetCollector; import org.elasticsearch.search.facet.FacetPhaseExecutionException; @@ -66,8 +66,7 @@ public class GeoDistanceFacetProcessor extends AbstractComponent implements Face String valueScript = null; String scriptLang = null; Map params = null; - double lat = Double.NaN; - double lon = Double.NaN; + GeoPoint point = new GeoPoint(); DistanceUnit unit = DistanceUnit.KILOMETERS; GeoDistance geoDistance = GeoDistance.ARC; List entries = Lists.newArrayList(); @@ -105,9 +104,9 @@ public class GeoDistanceFacetProcessor extends AbstractComponent implements Face } } else { token = parser.nextToken(); - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); token = parser.nextToken(); - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } @@ -124,13 +123,11 @@ public class GeoDistanceFacetProcessor extends AbstractComponent implements Face currentName = parser.currentName(); } else if (token.isValue()) { if (currentName.equals(GeoPointFieldMapper.Names.LAT)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.LON)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } } } @@ -151,35 +148,19 @@ public class GeoDistanceFacetProcessor extends AbstractComponent implements Face normalizeLon = parser.booleanValue(); } else { // assume the value is the actual value - String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - lat = Double.parseDouble(value.substring(0, comma).trim()); - lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - lat = values[0]; - lon = values[1]; - } + point.resetFromString(parser.text()); fieldName = currentName; } } } - if (Double.isNaN(lat) || Double.isNaN(lon)) { - throw new FacetPhaseExecutionException(facetName, "lat/lon not set for geo_distance facet"); - } - if (entries.isEmpty()) { throw new FacetPhaseExecutionException(facetName, "no ranges defined for geo_distance facet"); } if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; } FieldMapper keyFieldMapper = context.smartNameFieldMapper(fieldName); @@ -194,16 +175,16 @@ public class GeoDistanceFacetProcessor extends AbstractComponent implements Face throw new FacetPhaseExecutionException(facetName, "failed to find mapping for [" + valueFieldName + "]"); } IndexNumericFieldData valueIndexFieldData = context.fieldData().getForField(valueFieldMapper); - return new ValueGeoDistanceFacetCollector(facetName, keyIndexFieldData, lat, lon, unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), + return new ValueGeoDistanceFacetCollector(facetName, keyIndexFieldData, point.lat(), point.lon(), unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), context, valueIndexFieldData); } if (valueScript != null) { - return new ScriptGeoDistanceFacetCollector(facetName, keyIndexFieldData, lat, lon, unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), + return new ScriptGeoDistanceFacetCollector(facetName, keyIndexFieldData, point.lat(), point.lon(), unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), context, scriptLang, valueScript, params); } - return new GeoDistanceFacetCollector(facetName, keyIndexFieldData, lat, lon, unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), + return new GeoDistanceFacetCollector(facetName, keyIndexFieldData, point.lat(), point.lon(), unit, geoDistance, entries.toArray(new GeoDistanceFacet.Entry[entries.size()]), context); } diff --git a/src/main/java/org/elasticsearch/search/facet/geodistance/ScriptGeoDistanceFacetCollector.java b/src/main/java/org/elasticsearch/search/facet/geodistance/ScriptGeoDistanceFacetCollector.java index d9d200b2016..b665ea31fbf 100644 --- a/src/main/java/org/elasticsearch/search/facet/geodistance/ScriptGeoDistanceFacetCollector.java +++ b/src/main/java/org/elasticsearch/search/facet/geodistance/ScriptGeoDistanceFacetCollector.java @@ -21,10 +21,10 @@ package org.elasticsearch.search.facet.geodistance; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.search.Scorer; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.script.SearchScript; import org.elasticsearch.search.internal.SearchContext; diff --git a/src/main/java/org/elasticsearch/search/facet/geodistance/ValueGeoDistanceFacetCollector.java b/src/main/java/org/elasticsearch/search/facet/geodistance/ValueGeoDistanceFacetCollector.java index 9784abf4baa..4f35748fc10 100644 --- a/src/main/java/org/elasticsearch/search/facet/geodistance/ValueGeoDistanceFacetCollector.java +++ b/src/main/java/org/elasticsearch/search/facet/geodistance/ValueGeoDistanceFacetCollector.java @@ -20,12 +20,12 @@ package org.elasticsearch.search.facet.geodistance; import org.apache.lucene.index.AtomicReaderContext; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.fielddata.DoubleValues; import org.elasticsearch.index.fielddata.GeoPointValues; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.fielddata.IndexNumericFieldData; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.search.internal.SearchContext; import java.io.IOException; diff --git a/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java b/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java index 55475c58f66..1f4b51707cc 100644 --- a/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java +++ b/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java @@ -19,16 +19,14 @@ package org.elasticsearch.search.sort; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.search.geo.GeoDistance; import java.io.IOException; /** * A geo distance based sorting on a geo point like field. - * - * */ public class GeoDistanceSortBuilder extends SortBuilder { diff --git a/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortParser.java b/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortParser.java index 9065467645a..0140da913be 100644 --- a/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortParser.java +++ b/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortParser.java @@ -21,16 +21,16 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.elasticsearch.ElasticSearchIllegalArgumentException; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.fielddata.IndexGeoPointFieldData; import org.elasticsearch.index.fielddata.fieldcomparator.GeoDistanceComparatorSource; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; -import org.elasticsearch.index.search.geo.GeoDistance; -import org.elasticsearch.index.search.geo.GeoHashUtils; -import org.elasticsearch.index.search.geo.GeoUtils; -import org.elasticsearch.index.search.geo.Point; import org.elasticsearch.search.internal.SearchContext; /** @@ -46,8 +46,7 @@ public class GeoDistanceSortParser implements SortParser { @Override public SortField parse(XContentParser parser, SearchContext context) throws Exception { String fieldName = null; - double lat = Double.NaN; - double lon = Double.NaN; + GeoPoint point = new GeoPoint(); DistanceUnit unit = DistanceUnit.KILOMETERS; GeoDistance geoDistance = GeoDistance.ARC; boolean reverse = false; @@ -62,9 +61,9 @@ public class GeoDistanceSortParser implements SortParser { currentName = parser.currentName(); } else if (token == XContentParser.Token.START_ARRAY) { token = parser.nextToken(); - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); token = parser.nextToken(); - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { } @@ -77,13 +76,11 @@ public class GeoDistanceSortParser implements SortParser { currentName = parser.currentName(); } else if (token.isValue()) { if (currentName.equals(GeoPointFieldMapper.Names.LAT)) { - lat = parser.doubleValue(); + point.resetLat(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.LON)) { - lon = parser.doubleValue(); + point.resetLon(parser.doubleValue()); } else if (currentName.equals(GeoPointFieldMapper.Names.GEOHASH)) { - double[] values = GeoHashUtils.decode(parser.text()); - lat = values[0]; - lon = values[1]; + GeoHashUtils.decode(parser.text(), point); } } } @@ -100,28 +97,14 @@ public class GeoDistanceSortParser implements SortParser { normalizeLat = parser.booleanValue(); normalizeLon = parser.booleanValue(); } else { - // assume the value is the actual value - String value = parser.text(); - int comma = value.indexOf(','); - if (comma != -1) { - lat = Double.parseDouble(value.substring(0, comma).trim()); - lon = Double.parseDouble(value.substring(comma + 1).trim()); - } else { - double[] values = GeoHashUtils.decode(value); - lat = values[0]; - lon = values[1]; - } - + point.resetFromString(parser.text()); fieldName = currentName; } } } if (normalizeLat || normalizeLon) { - Point point = new Point(lat, lon); GeoUtils.normalizePoint(point, normalizeLat, normalizeLon); - lat = point.lat; - lon = point.lon; } FieldMapper mapper = context.smartNameFieldMapper(fieldName); @@ -130,6 +113,6 @@ public class GeoDistanceSortParser implements SortParser { } IndexGeoPointFieldData indexFieldData = context.fieldData().getForField(mapper); - return new SortField(fieldName, new GeoDistanceComparatorSource(indexFieldData, lat, lon, unit, geoDistance), reverse); + return new SortField(fieldName, new GeoDistanceComparatorSource(indexFieldData, point.lat(), point.lon(), unit, geoDistance), reverse); } } diff --git a/src/test/java/org/elasticsearch/benchmark/search/geo/GeoDistanceSearchBenchmark.java b/src/test/java/org/elasticsearch/benchmark/search/geo/GeoDistanceSearchBenchmark.java index c3885369556..2849e4f1661 100644 --- a/src/test/java/org/elasticsearch/benchmark/search/geo/GeoDistanceSearchBenchmark.java +++ b/src/test/java/org/elasticsearch/benchmark/search/geo/GeoDistanceSearchBenchmark.java @@ -22,11 +22,11 @@ package org.elasticsearch.benchmark.search.geo; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.unit.SizeValue; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; diff --git a/src/test/java/org/elasticsearch/test/integration/search/geo/GeoDistanceTests.java b/src/test/java/org/elasticsearch/test/integration/search/geo/GeoDistanceTests.java index 5d2942f9f6d..901c208a3cd 100644 --- a/src/test/java/org/elasticsearch/test/integration/search/geo/GeoDistanceTests.java +++ b/src/test/java/org/elasticsearch/test/integration/search/geo/GeoDistanceTests.java @@ -21,8 +21,8 @@ package org.elasticsearch.test.integration.search.geo; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; diff --git a/src/test/java/org/elasticsearch/test/integration/validate/SimpleValidateQueryTests.java b/src/test/java/org/elasticsearch/test/integration/validate/SimpleValidateQueryTests.java index beddf05dd18..89515235a88 100644 --- a/src/test/java/org/elasticsearch/test/integration/validate/SimpleValidateQueryTests.java +++ b/src/test/java/org/elasticsearch/test/integration/validate/SimpleValidateQueryTests.java @@ -21,13 +21,13 @@ package org.elasticsearch.test.integration.validate; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryResponse; import org.elasticsearch.client.Client; +import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.FilterBuilders; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.search.geo.GeoDistance; import org.elasticsearch.test.integration.AbstractNodesTests; import org.hamcrest.Matcher; import org.testng.annotations.AfterClass; diff --git a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/GeohashMappingGeoPointTests.java b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/GeohashMappingGeoPointTests.java index cde370494ee..7eb30ba234f 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/GeohashMappingGeoPointTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/GeohashMappingGeoPointTests.java @@ -19,10 +19,10 @@ package org.elasticsearch.test.unit.index.mapper.geo; +import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.ParsedDocument; -import org.elasticsearch.index.search.geo.GeoHashUtils; import org.elasticsearch.test.unit.index.mapper.MapperTests; import org.hamcrest.MatcherAssert; import org.testng.annotations.Test; diff --git a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonAndGeohashMappingGeoPointTests.java b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonAndGeohashMappingGeoPointTests.java index 84fd2a3605b..970a0e60426 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonAndGeohashMappingGeoPointTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonAndGeohashMappingGeoPointTests.java @@ -19,10 +19,10 @@ package org.elasticsearch.test.unit.index.mapper.geo; +import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.ParsedDocument; -import org.elasticsearch.index.search.geo.GeoHashUtils; import org.elasticsearch.test.unit.index.mapper.MapperTests; import org.testng.annotations.Test; diff --git a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonMappingGeoPointTests.java b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonMappingGeoPointTests.java index 1ab84da2bb3..891a805685f 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonMappingGeoPointTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/mapper/geo/LatLonMappingGeoPointTests.java @@ -19,11 +19,11 @@ package org.elasticsearch.test.unit.index.mapper.geo; +import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.ParsedDocument; -import org.elasticsearch.index.search.geo.GeoHashUtils; import org.elasticsearch.test.unit.index.mapper.MapperTests; import org.testng.annotations.Test; diff --git a/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java b/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java index af3cd24348c..a7d09929875 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java @@ -1803,10 +1803,10 @@ public class SimpleIndexQueryParserTests { XConstantScoreQuery constantScoreQuery = (XConstantScoreQuery) parsedQuery.query(); InMemoryGeoBoundingBoxFilter filter = (InMemoryGeoBoundingBoxFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); - assertThat(filter.topLeft().lat, closeTo(40, 0.00001)); - assertThat(filter.topLeft().lon, closeTo(-70, 0.00001)); - assertThat(filter.bottomRight().lat, closeTo(30, 0.00001)); - assertThat(filter.bottomRight().lon, closeTo(-80, 0.00001)); + assertThat(filter.topLeft().lat(), closeTo(40, 0.00001)); + assertThat(filter.topLeft().lon(), closeTo(-70, 0.00001)); + assertThat(filter.bottomRight().lat(), closeTo(30, 0.00001)); + assertThat(filter.bottomRight().lon(), closeTo(-80, 0.00001)); } @@ -1819,10 +1819,10 @@ public class SimpleIndexQueryParserTests { XConstantScoreQuery constantScoreQuery = (XConstantScoreQuery) parsedQuery; InMemoryGeoBoundingBoxFilter filter = (InMemoryGeoBoundingBoxFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); - assertThat(filter.topLeft().lat, closeTo(40, 0.00001)); - assertThat(filter.topLeft().lon, closeTo(-70, 0.00001)); - assertThat(filter.bottomRight().lat, closeTo(30, 0.00001)); - assertThat(filter.bottomRight().lon, closeTo(-80, 0.00001)); + assertThat(filter.topLeft().lat(), closeTo(40, 0.00001)); + assertThat(filter.topLeft().lon(), closeTo(-70, 0.00001)); + assertThat(filter.bottomRight().lat(), closeTo(30, 0.00001)); + assertThat(filter.bottomRight().lon(), closeTo(-80, 0.00001)); } @Test @@ -1834,10 +1834,10 @@ public class SimpleIndexQueryParserTests { XConstantScoreQuery constantScoreQuery = (XConstantScoreQuery) parsedQuery; InMemoryGeoBoundingBoxFilter filter = (InMemoryGeoBoundingBoxFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); - assertThat(filter.topLeft().lat, closeTo(40, 0.00001)); - assertThat(filter.topLeft().lon, closeTo(-70, 0.00001)); - assertThat(filter.bottomRight().lat, closeTo(30, 0.00001)); - assertThat(filter.bottomRight().lon, closeTo(-80, 0.00001)); + assertThat(filter.topLeft().lat(), closeTo(40, 0.00001)); + assertThat(filter.topLeft().lon(), closeTo(-70, 0.00001)); + assertThat(filter.bottomRight().lat(), closeTo(30, 0.00001)); + assertThat(filter.bottomRight().lon(), closeTo(-80, 0.00001)); } @Test @@ -1849,10 +1849,10 @@ public class SimpleIndexQueryParserTests { XConstantScoreQuery constantScoreQuery = (XConstantScoreQuery) parsedQuery; InMemoryGeoBoundingBoxFilter filter = (InMemoryGeoBoundingBoxFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); - assertThat(filter.topLeft().lat, closeTo(40, 0.00001)); - assertThat(filter.topLeft().lon, closeTo(-70, 0.00001)); - assertThat(filter.bottomRight().lat, closeTo(30, 0.00001)); - assertThat(filter.bottomRight().lon, closeTo(-80, 0.00001)); + assertThat(filter.topLeft().lat(), closeTo(40, 0.00001)); + assertThat(filter.topLeft().lon(), closeTo(-70, 0.00001)); + assertThat(filter.bottomRight().lat(), closeTo(30, 0.00001)); + assertThat(filter.bottomRight().lon(), closeTo(-80, 0.00001)); } @Test @@ -1864,10 +1864,10 @@ public class SimpleIndexQueryParserTests { XConstantScoreQuery constantScoreQuery = (XConstantScoreQuery) parsedQuery; InMemoryGeoBoundingBoxFilter filter = (InMemoryGeoBoundingBoxFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); - assertThat(filter.topLeft().lat, closeTo(40, 0.00001)); - assertThat(filter.topLeft().lon, closeTo(-70, 0.00001)); - assertThat(filter.bottomRight().lat, closeTo(30, 0.00001)); - assertThat(filter.bottomRight().lon, closeTo(-80, 0.00001)); + assertThat(filter.topLeft().lat(), closeTo(40, 0.00001)); + assertThat(filter.topLeft().lon(), closeTo(-70, 0.00001)); + assertThat(filter.bottomRight().lat(), closeTo(30, 0.00001)); + assertThat(filter.bottomRight().lon(), closeTo(-80, 0.00001)); } @Test @@ -1881,12 +1881,12 @@ public class SimpleIndexQueryParserTests { GeoPolygonFilter filter = (GeoPolygonFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); assertThat(filter.points().length, equalTo(3)); - assertThat(filter.points()[0].lat, closeTo(40, 0.00001)); - assertThat(filter.points()[0].lon, closeTo(-70, 0.00001)); - assertThat(filter.points()[1].lat, closeTo(30, 0.00001)); - assertThat(filter.points()[1].lon, closeTo(-80, 0.00001)); - assertThat(filter.points()[2].lat, closeTo(20, 0.00001)); - assertThat(filter.points()[2].lon, closeTo(-90, 0.00001)); + assertThat(filter.points()[0].lat(), closeTo(40, 0.00001)); + assertThat(filter.points()[0].lon(), closeTo(-70, 0.00001)); + assertThat(filter.points()[1].lat(), closeTo(30, 0.00001)); + assertThat(filter.points()[1].lon(), closeTo(-80, 0.00001)); + assertThat(filter.points()[2].lat(), closeTo(20, 0.00001)); + assertThat(filter.points()[2].lon(), closeTo(-90, 0.00001)); } @Test @@ -1899,12 +1899,12 @@ public class SimpleIndexQueryParserTests { GeoPolygonFilter filter = (GeoPolygonFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); assertThat(filter.points().length, equalTo(3)); - assertThat(filter.points()[0].lat, closeTo(40, 0.00001)); - assertThat(filter.points()[0].lon, closeTo(-70, 0.00001)); - assertThat(filter.points()[1].lat, closeTo(30, 0.00001)); - assertThat(filter.points()[1].lon, closeTo(-80, 0.00001)); - assertThat(filter.points()[2].lat, closeTo(20, 0.00001)); - assertThat(filter.points()[2].lon, closeTo(-90, 0.00001)); + assertThat(filter.points()[0].lat(), closeTo(40, 0.00001)); + assertThat(filter.points()[0].lon(), closeTo(-70, 0.00001)); + assertThat(filter.points()[1].lat(), closeTo(30, 0.00001)); + assertThat(filter.points()[1].lon(), closeTo(-80, 0.00001)); + assertThat(filter.points()[2].lat(), closeTo(20, 0.00001)); + assertThat(filter.points()[2].lon(), closeTo(-90, 0.00001)); } @Test @@ -1917,12 +1917,12 @@ public class SimpleIndexQueryParserTests { GeoPolygonFilter filter = (GeoPolygonFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); assertThat(filter.points().length, equalTo(3)); - assertThat(filter.points()[0].lat, closeTo(40, 0.00001)); - assertThat(filter.points()[0].lon, closeTo(-70, 0.00001)); - assertThat(filter.points()[1].lat, closeTo(30, 0.00001)); - assertThat(filter.points()[1].lon, closeTo(-80, 0.00001)); - assertThat(filter.points()[2].lat, closeTo(20, 0.00001)); - assertThat(filter.points()[2].lon, closeTo(-90, 0.00001)); + assertThat(filter.points()[0].lat(), closeTo(40, 0.00001)); + assertThat(filter.points()[0].lon(), closeTo(-70, 0.00001)); + assertThat(filter.points()[1].lat(), closeTo(30, 0.00001)); + assertThat(filter.points()[1].lon(), closeTo(-80, 0.00001)); + assertThat(filter.points()[2].lat(), closeTo(20, 0.00001)); + assertThat(filter.points()[2].lon(), closeTo(-90, 0.00001)); } @Test @@ -1935,12 +1935,12 @@ public class SimpleIndexQueryParserTests { GeoPolygonFilter filter = (GeoPolygonFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); assertThat(filter.points().length, equalTo(3)); - assertThat(filter.points()[0].lat, closeTo(40, 0.00001)); - assertThat(filter.points()[0].lon, closeTo(-70, 0.00001)); - assertThat(filter.points()[1].lat, closeTo(30, 0.00001)); - assertThat(filter.points()[1].lon, closeTo(-80, 0.00001)); - assertThat(filter.points()[2].lat, closeTo(20, 0.00001)); - assertThat(filter.points()[2].lon, closeTo(-90, 0.00001)); + assertThat(filter.points()[0].lat(), closeTo(40, 0.00001)); + assertThat(filter.points()[0].lon(), closeTo(-70, 0.00001)); + assertThat(filter.points()[1].lat(), closeTo(30, 0.00001)); + assertThat(filter.points()[1].lon(), closeTo(-80, 0.00001)); + assertThat(filter.points()[2].lat(), closeTo(20, 0.00001)); + assertThat(filter.points()[2].lon(), closeTo(-90, 0.00001)); } @Test @@ -1953,12 +1953,12 @@ public class SimpleIndexQueryParserTests { GeoPolygonFilter filter = (GeoPolygonFilter) constantScoreQuery.getFilter(); assertThat(filter.fieldName(), equalTo("location")); assertThat(filter.points().length, equalTo(3)); - assertThat(filter.points()[0].lat, closeTo(40, 0.00001)); - assertThat(filter.points()[0].lon, closeTo(-70, 0.00001)); - assertThat(filter.points()[1].lat, closeTo(30, 0.00001)); - assertThat(filter.points()[1].lon, closeTo(-80, 0.00001)); - assertThat(filter.points()[2].lat, closeTo(20, 0.00001)); - assertThat(filter.points()[2].lon, closeTo(-90, 0.00001)); + assertThat(filter.points()[0].lat(), closeTo(40, 0.00001)); + assertThat(filter.points()[0].lon(), closeTo(-70, 0.00001)); + assertThat(filter.points()[1].lat(), closeTo(30, 0.00001)); + assertThat(filter.points()[1].lon(), closeTo(-80, 0.00001)); + assertThat(filter.points()[2].lat(), closeTo(20, 0.00001)); + assertThat(filter.points()[2].lon(), closeTo(-90, 0.00001)); } @Test diff --git a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoDistanceTests.java b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoDistanceTests.java index 649769e26d5..5fced9e6523 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoDistanceTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoDistanceTests.java @@ -19,15 +19,13 @@ package org.elasticsearch.test.unit.index.search.geo; +import org.elasticsearch.common.geo.GeoDistance; +import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.unit.DistanceUnit; -import org.elasticsearch.index.search.geo.GeoDistance; -import org.elasticsearch.index.search.geo.Point; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.*; /** */ @@ -49,22 +47,22 @@ public class GeoDistanceTests { @Test public void testArcDistanceVsPlaneInEllipsis() { - Point centre = new Point(48.8534100, 2.3488000); - Point northernPoint = new Point(48.8801108681, 2.35152032666); - Point westernPoint = new Point(48.85265, 2.308896); + GeoPoint centre = new GeoPoint(48.8534100, 2.3488000); + GeoPoint northernPoint = new GeoPoint(48.8801108681, 2.35152032666); + GeoPoint westernPoint = new GeoPoint(48.85265, 2.308896); // With GeoDistance.ARC both the northern and western points are within the 4km range - assertThat(GeoDistance.ARC.calculate(centre.lat, centre.lon, northernPoint.lat, - northernPoint.lon, DistanceUnit.KILOMETERS), lessThan(4D)); - assertThat(GeoDistance.ARC.calculate(centre.lat, centre.lon, westernPoint.lat, - westernPoint.lon, DistanceUnit.KILOMETERS), lessThan(4D)); + assertThat(GeoDistance.ARC.calculate(centre.lat(), centre.lon(), northernPoint.lat(), + northernPoint.lon(), DistanceUnit.KILOMETERS), lessThan(4D)); + assertThat(GeoDistance.ARC.calculate(centre.lat(), centre.lon(), westernPoint.lat(), + westernPoint.lon(), DistanceUnit.KILOMETERS), lessThan(4D)); // With GeoDistance.PLANE, only the northern point is within the 4km range, // the western point is outside of the range due to the simple math it employs, // meaning results will appear elliptical - assertThat(GeoDistance.PLANE.calculate(centre.lat, centre.lon, northernPoint.lat, - northernPoint.lon, DistanceUnit.KILOMETERS), lessThan(4D)); - assertThat(GeoDistance.PLANE.calculate(centre.lat, centre.lon, westernPoint.lat, - westernPoint.lon, DistanceUnit.KILOMETERS), greaterThan(4D)); + assertThat(GeoDistance.PLANE.calculate(centre.lat(), centre.lon(), northernPoint.lat(), + northernPoint.lon(), DistanceUnit.KILOMETERS), lessThan(4D)); + assertThat(GeoDistance.PLANE.calculate(centre.lat(), centre.lon(), westernPoint.lat(), + westernPoint.lon(), DistanceUnit.KILOMETERS), greaterThan(4D)); } } diff --git a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoHashUtilsTests.java b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoHashUtilsTests.java index 41920b03947..67b729049b2 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoHashUtilsTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoHashUtilsTests.java @@ -19,7 +19,8 @@ package org.elasticsearch.test.unit.index.search.geo; -import org.elasticsearch.index.search.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoHashUtils; +import org.elasticsearch.common.geo.GeoPoint; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; @@ -50,10 +51,10 @@ public class GeoHashUtilsTests { public void testDecodePreciseLongitudeLatitude() { String hash = GeoHashUtils.encode(52.3738007, 4.8909347); - double[] latitudeLongitude = GeoHashUtils.decode(hash); + GeoPoint point = GeoHashUtils.decode(hash); - assertEquals(52.3738007, latitudeLongitude[0], 0.00001D); - assertEquals(4.8909347, latitudeLongitude[1], 0.00001D); + assertEquals(52.3738007, point.lat(), 0.00001D); + assertEquals(4.8909347, point.lon(), 0.00001D); } /** @@ -64,10 +65,10 @@ public class GeoHashUtilsTests { public void testDecodeImpreciseLongitudeLatitude() { String hash = GeoHashUtils.encode(84.6, 10.5); - double[] latitudeLongitude = GeoHashUtils.decode(hash); + GeoPoint point = GeoHashUtils.decode(hash); - assertEquals(84.6, latitudeLongitude[0], 0.00001D); - assertEquals(10.5, latitudeLongitude[1], 0.00001D); + assertEquals(84.6, point.lat(), 0.00001D); + assertEquals(10.5, point.lon(), 0.00001D); } /* @@ -78,16 +79,10 @@ public class GeoHashUtilsTests { public void testDecodeEncode() { String geoHash = "u173zq37x014"; assertEquals(geoHash, GeoHashUtils.encode(52.3738007, 4.8909347)); - double[] decode = GeoHashUtils.decode(geoHash); - assertEquals(52.37380061d, decode[0], 0.000001d); - assertEquals(4.8909343d, decode[1], 0.000001d); + GeoPoint decode = GeoHashUtils.decode(geoHash); + assertEquals(52.37380061d, decode.lat(), 0.000001d); + assertEquals(4.8909343d, decode.lon(), 0.000001d); - assertEquals(geoHash, GeoHashUtils.encode(decode[0], decode[1])); - - geoHash = "u173"; - decode = GeoHashUtils.decode("u173"); - geoHash = GeoHashUtils.encode(decode[0], decode[1]); - assertEquals(decode[0], GeoHashUtils.decode(geoHash)[0], 0.000001d); - assertEquals(decode[1], GeoHashUtils.decode(geoHash)[1], 0.000001d); + assertEquals(geoHash, GeoHashUtils.encode(decode.lat(), decode.lon())); } } diff --git a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoUtilsTests.java b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoUtilsTests.java index 0d3bda367f8..caf3473d0a4 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoUtilsTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/search/geo/GeoUtilsTests.java @@ -19,8 +19,8 @@ package org.elasticsearch.test.unit.index.search.geo; -import org.elasticsearch.index.search.geo.GeoUtils; -import org.elasticsearch.index.search.geo.Point; +import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.geo.GeoUtils; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -85,7 +85,7 @@ public class GeoUtilsTests { // Now with points, to check for longitude shifting with latitude normalization // We've gone past the north pole and down the other side, the longitude will // be shifted by 180 - assertNormalizedPoint(new Point(90.5, 10), new Point(89.5, -170)); + assertNormalizedPoint(new GeoPoint(90.5, 10), new GeoPoint(89.5, -170)); // Every 10-units, multiple full turns for (int shift = -20; shift <= 20; ++shift) { @@ -199,7 +199,7 @@ public class GeoUtilsTests { assertThat(GeoUtils.normalizeLat(+18000000000091.0), equalTo(GeoUtils.normalizeLat(+091.0))); } - private static void assertNormalizedPoint(Point input, Point expected) { + private static void assertNormalizedPoint(GeoPoint input, GeoPoint expected) { GeoUtils.normalizePoint(input); assertThat(input, equalTo(expected)); }