blob: 41e5504543472bd8007dc55054b2d1d8ffbf23f3 [file] [log] [blame]
/*
* 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.schema;
import java.io.File;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.solr.common.util.Utils;
import org.apache.solr.rest.schema.TestBulkSchemaAPI;
import org.apache.solr.util.RestTestBase;
import org.apache.solr.util.RestTestHarness;
import org.junit.After;
import org.junit.Before;
/**
* Tests the useDocValuesAsStored functionality.
*/
// See: https://issues.apache.org/jira/browse/SOLR-12028 Tests cannot remove files on Windows machines occasionally
public class TestUseDocValuesAsStored2 extends RestTestBase {
@Before
public void before() throws Exception {
File tmpSolrHome = createTempDir().toFile();
FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
System.setProperty("managed.schema.mutable", "true");
System.setProperty("enable.update.log", "false");
createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema-rest.xml",
"/solr", true, null);
}
@After
public void after() throws Exception {
if (jetty != null) {
jetty.stop();
jetty = null;
}
client = null;
if (restTestHarness != null) {
restTestHarness.close();
}
restTestHarness = null;
}
public void testSchemaAPI() throws Exception {
RestTestHarness harness = restTestHarness;
String payload = "{\n" +
" 'add-field' : {\n" +
" 'name':'a1',\n" +
" 'type': 'string',\n" +
" 'stored':false,\n" +
" 'docValues':true,\n" +
" 'indexed':false\n" +
" },\n" +
" 'add-field' : {\n" +
" 'name':'a2',\n" +
" 'type': 'string',\n" +
" 'stored':false,\n" +
" 'useDocValuesAsStored':true,\n" +
" 'docValues':true,\n" +
" 'indexed':true\n" +
" },\n" +
" 'add-field' : {\n" +
" 'name':'a3',\n" +
" 'type': 'string',\n" +
" 'stored':false,\n" +
" 'useDocValuesAsStored':false,\n" +
" 'docValues':true,\n" +
" 'indexed':true\n" +
" }\n" +
" }\n";
String response = harness.post("/schema", json(payload));
@SuppressWarnings({"rawtypes"})
Map m = (Map) Utils.fromJSONString(response);
assertNull(response, m.get("errors"));
// default value of useDocValuesAsStored
m = TestBulkSchemaAPI.getObj(harness, "a1", "fields");
assertNotNull("field a1 not created", m);
assertNull(m.get("useDocValuesAsStored"));
// useDocValuesAsStored=true
m = TestBulkSchemaAPI.getObj(harness,"a2", "fields");
assertNotNull("field a2 not created", m);
assertEquals(Boolean.TRUE, m.get("useDocValuesAsStored"));
// useDocValuesAsStored=false
m = TestBulkSchemaAPI.getObj(harness,"a3", "fields");
assertNotNull("field a3 not created", m);
assertEquals(Boolean.FALSE, m.get("useDocValuesAsStored"));
// Index documents to check the effect
assertU(adoc("id", "myid1", "a1", "1", "a2", "2", "a3", "3"));
assertU(commit());
RestTestBase.assertJQ("/select?q=id:myid*&fl=*",
"/response/docs==[{'id':'myid1', 'a1':'1', 'a2':'2'}]");
RestTestBase.assertJQ("/select?q=id:myid*&fl=id,a1,a2,a3",
"/response/docs==[{'id':'myid1', 'a1':'1', 'a2':'2', 'a3':'3'}]");
RestTestBase.assertJQ("/select?q=id:myid*&fl=a3",
"/response/docs==[{'a3':'3'}]");
// this will return a3 because it is explicitly requested even if '*' is specified
RestTestBase.assertJQ("/select?q=id:myid*&fl=*,a3",
"/response/docs==[{'id':'myid1', 'a1':'1', 'a2':'2', 'a3':'3'}]");
// this will not return a3 because the glob 'a*' will match only stored + useDocValuesAsStored=true fields
RestTestBase.assertJQ("/select?q=id:myid*&fl=id,a*",
"/response/docs==[{'id':'myid1', 'a1':'1', 'a2':'2'}]");
// Test replace-field
// Explicitly set useDocValuesAsStored to false
payload = "{\n" +
" 'replace-field' : {\n" +
" 'name':'a1',\n" +
" 'type': 'string',\n" +
" 'stored':false,\n" +
" 'useDocValuesAsStored':false,\n" +
" 'docValues':true,\n" +
" 'indexed':false\n" +
" }}";
response = harness.post("/schema", json(payload));
m = TestBulkSchemaAPI.getObj(harness, "a1", "fields");
assertNotNull("field a1 doesn't exist any more", m);
assertEquals(Boolean.FALSE, m.get("useDocValuesAsStored"));
// Explicitly set useDocValuesAsStored to true
payload = "{\n" +
" 'replace-field' : {\n" +
" 'name':'a1',\n" +
" 'type': 'string',\n" +
" 'stored':false,\n" +
" 'useDocValuesAsStored':true,\n" +
" 'docValues':true,\n" +
" 'indexed':false\n" +
" }}";
response = harness.post("/schema", json(payload));
m = TestBulkSchemaAPI.getObj(harness, "a1", "fields");
assertNotNull("field a1 doesn't exist any more", m);
assertEquals(Boolean.TRUE, m.get("useDocValuesAsStored"));
// add a field which is stored as well as docvalues
payload = "{ 'add-field' : {\n" +
" 'name':'a4',\n" +
" 'type': 'string',\n" +
" 'stored':true,\n" +
" 'useDocValuesAsStored':true,\n" +
" 'docValues':true,\n" +
" 'indexed':true\n" +
" }}";
response = harness.post("/schema", json(payload));
m = TestBulkSchemaAPI.getObj(harness, "a4", "fields");
assertNotNull("field a4 not found", m);
assertEquals(Boolean.TRUE, m.get("useDocValuesAsStored"));
assertU(adoc("id", "myid1", "a1", "1", "a2", "2", "a3", "3", "a4", "4"));
assertU(commit());
RestTestBase.assertJQ("/select?q=id:myid*&fl=*",
"/response/docs==[{'id':'myid1', 'a1':'1', 'a2':'2', 'a4':'4'}]");
}
}