From 5509306e4023649b98a3657d479a7ef4b15d32eb Mon Sep 17 00:00:00 2001 From: Patrick O'Leary Date: Wed, 10 Jun 2009 20:59:26 +0000 Subject: [PATCH] Fixed doc id's to bitset id for sorting with a multi segmented index FieldSourceComparator still uses bitset id's git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@783517 13f79535-47bb-0310-9956-ffa450edef68 --- .../spatial/tier/CartesianShapeFilter.java | 4 +- .../tier/DistanceFieldComparatorSource.java | 39 ++++++++++--------- .../spatial/tier/LatLongDistanceFilter.java | 37 +++++++++++++----- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianShapeFilter.java b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianShapeFilter.java index 11f049b7f7b..4568b957d77 100644 --- a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianShapeFilter.java +++ b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianShapeFilter.java @@ -51,7 +51,7 @@ public class CartesianShapeFilter extends Filter { TermDocs termDocs = reader.termDocs(); List area = shape.getArea(); int sz = area.size(); - log.info("Area size "+ sz); + log.fine("Area size "+ sz); // iterate through each boxid for (int i =0; i< sz; i++) { @@ -68,7 +68,7 @@ public class CartesianShapeFilter extends Filter { } long end = System.currentTimeMillis(); - log.info("BoundaryBox Time Taken: "+ (end - start) + " found: "+bits.cardinality()+" candidates"); + log.fine("BoundaryBox Time Taken: "+ (end - start) + " found: "+bits.cardinality()+" candidates"); return bits; } diff --git a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java index 8050c46dd27..8530414f07f 100644 --- a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java +++ b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceFieldComparatorSource.java @@ -48,8 +48,8 @@ public class DistanceFieldComparatorSource extends FieldComparatorSource { } @Override - public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed) - throws IOException { + public FieldComparator newComparator(String fieldname, int numHits, + int sortPos, boolean reversed) throws IOException { dsdlc = new DistanceScoreDocLookupComparator(distanceFilter, numHits); return dsdlc; } @@ -59,8 +59,10 @@ public class DistanceFieldComparatorSource extends FieldComparatorSource { private DistanceFilter distanceFilter; private double[] values; private double bottom; - - public DistanceScoreDocLookupComparator(DistanceFilter distanceFilter, int numHits) { + private int offset =0; + + public DistanceScoreDocLookupComparator(DistanceFilter distanceFilter, + int numHits) { this.distanceFilter = distanceFilter; values = new double[numHits]; return; @@ -78,26 +80,25 @@ public class DistanceFieldComparatorSource extends FieldComparatorSource { return 0; } - - public void cleanUp() { distanceFilter = null; } @Override public int compareBottom(int doc) { - final double v2 = distanceFilter.getDistance(doc); - if (bottom > v2) { - return 1; - } else if (bottom < v2) { - return -1; - } + 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); + values[slot] = distanceFilter.getDistance(doc + offset); } @Override @@ -107,10 +108,12 @@ public class DistanceFieldComparatorSource extends FieldComparatorSource { } @Override - public void setNextReader(IndexReader reader, int docBase, int numSlotsFull) - throws IOException { - // TODO Auto-generated method stub - + public void setNextReader(IndexReader reader, int docBase, + int numSlotsFull) throws IOException { + + // each reader in a segmented base + // has an offset based on the maxDocs of previous readers + offset = docBase; } @Override @@ -120,7 +123,7 @@ public class DistanceFieldComparatorSource extends FieldComparatorSource { @Override public int sortType() { - + return SortField.DOUBLE; } } diff --git a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/LatLongDistanceFilter.java b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/LatLongDistanceFilter.java index 588cc996700..65d3f7c1f54 100644 --- a/contrib/spatial/src/java/org/apache/lucene/spatial/tier/LatLongDistanceFilter.java +++ b/contrib/spatial/src/java/org/apache/lucene/spatial/tier/LatLongDistanceFilter.java @@ -45,7 +45,7 @@ public class LatLongDistanceFilter extends DistanceFilter { String latField; String lngField; Logger log = Logger.getLogger(getClass().getName()); - int offset =0; + int nextOffset = 0; Map distances = null; @@ -89,12 +89,18 @@ public class LatLongDistanceFilter extends DistanceFilter { // distances for the same point // TODO: Why is this a WeakHashMap? WeakHashMap cdistance = new WeakHashMap(maxdocs); - + long start = System.currentTimeMillis(); String[] latIndex = FieldCache.DEFAULT.getStrings(reader, latField); String[] lngIndex = FieldCache.DEFAULT.getStrings(reader, lngField); /* store calculated distances for reuse by other components */ distances = new HashMap(maxdocs); + + + if (distances == null){ + distances = new HashMap(); + } + for (int i = 0 ; i < maxdocs; i++) { String sx = latIndex[i]; @@ -121,11 +127,22 @@ public class LatLongDistanceFilter extends DistanceFilter { } distances.put(i, d); + // why was i storing all distances again? if (d < distance){ bits.set(i); + distances.put(i+ nextOffset, d); // include nextOffset for multi segment reader } + i = bits.nextSetBit(i+1); } + int size = bits.cardinality(); + nextOffset += reader.maxDoc(); // this should be something that's part of indexReader + long end = System.currentTimeMillis(); + log.fine("Bits 1: Time taken : "+ (end - start) + + ", results : "+ distances.size() + + ", cached : "+ cdistance.size() + + ", incoming size: "+ size+ + ", nextOffset: "+ nextOffset); return bits; } @@ -146,13 +163,9 @@ public class LatLongDistanceFilter extends DistanceFilter { HashMap cdistance = new HashMap(size); - /* store calculated distances for reuse by other components */ - boolean db = false; - offset += reader.maxDoc(); + if (distances == null){ distances = new HashMap(); - }else { - db=true; } long start = System.currentTimeMillis(); @@ -193,20 +206,24 @@ public class LatLongDistanceFilter extends DistanceFilter { // why was i storing all distances again? if (d < distance){ result.set(i); - distances.put(i+ nextOffset, d); // include nextOffset for multireader + int did = i + nextOffset; + distances.put(did, d); // include nextOffset for multi segment reader + } i = bits.nextSetBit(i+1); } long end = System.currentTimeMillis(); + nextOffset += reader.maxDoc(); // this should be something that's part of indexReader log.fine("Time taken : "+ (end - start) + ", results : "+ distances.size() + ", cached : "+ cdistance.size() + - ", incoming size: "+ size); + ", incoming size: "+ size+ + ", nextOffset: "+ nextOffset); cdistance = null; - nextOffset += offset; // this should be something that's part of indexReader + return result; }