Index: solr/common-build.xml
===================================================================
--- solr/common-build.xml (revision 1036589)
+++ solr/common-build.xml (working copy)
@@ -56,7 +56,7 @@
-
+
Index: lucene/common-build.xml
===================================================================
--- lucene/common-build.xml (revision 1036589)
+++ lucene/common-build.xml (working copy)
@@ -64,7 +64,7 @@
-
+
Index: lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (revision 1036589)
+++ lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (working copy)
@@ -81,7 +81,7 @@
assertEquals(IndexWriterConfig.DEFAULT_READER_POOLING, conf.getReaderPooling());
assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
assertNull(conf.getMergedSegmentWarmer());
- assertEquals(IndexWriterConfig.DEFAULT_CODEC_PROVIDER, CodecProvider.getDefault());
+ //assertEquals(IndexWriterConfig.DEFAULT_CODEC_PROVIDER, CodecProvider.getDefault());
assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
assertEquals(IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR, conf.getReaderTermsIndexDivisor());
assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass());
Index: lucene/src/test/org/apache/lucene/util/LuceneTestCase.java
===================================================================
--- lucene/src/test/org/apache/lucene/util/LuceneTestCase.java (revision 1036589)
+++ lucene/src/test/org/apache/lucene/util/LuceneTestCase.java (working copy)
@@ -35,6 +35,8 @@
import org.apache.lucene.index.codecs.preflex.PreFlexCodec;
import org.apache.lucene.index.codecs.preflexrw.PreFlexRWCodec;
import org.apache.lucene.index.codecs.pulsing.PulsingCodec;
+import org.apache.lucene.index.codecs.simpletext.SimpleTextCodec;
+import org.apache.lucene.index.codecs.standard.StandardCodec;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.FieldCache.CacheEntry;
@@ -73,6 +75,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
@@ -145,7 +148,7 @@
// each test case (non-J4 tests) and each test class (J4
// tests)
/** Gets the codec to run tests with. */
- static final String TEST_CODEC = System.getProperty("tests.codec", "random");
+ static final String TEST_CODEC = System.getProperty("tests.codec", "randomPerField");
/** Gets the locale to run tests with */
static final String TEST_LOCALE = System.getProperty("tests.locale", "random");
/** Gets the timezone to run tests with */
@@ -187,7 +190,10 @@
// saves default codec: we do this statically as many build indexes in @beforeClass
private static String savedDefaultCodec;
+ // default codec: not set when we use a per-field provider.
private static Codec codec;
+ // default codec provider
+ private static CodecProvider savedCodecProvider;
private static Locale locale;
private static Locale savedLocale;
@@ -198,8 +204,7 @@
private static final String[] TEST_CODECS = new String[] {"MockSep", "MockFixedIntBlock", "MockVariableIntBlock"};
- private static void swapCodec(Codec c) {
- final CodecProvider cp = CodecProvider.getDefault();
+ private static void swapCodec(Codec c, CodecProvider cp) {
Codec prior = null;
try {
prior = cp.lookup(c.name);
@@ -212,15 +217,12 @@
}
// returns current default codec
- static Codec installTestCodecs() {
- final CodecProvider cp = CodecProvider.getDefault();
-
+ static Codec installTestCodecs(String codec, CodecProvider cp) {
savedDefaultCodec = cp.getDefaultFieldCodec();
- String codec = TEST_CODEC;
final boolean codecHasParam;
int codecParam = 0;
- if (codec.equals("random")) {
+ if (codec.startsWith("random")) {
codec = pickRandomCodec(random);
codecHasParam = false;
} else {
@@ -241,21 +243,20 @@
// If we're running w/ PreFlex codec we must swap in the
// test-only PreFlexRW codec (since core PreFlex can
// only read segments):
- swapCodec(new PreFlexRWCodec());
+ swapCodec(new PreFlexRWCodec(), cp);
}
- swapCodec(new MockSepCodec());
- swapCodec(new PulsingCodec(codecHasParam && "Pulsing".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 20)));
- swapCodec(new MockFixedIntBlockCodec(codecHasParam && "MockFixedIntBlock".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 2000)));
+ swapCodec(new MockSepCodec(), cp);
+ swapCodec(new PulsingCodec(codecHasParam && "Pulsing".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 20)), cp);
+ swapCodec(new MockFixedIntBlockCodec(codecHasParam && "MockFixedIntBlock".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 2000)), cp);
// baseBlockSize cannot be over 127:
- swapCodec(new MockVariableIntBlockCodec(codecHasParam && "MockVariableIntBlock".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 127)));
+ swapCodec(new MockVariableIntBlockCodec(codecHasParam && "MockVariableIntBlock".equals(codec) ? codecParam : _TestUtil.nextInt(random, 1, 127)), cp);
return cp.lookup(codec);
}
// returns current PreFlex codec
- static void removeTestCodecs(Codec codec) {
- final CodecProvider cp = CodecProvider.getDefault();
+ static void removeTestCodecs(Codec codec, CodecProvider cp) {
if (codec.name.equals("PreFlex")) {
final Codec preFlex = cp.lookup("PreFlex");
if (preFlex != null) {
@@ -266,7 +267,7 @@
cp.unregister(cp.lookup("MockSep"));
cp.unregister(cp.lookup("MockFixedIntBlock"));
cp.unregister(cp.lookup("MockVariableIntBlock"));
- swapCodec(new PulsingCodec(1));
+ swapCodec(new PulsingCodec(1), cp);
cp.setDefaultFieldCodec(savedDefaultCodec);
}
@@ -312,7 +313,17 @@
staticSeed = "random".equals(TEST_SEED) ? seedRand.nextLong() : TwoLongs.fromString(TEST_SEED).l1;
random.setSeed(staticSeed);
stores = Collections.synchronizedMap(new IdentityHashMap());
- codec = installTestCodecs();
+ savedCodecProvider = CodecProvider.getDefault();
+ if ("randomPerField".equals(TEST_CODEC)) {
+ if (random.nextInt(4) == 0) { // preflex-only setup
+ codec = installTestCodecs("PreFlex", CodecProvider.getDefault());
+ } else { // per-field setup
+ CodecProvider.setDefault(new RandomCodecProvider());
+ codec = installTestCodecs(TEST_CODEC, CodecProvider.getDefault());
+ }
+ } else { // ordinary setup
+ codec = installTestCodecs(TEST_CODEC, CodecProvider.getDefault());
+ }
savedLocale = Locale.getDefault();
locale = TEST_LOCALE.equals("random") ? randomLocale(random) : localeForName(TEST_LOCALE);
Locale.setDefault(locale);
@@ -324,7 +335,21 @@
@AfterClass
public static void afterClassLuceneTestCaseJ4() {
- removeTestCodecs(codec);
+ String codecDescription;
+ CodecProvider cp = CodecProvider.getDefault();
+
+ if ("randomPerField".equals(TEST_CODEC)) {
+ if (cp instanceof RandomCodecProvider)
+ codecDescription = cp.toString();
+ else
+ codecDescription = "PreFlex";
+ } else {
+ codecDescription = codec.toString();
+ }
+
+ if (CodecProvider.getDefault() == savedCodecProvider)
+ removeTestCodecs(codec, CodecProvider.getDefault());
+ CodecProvider.setDefault(savedCodecProvider);
Locale.setDefault(savedLocale);
TimeZone.setDefault(savedTimeZone);
System.clearProperty("solr.solr.home");
@@ -341,7 +366,7 @@
stores = null;
// if tests failed, report some information back
if (testsFailed)
- System.out.println("NOTE: test params are: codec=" + codec +
+ System.out.println("NOTE: test params are: codec=" + codecDescription +
", locale=" + locale +
", timezone=" + (timeZone == null ? "(null)" : timeZone.getID()));
if (testsFailed) {
@@ -942,6 +967,42 @@
}
}
+ private static class RandomCodecProvider extends CodecProvider {
+ private List knownCodecs = new ArrayList();
+ private Map previousMappings = new HashMap();
+
+ RandomCodecProvider() {
+ register(new StandardCodec());
+ register(new PreFlexCodec());
+ register(new PulsingCodec(1));
+ register(new SimpleTextCodec());
+ }
+
+ public synchronized void register(Codec codec) {
+ if (!codec.name.equals("PreFlex"))
+ knownCodecs.add(codec);
+ super.register(codec);
+ }
+
+ public synchronized void unregister(Codec codec) {
+ knownCodecs.remove(codec);
+ super.unregister(codec);
+ }
+
+ public synchronized String getFieldCodec(String name) {
+ Codec codec = previousMappings.get(name);
+ if (codec == null) {
+ codec = knownCodecs.get(random.nextInt(knownCodecs.size()));
+ previousMappings.put(name, codec);
+ }
+ return codec.name;
+ }
+
+ public String toString() {
+ return previousMappings.toString();
+ }
+ }
+
@Ignore("just a hack")
public final void alwaysIgnoredTestMethod() {}
}
Index: lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java (revision 1036589)
+++ lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java (working copy)
@@ -96,12 +96,16 @@
return infosReader;
}
- static private final CodecProvider defaultCodecs = new DefaultCodecProvider();
+ static private CodecProvider defaultCodecs = new DefaultCodecProvider();
public static CodecProvider getDefault() {
return defaultCodecs;
}
+ public static void setDefault(CodecProvider cp) {
+ defaultCodecs = cp;
+ }
+
/**
* Sets the {@link Codec} for a given field. Not that setting a fields code is
* write-once. If the fields codec is already set this method will throw an