@Override protected String getDistanceString(LeafReaderContext ctx, int docId) throws IOException { StringBuilder values = new StringBuilder(mode.name()); values.append(" of: ["); final MultiGeoPointValues geoPointValues = fieldData.load(ctx).getGeoPointValues(); if (geoPointValues.advanceExact(docId)) { final int num = geoPointValues.docValueCount(); for (int i = 0; i < num; i++) { GeoPoint value = geoPointValues.nextValue(); values.append("Math.max(arcDistance("); values.append(value).append("(=doc value),"); values.append(origin).append("(=origin)) - ").append(offset).append("(=offset), 0)"); if (i != num - 1) { values.append(", "); } } } else { values.append("0.0"); } values.append("]"); return values.toString(); }
@Override public boolean advanceExact(int doc) throws IOException { if (values.advanceExact(doc)) { count = values.docValueCount(); } else { count = 0; } // always return true because we want to return a value even if // the document does not have a value return true; }
@Override public void get(List<CharSequence> list) throws IOException { for (int i = 0, count = values.docValueCount(); i < count; ++i) { list.add(values.nextValue().toString()); } } });
@Override public void get(int docID, List<CharSequence> list) { values.setDocument(docID); for (int i = 0, count = values.count(); i < count; ++i) { list.add(values.valueAt(i).toString()); } } });
@Override public void setDocument(int docId) { values.setDocument(docId); count = values.count(); }
@Override public double doubleVal(int doc) throws IOException { if (values.advanceExact(doc)) { return values.nextValue().getLat(); } else { return 0.0; } } };
@Override public boolean advanceExact(int doc) throws IOException { return values.advanceExact(doc); } @Override
@Override public GeoPoint valueAt(int index) { if (count > 0) { return values.valueAt(index); } else if (index == 0) { return missing; } else { throw new IndexOutOfBoundsException(); } }
@Override public int count() { return geoPointValues.count(); }
@Override public void setNextDocId(int docId) { values.setDocument(docId); }
@Override public GeoPoint nextValue() throws IOException { if (count > 0) { return values.nextValue(); } else { return missing; } } };
@Override public void get(int docID, List<CharSequence> list) { values.setDocument(docID); for (int i = 0, count = values.count(); i < count; ++i) { list.add(values.valueAt(i).toString()); } } });
@Override public void setDocument(int docId) { values.setDocument(docId); count = values.count(); }
@Override public boolean advanceExact(int doc) throws IOException { if (values.advanceExact(doc)) { count = values.docValueCount(); } else { count = 0; } // always return true because we want to return a value even if // the document does not have a value return true; }
@Override public void get(List<CharSequence> list) throws IOException { for (int i = 0, count = values.docValueCount(); i < count; ++i) { list.add(values.nextValue().toString()); } } });
@Override public double doubleVal(int doc) throws IOException { if (values.advanceExact(doc)) { return values.nextValue().getLon(); } else { return 0.0; } } };
@Override public boolean advanceExact(int doc) throws IOException { return pointValues.advanceExact(doc); } };
@Override public GeoPoint valueAt(int index) { if (count > 0) { return values.valueAt(index); } else if (index == 0) { return missing; } else { throw new IndexOutOfBoundsException(); } }