You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2016/03/24 19:14:50 UTC
lucene-solr:branch_6x: LUCENE-7136: remove threads from
BaseGeoPointTestCase
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x 139aa0bec -> 39aaa108a
LUCENE-7136: remove threads from BaseGeoPointTestCase
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/39aaa108
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/39aaa108
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/39aaa108
Branch: refs/heads/branch_6x
Commit: 39aaa108ac8a85809080e4f7cf2b5ac0cc0d0fe9
Parents: 139aa0b
Author: Robert Muir <rm...@apache.org>
Authored: Thu Mar 24 14:13:24 2016 -0400
Committer: Robert Muir <rm...@apache.org>
Committed: Thu Mar 24 14:15:11 2016 -0400
----------------------------------------------------------------------
.../spatial/util/BaseGeoPointTestCase.java | 310 ++++++++-----------
1 file changed, 126 insertions(+), 184 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/39aaa108/lucene/spatial/src/test/org/apache/lucene/spatial/util/BaseGeoPointTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/spatial/src/test/org/apache/lucene/spatial/util/BaseGeoPointTestCase.java b/lucene/spatial/src/test/org/apache/lucene/spatial/util/BaseGeoPointTestCase.java
index 4d25451..fd97207 100644
--- a/lucene/spatial/src/test/org/apache/lucene/spatial/util/BaseGeoPointTestCase.java
+++ b/lucene/spatial/src/test/org/apache/lucene/spatial/util/BaseGeoPointTestCase.java
@@ -19,14 +19,11 @@ package org.apache.lucene.spatial.util;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashSet;
-import java.util.List;
import java.util.Locale;
import java.util.Set;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.lucene.analysis.MockAnalyzer;
@@ -325,7 +322,7 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
double[] lons = new double[numPoints];
Arrays.fill(lons, theLon);
- verify(small, lats, lons, false);
+ verify(small, lats, lons);
}
public void testAllLatEqual() throws Exception {
@@ -372,7 +369,7 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
lats[docID] = lat;
}
- verify(small, lats, lons, false);
+ verify(small, lats, lons);
}
public void testAllLonEqual() throws Exception {
@@ -421,7 +418,7 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
lons[docID] = theLon;
}
- verify(small, lats, lons, false);
+ verify(small, lats, lons);
}
public void testMultiValued() throws Exception {
@@ -535,25 +532,21 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
public void testRandomTiny() throws Exception {
// Make sure single-leaf-node case is OK:
- doTestRandom(10, false);
+ doTestRandom(10);
}
public void testRandomMedium() throws Exception {
- doTestRandom(10000, false);
- }
-
- public void testRandomWithThreads() throws Exception {
- doTestRandom(10000, true);
+ doTestRandom(10000);
}
@Nightly
public void testRandomBig() throws Exception {
assumeFalse("Direct codec can OOME on this test", TestUtil.getDocValuesFormat(FIELD_NAME).equals("Direct"));
assumeFalse("Memory codec can OOME on this test", TestUtil.getDocValuesFormat(FIELD_NAME).equals("Memory"));
- doTestRandom(200000, false);
+ doTestRandom(200000);
}
- private void doTestRandom(int count, boolean useThreads) throws Exception {
+ private void doTestRandom(int count) throws Exception {
int numPoints = atLeast(count);
@@ -621,7 +614,7 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
}
}
- verify(small, lats, lons, useThreads);
+ verify(small, lats, lons);
}
public double randomLat(boolean small) {
@@ -808,7 +801,7 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
protected abstract void describe(int docID, double lat, double lon);
}
- protected void verify(boolean small, double[] lats, double[] lons, boolean useThreads) throws Exception {
+ protected void verify(boolean small, double[] lats, double[] lons) throws Exception {
IndexWriterConfig iwc = newIndexWriterConfig();
// Else we can get O(N^2) merging:
int mbd = iwc.getMaxBufferedDocs();
@@ -852,189 +845,138 @@ public abstract class BaseGeoPointTestCase extends LuceneTestCase {
// We can't wrap with "exotic" readers because the BKD query must see the BKDDVFormat:
IndexSearcher s = newSearcher(r, false);
- if (useThreads) {
- // We must disable query cache otherwise test seed may not reproduce since different
- // threads may or may not get a cache hit or miss depending on order the JVM
- // schedules the threads:
- s.setQueryCache(null);
- }
-
- // Make sure queries are thread safe:
- int numThreads;
- if (useThreads) {
- numThreads = TestUtil.nextInt(random(), 2, 5);
- } else {
- numThreads = 1;
- }
-
- List<Thread> threads = new ArrayList<>();
final int iters = atLeast(75);
- final CountDownLatch startingGun = new CountDownLatch(1);
final AtomicBoolean failed = new AtomicBoolean();
- for(int i=0;i<numThreads;i++) {
- Thread thread = new Thread() {
+ NumericDocValues docIDToID = MultiDocValues.getNumericValues(r, "id");
+
+ for (int iter=0;iter<iters && failed.get() == false;iter++) {
+
+ if (VERBOSE) {
+ System.out.println("\n" + Thread.currentThread().getName() + ": TEST: iter=" + iter + " s=" + s);
+ }
+ Query query;
+ VerifyHits verifyHits;
+
+ if (random().nextBoolean()) {
+ // Rect: don't allow dateline crossing when testing small:
+ final GeoRect rect = randomRect(small, small == false);
+
+ query = newRectQuery(FIELD_NAME, rect.minLat, rect.maxLat, rect.minLon, rect.maxLon);
+
+ verifyHits = new VerifyHits() {
@Override
- public void run() {
- try {
- _run();
- } catch (Exception e) {
- failed.set(true);
- throw new RuntimeException(e);
- }
+ protected boolean shouldMatch(double pointLat, double pointLon) {
+ return rectContainsPoint(rect, pointLat, pointLon);
+ }
+ @Override
+ protected void describe(int docID, double lat, double lon) {
}
+ };
- private void _run() throws Exception {
- if (useThreads) {
- startingGun.await();
- }
+ } else if (random().nextBoolean()) {
+ // Distance
+ final boolean rangeQuery = random().nextBoolean();
+ final double centerLat = randomLat(small);
+ final double centerLon = randomLon(small);
+
+ double radiusMeters;
+ double minRadiusMeters;
+
+ if (small) {
+ // Approx 3 degrees lon at the equator:
+ radiusMeters = random().nextDouble() * 333000 + 1.0;
+ } else {
+ // So the query can cover at most 50% of the earth's surface:
+ radiusMeters = random().nextDouble() * GeoUtils.SEMIMAJOR_AXIS * Math.PI / 2.0 + 1.0;
+ }
+
+ // generate a random minimum radius between 1% and 95% the max radius
+ minRadiusMeters = (0.01 + 0.94 * random().nextDouble()) * radiusMeters;
+
+ if (VERBOSE) {
+ final DecimalFormat df = new DecimalFormat("#,###.00", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+ System.out.println(" radiusMeters = " + df.format(radiusMeters)
+ + ((rangeQuery == true) ? " minRadiusMeters = " + df.format(minRadiusMeters) : ""));
+ }
- NumericDocValues docIDToID = MultiDocValues.getNumericValues(r, "id");
-
- for (int iter=0;iter<iters && failed.get() == false;iter++) {
-
- if (VERBOSE) {
- System.out.println("\n" + Thread.currentThread().getName() + ": TEST: iter=" + iter + " s=" + s);
- }
- Query query;
- VerifyHits verifyHits;
-
- if (random().nextBoolean()) {
- // Rect: don't allow dateline crossing when testing small:
- final GeoRect rect = randomRect(small, small == false);
-
- query = newRectQuery(FIELD_NAME, rect.minLat, rect.maxLat, rect.minLon, rect.maxLon);
-
- verifyHits = new VerifyHits() {
- @Override
- protected boolean shouldMatch(double pointLat, double pointLon) {
- return rectContainsPoint(rect, pointLat, pointLon);
- }
- @Override
- protected void describe(int docID, double lat, double lon) {
- }
- };
-
- } else if (random().nextBoolean()) {
- // Distance
- final boolean rangeQuery = random().nextBoolean();
- final double centerLat = randomLat(small);
- final double centerLon = randomLon(small);
-
- double radiusMeters;
- double minRadiusMeters;
-
- if (small) {
- // Approx 3 degrees lon at the equator:
- radiusMeters = random().nextDouble() * 333000 + 1.0;
- } else {
- // So the query can cover at most 50% of the earth's surface:
- radiusMeters = random().nextDouble() * GeoUtils.SEMIMAJOR_AXIS * Math.PI / 2.0 + 1.0;
- }
-
- // generate a random minimum radius between 1% and 95% the max radius
- minRadiusMeters = (0.01 + 0.94 * random().nextDouble()) * radiusMeters;
-
- if (VERBOSE) {
- final DecimalFormat df = new DecimalFormat("#,###.00", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
- System.out.println(" radiusMeters = " + df.format(radiusMeters)
- + ((rangeQuery == true) ? " minRadiusMeters = " + df.format(minRadiusMeters) : ""));
- }
-
- try {
- if (rangeQuery == true) {
- query = newDistanceRangeQuery(FIELD_NAME, centerLat, centerLon, minRadiusMeters, radiusMeters);
- } else {
- query = newDistanceQuery(FIELD_NAME, centerLat, centerLon, radiusMeters);
- }
- } catch (IllegalArgumentException e) {
- if (e.getMessage().contains("exceeds maxRadius")) {
- continue;
- }
- throw e;
- }
-
- verifyHits = new VerifyHits() {
- @Override
- protected boolean shouldMatch(double pointLat, double pointLon) {
- if (rangeQuery == false) {
- return circleContainsPoint(centerLat, centerLon, radiusMeters, pointLat, pointLon);
- } else {
- return distanceRangeContainsPoint(centerLat, centerLon, minRadiusMeters, radiusMeters, pointLat, pointLon);
- }
- }
-
- @Override
- protected void describe(int docID, double pointLat, double pointLon) {
- double distanceMeters = SloppyMath.haversinMeters(centerLat, centerLon, pointLat, pointLon);
- System.out.println(" docID=" + docID + " centerLat=" + centerLat + " centerLon=" + centerLon
- + " pointLat=" + pointLat + " pointLon=" + pointLon + " distanceMeters=" + distanceMeters
- + " vs" + ((rangeQuery == true) ? " minRadiusMeters=" + minRadiusMeters : "") + " radiusMeters=" + radiusMeters);
- }
- };
-
- // TODO: get poly query working with dateline crossing too (how?)!
- } else {
-
- // TODO: poly query can't handle dateline crossing yet:
- final GeoRect bbox = randomRect(small, false);
-
- // Polygon
- double[] lats = new double[5];
- double[] lons = new double[5];
- lats[0] = bbox.minLat;
- lons[0] = bbox.minLon;
- lats[1] = bbox.maxLat;
- lons[1] = bbox.minLon;
- lats[2] = bbox.maxLat;
- lons[2] = bbox.maxLon;
- lats[3] = bbox.minLat;
- lons[3] = bbox.maxLon;
- lats[4] = bbox.minLat;
- lons[4] = bbox.minLon;
- query = newPolygonQuery(FIELD_NAME, lats, lons);
-
- verifyHits = new VerifyHits() {
- @Override
- protected boolean shouldMatch(double pointLat, double pointLon) {
- return polyRectContainsPoint(bbox, pointLat, pointLon);
- }
-
- @Override
- protected void describe(int docID, double lat, double lon) {
- }
- };
- }
-
- if (query != null) {
-
- if (VERBOSE) {
- System.out.println(" query=" + query);
- }
-
- verifyHits.test(failed, small, s, docIDToID, deleted, query, lats, lons);
- }
+ try {
+ if (rangeQuery == true) {
+ query = newDistanceRangeQuery(FIELD_NAME, centerLat, centerLon, minRadiusMeters, radiusMeters);
+ } else {
+ query = newDistanceQuery(FIELD_NAME, centerLat, centerLon, radiusMeters);
+ }
+ } catch (IllegalArgumentException e) {
+ if (e.getMessage().contains("exceeds maxRadius")) {
+ continue;
+ }
+ throw e;
+ }
+
+ verifyHits = new VerifyHits() {
+ @Override
+ protected boolean shouldMatch(double pointLat, double pointLon) {
+ if (rangeQuery == false) {
+ return circleContainsPoint(centerLat, centerLon, radiusMeters, pointLat, pointLon);
+ } else {
+ return distanceRangeContainsPoint(centerLat, centerLon, minRadiusMeters, radiusMeters, pointLat, pointLon);
}
}
- };
- thread.setName("T" + i);
- if (useThreads) {
- thread.start();
+
+ @Override
+ protected void describe(int docID, double pointLat, double pointLon) {
+ double distanceMeters = SloppyMath.haversinMeters(centerLat, centerLon, pointLat, pointLon);
+ System.out.println(" docID=" + docID + " centerLat=" + centerLat + " centerLon=" + centerLon
+ + " pointLat=" + pointLat + " pointLon=" + pointLon + " distanceMeters=" + distanceMeters
+ + " vs" + ((rangeQuery == true) ? " minRadiusMeters=" + minRadiusMeters : "") + " radiusMeters=" + radiusMeters);
+ }
+ };
+
+ // TODO: get poly query working with dateline crossing too (how?)!
} else {
- // Just run with main thread:
- thread.run();
+
+ // TODO: poly query can't handle dateline crossing yet:
+ final GeoRect bbox = randomRect(small, false);
+
+ // Polygon
+ double[] polyLats = new double[5];
+ double[] polyLons = new double[5];
+ polyLats[0] = bbox.minLat;
+ polyLons[0] = bbox.minLon;
+ polyLats[1] = bbox.maxLat;
+ polyLons[1] = bbox.minLon;
+ polyLats[2] = bbox.maxLat;
+ polyLons[2] = bbox.maxLon;
+ polyLats[3] = bbox.minLat;
+ polyLons[3] = bbox.maxLon;
+ polyLats[4] = bbox.minLat;
+ polyLons[4] = bbox.minLon;
+ query = newPolygonQuery(FIELD_NAME, polyLats, polyLons);
+
+ verifyHits = new VerifyHits() {
+ @Override
+ protected boolean shouldMatch(double pointLat, double pointLon) {
+ return polyRectContainsPoint(bbox, pointLat, pointLon);
+ }
+
+ @Override
+ protected void describe(int docID, double lat, double lon) {
+ }
+ };
}
- threads.add(thread);
- }
- if (useThreads) {
- startingGun.countDown();
- for(Thread thread : threads) {
- thread.join();
+
+ if (query != null) {
+
+ if (VERBOSE) {
+ System.out.println(" query=" + query);
+ }
+
+ verifyHits.test(failed, small, s, docIDToID, deleted, query, lats, lons);
}
}
+
IOUtils.close(r, dir);
- assertFalse(failed.get());
}
public void testRectBoundariesAreInclusive() throws Exception {