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 2014/10/04 17:08:35 UTC
svn commit: r1629403 [2/4] - in /lucene/dev/branches/lucene5969: ./
dev-tools/ dev-tools/scripts/ lucene/ lucene/backward-codecs/
lucene/backward-codecs/src/test/org/apache/lucene/index/ lucene/core/
lucene/core/src/java/org/apache/lucene/document/ luc...
Modified: lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermConstantScore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermConstantScore.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermConstantScore.java (original)
+++ lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermConstantScore.java Sat Oct 4 15:08:32 2014
@@ -160,7 +160,7 @@ public class TestMultiTermConstantScore
result[i].score, SCORE_COMP_THRESH);
}
- result = search.search(csrq("data", "1", "6", T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, 1000).scoreDocs;
+ result = search.search(csrq("data", "1", "6", T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, 1000).scoreDocs;
numHits = result.length;
assertEquals("wrong number of results", 6, numHits);
for (int i = 0; i < numHits; i++) {
@@ -204,7 +204,7 @@ public class TestMultiTermConstantScore
bq = new BooleanQuery();
bq.add(dummyTerm, BooleanClause.Occur.SHOULD); // hits one doc
- bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), BooleanClause.Occur.SHOULD); // hits no docs
+ bq.add(csrq("data", "#", "#", T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), BooleanClause.Occur.SHOULD); // hits no docs
result = search.search(bq, null, 1000).scoreDocs;
numHits = result.length;
assertEquals("wrong number of results", 1, numHits);
@@ -346,37 +346,37 @@ public class TestMultiTermConstantScore
result = search.search(csrq("id", minIP, maxIP, T, T), null, numDocs).scoreDocs;
assertEquals("find all", numDocs, result.length);
- result = search.search(csrq("id", minIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("find all", numDocs, result.length);
result = search.search(csrq("id", minIP, maxIP, T, F), null, numDocs).scoreDocs;
assertEquals("all but last", numDocs - 1, result.length);
- result = search.search(csrq("id", minIP, maxIP, T, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, maxIP, T, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("all but last", numDocs - 1, result.length);
result = search.search(csrq("id", minIP, maxIP, F, T), null, numDocs).scoreDocs;
assertEquals("all but first", numDocs - 1, result.length);
- result = search.search(csrq("id", minIP, maxIP, F, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, maxIP, F, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("all but first", numDocs - 1, result.length);
result = search.search(csrq("id", minIP, maxIP, F, F), null, numDocs).scoreDocs;
assertEquals("all but ends", numDocs - 2, result.length);
- result = search.search(csrq("id", minIP, maxIP, F, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, maxIP, F, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("all but ends", numDocs - 2, result.length);
result = search.search(csrq("id", medIP, maxIP, T, T), null, numDocs).scoreDocs;
assertEquals("med and up", 1 + maxId - medId, result.length);
- result = search.search(csrq("id", medIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", medIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("med and up", 1 + maxId - medId, result.length);
result = search.search(csrq("id", minIP, medIP, T, T), null, numDocs).scoreDocs;
assertEquals("up to med", 1 + medId - minId, result.length);
- result = search.search(csrq("id", minIP, medIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, medIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("up to med", 1 + medId - minId, result.length);
// unbounded id
@@ -404,49 +404,49 @@ public class TestMultiTermConstantScore
result = search.search(csrq("id", minIP, minIP, F, F), null, numDocs).scoreDocs;
assertEquals("min,min,F,F", 0, result.length);
- result = search.search(csrq("id", minIP, minIP, F, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, minIP, F, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("min,min,F,F", 0, result.length);
result = search.search(csrq("id", medIP, medIP, F, F), null, numDocs).scoreDocs;
assertEquals("med,med,F,F", 0, result.length);
- result = search.search(csrq("id", medIP, medIP, F, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", medIP, medIP, F, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("med,med,F,F", 0, result.length);
result = search.search(csrq("id", maxIP, maxIP, F, F), null, numDocs).scoreDocs;
assertEquals("max,max,F,F", 0, result.length);
- result = search.search(csrq("id", maxIP, maxIP, F, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", maxIP, maxIP, F, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("max,max,F,F", 0, result.length);
result = search.search(csrq("id", minIP, minIP, T, T), null, numDocs).scoreDocs;
assertEquals("min,min,T,T", 1, result.length);
- result = search.search(csrq("id", minIP, minIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", minIP, minIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("min,min,T,T", 1, result.length);
result = search.search(csrq("id", null, minIP, F, T), null, numDocs).scoreDocs;
assertEquals("nul,min,F,T", 1, result.length);
- result = search.search(csrq("id", null, minIP, F, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", null, minIP, F, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("nul,min,F,T", 1, result.length);
result = search.search(csrq("id", maxIP, maxIP, T, T), null, numDocs).scoreDocs;
assertEquals("max,max,T,T", 1, result.length);
- result = search.search(csrq("id", maxIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", maxIP, maxIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("max,max,T,T", 1, result.length);
result = search.search(csrq("id", maxIP, null, T, F), null, numDocs).scoreDocs;
assertEquals("max,nul,T,T", 1, result.length);
- result = search.search(csrq("id", maxIP, null, T, F, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", maxIP, null, T, F, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("max,nul,T,T", 1, result.length);
result = search.search(csrq("id", medIP, medIP, T, T), null, numDocs).scoreDocs;
assertEquals("med,med,T,T", 1, result.length);
- result = search.search(csrq("id", medIP, medIP, T, T, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT), null, numDocs).scoreDocs;
+ result = search.search(csrq("id", medIP, medIP, T, T, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE), null, numDocs).scoreDocs;
assertEquals("med,med,T,T", 1, result.length);
}
Modified: lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java (original)
+++ lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestMultiTermQueryRewrites.java Sat Oct 4 15:08:32 2014
@@ -138,12 +138,6 @@ public class TestMultiTermQueryRewrites
// use a large PQ here to only test duplicate terms and dont mix up when all scores are equal
checkDuplicateTerms(new MultiTermQuery.TopTermsScoringBooleanQueryRewrite(1024));
checkDuplicateTerms(new MultiTermQuery.TopTermsBoostOnlyBooleanQueryRewrite(1024));
-
- // Test auto rewrite (but only boolean mode), so we set the limits to large values to always get a BQ
- final MultiTermQuery.ConstantScoreAutoRewrite rewrite = new MultiTermQuery.ConstantScoreAutoRewrite();
- rewrite.setTermCountCutoff(Integer.MAX_VALUE);
- rewrite.setDocCountPercent(100.);
- checkDuplicateTerms(rewrite);
}
private void checkBooleanQueryBoosts(BooleanQuery bq) {
@@ -235,7 +229,6 @@ public class TestMultiTermQueryRewrites
checkMaxClauseLimitation(MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE);
checkNoMaxClauseLimitation(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
- checkNoMaxClauseLimitation(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
checkNoMaxClauseLimitation(new MultiTermQuery.TopTermsScoringBooleanQueryRewrite(1024));
checkNoMaxClauseLimitation(new MultiTermQuery.TopTermsBoostOnlyBooleanQueryRewrite(1024));
}
Modified: lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestWildcard.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestWildcard.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestWildcard.java (original)
+++ lucene/dev/branches/lucene5969/lucene/core/src/test/org/apache/lucene/search/TestWildcard.java Sat Oct 4 15:08:32 2014
@@ -87,12 +87,6 @@ public class TestWildcard
assertTrue(q instanceof ConstantScoreQuery);
assertEquals(q.getBoost(), wq.getBoost(), 0.1);
- wq.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
- wq.setBoost(0.3F);
- q = searcher.rewrite(wq);
- assertTrue(q instanceof ConstantScoreQuery);
- assertEquals(q.getBoost(), wq.getBoost(), 0.1);
-
wq.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE);
wq.setBoost(0.4F);
q = searcher.rewrite(wq);
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/AssociationsFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/AssociationsFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/AssociationsFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/AssociationsFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -38,6 +38,7 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.store.Directory;
@@ -61,7 +62,7 @@ public class AssociationsFacetsExample {
/** Build the example index. */
private void index() throws IOException {
- IndexWriterConfig iwc = new IndexWriterConfig(new WhitespaceAnalyzer());
+ IndexWriterConfig iwc = new IndexWriterConfig(new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE);
IndexWriter indexWriter = new IndexWriter(indexDir, iwc);
// Writes facet ords to a separate directory from the main index
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -41,6 +41,7 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queries.BooleanFilter;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.BooleanClause;
@@ -54,8 +55,6 @@ import org.apache.lucene.store.Directory
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.SloppyMath;
-
-
/** Shows simple usage of dynamic range faceting, using the
* expressions module to calculate distance. */
public class DistanceFacetsExample implements Closeable {
@@ -88,7 +87,7 @@ public class DistanceFacetsExample imple
/** Build the example index. */
public void index() throws IOException {
IndexWriter writer = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
// TODO: we could index in radians instead ... saves all the conversions in getBoundingBoxFilter
@@ -246,7 +245,6 @@ public class DistanceFacetsExample imple
}
/** Runs the search and drill-down examples and prints the results. */
- @SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
DistanceFacetsExample example = new DistanceFacetsExample();
example.index();
@@ -255,7 +253,6 @@ public class DistanceFacetsExample imple
System.out.println("-----------------------");
System.out.println(example.search());
- System.out.println("\n");
System.out.println("Distance facet drill-down example (field/< 2 km):");
System.out.println("---------------------------------------------");
TopDocs hits = example.drillDown(example.TWO_KM);
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/ExpressionAggregationFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/ExpressionAggregationFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/ExpressionAggregationFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/ExpressionAggregationFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -23,6 +23,7 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.SortField;
@@ -59,7 +60,7 @@ public class ExpressionAggregationFacets
/** Build the example index. */
private void index() throws IOException {
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
// Writes facet ords to a separate directory from the main index
DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/MultiCategoryListsFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/MultiCategoryListsFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/MultiCategoryListsFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/MultiCategoryListsFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -35,6 +35,7 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.store.Directory;
@@ -47,7 +48,7 @@ public class MultiCategoryListsFacetsExa
private final Directory taxoDir = new RAMDirectory();
private final FacetsConfig config = new FacetsConfig();
- /** Creates a new instance and populates the catetory list params mapping. */
+ /** Creates a new instance and populates the category list params mapping. */
public MultiCategoryListsFacetsExample() {
config.setIndexFieldName("Author", "author");
config.setIndexFieldName("Publish Date", "pubdate");
@@ -57,7 +58,7 @@ public class MultiCategoryListsFacetsExa
/** Build the example index. */
private void index() throws IOException {
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
// Writes facet ords to a separate directory from the main index
DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/RangeFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/RangeFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/RangeFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/RangeFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -35,6 +35,7 @@ import org.apache.lucene.facet.range.Lon
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
@@ -42,8 +43,6 @@ import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
-
-
/** Shows simple usage of dynamic range faceting. */
public class RangeFacetsExample implements Closeable {
@@ -61,7 +60,7 @@ public class RangeFacetsExample implemen
/** Build the example index. */
public void index() throws IOException {
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
// Add documents with a fake timestamp, 1000 sec before
// "now", 2000 sec before "now", ...:
@@ -121,7 +120,6 @@ public class RangeFacetsExample implemen
}
/** Runs the search and drill-down examples and prints the results. */
- @SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
RangeFacetsExample example = new RangeFacetsExample();
example.index();
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -38,6 +38,7 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.store.Directory;
@@ -58,7 +59,7 @@ public class SimpleFacetsExample {
/** Build the example index. */
private void index() throws IOException {
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
// Writes facet ords to a separate directory from the main index
DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
@@ -228,24 +229,21 @@ public class SimpleFacetsExample {
public static void main(String[] args) throws Exception {
System.out.println("Facet counting example:");
System.out.println("-----------------------");
- SimpleFacetsExample example1 = new SimpleFacetsExample();
- List<FacetResult> results1 = example1.runFacetOnly();
+ SimpleFacetsExample example = new SimpleFacetsExample();
+ List<FacetResult> results1 = example.runFacetOnly();
System.out.println("Author: " + results1.get(0));
System.out.println("Publish Date: " + results1.get(1));
System.out.println("Facet counting example (combined facets and search):");
System.out.println("-----------------------");
- SimpleFacetsExample example = new SimpleFacetsExample();
List<FacetResult> results = example.runSearch();
System.out.println("Author: " + results.get(0));
System.out.println("Publish Date: " + results.get(1));
- System.out.println("\n");
System.out.println("Facet drill-down example (Publish Date/2010):");
System.out.println("---------------------------------------------");
System.out.println("Author: " + example.runDrillDown());
- System.out.println("\n");
System.out.println("Facet drill-sideways example (Publish Date/2010):");
System.out.println("---------------------------------------------");
for(FacetResult result : example.runDrillSideways()) {
Modified: lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleSortedSetFacetsExample.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleSortedSetFacetsExample.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleSortedSetFacetsExample.java (original)
+++ lucene/dev/branches/lucene5969/lucene/demo/src/java/org/apache/lucene/demo/facet/SimpleSortedSetFacetsExample.java Sat Oct 4 15:08:32 2014
@@ -35,6 +35,7 @@ import org.apache.lucene.facet.sortedset
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.store.Directory;
@@ -56,7 +57,7 @@ public class SimpleSortedSetFacetsExampl
/** Build the example index. */
private void index() throws IOException {
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(
- new WhitespaceAnalyzer()));
+ new WhitespaceAnalyzer()).setOpenMode(OpenMode.CREATE));
Document doc = new Document();
doc.add(new SortedSetDocValuesFacetField("Author", "Bob"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "2010"));
Modified: lucene/dev/branches/lucene5969/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (original)
+++ lucene/dev/branches/lucene5969/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java Sat Oct 4 15:08:32 2014
@@ -17,15 +17,6 @@ package org.apache.lucene.index.memory;
* limitations under the License.
*/
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
@@ -36,8 +27,8 @@ import org.apache.lucene.index.LeafReade
import org.apache.lucene.index.BinaryDocValues;
import org.apache.lucene.index.DocsAndPositionsEnum;
import org.apache.lucene.index.DocsEnum;
-import org.apache.lucene.index.FieldInfo.IndexOptions;
import org.apache.lucene.index.FieldInfo;
+import org.apache.lucene.index.FieldInfo.IndexOptions;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.FieldInvertState;
import org.apache.lucene.index.Fields;
@@ -55,21 +46,30 @@ import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.SimpleCollector;
import org.apache.lucene.search.similarities.Similarity;
-import org.apache.lucene.store.RAMDirectory; // for javadocs
+import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.ByteBlockPool;
import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.BytesRefHash.DirectBytesStartArray;
import org.apache.lucene.util.BytesRefHash;
+import org.apache.lucene.util.BytesRefHash.DirectBytesStartArray;
import org.apache.lucene.util.Counter;
+import org.apache.lucene.util.IntBlockPool;
import org.apache.lucene.util.IntBlockPool.SliceReader;
import org.apache.lucene.util.IntBlockPool.SliceWriter;
-import org.apache.lucene.util.IntBlockPool;
import org.apache.lucene.util.RamUsageEstimator;
import org.apache.lucene.util.RecyclingByteBlockAllocator;
import org.apache.lucene.util.RecyclingIntBlockAllocator;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
/**
* High-performance single-document main memory Apache Lucene fulltext search index.
@@ -153,18 +153,12 @@ import org.apache.lucene.util.RecyclingI
* </pre>
*
*
- * <h4>No thread safety guarantees</h4>
- *
- * An instance can be queried multiple times with the same or different queries,
- * but an instance is not thread-safe. If desired use idioms such as:
- * <pre class="prettyprint">
- * MemoryIndex index = ...
- * synchronized (index) {
- * // read and/or write index (i.e. add fields and/or query)
- * }
- * </pre>
- *
- *
+ * <h4>Thread safety guarantees</h4>
+ *
+ * MemoryIndex is not normally thread-safe for adds or queries. However, queries
+ * are thread-safe after {@code freeze()} has been called.
+ *
+ *
* <h4>Performance Notes</h4>
*
* Internally there's a new data structure geared towards efficient indexing
@@ -212,6 +206,8 @@ public class MemoryIndex {
private HashMap<String,FieldInfo> fieldInfos = new HashMap<>();
private Counter bytesUsed;
+
+ private boolean frozen = false;
/**
* Sorts term entries into ascending order; also works for
@@ -417,6 +413,8 @@ public class MemoryIndex {
*/
public void addField(String fieldName, TokenStream stream, float boost, int positionIncrementGap, int offsetGap) {
try {
+ if (frozen)
+ throw new IllegalArgumentException("Cannot call addField() when MemoryIndex is frozen");
if (fieldName == null)
throw new IllegalArgumentException("fieldName must not be null");
if (stream == null)
@@ -513,6 +511,20 @@ public class MemoryIndex {
reader.setSearcher(searcher); // to later get hold of searcher.getSimilarity()
return searcher;
}
+
+ /**
+ * Prepares the MemoryIndex for querying in a non-lazy way.
+ *
+ * After calling this you can query the MemoryIndex from multiple threads, but you
+ * cannot subsequently add new data.
+ */
+ public void freeze() {
+ this.frozen = true;
+ sortFields();
+ for (Map.Entry<String,Info> info : sortedFields) {
+ info.getValue().sortTerms();
+ }
+ }
/**
* Convenience method that efficiently returns the relevance score by
@@ -684,10 +696,10 @@ public class MemoryIndex {
private final long sumTotalTermFreq;
/** the last position encountered in this field for multi field support*/
- private int lastPosition;
+ private final int lastPosition;
/** the last offset encountered in this field for multi field support*/
- private int lastOffset;
+ private final int lastOffset;
public Info(BytesRefHash terms, SliceByteStartArray sliceArray, int numTokens, int numOverlapTokens, float boost, int lastPosition, int lastOffset, long sumTotalTermFreq) {
this.terms = terms;
@@ -1229,6 +1241,7 @@ public class MemoryIndex {
this.sortedFields = null;
byteBlockPool.reset(false, false); // no need to 0-fill the buffers
intBlockPool.reset(true, false); // here must must 0-fill since we use slices
+ this.frozen = false;
}
private static final class SliceByteStartArray extends DirectBytesStartArray {
Modified: lucene/dev/branches/lucene5969/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java Sat Oct 4 15:08:32 2014
@@ -17,15 +17,6 @@ package org.apache.lucene.queries;
* limitations under the License.
*/
-import org.apache.lucene.index.*;
-import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.util.ArrayUtil;
-import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.FixedBitSet;
-
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -33,6 +24,20 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import org.apache.lucene.index.DocsEnum;
+import org.apache.lucene.index.Fields;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.util.ArrayUtil;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.DocIdSetBuilder;
+
/**
* Constructs a filter for docs matching any of the terms added to this class.
* Unlike a RangeFilter this can be used for filtering on multiple terms that are not necessarily in
@@ -178,11 +183,11 @@ public final class TermsFilter extends F
@Override
public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
final LeafReader reader = context.reader();
- FixedBitSet result = null; // lazy init if needed - no need to create a big bitset ahead of time
+ DocIdSetBuilder builder = new DocIdSetBuilder(reader.maxDoc());
final Fields fields = reader.fields();
final BytesRef spare = new BytesRef(this.termsBytes);
if (fields == null) {
- return result;
+ return builder.build();
}
Terms terms = null;
TermsEnum termsEnum = null;
@@ -195,21 +200,12 @@ public final class TermsFilter extends F
spare.length = offsets[i+1] - offsets[i];
if (termsEnum.seekExact(spare)) {
docs = termsEnum.docs(acceptDocs, docs, DocsEnum.FLAG_NONE); // no freq since we don't need them
- if (result == null) {
- if (docs.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
- result = new FixedBitSet(reader.maxDoc());
- // lazy init but don't do it in the hot loop since we could read many docs
- result.set(docs.docID());
- }
- }
- while (docs.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
- result.set(docs.docID());
- }
+ builder.or(docs);
}
}
}
}
- return result;
+ return builder.build();
}
@Override
Modified: lucene/dev/branches/lucene5969/lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java Sat Oct 4 15:08:32 2014
@@ -28,19 +28,19 @@ import java.util.Set;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
-import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.MultiReader;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.SlowCompositeReaderWrapper;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java Sat Oct 4 15:08:32 2014
@@ -61,7 +61,7 @@ public abstract class QueryParserBase ex
Operator operator = OR_OPERATOR;
boolean lowercaseExpandedTerms = true;
- MultiTermQuery.RewriteMethod multiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
+ MultiTermQuery.RewriteMethod multiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE;
boolean allowLeadingWildcard = false;
protected String field;
@@ -274,7 +274,7 @@ public abstract class QueryParserBase ex
}
/**
- * By default QueryParser uses {@link org.apache.lucene.search.MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}
+ * By default QueryParser uses {@link org.apache.lucene.search.MultiTermQuery#CONSTANT_SCORE_FILTER_REWRITE}
* when creating a {@link PrefixQuery}, {@link WildcardQuery} or {@link TermRangeQuery}. This implementation is generally preferable because it
* a) Runs faster b) Does not have the scarcity of terms unduly influence score
* c) avoids any {@link TooManyClauses} exception.
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/CommonQueryParserConfiguration.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/CommonQueryParserConfiguration.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/CommonQueryParserConfiguration.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/CommonQueryParserConfiguration.java Sat Oct 4 15:08:32 2014
@@ -73,7 +73,7 @@ public interface CommonQueryParserConfig
/**
* By default, it uses
- * {@link MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT} when creating a
+ * {@link MultiTermQuery#CONSTANT_SCORE_FILTER_REWRITE} when creating a
* prefix, wildcard and range queries. This implementation is generally
* preferable because it a) Runs faster b) Does not have the scarcity of terms
* unduly influence score c) avoids any {@link TooManyListenersException}
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java Sat Oct 4 15:08:32 2014
@@ -265,7 +265,7 @@ public class StandardQueryParser extends
/**
* By default, it uses
- * {@link MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT} when creating a
+ * {@link MultiTermQuery#CONSTANT_SCORE_FILTER_REWRITE} when creating a
* prefix, wildcard and range queries. This implementation is generally
* preferable because it a) Runs faster b) Does not have the scarcity of terms
* unduly influence score c) avoids any {@link TooManyListenersException}
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java Sat Oct 4 15:08:32 2014
@@ -208,7 +208,7 @@ public class StandardQueryConfigHandler
set(ConfigurationKeys.FIELD_BOOST_MAP, new LinkedHashMap<String, Float>());
set(ConfigurationKeys.FUZZY_CONFIG, new FuzzyConfig());
set(ConfigurationKeys.LOCALE, Locale.getDefault());
- set(ConfigurationKeys.MULTI_TERM_REWRITE_METHOD, MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
+ set(ConfigurationKeys.MULTI_TERM_REWRITE_METHOD, MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
set(ConfigurationKeys.FIELD_DATE_RESOLUTION_MAP, new HashMap<CharSequence, DateTools.Resolution>());
}
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiTermRewriteMethodProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiTermRewriteMethodProcessor.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiTermRewriteMethodProcessor.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiTermRewriteMethodProcessor.java Sat Oct 4 15:08:32 2014
@@ -30,7 +30,7 @@ import org.apache.lucene.search.MultiTer
/**
* This processor instates the default
* {@link org.apache.lucene.search.MultiTermQuery.RewriteMethod},
- * {@link MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}, for multi-term
+ * {@link MultiTermQuery#CONSTANT_SCORE_FILTER_REWRITE}, for multi-term
* query nodes.
*/
public class MultiTermRewriteMethodProcessor extends QueryNodeProcessorImpl {
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java Sat Oct 4 15:08:32 2014
@@ -321,15 +321,15 @@ public class TestQPHelper extends Lucene
StandardQueryParser qp = new StandardQueryParser(new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
Query q = qp.parse("foo*bar", "field");
assertTrue(q instanceof WildcardQuery);
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE, ((MultiTermQuery) q).getRewriteMethod());
q = qp.parse("foo*", "field");
assertTrue(q instanceof PrefixQuery);
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE, ((MultiTermQuery) q).getRewriteMethod());
q = qp.parse("[a TO z]", "field");
assertTrue(q instanceof TermRangeQuery);
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE, ((MultiTermQuery) q).getRewriteMethod());
}
public void testCJK() throws Exception {
@@ -659,7 +659,7 @@ public class TestQPHelper extends Lucene
public void testRange() throws Exception {
assertQueryEquals("[ a TO z]", null, "[a TO z]");
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((TermRangeQuery)getQuery("[ a TO z]", null)).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE, ((TermRangeQuery)getQuery("[ a TO z]", null)).getRewriteMethod());
StandardQueryParser qp = new StandardQueryParser();
@@ -1152,7 +1152,7 @@ public class TestQPHelper extends Lucene
assertTrue(qp.parse("/[A-Z][123]/^0.5", df) instanceof RegexpQuery);
assertEquals(q, qp.parse("/[A-Z][123]/^0.5", df));
assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE, ((RegexpQuery)qp.parse("/[A-Z][123]/^0.5", df)).getRewriteMethod());
- qp.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
+ qp.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
Query escaped = new RegexpQuery(new Term("field", "[a-z]\\/[123]"));
assertEquals(escaped, qp.parse("/[a-z]\\/[123]/", df));
Modified: lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java (original)
+++ lucene/dev/branches/lucene5969/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java Sat Oct 4 15:08:32 2014
@@ -571,7 +571,7 @@ public abstract class QueryParserTestBas
assertQueryEquals("[ a TO z}", null, "[a TO z}");
assertQueryEquals("{ a TO z]", null, "{a TO z]");
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((TermRangeQuery)getQuery("[ a TO z]")).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE, ((TermRangeQuery)getQuery("[ a TO z]")).getRewriteMethod());
CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.SIMPLE, true));
@@ -987,7 +987,7 @@ public abstract class QueryParserTestBas
assertTrue(getQuery("/[A-Z][123]/^0.5",qp) instanceof RegexpQuery);
assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE, ((RegexpQuery)getQuery("/[A-Z][123]/^0.5",qp)).getRewriteMethod());
assertEquals(q, getQuery("/[A-Z][123]/^0.5",qp));
- qp.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
+ qp.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
Query escaped = new RegexpQuery(new Term("field", "[a-z]\\/[123]"));
assertEquals(escaped, getQuery("/[a-z]\\/[123]/",qp));
Modified: lucene/dev/branches/lucene5969/lucene/replicator/src/test/org/apache/lucene/replicator/IndexAndTaxonomyReplicationClientTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/replicator/src/test/org/apache/lucene/replicator/IndexAndTaxonomyReplicationClientTest.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/replicator/src/test/org/apache/lucene/replicator/IndexAndTaxonomyReplicationClientTest.java (original)
+++ lucene/dev/branches/lucene5969/lucene/replicator/src/test/org/apache/lucene/replicator/IndexAndTaxonomyReplicationClientTest.java Sat Oct 4 15:08:32 2014
@@ -412,16 +412,18 @@ public class IndexAndTaxonomyReplication
// verify taxonomy index is fully consistent (since we only add one
// category to all documents, there's nothing much more to validate.
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
- CheckIndex checker = new CheckIndex(handlerTaxoDir.getDelegate());
- checker.setFailFast(true);
- checker.setInfoStream(new PrintStream(bos, false, IOUtils.UTF_8), false);
CheckIndex.Status indexStatus = null;
- try {
- indexStatus = checker.checkIndex(null);
- } catch (IOException ioe) {
- // ok: we fallback below
- } catch (RuntimeException re) {
- // ok: we fallback below
+
+ try (CheckIndex checker = new CheckIndex(handlerTaxoDir.getDelegate())) {
+ checker.setFailFast(true);
+ checker.setInfoStream(new PrintStream(bos, false, IOUtils.UTF_8), false);
+ try {
+ indexStatus = checker.checkIndex(null);
+ } catch (IOException ioe) {
+ // ok: we fallback below
+ } catch (RuntimeException re) {
+ // ok: we fallback below
+ }
}
if (indexStatus == null || indexStatus.clean == false) {
Modified: lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java (original)
+++ lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java Sat Oct 4 15:08:32 2014
@@ -16,15 +16,21 @@ package org.apache.lucene.sandbox.querie
* limitations under the License.
*/
-import org.apache.lucene.index.*;
+import java.io.IOException;
+
+import org.apache.lucene.index.DocsEnum;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.SlowCompositeReaderWrapper;
+import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Filter;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.FixedBitSet;
-
-import java.io.IOException;
+import org.apache.lucene.util.SparseFixedBitSet;
/**
* Filter to remove duplicate values from search results.
@@ -87,8 +93,8 @@ public class DuplicateFilter extends Fil
}
}
- private FixedBitSet correctBits(LeafReader reader, Bits acceptDocs) throws IOException {
- FixedBitSet bits = new FixedBitSet(reader.maxDoc()); //assume all are INvalid
+ private SparseFixedBitSet correctBits(LeafReader reader, Bits acceptDocs) throws IOException {
+ SparseFixedBitSet bits = new SparseFixedBitSet(reader.maxDoc()); //assume all are INvalid
Terms terms = reader.fields().terms(fieldName);
if (terms == null) {
Modified: lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedTermRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedTermRangeQuery.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedTermRangeQuery.java (original)
+++ lucene/dev/branches/lucene5969/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedTermRangeQuery.java Sat Oct 4 15:08:32 2014
@@ -36,7 +36,7 @@ import org.apache.lucene.util.ToStringUt
* for numerical ranges; use {@link NumericRangeQuery} instead.
*
* <p>This query uses the {@link
- * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}
+ * MultiTermQuery#CONSTANT_SCORE_FILTER_REWRITE}
* rewrite method.
* @deprecated Index collation keys with CollationKeyAnalyzer or ICUCollationKeyAnalyzer instead.
* This class will be removed in Lucene 5.0
Modified: lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/BaseDocIdSetTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/BaseDocIdSetTestCase.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/BaseDocIdSetTestCase.java (original)
+++ lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/BaseDocIdSetTestCase.java Sat Oct 4 15:08:32 2014
@@ -57,7 +57,7 @@ public abstract class BaseDocIdSetTestCa
/** Test length=0. */
public void testNoBit() throws IOException {
final BitSet bs = new BitSet(1);
- final T copy = copyOf(bs, 0);
+ final T copy = copyOf(bs, TestUtil.nextInt(random(), 1, 10000));
assertEquals(0, bs, copy);
}
@@ -67,7 +67,7 @@ public abstract class BaseDocIdSetTestCa
if (random().nextBoolean()) {
bs.set(0);
}
- final T copy = copyOf(bs, 1);
+ final T copy = copyOf(bs, TestUtil.nextInt(random(), 1, 10000));
assertEquals(1, bs, copy);
}
@@ -80,7 +80,7 @@ public abstract class BaseDocIdSetTestCa
if (random().nextBoolean()) {
bs.set(1);
}
- final T copy = copyOf(bs, 2);
+ final T copy = copyOf(bs, TestUtil.nextInt(random(), 1, 10000));
assertEquals(2, bs, copy);
}
Modified: lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java (original)
+++ lucene/dev/branches/lucene5969/lucene/test-framework/src/java/org/apache/lucene/util/TestUtil.java Sat Oct 4 15:08:32 2014
@@ -85,6 +85,7 @@ import org.apache.lucene.search.Filtered
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.NoLockFactory;
import org.junit.Assert;
import com.carrotsearch.randomizedtesting.generators.RandomInts;
@@ -213,20 +214,24 @@ public final class TestUtil {
* look for any other corruption. */
public static CheckIndex.Status checkIndex(Directory dir, boolean crossCheckTermVectors, boolean failFast) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
- CheckIndex checker = new CheckIndex(dir);
- checker.setCrossCheckTermVectors(crossCheckTermVectors);
- checker.setFailFast(failFast);
- checker.setInfoStream(new PrintStream(bos, false, IOUtils.UTF_8), false);
- CheckIndex.Status indexStatus = checker.checkIndex(null);
- if (indexStatus == null || indexStatus.clean == false) {
- System.out.println("CheckIndex failed");
- System.out.println(bos.toString(IOUtils.UTF_8));
- throw new RuntimeException("CheckIndex failed");
- } else {
- if (LuceneTestCase.INFOSTREAM) {
+ // TODO: actually use the dir's lock factory, unless test uses a special method?
+ // some tests e.g. exception tests become much more complicated if they have to close the writer
+ try (CheckIndex checker = new CheckIndex(dir, NoLockFactory.getNoLockFactory().makeLock("bogus"))) {
+ checker.setCrossCheckTermVectors(crossCheckTermVectors);
+ checker.setFailFast(failFast);
+ checker.setInfoStream(new PrintStream(bos, false, IOUtils.UTF_8), false);
+ CheckIndex.Status indexStatus = checker.checkIndex(null);
+
+ if (indexStatus == null || indexStatus.clean == false) {
+ System.out.println("CheckIndex failed");
System.out.println(bos.toString(IOUtils.UTF_8));
+ throw new RuntimeException("CheckIndex failed");
+ } else {
+ if (LuceneTestCase.INFOSTREAM) {
+ System.out.println(bos.toString(IOUtils.UTF_8));
+ }
+ return indexStatus;
}
- return indexStatus;
}
}
Modified: lucene/dev/branches/lucene5969/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/CHANGES.txt?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene5969/solr/CHANGES.txt Sat Oct 4 15:08:32 2014
@@ -145,6 +145,13 @@ New Features
* SOLR-6565: SolrRequest support for query params (Gregory Chanan)
+* SOLR-6476: Create a bulk mode for schema API (Noble Paul, Steve Rowe)
+
+* SOLR-6512: Add a collections API call to add/delete arbitrary properties
+ to a specific replica. Optionally adding sliceUnique=true will remove
+ this property from all other replicas within a particular slice.
+ (Erick Erickson)
+
Bug Fixes
----------------------
@@ -154,9 +161,6 @@ Bug Fixes
* SOLR-6424: The hdfs block cache BLOCKCACHE_WRITE_ENABLED is not defaulting to false like it
should. (Mark Miller)
-* SOLR-6425: If you using the new global hdfs block cache option, you can end up reading corrupt
- files on file name reuse. (Mark Miller, Gregory Chanan)
-
* SOLR-6426: SolrZkClient clean can fail due to a race with children nodes. (Mark Miller)
* SOLR-5966: Admin UI Menu is fixed and doesn't respect smaller viewports.
@@ -165,18 +169,9 @@ Bug Fixes
* SOLR-4406: Fix RawResponseWriter to respect 'base' writer
(Steve Davids, hossman)
-* SOLR-6024: Fix StatsComponent when using docValues="true" multiValued="true"
- (Vitaliy Zhovtyuk & Tomas Fernandez-Lobbe via hossman)
-
* SOLR-6297: Fix WordBreakSolrSpellChecker to not lose suggestions in shard/cloud
environments (James Dyer)
-* SOLR-5814: CoreContainer reports incorrect & missleading path for solrconfig.xml
- when there are loading problems (Pradeep via hossman)
-
-* SOLR-6447: bin/solr script needs to pass -DnumShards=1 for boostrapping collection1
- when starting Solr in cloud mode. (Timothy Potter)
-
* SOLR-6467: bin/solr script should direct stdout/stderr when starting in the background
to the solr-PORT-console.log in the logs directory instead of bin. (Timothy Potter)
@@ -187,17 +182,12 @@ Bug Fixes
* SOLR-6457: LBHttpSolrServer: ArrayIndexOutOfBoundsException risk if counter overflows
(longkey via Noble Paul)
-* SOLR-6493: Fix fq exclusion via "ex" local param in multivalued stats.field (hossman)
-
* SOLR-6452: StatsComponent's stat 'missing' will work on fields with docValues=true and
indexed=false (Xu Zhang via Tomás Fernández Löbbe)
* SOLR-6499: Log warning about multiple update request handlers
(Noble Paul, Andreas Hubold, hossman)
-* SOLR-6501: Binary Response Writer does not return wildcard fields.
- (Mike Hugo, Constantin Mitocaru, sarowe, shalin)
-
* SOLR-6507: Fixed several bugs involving stats.field used with local params (hossman)
* SOLR-6481: CLUSTERSTATUS should check if the node hosting a replica is live when
@@ -210,6 +200,11 @@ Bug Fixes
* SOLR-6511: Fencepost error in LeaderInitiatedRecoveryThread (Timothy Potter)
+* SOLR-6530: Commits under network partitions can put any node in down state.
+ (Ramkumar Aiyengar, Alan Woodward, Mark Miller, shalin)
+
+* SOLR-6587: Misleading exception when creating collections in SolrCloud with bad configuration.
+ (Tomás Fernández Löbbe)
Other Changes
----------------------
@@ -272,6 +267,45 @@ Other Changes
* SOLR-6453: Stop throwing an error message from Overseer when node exits (Ramkumar Aiyengar, Noble Paul)
+* SOLR-6249: Schema API changes return success before all cores are updated; client application
+ can provide the optional updateTimeoutSecs parameter to cause the server handling the
+ managed schema update to block until all replicas of the same collection have processed the
+ update or until the specified timeout is reached (Timothy Potter)
+
+* SOLR-6550: Provide simple mechanism for passing additional metadata / context about a server-side
+ SolrException back to the client-side (Timothy Potter)
+
+================== 4.10.1 ==================
+
+Bug Fixes
+----------------------
+
+* SOLR-6425: If using the new global hdfs block cache option, you can end up
+ reading corrupt files on file name reuse. (Mark Miller, Gregory Chanan)
+
+* SOLR-5814: CoreContainer reports incorrect & missleading path for solrconfig.xml
+ when there are loading problems (Pradeep via hossman)
+
+* SOLR-6024: Fix StatsComponent when using docValues="true" multiValued="true"
+ (Vitaliy Zhovtyuk & Tomas Fernandez-Lobbe via hossman)
+
+* SOLR-6493: Fix fq exclusion via "ex" local param in multivalued stats.field (hossman)
+
+* SOLR-6447: bin/solr script needs to pass -DnumShards=1 for boostrapping collection1
+ when starting Solr in cloud mode. (Timothy Potter)
+
+* SOLR-6501: Binary Response Writer does not return wildcard fields.
+ (Mike Hugo, Constantin Mitocaru, sarowe, shalin)
+
+Other Changes
+---------------------
+
+* SOLR-6503: Removed support for parsing netcdf files in Solr Cell because
+ of license issues. If you need support for this format, download the parser
+ JAR yourself (version 4.2) and add it to contrib/extraction/lib folder:
+ http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/
+ (Uwe Schindler)
+
================== 4.10.0 =================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release
Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/Overseer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/Overseer.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/Overseer.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/Overseer.java Sat Oct 4 15:08:32 2014
@@ -36,6 +36,8 @@ import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterState;
@@ -119,7 +121,9 @@ public class Overseer implements Closeab
private static Logger log = LoggerFactory.getLogger(Overseer.class);
- static enum LeaderStatus { DONT_KNOW, NO, YES };
+ static enum LeaderStatus {DONT_KNOW, NO, YES}
+
+ public static final Set<String> sliceUniqueBooleanProperties = ImmutableSet.of("property.preferredleader");
private long lastUpdatedTime = 0;
@@ -438,6 +442,12 @@ public class Overseer implements Closeab
case CLUSTERPROP:
handleProp(message);
break;
+ case ADDREPLICAPROP:
+ clusterState = addReplicaProp(clusterState, message);
+ break;
+ case DELETEREPLICAPROP:
+ clusterState = deleteReplicaProp(clusterState, message);
+ break;
default:
throw new RuntimeException("unknown operation:" + operation
+ " contents:" + message.getProperties());
@@ -504,6 +514,108 @@ public class Overseer implements Closeab
return clusterState;
}
+ private ClusterState addReplicaProp(ClusterState clusterState, ZkNodeProps message) {
+
+ if (checkKeyExistence(message, ZkStateReader.COLLECTION_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.SHARD_ID_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.REPLICA_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.PROPERTY_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.PROPERTY_VALUE_PROP) == false) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+ "Overseer SETREPLICAPROPERTY requires " +
+ ZkStateReader.COLLECTION_PROP + " and " + ZkStateReader.SHARD_ID_PROP + " and " +
+ ZkStateReader.REPLICA_PROP + " and " + ZkStateReader.PROPERTY_PROP + " and " +
+ ZkStateReader.PROPERTY_VALUE_PROP + " no action taken.");
+ }
+
+ String collectionName = message.getStr(ZkStateReader.COLLECTION_PROP);
+ String sliceName = message.getStr(ZkStateReader.SHARD_ID_PROP);
+ String replicaName = message.getStr(ZkStateReader.REPLICA_PROP);
+ String property = message.getStr(ZkStateReader.PROPERTY_PROP).toLowerCase(Locale.ROOT);
+ if (property.startsWith(OverseerCollectionProcessor.COLL_PROP_PREFIX) == false) {
+ property = OverseerCollectionProcessor.COLL_PROP_PREFIX + property;
+ }
+ String propVal = message.getStr(ZkStateReader.PROPERTY_VALUE_PROP);
+ String sliceUnique = message.getStr(OverseerCollectionProcessor.SLICE_UNIQUE);
+
+ boolean isUnique = false;
+
+ if (sliceUniqueBooleanProperties.contains(property)) {
+ if (StringUtils.isNotBlank(sliceUnique) && Boolean.parseBoolean(sliceUnique) == false) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Overseer SETREPLICAPROPERTY for " +
+ property + " cannot have " + OverseerCollectionProcessor.SLICE_UNIQUE + " set to anything other than" +
+ "'true'. No action taken");
+ }
+ isUnique = true;
+ } else {
+ isUnique = Boolean.parseBoolean(sliceUnique);
+ }
+
+ Replica replica = clusterState.getReplica(collectionName, replicaName);
+
+ if (replica == null) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Could not find collection/slice/replica " +
+ collectionName + "/" + sliceName + "/" + replicaName + " no action taken.");
+ }
+ log.info("Setting property " + property + " with value: " + propVal +
+ " for collection: " + collectionName + ". Full message: " + message);
+ if (StringUtils.equalsIgnoreCase(replica.getStr(property), propVal)) return clusterState; // already the value we're going to set
+
+ // OK, there's no way we won't change the cluster state now
+ Map<String,Replica> replicas = clusterState.getSlice(collectionName, sliceName).getReplicasCopy();
+ if (isUnique == false) {
+ replicas.get(replicaName).getProperties().put(property, propVal);
+ } else { // Set prop for this replica, but remove it for all others.
+ for (Replica rep : replicas.values()) {
+ if (rep.getName().equalsIgnoreCase(replicaName)) {
+ rep.getProperties().put(property, propVal);
+ } else {
+ rep.getProperties().remove(property);
+ }
+ }
+ }
+ Slice newSlice = new Slice(sliceName, replicas, clusterState.getSlice(collectionName, sliceName).shallowCopy());
+ return updateSlice(clusterState, collectionName, newSlice);
+ }
+
+ private ClusterState deleteReplicaProp(ClusterState clusterState, ZkNodeProps message) {
+
+ if (checkKeyExistence(message, ZkStateReader.COLLECTION_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.SHARD_ID_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.REPLICA_PROP) == false ||
+ checkKeyExistence(message, ZkStateReader.PROPERTY_PROP) == false) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+ "Overseer DELETEREPLICAPROPERTY requires " +
+ ZkStateReader.COLLECTION_PROP + " and " + ZkStateReader.SHARD_ID_PROP + " and " +
+ ZkStateReader.REPLICA_PROP + " and " + ZkStateReader.PROPERTY_PROP + " no action taken.");
+ }
+ String collectionName = message.getStr(ZkStateReader.COLLECTION_PROP);
+ String sliceName = message.getStr(ZkStateReader.SHARD_ID_PROP);
+ String replicaName = message.getStr(ZkStateReader.REPLICA_PROP);
+ String property = message.getStr(ZkStateReader.PROPERTY_PROP).toLowerCase(Locale.ROOT);
+ if (property.startsWith(OverseerCollectionProcessor.COLL_PROP_PREFIX) == false) {
+ property = OverseerCollectionProcessor.COLL_PROP_PREFIX + property;
+ }
+
+ Replica replica = clusterState.getReplica(collectionName, replicaName);
+
+ if (replica == null) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Could not find collection/slice/replica " +
+ collectionName + "/" + sliceName + "/" + replicaName + " no action taken.");
+ }
+
+ log.info("Deleting property " + property + " for collection: " + collectionName +
+ " slice " + sliceName + " replica " + replicaName + ". Full message: " + message);
+ String curProp = replica.getStr(property);
+ if (curProp == null) return clusterState; // not there anyway, nothing to do.
+
+ Map<String, Replica> replicas = clusterState.getSlice(collectionName, sliceName).getReplicasCopy();
+ replica = replicas.get(replicaName);
+ replica.getProperties().remove(property);
+ Slice newSlice = new Slice(sliceName, replicas, clusterState.getSlice(collectionName, sliceName).shallowCopy());
+ return updateSlice(clusterState, collectionName, newSlice);
+ }
+
private ClusterState setShardLeader(ClusterState clusterState, ZkNodeProps message) {
StringBuilder sb = new StringBuilder();
String baseUrl = message.getStr(ZkStateReader.BASE_URL_PROP);
@@ -1055,7 +1167,6 @@ public class Overseer implements Closeab
newCollection = coll.copyWithSlices(slices);
}
-
// System.out.println("###!!!### NEW CLUSTERSTATE: " + JSONUtil.toJSON(newCollections));
return newState(state, singletonMap(collectionName, newCollection));
Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Sat Oct 4 15:08:32 2014
@@ -20,10 +20,12 @@ package org.apache.solr.cloud;
import static org.apache.solr.cloud.Assign.getNodesForNewShard;
import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.REPLICA_PROP;
+import static org.apache.solr.common.cloud.ZkStateReader.PROPERTY_PROP;
+import static org.apache.solr.common.cloud.ZkStateReader.PROPERTY_VALUE_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
-import static org.apache.solr.common.cloud.ZkStateReader.ONLY_IF_DOWN;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICAPROP;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.CLUSTERSTATUS;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.CREATE;
@@ -31,6 +33,7 @@ import static org.apache.solr.common.par
import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETE;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETESHARD;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.REMOVEROLE;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETEREPLICAPROP;
import java.io.Closeable;
import java.io.IOException;
@@ -51,6 +54,7 @@ import java.util.concurrent.SynchronousQ
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
@@ -146,6 +150,10 @@ public class OverseerCollectionProcessor
public static final String COLL_PROP_PREFIX = "property.";
+ public static final String ONLY_IF_DOWN = "onlyIfDown";
+
+ public static final String SLICE_UNIQUE = "sliceUnique";
+
public int maxParallelThreads = 10;
public static final Set<String> KNOWN_CLUSTER_PROPS = ImmutableSet.of(ZkStateReader.LEGACY_CLOUD, ZkStateReader.URL_SCHEME);
@@ -619,6 +627,12 @@ public class OverseerCollectionProcessor
case CLUSTERSTATUS:
getClusterStatus(zkStateReader.getClusterState(), message, results);
break;
+ case ADDREPLICAPROP:
+ processReplicaAddPropertyCommand(message);
+ break;
+ case DELETEREPLICAPROP:
+ processReplicaDeletePropertyCommand(message);
+ break;
default:
throw new SolrException(ErrorCode.BAD_REQUEST, "Unknown operation:"
+ operation);
@@ -645,6 +659,44 @@ public class OverseerCollectionProcessor
}
@SuppressWarnings("unchecked")
+ private void processReplicaAddPropertyCommand(ZkNodeProps message) throws KeeperException, InterruptedException {
+ if (StringUtils.isBlank(message.getStr(COLLECTION_PROP)) ||
+ StringUtils.isBlank(message.getStr(SHARD_ID_PROP)) ||
+ StringUtils.isBlank(message.getStr(REPLICA_PROP)) ||
+ StringUtils.isBlank(message.getStr(PROPERTY_PROP)) ||
+ StringUtils.isBlank(message.getStr(PROPERTY_VALUE_PROP))) {
+ throw new SolrException(ErrorCode.BAD_REQUEST,
+ String.format(Locale.ROOT, "The '%s', '%s', '%s', '%s', and '%s' parameters are required for all replica properties add/delete' operations",
+ COLLECTION_PROP, SHARD_ID_PROP, REPLICA_PROP, PROPERTY_PROP, PROPERTY_VALUE_PROP));
+ }
+ SolrZkClient zkClient = zkStateReader.getZkClient();
+ DistributedQueue inQueue = Overseer.getInQueue(zkClient);
+ Map<String, Object> propMap = new HashMap<>();
+ propMap.put(Overseer.QUEUE_OPERATION, ADDREPLICAPROP.toLower());
+ propMap.putAll(message.getProperties());
+ ZkNodeProps m = new ZkNodeProps(propMap);
+ inQueue.offer(ZkStateReader.toJSON(m));
+ }
+
+ private void processReplicaDeletePropertyCommand(ZkNodeProps message) throws KeeperException, InterruptedException {
+ if (StringUtils.isBlank(message.getStr(COLLECTION_PROP)) ||
+ StringUtils.isBlank(message.getStr(SHARD_ID_PROP)) ||
+ StringUtils.isBlank(message.getStr(REPLICA_PROP)) ||
+ StringUtils.isBlank(message.getStr(PROPERTY_PROP))) {
+ throw new SolrException(ErrorCode.BAD_REQUEST,
+ String.format(Locale.ROOT, "The '%s', '%s', '%s', and '%s' parameters are required for all replica properties add/delete' operations",
+ COLLECTION_PROP, SHARD_ID_PROP, REPLICA_PROP, PROPERTY_PROP));
+ }
+ SolrZkClient zkClient = zkStateReader.getZkClient();
+ DistributedQueue inQueue = Overseer.getInQueue(zkClient);
+ Map<String, Object> propMap = new HashMap<>();
+ propMap.put(Overseer.QUEUE_OPERATION, DELETEREPLICAPROP.toLower());
+ propMap.putAll(message.getProperties());
+ ZkNodeProps m = new ZkNodeProps(propMap);
+ inQueue.offer(ZkStateReader.toJSON(m));
+ }
+
+ @SuppressWarnings("unchecked")
private void getOverseerStatus(ZkNodeProps message, NamedList results) throws KeeperException, InterruptedException {
String leaderNode = getLeaderNode(zkStateReader.getZkClient());
results.add("leader", leaderNode);
@@ -841,6 +893,8 @@ public class OverseerCollectionProcessor
* @param liveNodes List of currently live node names.
* @param collectionProps Map of collection status information pulled directly from ZooKeeper.
*/
+
+ @SuppressWarnings("unchecked")
protected void crossCheckReplicaStateWithLiveNodes(List<String> liveNodes, NamedList<Object> collectionProps) {
Iterator<Map.Entry<String,Object>> colls = collectionProps.iterator();
while (colls.hasNext()) {
Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkController.java Sat Oct 4 15:08:32 2014
@@ -189,6 +189,9 @@ public final class ZkController {
// and interact with zookeeper via the Solr admin UI on a node outside the cluster,
// and so one that will not be killed or stopped when testing. See developer cloud-scripts.
private boolean zkRunOnly = Boolean.getBoolean("zkRunOnly"); // expert
+
+ // keeps track of a list of objects that need to know a new ZooKeeper session was created after expiration occurred
+ private List<OnReconnect> reconnectListeners = new ArrayList<OnReconnect>();
public ZkController(final CoreContainer cc, String zkServerAddress, int zkClientTimeout, int zkClientConnectTimeout, String localHost, String locaHostPort,
String localHostContext, int leaderVoteWait, int leaderConflictResolveWait, boolean genericCoreNodeNames, final CurrentCoreDescriptorProvider registerOnReconnect)
@@ -239,8 +242,9 @@ public final class ZkController {
@Override
public void command() {
+ log.info("ZooKeeper session re-connected ... refreshing core states after session expiration.");
+
try {
-
// this is troublesome - we dont want to kill anything the old
// leader accepted
// though I guess sync will likely get those updates back? But
@@ -294,7 +298,19 @@ public final class ZkController {
}
}
}
-
+
+ // notify any other objects that need to know when the session was re-connected
+ synchronized (reconnectListeners) {
+ for (OnReconnect listener : reconnectListeners) {
+ try {
+ listener.command();
+ } catch (Exception exc) {
+ // not much we can do here other than warn in the log
+ log.warn("Error when notifying OnReconnect listener "+listener+" after session re-connected.", exc);
+ }
+ }
+ }
+
} catch (InterruptedException e) {
// Restore the interrupted status
Thread.currentThread().interrupt();
@@ -2013,4 +2029,16 @@ public final class ZkController {
}
}
}
+
+ /**
+ * Add a listener to be notified once there is a new session created after a ZooKeeper session expiration occurs;
+ * in most cases, listeners will be components that have watchers that need to be re-created.
+ */
+ public void addOnReconnectListener(OnReconnect listener) {
+ if (listener != null) {
+ synchronized (reconnectListeners) {
+ reconnectListeners.add(listener);
+ }
+ }
+ }
}
Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java Sat Oct 4 15:08:32 2014
@@ -28,6 +28,7 @@ import org.apache.solr.common.SolrExcept
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.ZooKeeperException;
import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.schema.ZkIndexSchemaReader;
import org.apache.zookeeper.KeeperException;
/**
@@ -38,6 +39,7 @@ public class ZkSolrResourceLoader extend
private final String collectionZkPath;
private ZkController zkController;
+ private ZkIndexSchemaReader zkIndexSchemaReader;
public ZkSolrResourceLoader(String instanceDir, String collection,
ZkController zooKeeperController) {
@@ -129,4 +131,10 @@ public class ZkSolrResourceLoader extend
public ZkController getZkController() {
return zkController;
}
+
+ public void setZkIndexSchemaReader(ZkIndexSchemaReader zkIndexSchemaReader) {
+ this.zkIndexSchemaReader = zkIndexSchemaReader;
+ }
+
+ public ZkIndexSchemaReader getZkIndexSchemaReader() { return zkIndexSchemaReader; }
}
Modified: lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1629403&r1=1629402&r2=1629403&view=diff
==============================================================================
--- lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/lucene5969/solr/core/src/java/org/apache/solr/core/SolrConfig.java Sat Oct 4 15:08:32 2014
@@ -21,6 +21,7 @@ package org.apache.solr.core;
import org.apache.lucene.index.IndexDeletionPolicy;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.util.Version;
+import org.apache.solr.cloud.ZkSolrResourceLoader;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.handler.component.SearchComponent;
@@ -144,7 +145,12 @@ public class SolrConfig extends Config {
return new SolrConfig(loader, name, null);
}
catch (Exception e) {
- String resource = loader.getConfigDir() + name;
+ String resource;
+ if (loader instanceof ZkSolrResourceLoader) {
+ resource = name;
+ } else {
+ resource = loader.getConfigDir() + name;
+ }
throw new SolrException(ErrorCode.SERVER_ERROR, "Error loading solr config from " + resource, e);
}
}