pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / spatial / src / java / org / apache / lucene / spatial / tier / DistanceFieldComparatorSource.java
diff --git a/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java b/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java
new file mode 100644 (file)
index 0000000..6dea63e
--- /dev/null
@@ -0,0 +1,123 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.spatial.tier;
+
+import java.io.IOException;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.FieldComparator;
+import org.apache.lucene.search.FieldComparatorSource;
+
+/**
+ * <p><font color="red"><b>NOTE:</b> This API is still in
+ * flux and might change in incompatible ways in the next
+ * release.</font>
+ */
+public class DistanceFieldComparatorSource extends FieldComparatorSource {
+
+  private static final long serialVersionUID = 1L;
+
+  private DistanceFilter distanceFilter;
+  private DistanceScoreDocLookupComparator dsdlc;
+
+  public DistanceFieldComparatorSource(Filter distanceFilter) {
+    this.distanceFilter = (DistanceFilter) distanceFilter;
+  }
+
+  public void cleanUp() {
+    distanceFilter = null;
+
+    if (dsdlc != null) {
+      dsdlc.cleanUp();
+    }
+
+    dsdlc = null;
+  }
+
+  @Override
+  public FieldComparator newComparator(String fieldname, int numHits,
+                                         int sortPos, boolean reversed) throws IOException {
+    dsdlc = new DistanceScoreDocLookupComparator(numHits);
+    return dsdlc;
+  }
+
+  private class DistanceScoreDocLookupComparator extends FieldComparator<Double> {
+
+    private double[] values;
+    private double bottom;
+    private int offset =0;
+               
+    public DistanceScoreDocLookupComparator(int numHits) {
+      values = new double[numHits];
+      return;
+    }
+
+    @Override
+    public int compare(int slot1, int slot2) {
+      double a = values[slot1];
+      double b = values[slot2];
+      if (a > b)
+        return 1;
+      if (a < b)
+        return -1;
+
+      return 0;
+    }
+
+    public void cleanUp() {
+      distanceFilter = null;
+    }
+
+    @Override
+    public int compareBottom(int doc) {
+      double v2 = distanceFilter.getDistance(doc+ offset);
+                       
+      if (bottom > v2) {
+        return 1;
+      } else if (bottom < v2) {
+        return -1;
+      }
+      return 0;
+    }
+
+    @Override
+    public void copy(int slot, int doc) {
+      values[slot] = distanceFilter.getDistance(doc + offset);
+    }
+
+    @Override
+    public void setBottom(int slot) {
+      this.bottom = values[slot];
+    }
+
+    @Override
+    public void setNextReader(IndexReader reader, int docBase)
+      throws IOException {
+                       
+      // each reader in a segmented base
+      // has an offset based on the maxDocs of previous readers
+      offset = docBase;
+    }
+
+    @Override
+    public Double value(int slot) {
+      return values[slot];
+    }
+  }
+}