diff options
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java | 63 |
1 files changed, 31 insertions, 32 deletions
diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java b/core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java index d11a79c255..93fa5bf22a 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/plain/LatLonPointDVAtomicFieldData.java @@ -19,6 +19,8 @@ package org.elasticsearch.index.fielddata.plain; import org.apache.lucene.geo.GeoEncodingUtils; +import org.apache.lucene.index.DocValues; +import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.SortedNumericDocValues; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.ArrayUtil; @@ -26,16 +28,18 @@ import org.apache.lucene.util.RamUsageEstimator; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.index.fielddata.MultiGeoPointValues; -import java.util.Arrays; +import java.io.IOException; import java.util.Collection; import java.util.Collections; final class LatLonPointDVAtomicFieldData extends AbstractAtomicGeoPointFieldData { - private final SortedNumericDocValues values; + private final LeafReader reader; + private final String fieldName; - LatLonPointDVAtomicFieldData(SortedNumericDocValues values) { + LatLonPointDVAtomicFieldData(LeafReader reader, String fieldName) { super(); - this.values = values; + this.reader = reader; + this.fieldName = fieldName; } @Override @@ -55,37 +59,32 @@ final class LatLonPointDVAtomicFieldData extends AbstractAtomicGeoPointFieldData @Override public MultiGeoPointValues getGeoPointValues() { - return new MultiGeoPointValues() { - GeoPoint[] points = new GeoPoint[0]; - private int count = 0; + try { + final SortedNumericDocValues numericValues = DocValues.getSortedNumeric(reader, fieldName); + return new MultiGeoPointValues() { - @Override - public void setDocument(int docId) { - values.setDocument(docId); - count = values.count(); - if (count > points.length) { - final int previousLength = points.length; - points = Arrays.copyOf(points, ArrayUtil.oversize(count, RamUsageEstimator.NUM_BYTES_OBJECT_REF)); - for (int i = previousLength; i < points.length; ++i) { - points[i] = new GeoPoint(Double.NaN, Double.NaN); - } - } - long encoded; - for (int i=0; i<count; ++i) { - encoded = values.valueAt(i); - points[i].reset(GeoEncodingUtils.decodeLatitude((int)(encoded >>> 32)), GeoEncodingUtils.decodeLongitude((int)encoded)); + final GeoPoint point = new GeoPoint(); + + @Override + public boolean advanceExact(int doc) throws IOException { + return numericValues.advanceExact(doc); } - } - @Override - public int count() { - return count; - } + @Override + public int docValueCount() { + return numericValues.docValueCount(); + } - @Override - public GeoPoint valueAt(int index) { - return points[index]; - } - }; + @Override + public GeoPoint nextValue() throws IOException { + final long encoded = numericValues.nextValue(); + point.reset(GeoEncodingUtils.decodeLatitude((int) (encoded >>> 32)), + GeoEncodingUtils.decodeLongitude((int) encoded)); + return point; + } + }; + } catch (IOException e) { + throw new IllegalStateException("Cannot load doc values", e); + } } } |