You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2013/04/11 00:57:57 UTC
svn commit: r1466724 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/analysis/
lucene/analysis/common/src/java/org/apache/lucene/analysis/util/ solr/
solr/core/ solr/core/src/java/org/apache/solr/schema/
solr/core/src/test-files/solr/collection1...
Author: sarowe
Date: Wed Apr 10 22:57:56 2013
New Revision: 1466724
URL: http://svn.apache.org/r1466724
Log:
SOLR-4658:
- Fix class name shortening issues, for SimilarityFactory's, FieldType's, and analysis factories: persisted class names' original forms are preserved in both shortened form (e.g. 'solr.TextField') and fully qualified form (e.g. 'org.apache.solr.schema.TextField')
- luceneMatchVersion on analysis factories is now persisted only when explicitly specified in the original; previously the default value was persisted when it was absent in the original
- Add MockTokenFilterFactory
Added:
lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/schema-class-name-shortening-on-serialization.xml
- copied unchanged from r1466720, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/schema-class-name-shortening-on-serialization.xml
lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/collection1/conf/schema-rest-lucene-match-version.xml
- copied unchanged from r1466720, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/schema-rest-lucene-match-version.xml
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
- copied unchanged from r1466720, lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java
- copied unchanged from r1466720, lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/schema/TestSerializedLuceneMatchVersion.java
lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/analysis/MockTokenFilterFactory.java
- copied unchanged from r1466720, lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/analysis/MockTokenFilterFactory.java
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/analysis/ (props changed)
lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AbstractAnalysisFactory.java
lucene/dev/branches/branch_4x/solr/ (props changed)
lucene/dev/branches/branch_4x/solr/core/ (props changed)
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldType.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSchemaSimilarityResource.java
lucene/dev/branches/branch_4x/solr/test-framework/ (props changed)
Modified: lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AbstractAnalysisFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AbstractAnalysisFactory.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AbstractAnalysisFactory.java (original)
+++ lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AbstractAnalysisFactory.java Wed Apr 10 22:57:56 2013
@@ -51,20 +51,24 @@ import java.util.regex.PatternSyntaxExce
* </ol>
*/
public abstract class AbstractAnalysisFactory {
+ public static final String LUCENE_MATCH_VERSION_PARAM = "luceneMatchVersion";
/** The original args, before any processing */
private final Map<String,String> originalArgs;
/** the luceneVersion arg */
protected final Version luceneMatchVersion;
+ /** whether the luceneMatchVersion arg is explicitly specified in the serialized schema */
+ private boolean isExplicitLuceneMatchVersion = false;
/**
* Initialize this factory via a set of key-value pairs.
*/
protected AbstractAnalysisFactory(Map<String,String> args) {
originalArgs = Collections.unmodifiableMap(new HashMap<String,String>(args));
- String version = get(args, "luceneMatchVersion");
+ String version = get(args, LUCENE_MATCH_VERSION_PARAM);
luceneMatchVersion = version == null ? null : Version.parseLeniently(version);
+ args.remove(CLASS_NAME); // consume the class arg
}
public final Map<String,String> getOriginalArgs() {
@@ -299,4 +303,28 @@ public abstract class AbstractAnalysisFa
return result;
}
+
+ private static final String CLASS_NAME = "class";
+
+ /**
+ * @return the string used to specify the concrete class name in a serialized representation: the class arg.
+ * If the concrete class name was not specified via a class arg, returns {@code getClass().getName()}.
+ */
+ public String getClassArg() {
+ if (null != originalArgs) {
+ String className = originalArgs.get(CLASS_NAME);
+ if (null != className) {
+ return className;
+ }
+ }
+ return getClass().getName();
+ }
+
+ public boolean isExplicitLuceneMatchVersion() {
+ return isExplicitLuceneMatchVersion;
+ }
+
+ public void setExplicitLuceneMatchVersion(boolean isExplicitLuceneMatchVersion) {
+ this.isExplicitLuceneMatchVersion = isExplicitLuceneMatchVersion;
+ }
}
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java Wed Apr 10 22:57:56 2013
@@ -49,6 +49,7 @@ public abstract class AbstractSubTypeFie
@Override
protected void init(IndexSchema schema, Map<String, String> args) {
+ super.init(schema, args);
this.schema = schema;
//it's not a first class citizen for the IndexSchema
SolrParams p = new MapSolrParams(args);
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldType.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldType.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldType.java Wed Apr 10 22:57:56 2013
@@ -26,8 +26,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
+import static org.apache.lucene.analysis.util.AbstractAnalysisFactory.LUCENE_MATCH_VERSION_PARAM;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;
@@ -95,7 +95,6 @@ public abstract class FieldType extends
private boolean isExplicitQueryAnalyzer;
private boolean isExplicitAnalyzer;
-
/** Returns true if fields of this type should be tokenized */
public boolean isTokenized() {
return (properties & TOKENIZED) != 0;
@@ -152,6 +151,7 @@ public abstract class FieldType extends
this.args = Collections.unmodifiableMap(args);
Map<String,String> initArgs = new HashMap<String,String>(args);
+ initArgs.remove(CLASS_NAME); // consume the class arg
trueProperties = FieldProperties.parseProperties(initArgs,true,false);
falseProperties = FieldProperties.parseProperties(initArgs,false,false);
@@ -413,7 +413,21 @@ public abstract class FieldType extends
return isExplicitAnalyzer;
}
- /**
+ /**
+ * @return the string used to specify the concrete class name in a serialized representation: the class arg.
+ * If the concrete class name was not specified via a class arg, returns {@code getClass().getName()}.
+ */
+ public String getClassArg() {
+ if (null != args) {
+ String className = args.get(CLASS_NAME);
+ if (null != className) {
+ return className;
+ }
+ }
+ return getClass().getName();
+ }
+
+ /**
* Default analyzer for types that only produce 1 verbatim token...
* A maximum size of chars to be read must be specified
*/
@@ -752,12 +766,14 @@ public abstract class FieldType extends
public SimpleOrderedMap<Object> getNamedPropertyValues(boolean showDefaults) {
SimpleOrderedMap<Object> namedPropertyValues = new SimpleOrderedMap<Object>();
namedPropertyValues.add(TYPE_NAME, getTypeName());
- namedPropertyValues.add(CLASS_NAME, getShortName(getClass().getName()));
+ namedPropertyValues.add(CLASS_NAME, getClassArg());
if (showDefaults) {
Map<String,String> fieldTypeArgs = getNonFieldPropertyArgs();
if (null != fieldTypeArgs) {
for (String key : fieldTypeArgs.keySet()) {
- namedPropertyValues.add(key, fieldTypeArgs.get(key));
+ if ( ! CLASS_NAME.equals(key) && ! TYPE_NAME.equals(key)) {
+ namedPropertyValues.add(key, fieldTypeArgs.get(key));
+ }
}
}
if (this instanceof TextField) {
@@ -790,7 +806,7 @@ public abstract class FieldType extends
for (String key : args.keySet()) {
if (fieldProperties.contains(key)) {
namedPropertyValues.add(key, StrUtils.parseBool(args.get(key)));
- } else {
+ } else if ( ! CLASS_NAME.equals(key) && ! TYPE_NAME.equals(key)) {
namedPropertyValues.add(key, args.get(key));
}
}
@@ -846,11 +862,19 @@ public abstract class FieldType extends
List<SimpleOrderedMap<Object>> charFilterProps = new ArrayList<SimpleOrderedMap<Object>>();
for (CharFilterFactory charFilterFactory : charFilterFactories) {
SimpleOrderedMap<Object> props = new SimpleOrderedMap<Object>();
- props.add(CLASS_NAME, getShortName(charFilterFactory.getClass().getName()));
+ props.add(CLASS_NAME, charFilterFactory.getClassArg());
factoryArgs = charFilterFactory.getOriginalArgs();
if (null != factoryArgs) {
for (String key : factoryArgs.keySet()) {
- props.add(key, factoryArgs.get(key));
+ if ( ! CLASS_NAME.equals(key)) {
+ if (LUCENE_MATCH_VERSION_PARAM.equals(key)) {
+ if (charFilterFactory.isExplicitLuceneMatchVersion()) {
+ props.add(key, factoryArgs.get(key));
+ }
+ } else {
+ props.add(key, factoryArgs.get(key));
+ }
+ }
}
}
charFilterProps.add(props);
@@ -860,11 +884,19 @@ public abstract class FieldType extends
SimpleOrderedMap<Object> tokenizerProps = new SimpleOrderedMap<Object>();
TokenizerFactory tokenizerFactory = tokenizerChain.getTokenizerFactory();
- tokenizerProps.add(CLASS_NAME, getShortName(tokenizerFactory.getClass().getName()));
+ tokenizerProps.add(CLASS_NAME, tokenizerFactory.getClassArg());
factoryArgs = tokenizerFactory.getOriginalArgs();
if (null != factoryArgs) {
for (String key : factoryArgs.keySet()) {
- tokenizerProps.add(key, factoryArgs.get(key));
+ if ( ! CLASS_NAME.equals(key)) {
+ if (LUCENE_MATCH_VERSION_PARAM.equals(key)) {
+ if (tokenizerFactory.isExplicitLuceneMatchVersion()) {
+ tokenizerProps.add(key, factoryArgs.get(key));
+ }
+ } else {
+ tokenizerProps.add(key, factoryArgs.get(key));
+ }
+ }
}
}
analyzerProps.add(TOKENIZER, tokenizerProps);
@@ -874,11 +906,19 @@ public abstract class FieldType extends
List<SimpleOrderedMap<Object>> filterProps = new ArrayList<SimpleOrderedMap<Object>>();
for (TokenFilterFactory filterFactory : filterFactories) {
SimpleOrderedMap<Object> props = new SimpleOrderedMap<Object>();
- props.add(CLASS_NAME, getShortName(filterFactory.getClass().getName()));
+ props.add(CLASS_NAME, filterFactory.getClassArg());
factoryArgs = filterFactory.getOriginalArgs();
if (null != factoryArgs) {
for (String key : factoryArgs.keySet()) {
- props.add(key, factoryArgs.get(key));
+ if ( ! CLASS_NAME.equals(key)) {
+ if (LUCENE_MATCH_VERSION_PARAM.equals(key)) {
+ if (filterFactory.isExplicitLuceneMatchVersion()) {
+ props.add(key, factoryArgs.get(key));
+ }
+ } else {
+ props.add(key, factoryArgs.get(key));
+ }
+ }
}
}
filterProps.add(props);
@@ -890,12 +930,4 @@ public abstract class FieldType extends
}
return analyzerProps;
}
-
- private static final Pattern SHORTENABLE_PACKAGE_PATTERN
- = Pattern.compile("org\\.apache\\.(?:lucene\\.analysis(?=.).*|solr\\.(?:analysis|schema))\\.([^.]+)$");
-
- private static String getShortName(String fullyQualifiedName) {
- Matcher matcher = SHORTENABLE_PACKAGE_PATTERN.matcher(fullyQualifiedName);
- return matcher.matches() ? "solr." + matcher.group(1) : fullyQualifiedName;
- }
}
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java Wed Apr 10 22:57:56 2013
@@ -137,11 +137,10 @@ public final class FieldTypePluginLoader
@Override
protected void init(FieldType plugin, Node node) throws Exception {
- Map<String,String> params = DOMUtil.toMapExcept( node.getAttributes(),
- "name","class" );
- plugin.setArgs(schema, params );
+ Map<String,String> params = DOMUtil.toMapExcept( node.getAttributes(), "name");
+ plugin.setArgs(schema, params);
}
-
+
@Override
protected FieldType register(String name,
FieldType plugin) throws Exception {
@@ -301,10 +300,12 @@ public final class FieldTypePluginLoader
@Override
protected CharFilterFactory create(SolrResourceLoader loader, String name, String className, Node node) throws Exception {
- final Map<String,String> params = DOMUtil.toMapExcept(node.getAttributes(),"class");
+ final Map<String,String> params = DOMUtil.toMap(node.getAttributes());
String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
params.put(LUCENE_MATCH_VERSION_PARAM, parseConfiguredVersion(configuredVersion, CharFilterFactory.class.getSimpleName()).toString());
- return loader.newInstance(className, CharFilterFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ CharFilterFactory factory = loader.newInstance(className, CharFilterFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ factory.setExplicitLuceneMatchVersion(null != configuredVersion);
+ return factory;
}
@Override
@@ -335,10 +336,12 @@ public final class FieldTypePluginLoader
@Override
protected TokenizerFactory create(SolrResourceLoader loader, String name, String className, Node node) throws Exception {
- final Map<String,String> params = DOMUtil.toMapExcept(node.getAttributes(),"class");
+ final Map<String,String> params = DOMUtil.toMap(node.getAttributes());
String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
params.put(LUCENE_MATCH_VERSION_PARAM, parseConfiguredVersion(configuredVersion, TokenizerFactory.class.getSimpleName()).toString());
- return loader.newInstance(className, TokenizerFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ TokenizerFactory factory = loader.newInstance(className, TokenizerFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ factory.setExplicitLuceneMatchVersion(null != configuredVersion);
+ return factory;
}
@Override
@@ -373,10 +376,13 @@ public final class FieldTypePluginLoader
{
@Override
protected TokenFilterFactory create(SolrResourceLoader loader, String name, String className, Node node) throws Exception {
- final Map<String,String> params = DOMUtil.toMapExcept(node.getAttributes(),"class");
+ final Map<String,String> params = DOMUtil.toMap(node.getAttributes());
String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
params.put(LUCENE_MATCH_VERSION_PARAM, parseConfiguredVersion(configuredVersion, TokenFilterFactory.class.getSimpleName()).toString());
- return loader.newInstance(className, TokenFilterFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ TokenFilterFactory factory = loader.newInstance
+ (className, TokenFilterFactory.class, getDefaultPackages(), new Class[] { Map.class }, new Object[] { params });
+ factory.setExplicitLuceneMatchVersion(null != configuredVersion);
+ return factory;
}
@Override
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Wed Apr 10 22:57:56 2013
@@ -888,10 +888,13 @@ public class IndexSchema {
return null;
} else {
SimilarityFactory similarityFactory;
- final Object obj = loader.newInstance(((Element) node).getAttribute("class"), Object.class, "search.similarities.");
+ final String classArg = ((Element) node).getAttribute(SimilarityFactory.CLASS_NAME);
+ final Object obj = loader.newInstance(classArg, Object.class, "search.similarities.");
if (obj instanceof SimilarityFactory) {
// configure a factory, get a similarity back
- SolrParams params = SolrParams.toSolrParams(DOMUtil.childNodesToNamedList(node));
+ final NamedList<Object> namedList = DOMUtil.childNodesToNamedList(node);
+ namedList.add(SimilarityFactory.CLASS_NAME, classArg);
+ SolrParams params = SolrParams.toSolrParams(namedList);
similarityFactory = (SimilarityFactory)obj;
similarityFactory.init(params);
} else {
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java Wed Apr 10 22:57:56 2013
@@ -40,7 +40,6 @@ import java.util.Iterator;
*/
public abstract class SimilarityFactory {
public static final String CLASS_NAME = "class";
- private static final String SOLR_SIMILARITIES_PACKAGE = "org.apache.solr.search.similarities";
protected SolrParams params;
@@ -52,25 +51,38 @@ public abstract class SimilarityFactory
/** Returns a serializable description of this similarity(factory) */
public SimpleOrderedMap<Object> getNamedPropertyValues() {
- String className = getClass().getName();
- if (className.startsWith("org.apache.solr.schema.IndexSchema$")) {
- // If this class is just a no-params wrapper around a similarity class, use the similarity class
- className = getSimilarity().getClass().getName();
- } else {
- // Only shorten factory names
- if (className.startsWith(SOLR_SIMILARITIES_PACKAGE + ".")) {
- className = className.replace(SOLR_SIMILARITIES_PACKAGE, "solr");
- }
- }
SimpleOrderedMap<Object> props = new SimpleOrderedMap<Object>();
- props.add(CLASS_NAME, className);
+ props.add(CLASS_NAME, getClassArg());
if (null != params) {
Iterator<String> iter = params.getParameterNamesIterator();
while (iter.hasNext()) {
String key = iter.next();
- props.add(key, params.get(key));
+ if ( ! CLASS_NAME.equals(key)) {
+ props.add(key, params.get(key));
+ }
}
}
return props;
}
+
+ /**
+ * @return the string used to specify the concrete class name in a serialized representation: the class arg.
+ * If the concrete class name was not specified via a class arg, returns {@code getClass().getName()},
+ * unless this class is the anonymous similarity wrapper produced in {@link IndexSchema}, in which
+ * case the {@code getSimilarity().getClass().getName()} is returned.
+ */
+ public String getClassArg() {
+ if (null != params) {
+ String className = params.get(CLASS_NAME);
+ if (null != className) {
+ return className;
+ }
+ }
+ String className = getClass().getName();
+ if (className.startsWith("org.apache.solr.schema.IndexSchema$")) {
+ // If this class is just a no-params wrapper around a similarity class, use the similarity class
+ className = getSimilarity().getClass().getName();
+ }
+ return className;
+ }
}
Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSchemaSimilarityResource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSchemaSimilarityResource.java?rev=1466724&r1=1466723&r2=1466724&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSchemaSimilarityResource.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/rest/schema/TestSchemaSimilarityResource.java Wed Apr 10 22:57:56 2013
@@ -24,7 +24,7 @@ public class TestSchemaSimilarityResourc
public void testGetSchemaSimilarity() throws Exception {
assertQ("/schema/similarity?indent=on&wt=xml",
"count(/response/lst[@name='similarity']) = 1",
- "/response/lst[@name='similarity']/str[@name='class'][.='solr.DefaultSimilarityFactory']");
+ "/response/lst[@name='similarity']/str[@name='class'][.='org.apache.solr.search.similarities.DefaultSimilarityFactory']");
}
}