You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2016/03/09 17:00:14 UTC
[03/50] [abbrv] lucene-solr git commit: SOLR-8736: schema GET
operations on fields, dynamicFields, fieldTypes,
copyField are reimplemented as a part of the bulk API with less details. The
tests and write implementations are removed
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
index acc8c13..4319c3e 100644
--- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
@@ -39,6 +39,7 @@ import org.apache.lucene.uninverting.UninvertingReader;
import org.apache.lucene.util.Version;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.SolrException;
+import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
@@ -1352,6 +1353,10 @@ public class IndexSchema {
* Get a map of property name -> value for the whole schema.
*/
public SimpleOrderedMap<Object> getNamedPropertyValues() {
+ return getNamedPropertyValues(new MapSolrParams(Collections.EMPTY_MAP));
+
+ }
+ public SimpleOrderedMap<Object> getNamedPropertyValues(SolrParams params) {
SimpleOrderedMap<Object> topLevel = new SimpleOrderedMap<>();
topLevel.add(NAME, getSchemaName());
topLevel.add(VERSION, getVersion());
@@ -1372,19 +1377,19 @@ public class IndexSchema {
List<SimpleOrderedMap<Object>> fieldTypeProperties = new ArrayList<>();
SortedMap<String,FieldType> sortedFieldTypes = new TreeMap<>(fieldTypes);
for (FieldType fieldType : sortedFieldTypes.values()) {
- fieldTypeProperties.add(fieldType.getNamedPropertyValues(false));
+ fieldTypeProperties.add(fieldType.getNamedPropertyValues(params.getBool("showDefaults", false)));
}
topLevel.add(FIELD_TYPES, fieldTypeProperties);
List<SimpleOrderedMap<Object>> fieldProperties = new ArrayList<>();
SortedSet<String> fieldNames = new TreeSet<>(fields.keySet());
for (String fieldName : fieldNames) {
- fieldProperties.add(fields.get(fieldName).getNamedPropertyValues(false));
+ fieldProperties.add(fields.get(fieldName).getNamedPropertyValues(params.getBool("showDefaults", false)));
}
topLevel.add(FIELDS, fieldProperties);
List<SimpleOrderedMap<Object>> dynamicFieldProperties = new ArrayList<>();
for (IndexSchema.DynamicField dynamicField : dynamicFields) {
if ( ! dynamicField.getRegex().startsWith(INTERNAL_POLY_FIELD_PREFIX)) { // omit internal polyfields
- dynamicFieldProperties.add(dynamicField.getPrototype().getNamedPropertyValues(false));
+ dynamicFieldProperties.add(dynamicField.getPrototype().getNamedPropertyValues(params.getBool("showDefaults", false)));
}
}
topLevel.add(DYNAMIC_FIELDS, dynamicFieldProperties);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index d87eb69..f291b2f 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -35,10 +35,12 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
+import com.google.common.collect.ImmutableSet;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.Header;
@@ -84,6 +86,7 @@ import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.QueryResponseWriterUtil;
import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.schema.IndexSchema;
import org.apache.solr.security.AuthenticationPlugin;
import org.apache.solr.security.AuthorizationContext;
import org.apache.solr.security.AuthorizationContext.CollectionRequest;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java b/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
index ddbd331..52ba10b 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestClassNameShortening.java
@@ -18,13 +18,14 @@ package org.apache.solr.rest.schema;
import org.apache.solr.util.RestTestBase;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.restlet.ext.servlet.ServerServlet;
import java.util.SortedMap;
import java.util.TreeMap;
-
+@Ignore
public class TestClassNameShortening extends RestTestBase {
@BeforeClass
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestCopyFieldCollectionResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestCopyFieldCollectionResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestCopyFieldCollectionResource.java
index 5eeee8c..c0f936d 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestCopyFieldCollectionResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestCopyFieldCollectionResource.java
@@ -30,73 +30,51 @@ public class TestCopyFieldCollectionResource extends SolrRestletTestBase {
+" and int[@name='maxChars'][.='200']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ +" and str[@name='dest'][.='dest_sub_no_ast_s']]",
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
+ "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
+" and str[@name='dest'][.='title']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
+" and str[@name='dest'][.='*_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
- +" and str[@name='dest'][.='*_dest_sub_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ +" and str[@name='dest'][.='*_dest_sub_s']]",
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
+ +" and str[@name='dest'][.='dest_sub_no_ast_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_src_sub_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
+" and str[@name='dest'][.='title']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_src_sub_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
+" and str[@name='dest'][.='*_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_src_sub_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
- +" and str[@name='dest'][.='*_dest_sub_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ +" and str[@name='dest'][.='*_dest_sub_s']]",
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_src_sub_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_src_sub_i']"
+ +" and str[@name='dest'][.='dest_sub_no_ast_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='src_sub_no_ast_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
+" and str[@name='dest'][.='*_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='src_sub_no_ast_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
- +" and str[@name='dest'][.='*_dest_sub_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ +" and str[@name='dest'][.='*_dest_sub_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='src_sub_no_ast_i']"
- +" and str[@name='sourceDynamicBase'][.='*_i']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']"
- +" and str[@name='destDynamicBase'][.='*_s']]",
+ +" and str[@name='dest'][.='dest_sub_no_ast_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title_*']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_stemmed']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_lettertok']"
+" and str[@name='dest'][.='text']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title_*']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_stemmed']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_lettertok']"
+" and str[@name='dest'][.='*_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title_*']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_stemmed']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_lettertok']"
+" and str[@name='dest'][.='*_dest_sub_s']]",
"/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title_*']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_stemmed']"
- +" and arr[@name='sourceExplicitFields']/str[.='title_lettertok']"
+" and str[@name='dest'][.='dest_sub_no_ast_s']]");
}
@@ -104,56 +82,22 @@ public class TestCopyFieldCollectionResource extends SolrRestletTestBase {
public void testJsonGetAllCopyFields() throws Exception {
assertJQ("/schema/copyfields?indent=on&wt=json",
"/copyFields/[1]=={'source':'src_sub_no_ast_i','dest':'title'}",
- "/copyFields/[7]=={'source':'title','dest':'dest_sub_no_ast_s','destDynamicBase':'*_s'}",
+ "/copyFields/[7]=={'source':'title','dest':'dest_sub_no_ast_s'}",
"/copyFields/[8]=={'source':'*_i','dest':'title'}",
"/copyFields/[9]=={'source':'*_i','dest':'*_s'}",
- "/copyFields/[10]=={'source':'*_i','dest':'*_dest_sub_s','destDynamicBase':'*_s'}",
- "/copyFields/[11]=={'source':'*_i','dest':'dest_sub_no_ast_s','destDynamicBase':'*_s'}",
+ "/copyFields/[10]=={'source':'*_i','dest':'*_dest_sub_s'}",
+ "/copyFields/[11]=={'source':'*_i','dest':'dest_sub_no_ast_s'}",
- "/copyFields/[12]=={'source':'*_src_sub_i','sourceDynamicBase':'*_i','dest':'title'}",
- "/copyFields/[13]=={'source':'*_src_sub_i','sourceDynamicBase':'*_i','dest':'*_s'}",
- "/copyFields/[14]=={'source':'*_src_sub_i','sourceDynamicBase':'*_i','dest':'*_dest_sub_s','destDynamicBase':'*_s'}",
- "/copyFields/[15]=={'source':'*_src_sub_i','sourceDynamicBase':'*_i','dest':'dest_sub_no_ast_s','destDynamicBase':'*_s'}",
+ "/copyFields/[12]=={'source':'*_src_sub_i','dest':'title'}",
+ "/copyFields/[13]=={'source':'*_src_sub_i','dest':'*_s'}",
+ "/copyFields/[14]=={'source':'*_src_sub_i','dest':'*_dest_sub_s'}",
+ "/copyFields/[15]=={'source':'*_src_sub_i','dest':'dest_sub_no_ast_s'}",
- "/copyFields/[16]=={'source':'src_sub_no_ast_i','sourceDynamicBase':'*_i','dest':'*_s'}",
- "/copyFields/[17]=={'source':'src_sub_no_ast_i','sourceDynamicBase':'*_i','dest':'*_dest_sub_s','destDynamicBase':'*_s'}",
- "/copyFields/[18]=={'source':'src_sub_no_ast_i','sourceDynamicBase':'*_i','dest':'dest_sub_no_ast_s','destDynamicBase':'*_s'}");
+ "/copyFields/[16]=={'source':'src_sub_no_ast_i','dest':'*_s'}",
+ "/copyFields/[17]=={'source':'src_sub_no_ast_i','dest':'*_dest_sub_s'}",
+ "/copyFields/[18]=={'source':'src_sub_no_ast_i','dest':'dest_sub_no_ast_s'}");
}
- @Test
- public void testRestrictSource() throws Exception {
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=title,*_i,*_src_sub_i,src_sub_no_ast_i",
- "count(/response/arr[@name='copyFields']/lst) = 16", // 4 + 4 + 4 + 4
- "count(/response/arr[@name='copyFields']/lst/str[@name='source'][.='title']) = 4",
- "count(/response/arr[@name='copyFields']/lst/str[@name='source'][.='*_i']) = 4",
- "count(/response/arr[@name='copyFields']/lst/str[@name='source'][.='*_src_sub_i']) = 4",
- "count(/response/arr[@name='copyFields']/lst/str[@name='source'][.='src_sub_no_ast_i']) = 4");
- }
-
- @Test
- public void testRestrictDest() throws Exception {
- assertQ("/schema/copyfields/?indent=on&wt=xml&dest.fl=title,*_s,*_dest_sub_s,dest_sub_no_ast_s",
- "count(/response/arr[@name='copyFields']/lst) = 16", // 3 + 4 + 4 + 5
- "count(/response/arr[@name='copyFields']/lst/str[@name='dest'][.='title']) = 3",
- "count(/response/arr[@name='copyFields']/lst/str[@name='dest'][.='*_s']) = 4",
- "count(/response/arr[@name='copyFields']/lst/str[@name='dest'][.='*_dest_sub_s']) = 4",
- "count(/response/arr[@name='copyFields']/lst/str[@name='dest'][.='dest_sub_no_ast_s']) = 5");
- }
-
- @Test
- public void testRestrictSourceAndDest() throws Exception {
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=title,*_i&dest.fl=title,dest_sub_no_ast_s",
- "count(/response/arr[@name='copyFields']/lst) = 3",
-
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='title']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']]",
-
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
- +" and str[@name='dest'][.='title']]",
-
- "/response/arr[@name='copyFields']/lst[ str[@name='source'][.='*_i']"
- +" and str[@name='dest'][.='dest_sub_no_ast_s']]");
- }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldCollectionResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldCollectionResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldCollectionResource.java
index 318b28a..032bbad 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldCollectionResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldCollectionResource.java
@@ -30,39 +30,10 @@ public class TestDynamicFieldCollectionResource extends SolrRestletTestBase {
}
@Test
- public void testGetTwoDynamicFields() throws IOException {
- assertQ("/schema/dynamicfields?indent=on&wt=xml&fl=*_i,*_s",
- "count(/response/arr[@name='dynamicFields']/lst/str[@name='name']) = 2",
- "(/response/arr[@name='dynamicFields']/lst/str[@name='name'])[1] = '*_i'",
- "(/response/arr[@name='dynamicFields']/lst/str[@name='name'])[2] = '*_s'");
- }
-
- @Test
- public void testNotFoundDynamicFields() throws IOException {
- assertQ("/schema/dynamicfields?indent=on&wt=xml&fl=*_not_in_there,this_one_isnt_either_*",
- "count(/response/arr[@name='dynamicFields']) = 1",
- "count(/response/arr[@name='dynamicfields']/lst/str[@name='name']) = 0");
- }
-
- @Test
public void testJsonGetAllDynamicFields() throws Exception {
assertJQ("/schema/dynamicfields?indent=on",
"/dynamicFields/[0]/name=='*_coordinate'",
"/dynamicFields/[1]/name=='ignored_*'",
"/dynamicFields/[2]/name=='*_mfacet'");
}
-
- @Test
- public void testJsonGetTwoDynamicFields() throws Exception {
- assertJQ("/schema/dynamicfields?indent=on&fl=*_i,*_s&wt=xml", // assertJQ will fix the wt param to be json
- "/dynamicFields/[0]/name=='*_i'",
- "/dynamicFields/[1]/name=='*_s'");
- }
-
- @Test
- public void testJsonPostFieldsToNonMutableIndexSchema() throws Exception {
- assertJPost("/schema/dynamicfields",
- "[{\"name\":\"foobarbaz\", \"type\":\"text_general\", \"stored\":\"false\"}]",
- "/error/msg=='This IndexSchema is not mutable.'");
- }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldResource.java
index 54b17fc..7ca7953 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestDynamicFieldResource.java
@@ -67,11 +67,4 @@ public class TestDynamicFieldResource extends SolrRestletTestBase {
"/dynamicField/required==false",
"/dynamicField/tokenized==false");
}
-
- @Test
- public void testJsonPutFieldToNonMutableIndexSchema() throws Exception {
- assertJPut("/schema/dynamicfields/newfield_*",
- "{\"type\":\"text_general\", \"stored\":\"false\"}",
- "/error/msg=='This IndexSchema is not mutable.'");
- }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestFieldCollectionResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldCollectionResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldCollectionResource.java
index 571acc5..dd55415 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldCollectionResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldCollectionResource.java
@@ -30,45 +30,6 @@ public class TestFieldCollectionResource extends SolrRestletTestBase {
"(/response/arr[@name='fields']/lst/str[@name='name'])[3] = '_version_'");
}
- @Test
- public void testGetTwoFields() throws IOException {
- assertQ("/schema/fields?indent=on&wt=xml&fl=id,_version_",
- "count(/response/arr[@name='fields']/lst/str[@name='name']) = 2",
- "(/response/arr[@name='fields']/lst/str[@name='name'])[1] = 'id'",
- "(/response/arr[@name='fields']/lst/str[@name='name'])[2] = '_version_'");
- }
-
- @Test
- public void testGetThreeFieldsDontIncludeDynamic() throws IOException {
- //
- assertQ("/schema/fields?indent=on&wt=xml&fl=id,_version_,price_i",
- "count(/response/arr[@name='fields']/lst/str[@name='name']) = 2",
- "(/response/arr[@name='fields']/lst/str[@name='name'])[1] = 'id'",
- "(/response/arr[@name='fields']/lst/str[@name='name'])[2] = '_version_'");
- }
-
- @Test
- public void testGetThreeFieldsIncludeDynamic() throws IOException {
- assertQ("/schema/fields?indent=on&wt=xml&fl=id,_version_,price_i&includeDynamic=on",
-
- "count(/response/arr[@name='fields']/lst/str[@name='name']) = 3",
-
- "(/response/arr[@name='fields']/lst/str[@name='name'])[1] = 'id'",
-
- "(/response/arr[@name='fields']/lst/str[@name='name'])[2] = '_version_'",
-
- "(/response/arr[@name='fields']/lst/str[@name='name'])[3] = 'price_i'",
-
- "/response/arr[@name='fields']/lst[ str[@name='name']='price_i' "
- +" and str[@name='dynamicBase']='*_i']");
- }
-
- @Test
- public void testNotFoundFields() throws IOException {
- assertQ("/schema/fields?indent=on&wt=xml&fl=not_in_there,this_one_either",
- "count(/response/arr[@name='fields']) = 1",
- "count(/response/arr[@name='fields']/lst/str[@name='name']) = 0");
- }
@Test
public void testJsonGetAllFields() throws Exception {
@@ -78,10 +39,4 @@ public class TestFieldCollectionResource extends SolrRestletTestBase {
"/fields/[2]/name=='_version_'");
}
- @Test
- public void testJsonGetTwoFields() throws Exception {
- assertJQ("/schema/fields?indent=on&fl=id,_version_&wt=xml", // assertJQ should fix the wt param to be json
- "/fields/[0]/name=='id'",
- "/fields/[1]/name=='_version_'");
- }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java
index 711e3c0..627aee0 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java
@@ -72,18 +72,12 @@ public class TestFieldResource extends SolrRestletTestBase {
"/field/tokenized==true");
}
- @Test
- public void testGetFieldIncludeDynamic() throws Exception {
- assertQ("/schema/fields/some_crazy_name_i?indent=on&wt=xml&includeDynamic=true",
- "/response/lst[@name='field']/str[@name='name'] = 'some_crazy_name_i'",
- "/response/lst[@name='field']/str[@name='dynamicBase'] = '*_i'");
- }
-
+
@Test
public void testGetFieldDontShowDefaults() throws Exception {
String[] tests = {
"count(/response/lst[@name='field']) = 1",
- "count(/response/lst[@name='field']/*) = 7",
+ "count(/response/lst[@name='field']/*) = 6",
"/response/lst[@name='field']/str[@name='name'] = 'id'",
"/response/lst[@name='field']/str[@name='type'] = 'string'",
"/response/lst[@name='field']/bool[@name='indexed'] = 'true'",
@@ -95,17 +89,4 @@ public class TestFieldResource extends SolrRestletTestBase {
assertQ("/schema/fields/id?indent=on&wt=xml&showDefaults=false", tests);
}
- @Test
- public void testJsonPutFieldToNonMutableIndexSchema() throws Exception {
- assertJPut("/schema/fields/newfield",
- "{\"type\":\"text_general\", \"stored\":\"false\"}",
- "/error/msg=='This IndexSchema is not mutable.'");
- }
-
- @Test
- public void testJsonPostFieldsToNonMutableIndexSchema() throws Exception {
- assertJPost("/schema/fields",
- "[{\"name\":\"foobarbaz\", \"type\":\"text_general\", \"stored\":\"false\"}]",
- "/error/msg=='This IndexSchema is not mutable.'");
- }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeCollectionResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeCollectionResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeCollectionResource.java
index a61f644..53cd1c0 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeCollectionResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeCollectionResource.java
@@ -19,6 +19,7 @@ import org.apache.solr.rest.SolrRestletTestBase;
import org.junit.Test;
public class TestFieldTypeCollectionResource extends SolrRestletTestBase {
+
@Test
public void testGetAllFieldTypes() throws Exception {
assertQ("/schema/fieldtypes?indent=on&wt=xml",
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeResource.java
index 2f0c241..eb72aed 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeResource.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestFieldTypeResource.java
@@ -24,7 +24,7 @@ public class TestFieldTypeResource extends SolrRestletTestBase {
public void testGetFieldType() throws Exception {
assertQ("/schema/fieldtypes/float?indent=on&wt=xml&showDefaults=true",
"count(/response/lst[@name='fieldType']) = 1",
- "count(/response/lst[@name='fieldType']/*) = 18",
+ "count(/response/lst[@name='fieldType']/*) = 16",
"/response/lst[@name='fieldType']/str[@name='name'] = 'float'",
"/response/lst[@name='fieldType']/str[@name='class'] = 'solr.TrieFloatField'",
"/response/lst[@name='fieldType']/str[@name='precisionStep'] ='0'",
@@ -39,9 +39,7 @@ public class TestFieldTypeResource extends SolrRestletTestBase {
"/response/lst[@name='fieldType']/bool[@name='omitPositions'] = 'false'",
"/response/lst[@name='fieldType']/bool[@name='storeOffsetsWithPositions'] = 'false'",
"/response/lst[@name='fieldType']/bool[@name='multiValued'] = 'false'",
- "/response/lst[@name='fieldType']/bool[@name='tokenized'] = 'false'",
- "/response/lst[@name='fieldType']/arr[@name='fields']/str = 'weight'",
- "/response/lst[@name='fieldType']/arr[@name='dynamicFields']/str = '*_f'");
+ "/response/lst[@name='fieldType']/bool[@name='tokenized'] = 'false'");
}
@Test
@@ -69,22 +67,19 @@ public class TestFieldTypeResource extends SolrRestletTestBase {
"/fieldType/omitPositions==false",
"/fieldType/storeOffsetsWithPositions==false",
"/fieldType/multiValued==false",
- "/fieldType/tokenized==false",
- "/fieldType/fields==['weight']",
- "/fieldType/dynamicFields==['*_f']");
+ "/fieldType/tokenized==false");
}
@Test
public void testGetFieldTypeDontShowDefaults() throws Exception {
assertQ("/schema/fieldtypes/teststop?wt=xml&indent=on",
- "count(/response/lst[@name='fieldType']/*) = 5",
+ "count(/response/lst[@name='fieldType']/*) = 3",
"/response/lst[@name='fieldType']/str[@name='name'] = 'teststop'",
"/response/lst[@name='fieldType']/str[@name='class'] = 'solr.TextField'",
"/response/lst[@name='fieldType']/lst[@name='analyzer']/lst[@name='tokenizer']/str[@name='class'] = 'solr.LowerCaseTokenizerFactory'",
"/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst/str[@name='class'][.='solr.StandardFilterFactory']",
"/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst/str[@name='class'][.='solr.StopFilterFactory']",
- "/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst/str[@name='words'][.='stopwords.txt']",
- "/response/lst[@name='fieldType']/arr[@name='fields']/str[.='teststop']",
- "/response/lst[@name='fieldType']/arr[@name='dynamicFields']");
+ "/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst/str[@name='words'][.='stopwords.txt']"
+ );
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaDynamicFieldResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaDynamicFieldResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaDynamicFieldResource.java
deleted file mode 100644
index 6572709..0000000
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaDynamicFieldResource.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.rest.schema;
-import org.apache.commons.io.FileUtils;
-import org.apache.solr.util.RestTestBase;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.restlet.ext.servlet.ServerServlet;
-
-import java.io.File;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-
-public class TestManagedSchemaDynamicFieldResource extends RestTestBase {
-
- private static File tmpSolrHome;
- private static File tmpConfDir;
-
- private static final String collection = "collection1";
- private static final String confDir = collection + "/conf";
-
-
- @Before
- public void before() throws Exception {
- tmpSolrHome = createTempDir().toFile();
- tmpConfDir = new File(tmpSolrHome, confDir);
- FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
-
- final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
- final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
- solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
- extraServlets.put(solrRestApi, "/schema/*"); // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
-
- System.setProperty("managed.schema.mutable", "true");
- System.setProperty("enable.update.log", "false");
-
- createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema-rest.xml",
- "/solr", true, extraServlets);
- }
-
- @After
- public void after() throws Exception {
- if (jetty != null) {
- jetty.stop();
- jetty = null;
- }
- client = null;
- if (restTestHarness != null) {
- restTestHarness.close();
- }
- restTestHarness = null;
- }
-
- @Test
- public void testAddDynamicFieldBadFieldType() throws Exception {
- assertJPut("/schema/dynamicfields/*_newdynamicfield",
- json( "{'type':'not_in_there_at_all','stored':false}" ),
- "/error/msg==\"Dynamic field \\'*_newdynamicfield\\': Field type \\'not_in_there_at_all\\' not found.\"");
- }
-
- @Test
- public void testAddDynamicFieldMismatchedName() throws Exception {
- assertJPut("/schema/dynamicfields/*_newdynamicfield",
- json( "{'name':'*_something_else','type':'text','stored':false}" ),
- "/error/msg=='///regex:\\\\*_newdynamicfield///'");
- }
-
- @Test
- public void testAddDynamicFieldBadProperty() throws Exception {
- assertJPut("/schema/dynamicfields/*_newdynamicfield",
- json( "{'type':'text','no_property_with_this_name':false}" ),
- "/error/msg==\"java.lang.IllegalArgumentException: Invalid field property: no_property_with_this_name\"");
- }
-
- @Test
- public void testAddDynamicField() throws Exception {
- assertQ("/schema/dynamicfields/newdynamicfield_*?indent=on&wt=xml",
- "count(/response/lst[@name='newdynamicfield_*']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/dynamicfields/newdynamicfield_*",
- json("{'type':'text','stored':false}"),
- "/responseHeader/status==0");
-
- assertQ("/schema/dynamicfields/newdynamicfield_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertU(adoc("newdynamicfield_A", "value1 value2", "id", "123"));
- assertU(commit());
-
- assertQ("/select?q=newdynamicfield_A:value1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='123']");
- }
-
- @Test
- public void testAddDynamicFieldWithMulipleOptions() throws Exception {
- assertQ("/schema/dynamicfields/newdynamicfield_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/dynamicfields/newdynamicfield_*",
- json("{'type':'text_en','stored':true,'indexed':false}"),
- "/responseHeader/status==0");
-
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- assertTrue(managedSchemaFile.exists());
- String managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newdynamicfieldStoredTrueIndexedFalsePattern
- = Pattern.compile( "<dynamicField name=\"newdynamicfield_\\*\" type=\"text_en\""
- + "(?=.*stored=\"true\")(?=.*indexed=\"false\").*/>");
- assertTrue(newdynamicfieldStoredTrueIndexedFalsePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/dynamicfields/newdynamicfield_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/lst[@name='dynamicField']/str[@name='name'] = 'newdynamicfield_*'",
- "/response/lst[@name='dynamicField']/str[@name='type'] = 'text_en'",
- "/response/lst[@name='dynamicField']/bool[@name='indexed'] = 'false'",
- "/response/lst[@name='dynamicField']/bool[@name='stored'] = 'true'");
-
- assertU(adoc("newdynamicfield_A", "value1 value2", "id", "1234"));
- assertU(commit());
-
- assertQ("/schema/dynamicfields/newdynamicfield2_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/dynamicfields/newdynamicfield2_*",
- json("{'type':'text_en','stored':true,'indexed':true,'multiValued':true}"),
- "/responseHeader/status==0");
-
- managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newdynamicfield2StoredTrueIndexedTrueMultiValuedTruePattern
- = Pattern.compile( "<dynamicField name=\"newdynamicfield2_\\*\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"true\")(?=.*multiValued=\"true\").*/>");
- assertTrue(newdynamicfield2StoredTrueIndexedTrueMultiValuedTruePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/dynamicfields/newdynamicfield2_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/lst[@name='dynamicField']/str[@name='name'] = 'newdynamicfield2_*'",
- "/response/lst[@name='dynamicField']/str[@name='type'] = 'text_en'",
- "/response/lst[@name='dynamicField']/bool[@name='indexed'] = 'true'",
- "/response/lst[@name='dynamicField']/bool[@name='stored'] = 'true'",
- "/response/lst[@name='dynamicField']/bool[@name='multiValued'] = 'true'");
-
- assertU(adoc("newdynamicfield2_A", "value1 value2", "newdynamicfield2_A", "value3 value4", "id", "5678"));
- assertU(commit());
-
- assertQ("/select?q=newdynamicfield2_A:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='5678']");
- }
-
- @Test
- public void testAddDynamicFieldCollectionWithMultipleOptions() throws Exception {
- assertQ("/schema/dynamicfields?indent=on&wt=xml",
- "count(/response/arr[@name='dynamicFields']/lst/str[@name]) > 0", // there are fields
- "count(/response/arr[@name='dynamicFields']/lst/str[starts-with(@name,'newfield')]) = 0"); // but none named newfield*
-
- assertJPost("/schema/dynamicfields",
- json("[{'name':'newdynamicfield_*','type':'text_en','stored':true,'indexed':false}]"),
- "/responseHeader/status==0");
-
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- assertTrue(managedSchemaFile.exists());
- String managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newfieldStoredTrueIndexedFalsePattern
- = Pattern.compile( "<dynamicField name=\"newdynamicfield_\\*\" type=\"text_en\""
- + "(?=.*stored=\"true\")(?=.*indexed=\"false\").*/>");
- assertTrue(newfieldStoredTrueIndexedFalsePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/dynamicfields?indent=on&wt=xml",
- "/response/arr[@name='dynamicFields']/lst"
- + "[str[@name='name']='newdynamicfield_*' and str[@name='type']='text_en'"
- + " and bool[@name='stored']='true' and bool[@name='indexed']='false']");
-
- assertU(adoc("newdynamicfield_A", "value1 value2", "id", "789"));
- assertU(commit());
-
- assertJPost("/schema/dynamicfields",
- json("[{'name':'newdynamicfield2_*','type':'text_en','stored':true,'indexed':true,'multiValued':true}]"),
- "/responseHeader/status==0");
-
- managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newdynamicfield2StoredTrueIndexedTrueMultiValuedTruePattern
- = Pattern.compile( "<dynamicField name=\"newdynamicfield2_\\*\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"true\")(?=.*multiValued=\"true\").*/>");
- assertTrue(newdynamicfield2StoredTrueIndexedTrueMultiValuedTruePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/dynamicfields?indent=on&wt=xml",
- "/response/arr[@name='dynamicFields']/lst"
- + "[str[@name='name']='newdynamicfield2_*' and str[@name='type']='text_en'"
- + " and bool[@name='stored']='true' and bool[@name='indexed']='true' and bool[@name='multiValued']='true']");
-
- assertU(adoc("newdynamicfield2_A", "value1 value2", "newdynamicfield2_A", "value3 value4", "id", "790"));
- assertU(commit());
-
- assertQ("/select?q=newdynamicfield2_A:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='790']");
- }
-
-
- @Test
- public void testAddCopyField() throws Exception {
- assertQ("/schema/dynamicfields/newdynamicfield2_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/dynamicfields/dynamicfieldA_*",
- json("{'type':'text','stored':false}"),
- "/responseHeader/status==0");
- assertJPut("/schema/dynamicfields/dynamicfieldB_*",
- json("{'type':'text','stored':false, 'copyFields':['dynamicfieldA_*']}"),
- "/responseHeader/status==0");
- assertJPut("/schema/dynamicfields/dynamicfieldC_*",
- json("{'type':'text','stored':false, 'copyFields':'dynamicfieldA_*'}"),
- "/responseHeader/status==0");
-
- assertQ("/schema/dynamicfields/dynamicfieldB_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldB_*",
- "count(/response/arr[@name='copyFields']/lst) = 1");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldC_*",
- "count(/response/arr[@name='copyFields']/lst) = 1");
- //fine to pass in empty list, just won't do anything
- assertJPut("/schema/dynamicfields/dynamicfieldD_*",
- json("{'type':'text','stored':false, 'copyFields':[]}"),
- "/responseHeader/status==0");
- //some bad usages
- assertJPut("/schema/dynamicfields/dynamicfieldF_*",
- json("{'type':'text','stored':false, 'copyFields':['some_nonexistent_dynamicfield_ignore_exception_*']}"),
- "/error/msg==\"copyField dest :\\'some_nonexistent_dynamicfield_ignore_exception_*\\' is not an explicit field and doesn\\'t match a dynamicField.\"");
- }
-
- @Test
- public void testPostMultipleDynamicFields() throws Exception {
- assertQ("/schema/dynamicfields/newdynamicfield1_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertQ("/schema/dynamicfields/newdynamicfield2_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'newdynamicfield1_*','type':'text','stored':false},"
- + " {'name':'newdynamicfield2_*','type':'text','stored':false}]"),
- "/responseHeader/status==0");
-
- assertQ("/schema/dynamicfields/newdynamicfield1_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertQ("/schema/dynamicfields/newdynamicfield2_*?indent=on&wt=xml",
- "count(/response/lst[@name='dynamicField']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertU(adoc("newdynamicfield1_A", "value1 value2", "id", "123"));
- assertU(adoc("newdynamicfield2_A", "value3 value4", "id", "456"));
- assertU(commit());
-
- assertQ("/select?q=newdynamicfield1_A:value1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='123']");
- assertQ("/select?q=newdynamicfield2_A:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='456']");
- }
-
- @Test
- public void testPostCopy() throws Exception {
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'dynamicfieldA_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldB_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldC_*','type':'text','stored':false, 'copyFields':['dynamicfieldB_*']}]"),
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldC_*",
- "count(/response/arr[@name='copyFields']/lst) = 1");
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'dynamicfieldD_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldE_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldF_*','type':'text','stored':false, 'copyFields':['dynamicfieldD_*','dynamicfieldE_*']},"
- + " {'name':'dynamicfieldG_*','type':'text','stored':false, 'copyFields':'dynamicfieldD_*'}]"),//single
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldF_*",
- "count(/response/arr[@name='copyFields']/lst) = 2");
- //passing in an empty list is perfectly acceptable, it just won't do anything
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'dynamicfieldX_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldY_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldZ_*','type':'text','stored':false, 'copyFields':[]}]"),
- "/responseHeader/status==0");
- //some bad usages
-
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'dynamicfieldH_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldI_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldJ_*','type':'text','stored':false, 'copyFields':['some_nonexistent_dynamicfield_ignore_exception_*']}]"),
- "/error/msg=='copyField dest :\\'some_nonexistent_dynamicfield_ignore_exception_*\\' is not an explicit field and doesn\\'t match a dynamicField.'");
- }
-
- @Test
- public void testPostCopyFields() throws Exception {
- assertJPost("/schema/dynamicfields",
- json( "[{'name':'dynamicfieldA_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldB_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldC_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldD_*','type':'text','stored':false},"
- + " {'name':'dynamicfieldE_*','type':'text','stored':false}]"),
- "/responseHeader/status==0");
- assertJPost("/schema/copyfields",
- json( "[{'source':'dynamicfieldA_*', 'dest':'dynamicfieldB_*'},"
- + " {'source':'dynamicfieldD_*', 'dest':['dynamicfieldC_*', 'dynamicfieldE_*']}]"),
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldA_*",
- "count(/response/arr[@name='copyFields']/lst) = 1");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=dynamicfieldD_*",
- "count(/response/arr[@name='copyFields']/lst) = 2");
- assertJPost("/schema/copyfields", // copyField glob sources are not required to match a dynamic field
- json("[{'source':'some_glob_not_necessarily_matching_any_dynamicfield_*', 'dest':['dynamicfieldA_*']},"
- +" {'source':'*', 'dest':['dynamicfieldD_*']}]"),
- "/responseHeader/status==0");
- assertJPost("/schema/copyfields",
- json("[{'source':'dynamicfieldD_*', 'dest':['some_nonexistent_dynamicfield_ignore_exception_*']}]"),
- "/error/msg=='copyField dest :\\'some_nonexistent_dynamicfield_ignore_exception_*\\' is not an explicit field and doesn\\'t match a dynamicField.'");
- }
-}
-
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java
deleted file mode 100644
index b39d266..0000000
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.rest.schema;
-import org.apache.commons.io.FileUtils;
-import org.apache.solr.util.RestTestBase;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.restlet.ext.servlet.ServerServlet;
-
-import java.io.File;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-
-public class TestManagedSchemaFieldResource extends RestTestBase {
-
- private static File tmpSolrHome;
- private static File tmpConfDir;
-
- private static final String collection = "collection1";
- private static final String confDir = collection + "/conf";
-
-
- @Before
- public void before() throws Exception {
- tmpSolrHome = createTempDir().toFile();
- tmpConfDir = new File(tmpSolrHome, confDir);
- FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
-
- final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
- final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
- solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
- extraServlets.put(solrRestApi, "/schema/*"); // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
-
- System.setProperty("managed.schema.mutable", "true");
- System.setProperty("enable.update.log", "false");
-
- createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema-rest.xml",
- "/solr", true, extraServlets);
- }
-
- @After
- public void after() throws Exception {
- if (jetty != null) {
- jetty.stop();
- jetty = null;
- }
- client = null;
- if (restTestHarness != null) {
- restTestHarness.close();
- }
- restTestHarness = null;
- }
-
- @Test
- public void testAddFieldBadFieldType() throws Exception {
- assertJPut("/schema/fields/newfield",
- json( "{'type':'not_in_there_at_all','stored':false}" ),
- "/error/msg==\"Field \\'newfield\\': Field type \\'not_in_there_at_all\\' not found.\"");
- }
-
- @Test
- public void testAddFieldMismatchedName() throws Exception {
- assertJPut("/schema/fields/newfield",
- json( "{'name':'something_else','type':'text','stored':false}" ),
- "/error/msg=='///regex:newfield///'");
- }
-
- @Test
- public void testAddFieldBadProperty() throws Exception {
- assertJPut("/schema/fields/newfield",
- json( "{'type':'text','no_property_with_this_name':false}" ),
- "/error/msg==\"java.lang.IllegalArgumentException: Invalid field property: no_property_with_this_name\"");
- }
-
- @Test
- public void testAddField() throws Exception {
- assertQ("/schema/fields/newfield?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/fields/newfield",
- json("{'type':'text','stored':false}"),
- "/responseHeader/status==0");
-
- assertQ("/schema/fields/newfield?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertU(adoc("newfield", "value1 value2", "id", "123"));
- assertU(commit());
-
- assertQ("/select?q=newfield:value1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='123']");
- }
-
- @Test
- public void testAddFieldWithMulipleOptions() throws Exception {
- assertQ("/schema/fields/newfield?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/fields/newfield",
- json("{'type':'text_en','stored':true,'indexed':false}"),
- "/responseHeader/status==0");
-
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- assertTrue(managedSchemaFile.exists());
- String managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newfieldStoredTrueIndexedFalsePattern
- = Pattern.compile( "<field name=\"newfield\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"false\").*/>");
- assertTrue(newfieldStoredTrueIndexedFalsePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/fields/newfield?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/lst[@name='field']/str[@name='name'] = 'newfield'",
- "/response/lst[@name='field']/str[@name='type'] = 'text_en'",
- "/response/lst[@name='field']/bool[@name='indexed'] = 'false'",
- "/response/lst[@name='field']/bool[@name='stored'] = 'true'");
-
- assertU(adoc("newfield", "value1 value2", "id", "1234"));
- assertU(commit());
-
- assertQ("/schema/fields/newfield2?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/fields/newfield2",
- json("{'type':'text_en','stored':true,'indexed':true,'multiValued':true}"),
- "/responseHeader/status==0");
-
- managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newfield2StoredTrueIndexedTrueMultiValuedTruePattern
- = Pattern.compile( "<field name=\"newfield2\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"true\")(?=.*multiValued=\"true\").*/>");
- assertTrue(newfield2StoredTrueIndexedTrueMultiValuedTruePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/fields/newfield2?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/lst[@name='field']/str[@name='name'] = 'newfield2'",
- "/response/lst[@name='field']/str[@name='type'] = 'text_en'",
- "/response/lst[@name='field']/bool[@name='indexed'] = 'true'",
- "/response/lst[@name='field']/bool[@name='stored'] = 'true'",
- "/response/lst[@name='field']/bool[@name='multiValued'] = 'true'");
-
- assertU(adoc("newfield2", "value1 value2", "newfield2", "value3 value4", "id", "5678"));
- assertU(commit());
-
- assertQ("/select?q=newfield2:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='5678']");
- }
-
- @Test
- public void testAddFieldCollectionWithMultipleOptions() throws Exception {
- assertQ("/schema/fields?indent=on&wt=xml",
- "count(/response/arr[@name='fields']/lst/str[@name]) > 0", // there are fields
- "count(/response/arr[@name='fields']/lst/str[starts-with(@name,'newfield')]) = 0"); // but none named newfield*
-
- assertJPost("/schema/fields",
- json("[{'name':'newfield','type':'text_en','stored':true,'indexed':false}]"),
- "/responseHeader/status==0");
-
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- assertTrue(managedSchemaFile.exists());
- String managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newfieldStoredTrueIndexedFalsePattern
- = Pattern.compile( "<field name=\"newfield\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"false\").*/>");
- assertTrue(newfieldStoredTrueIndexedFalsePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/fields?indent=on&wt=xml",
- "/response/arr[@name='fields']/lst"
- + "[str[@name='name']='newfield' and str[@name='type']='text_en'"
- + " and bool[@name='stored']='true' and bool[@name='indexed']='false']");
-
- assertU(adoc("newfield", "value1 value2", "id", "789"));
- assertU(commit());
-
- assertJPost("/schema/fields",
- json("[{'name':'newfield2','type':'text_en','stored':true,'indexed':true,'multiValued':true}]"),
- "/responseHeader/status==0");
-
- managedSchemaContents = FileUtils.readFileToString(managedSchemaFile, "UTF-8");
- Pattern newfield2StoredTrueIndexedTrueMultiValuedTruePattern
- = Pattern.compile( "<field name=\"newfield2\" type=\"text_en\" "
- + "(?=.*stored=\"true\")(?=.*indexed=\"true\")(?=.*multiValued=\"true\").*/>");
- assertTrue(newfield2StoredTrueIndexedTrueMultiValuedTruePattern.matcher(managedSchemaContents).find());
-
- assertQ("/schema/fields?indent=on&wt=xml",
- "/response/arr[@name='fields']/lst"
- + "[str[@name='name']='newfield2' and str[@name='type']='text_en'"
- + " and bool[@name='stored']='true' and bool[@name='indexed']='true' and bool[@name='multiValued']='true']");
-
- assertU(adoc("newfield2", "value1 value2", "newfield2", "value3 value4", "id", "790"));
- assertU(commit());
-
- assertQ("/select?q=newfield2:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='790']");
- }
-
-
- @Test
- public void testAddCopyField() throws Exception {
- assertQ("/schema/fields/newfield2?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPut("/schema/fields/fieldA",
- json("{'type':'text','stored':false}"),
- "/responseHeader/status==0");
- assertJPut("/schema/fields/fieldB",
- json("{'type':'text','stored':false, 'copyFields':['fieldA']}"),
- "/responseHeader/status==0");
- assertJPut("/schema/fields/fieldC",
- json("{'type':'text','stored':false, 'copyFields':'fieldA'}"),
- "/responseHeader/status==0");
-
- assertQ("/schema/fields/fieldB?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldB",
- "count(/response/arr[@name='copyFields']/lst) = 1"
- );
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldC",
- "count(/response/arr[@name='copyFields']/lst) = 1"
- );
- //fine to pass in empty list, just won't do anything
- assertJPut("/schema/fields/fieldD",
- json("{'type':'text','stored':false, 'copyFields':[]}"),
- "/responseHeader/status==0");
- //some bad usages
- assertJPut("/schema/fields/fieldF",
- json("{'type':'text','stored':false, 'copyFields':['some_nonexistent_field_ignore_exception']}"),
- "/error/msg==\"copyField dest :\\'some_nonexistent_field_ignore_exception\\' is not an explicit field and doesn\\'t match a dynamicField.\"");
- }
-
- @Test
- public void testPostMultipleFields() throws Exception {
- assertQ("/schema/fields/newfield1?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertQ("/schema/fields/newfield2?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 0",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '404'",
- "/response/lst[@name='error']/int[@name='code'] = '404'");
-
- assertJPost("/schema/fields",
- json( "[{'name':'newfield1','type':'text','stored':false},"
- + " {'name':'newfield2','type':'text','stored':false}]"),
- "/responseHeader/status==0");
-
- assertQ("/schema/fields/newfield1?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertQ("/schema/fields/newfield2?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- assertU(adoc("newfield1", "value1 value2", "id", "123"));
- assertU(adoc("newfield2", "value3 value4", "id", "456"));
- assertU(commit());
-
- assertQ("/select?q=newfield1:value1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='123']");
- assertQ("/select?q=newfield2:value3",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'",
- "/response/result[@name='response'][@numFound='1']",
- "count(/response/result[@name='response']/doc/*) = 1",
- "/response/result[@name='response']/doc/str[@name='id'][.='456']");
- }
-
- @Test
- public void testPostCopy() throws Exception {
- assertJPost("/schema/fields",
- json( "[{'name':'fieldA','type':'text','stored':false},"
- + " {'name':'fieldB','type':'text','stored':false},"
- + " {'name':'fieldC','type':'text','stored':false, 'copyFields':['fieldB']}]"),
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldC",
- "count(/response/arr[@name='copyFields']/lst) = 1"
- );
- assertJPost("/schema/fields",
- json( "[{'name':'fieldD','type':'text','stored':false},"
- + " {'name':'fieldE','type':'text','stored':false},"
- + " {'name':'fieldF','type':'text','stored':false, 'copyFields':['fieldD','fieldE']},"
- + " {'name':'fieldG','type':'text','stored':false, 'copyFields':'fieldD'}]"),//single
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldF",
- "count(/response/arr[@name='copyFields']/lst) = 2"
- );
- //passing in an empty list is perfectly acceptable, it just won't do anything
- assertJPost("/schema/fields",
- json( "[{'name':'fieldX','type':'text','stored':false},"
- + " {'name':'fieldY','type':'text','stored':false},"
- + " {'name':'fieldZ','type':'text','stored':false, 'copyFields':[]}]"),
- "/responseHeader/status==0");
- //some bad usages
-
- assertJPost("/schema/fields",
- json( "[{'name':'fieldH','type':'text','stored':false},"
- + " {'name':'fieldI','type':'text','stored':false},"
- + " {'name':'fieldJ','type':'text','stored':false, 'copyFields':['some_nonexistent_field_ignore_exception']}]"),
- "/error/msg=='copyField dest :\\'some_nonexistent_field_ignore_exception\\' is not an explicit field and doesn\\'t match a dynamicField.'");
- }
-
- @Test
- public void testPostCopyFields() throws Exception {
- assertJPost("/schema/fields",
- json( "[{'name':'fieldA','type':'text','stored':false},"
- + " {'name':'fieldB','type':'text','stored':false},"
- + " {'name':'fieldC','type':'text','stored':false},"
- + " {'name':'fieldD','type':'text','stored':false},"
- + " {'name':'fieldE','type':'text','stored':false}]"),
- "/responseHeader/status==0");
- assertJPost("/schema/copyfields",
- json( "[{'source':'fieldA', 'dest':'fieldB'},"
- + " {'source':'fieldD', 'dest':['fieldC', 'fieldE']}]"),
- "/responseHeader/status==0");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldA",
- "count(/response/arr[@name='copyFields']/lst) = 1");
- assertQ("/schema/copyfields/?indent=on&wt=xml&source.fl=fieldD",
- "count(/response/arr[@name='copyFields']/lst) = 2");
- assertJPost("/schema/copyfields",
- json("[{'source':'some_nonexistent_field_ignore_exception', 'dest':['fieldA']}]"),
- "/error/msg=='copyField source :\\'some_nonexistent_field_ignore_exception\\' is not a glob and doesn\\'t match any explicit field or dynamicField.'");
- assertJPost("/schema/copyfields",
- json("[{'source':'fieldD', 'dest':['some_nonexistent_field_ignore_exception']}]"),
- "/error/msg=='copyField dest :\\'some_nonexistent_field_ignore_exception\\' is not an explicit field and doesn\\'t match a dynamicField.'");
- }
-}
-
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f2c281ab/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldTypeResource.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldTypeResource.java b/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldTypeResource.java
deleted file mode 100644
index a0f4e25..0000000
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldTypeResource.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.rest.schema;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.solr.util.RestTestBase;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.noggit.JSONUtil;
-import org.restlet.ext.servlet.ServerServlet;
-
-public class TestManagedSchemaFieldTypeResource extends RestTestBase {
-
- private static File tmpSolrHome;
- private static File tmpConfDir;
-
- private static final String collection = "collection1";
- private static final String confDir = collection + "/conf";
-
- @Before
- public void before() throws Exception {
- tmpSolrHome = createTempDir().toFile();
- tmpConfDir = new File(tmpSolrHome, confDir);
- FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
-
- final SortedMap<ServletHolder,String> extraServlets = new TreeMap<>();
- final ServletHolder solrRestApi = new ServletHolder("SolrSchemaRestApi", ServerServlet.class);
- solrRestApi.setInitParameter("org.restlet.application", "org.apache.solr.rest.SolrSchemaRestApi");
- extraServlets.put(solrRestApi, "/schema/*"); // '/schema/*' matches '/schema', '/schema/', and '/schema/whatever...'
-
- System.setProperty("managed.schema.mutable", "true");
- System.setProperty("enable.update.log", "false");
-
- createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema-rest.xml",
- "/solr", true, extraServlets);
- }
-
- @After
- private void after() throws Exception {
- jetty.stop();
- jetty = null;
- System.clearProperty("managed.schema.mutable");
- System.clearProperty("enable.update.log");
-
- if (restTestHarness != null) {
- restTestHarness.close();
- }
- restTestHarness = null;
- }
-
- @Test
- public void testAddFieldTypes() throws Exception {
-
- // name mismatch
- assertJPut("/schema/fieldtypes/myIntFieldType",
- json("{'name':'badNameEh','class':'solr.TrieIntField','stored':false}"),
- "/responseHeader/status==400");
-
- // no class
- assertJPut("/schema/fieldtypes/myIntFieldType",
- json("{'stored':false}"),
- "/responseHeader/status==400");
-
- // invalid attribute
- assertJPut("/schema/fieldtypes/myIntFieldType",
- json("{'foo':'bar'}"),
- "/responseHeader/status==400");
-
- // empty analyzer
- String ftdef = "";
- ftdef += "{";
- ftdef += " 'class':'solr.TextField','positionIncrementGap':'100',";
- ftdef += " 'analyzer':''";
- ftdef += "}";
- assertJPut("/schema/fieldtypes/emptyAnalyzerFieldType",
- json(ftdef),
- "/responseHeader/status==400");
-
- // basic field types
- assertJPut("/schema/fieldtypes/myIntFieldType",
- json("{'name':'myIntFieldType','class':'solr.TrieIntField','stored':false}"),
- "/responseHeader/status==0");
- checkFieldTypeProps(getExpectedProps("myIntFieldType", "solr.TrieIntField", true, false), 16);
-
- assertJPut("/schema/fieldtypes/myDoubleFieldType",
- json("{'class':'solr.TrieDoubleField','precisionStep':'0','positionIncrementGap':'0'}"),
- "/responseHeader/status==0");
- Map<String,Object> expProps =
- getExpectedProps("myDoubleFieldType", "solr.TrieDoubleField", true, true);
- // add some additional expected props for this type
- expProps.put("precisionStep", "0");
- expProps.put("positionIncrementGap", "0");
- checkFieldTypeProps(expProps, 18);
-
- assertJPut("/schema/fieldtypes/myBoolFieldType",
- json("{'class':'solr.BoolField','sortMissingLast':true}"),
- "/responseHeader/status==0");
- expProps = getExpectedProps("myBoolFieldType", "solr.BoolField", true, true);
- expProps.put("sortMissingLast", true);
- checkFieldTypeProps(expProps, 17);
-
- // a text analyzing field type
- ftdef = "{";
- ftdef += " 'class':'solr.TextField','positionIncrementGap':'100',";
- ftdef += " 'analyzer':{";
- ftdef += " 'charFilters':[";
- ftdef += " {'class':'solr.PatternReplaceCharFilterFactory','replacement':'$1$1','pattern':'([a-zA-Z])\\\\1+'}";
- ftdef += " ],";
- ftdef += " 'tokenizer':{'class':'solr.WhitespaceTokenizerFactory'},";
- ftdef += " 'filters':[";
- ftdef += " {'class':'solr.WordDelimiterFilterFactory','preserveOriginal':'0'},";
- ftdef += " {'class':'solr.StopFilterFactory','words':'stopwords.txt','ignoreCase':'true'},";
- ftdef += " {'class':'solr.LowerCaseFilterFactory'},";
- ftdef += " {'class':'solr.ASCIIFoldingFilterFactory'},";
- ftdef += " {'class':'solr.KStemFilterFactory'}";
- ftdef += " ]";
- ftdef += " }";
- ftdef += "}";
-
- assertJPut("/schema/fieldtypes/myTextFieldType", json(ftdef), "/responseHeader/status==0");
-
- expProps = getExpectedProps("myTextFieldType", "solr.TextField", true, true);
- expProps.put("autoGeneratePhraseQueries", false);
- expProps.put("omitNorms", false);
- expProps.put("omitTermFreqAndPositions", false);
- expProps.put("omitPositions", false);
- expProps.put("storeOffsetsWithPositions", false);
- expProps.put("tokenized", true);
-
- List<String> analyzerTests = new ArrayList<>();
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='charFilters']/lst[1]/str[@name='class'] = 'solr.PatternReplaceCharFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/lst[@name='tokenizer']/str[@name='class'] = 'solr.WhitespaceTokenizerFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[1]/str[@name='class'] = 'solr.WordDelimiterFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[2]/str[@name='class'] = 'solr.StopFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[3]/str[@name='class'] = 'solr.LowerCaseFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[4]/str[@name='class'] = 'solr.ASCIIFoldingFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[5]/str[@name='class'] = 'solr.KStemFilterFactory'");
- checkFieldTypeProps(expProps, 19, analyzerTests);
-
- // now add a field type that uses managed resources and a field that uses that type
-
- String piglatinStopWordEndpoint = "/schema/analysis/stopwords/piglatin";
- String piglatinSynonymEndpoint = "/schema/analysis/synonyms/piglatin";
-
- // now define a new FieldType that uses the managed piglatin endpoints
- // the managed endpoints will be autovivified as needed
- ftdef = "{";
- ftdef += " 'class':'solr.TextField',";
- ftdef += " 'analyzer':{";
- ftdef += " 'tokenizer':{'class':'solr.StandardTokenizerFactory'},";
- ftdef += " 'filters':[";
- ftdef += " {'class':'solr.ManagedStopFilterFactory','managed':'piglatin'},";
- ftdef += " {'class':'solr.ManagedSynonymFilterFactory','managed':'piglatin'}";
- ftdef += " ]";
- ftdef += " }";
- ftdef += "}";
- assertJPut("/schema/fieldtypes/piglatinFieldType", json(ftdef), "/responseHeader/status==0");
-
- expProps = getExpectedProps("piglatinFieldType", "solr.TextField", true, true);
- expProps.put("autoGeneratePhraseQueries", false);
- expProps.put("omitNorms", false);
- expProps.put("omitTermFreqAndPositions", false);
- expProps.put("omitPositions", false);
- expProps.put("storeOffsetsWithPositions", false);
- expProps.put("tokenized", true);
-
- analyzerTests = new ArrayList<>();
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/lst[@name='tokenizer']/str[@name='class'] = 'solr.StandardTokenizerFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[1]/str[@name='class'] = 'solr.ManagedStopFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[2]/str[@name='class'] = 'solr.ManagedSynonymFilterFactory'");
- checkFieldTypeProps(expProps, 18, analyzerTests);
-
- assertJQ(piglatinSynonymEndpoint,
- "/synonymMappings/initArgs/ignoreCase==false",
- "/synonymMappings/managedMap=={}");
-
- // add some piglatin synonyms
- Map<String,List<String>> syns = new HashMap<>();
- syns.put("appyhay", Arrays.asList("ladgay","oyfuljay"));
- assertJPut(piglatinSynonymEndpoint,
- JSONUtil.toJSON(syns),
- "/responseHeader/status==0");
- assertJQ(piglatinSynonymEndpoint,
- "/synonymMappings/managedMap/appyhay==['ladgay','oyfuljay']");
-
- // add some piglatin stopwords
- assertJPut(piglatinStopWordEndpoint,
- JSONUtil.toJSON(Arrays.asList("hetay")),
- "/responseHeader/status==0");
-
- assertJQ(piglatinStopWordEndpoint + "/hetay", "/hetay=='hetay'");
-
- // add a field that uses our new type
- assertJPut("/schema/fields/newManagedField",
- json("{'type':'piglatinFieldType','stored':false}"),
- "/responseHeader/status==0");
-
- assertQ("/schema/fields/newManagedField?indent=on&wt=xml",
- "count(/response/lst[@name='field']) = 1",
- "/response/lst[@name='responseHeader']/int[@name='status'] = '0'");
-
- // try to delete the managed synonyms endpoint, which should fail because it is being used
- assertJDelete(piglatinSynonymEndpoint, "/responseHeader/status==403");
-
- // test adding multiple field types at once
- ftdef = "[";
- ftdef += "{";
- ftdef += " 'name':'textFieldType1',";
- ftdef += " 'class':'solr.TextField','positionIncrementGap':'100',";
- ftdef += " 'analyzer':{";
- ftdef += " 'tokenizer':{'class':'solr.WhitespaceTokenizerFactory'},";
- ftdef += " 'filters':[";
- ftdef += " {'class':'solr.WordDelimiterFilterFactory','preserveOriginal':'0'},";
- ftdef += " {'class':'solr.StopFilterFactory','words':'stopwords.txt','ignoreCase':'true'},";
- ftdef += " {'class':'solr.LowerCaseFilterFactory'}";
- ftdef += " ]";
- ftdef += " }";
- ftdef += "},{";
- ftdef += " 'name':'textFieldType2',";
- ftdef += " 'class':'solr.TextField','positionIncrementGap':'100',";
- ftdef += " 'analyzer':{";
- ftdef += " 'tokenizer':{'class':'solr.WhitespaceTokenizerFactory'},";
- ftdef += " 'filters':[";
- ftdef += " {'class':'solr.WordDelimiterFilterFactory','preserveOriginal':'0'},";
- ftdef += " {'class':'solr.StopFilterFactory','words':'stopwords.txt','ignoreCase':'true'},";
- ftdef += " {'class':'solr.LowerCaseFilterFactory'},";
- ftdef += " {'class':'solr.ASCIIFoldingFilterFactory'}";
- ftdef += " ]";
- ftdef += " }";
- ftdef += "}";
- ftdef += "]";
-
- assertJPost("/schema/fieldtypes", json(ftdef), "/responseHeader/status==0");
-
- expProps = getExpectedProps("textFieldType1", "solr.TextField", true, true);
- expProps.put("autoGeneratePhraseQueries", false);
- expProps.put("omitNorms", false);
- expProps.put("omitTermFreqAndPositions", false);
- expProps.put("omitPositions", false);
- expProps.put("storeOffsetsWithPositions", false);
- expProps.put("tokenized", true);
-
- analyzerTests = new ArrayList<>();
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/lst[@name='tokenizer']/str[@name='class'] = 'solr.WhitespaceTokenizerFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[1]/str[@name='class'] = 'solr.WordDelimiterFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[2]/str[@name='class'] = 'solr.StopFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[3]/str[@name='class'] = 'solr.LowerCaseFilterFactory'");
- checkFieldTypeProps(expProps, 19, analyzerTests);
-
- expProps = getExpectedProps("textFieldType2", "solr.TextField", true, true);
- expProps.put("autoGeneratePhraseQueries", false);
- expProps.put("omitNorms", false);
- expProps.put("omitTermFreqAndPositions", false);
- expProps.put("omitPositions", false);
- expProps.put("storeOffsetsWithPositions", false);
- expProps.put("tokenized", true);
-
- analyzerTests = new ArrayList<>();
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/lst[@name='tokenizer']/str[@name='class'] = 'solr.WhitespaceTokenizerFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[1]/str[@name='class'] = 'solr.WordDelimiterFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[2]/str[@name='class'] = 'solr.StopFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[3]/str[@name='class'] = 'solr.LowerCaseFilterFactory'");
- analyzerTests.add("/response/lst[@name='fieldType']/lst[@name='analyzer']/arr[@name='filters']/lst[4]/str[@name='class'] = 'solr.ASCIIFoldingFilterFactory'");
- checkFieldTypeProps(expProps, 19, analyzerTests);
- }
-
- /**
- * Helper function to check fieldType settings against a set of expected values.
- */
- protected void checkFieldTypeProps(Map<String,Object> expected, int expectedChildCount) {
- checkFieldTypeProps(expected, expectedChildCount, null);
- }
-
- protected void checkFieldTypeProps(Map<String,Object> expected, int expectedChildCount, List<String> addlTests) {
- String fieldTypeName = (String)expected.get("name");
-
- List<String> tests = new ArrayList<>();
- tests.add("count(/response/lst[@name='fieldType']) = 1");
- tests.add("count(/response/lst[@name='fieldType']/*) = "+expectedChildCount);
- tests.add("count(/response/lst[@name='fieldType']/arr[@name='fields']/*) = 0");
- tests.add("count(/response/lst[@name='fieldType']/arr[@name='dynamicFields']/*) = 0");
- for (Map.Entry<String,Object> next : expected.entrySet()) {
- Object val = next.getValue();
- String pathType = null;
- if (val instanceof Boolean)
- pathType = "bool";
- else if (val instanceof String)
- pathType = "str";
- else
- fail("Unexpected value type "+val.getClass().getName());
- // NOTE: it seems like the fieldtypes endpoint only returns strings or booleans
-
- String xpath =
- "/response/lst[@name='fieldType']/"+pathType+"[@name='"+next.getKey()+"']";
- tests.add(xpath+" = '"+val+"'");
- }
-
- if (addlTests != null)
- tests.addAll(addlTests);
-
- assertQ("/schema/fieldtypes/"+fieldTypeName+"?indent=on&wt=xml&showDefaults=true",
- tests.toArray(new String[0]));
- }
-
- /**
- * Builds a map containing expected values for a field type created by this test.
- */
- protected Map<String,Object> getExpectedProps(String name, String className, boolean indexed, boolean stored) {
- Map<String,Object> map = new HashMap<>();
- map.put("name", name);
- map.put("class", className);
- map.put("indexed", indexed);
- map.put("stored", stored);
- map.put("docValues", false);
- map.put("termVectors", false);
- map.put("termPositions", false);
- map.put("termOffsets", false);
- map.put("omitNorms", true);
- map.put("omitTermFreqAndPositions", true);
- map.put("omitPositions", false);
- map.put("storeOffsetsWithPositions", false);
- map.put("multiValued", false);
- map.put("tokenized", false);
- return map;
- }
-}