blob: 0d739904f36976cea5766392385c691a32dc365e [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.search;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.transform.*;
import org.apache.lucene.util._TestUtil;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.Random;
public class ReturnFieldsTest extends SolrTestCaseJ4 {
// :TODO: datatypes produced by the functions used may change
/**
* values of the fl param that mean all real fields
*/
private static String[] ALL_REAL_FIELDS = new String[] { "", "*" };
/**
* values of the fl param that mean all real fields and score
*/
private static String[] SCORE_AND_REAL_FIELDS = new String[] {
"score", "score,*", "*,score"
};
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig.xml", "schema12.xml");
String v = "how now brown cow";
assertU(adoc("id","1", "text",v, "text_np", v, "#foo_s", v));
v = "now cow";
assertU(adoc("id","2", "text",v, "text_np", v));
assertU(commit());
}
@Test
public void testCopyRename() throws Exception {
// original
assertQ(req("q","id:1", "fl","id")
,"//*[@numFound='1'] "
,"*[count(//doc/str)=1] "
,"*//doc[1]/str[1][.='1'] "
);
// rename
assertQ(req("q","id:1", "fl","xxx:id")
,"//*[@numFound='1'] "
,"*[count(//doc/str)=1] "
,"*//doc[1]/str[1][.='1'] "
);
// original and copy
assertQ(req("q","id:1", "fl","id,xxx:id")
,"//*[@numFound='1'] "
,"*[count(//doc/str)=2] "
,"*//doc[1]/str[1][.='1'] "
,"*//doc[1]/str[2][.='1'] "
);
assertQ(req("q","id:1", "fl","xxx:id,id")
,"//*[@numFound='1'] "
,"*[count(//doc/str)=2] "
,"*//doc[1]/str[1][.='1'] "
,"*//doc[1]/str[2][.='1'] "
);
// two copies
assertQ(req("q","id:1", "fl","xxx:id,yyy:id")
,"//*[@numFound='1'] "
,"*[count(//doc/str)=2] "
,"*//doc[1]/str[1][.='1'] "
,"*//doc[1]/str[2][.='1'] "
);
}
@Test
public void testSeparators() {
ReturnFields rf = new SolrReturnFields( req("fl", "id name test subject score") );
assertTrue( rf.wantsScore() );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "name" ) );
assertTrue( rf.wantsField( "test" ) );
assertTrue( rf.wantsField( "subject" ) );
assertTrue( rf.wantsField( "score" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ScoreAugmenter);
rf = new SolrReturnFields( req("fl", "id,name,test,subject,score") );
assertTrue( rf.wantsScore() );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "name" ) );
assertTrue( rf.wantsField( "test" ) );
assertTrue( rf.wantsField( "subject" ) );
assertTrue( rf.wantsField( "score" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ScoreAugmenter);
rf = new SolrReturnFields( req("fl", "id,name test,subject score") );
assertTrue( rf.wantsScore() );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "name" ) );
assertTrue( rf.wantsField( "test" ) );
assertTrue( rf.wantsField( "subject" ) );
assertTrue( rf.wantsField( "score" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ScoreAugmenter);
rf = new SolrReturnFields( req("fl", "id, name test , subject,score") );
assertTrue( rf.wantsScore() );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "name" ) );
assertTrue( rf.wantsField( "test" ) );
assertTrue( rf.wantsField( "subject" ) );
assertTrue( rf.wantsField( "score" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ScoreAugmenter);
}
@Test
public void testWilcards() {
ReturnFields rf = new SolrReturnFields( req("fl", "*") );
assertFalse( rf.wantsScore() );
assertTrue( rf.wantsField( "xxx" ) );
assertTrue( rf.wantsAllFields() );
assertNull( rf.getTransformer() );
rf = new SolrReturnFields( req("fl", " * ") );
assertFalse( rf.wantsScore() );
assertTrue( rf.wantsField( "xxx" ) );
assertTrue( rf.wantsAllFields() );
assertNull( rf.getTransformer() );
// Check that we want wildcards
rf = new SolrReturnFields( req("fl", "id,aaa*,*bbb") );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "aaaxxx" ) );
assertFalse(rf.wantsField("xxxaaa"));
assertTrue( rf.wantsField( "xxxbbb" ) );
assertFalse(rf.wantsField("bbbxxx"));
assertFalse( rf.wantsField( "aa" ) );
assertFalse( rf.wantsField( "bb" ) );
}
@Test
public void testManyParameters() {
ReturnFields rf = new SolrReturnFields( req("fl", "id name", "fl", "test subject", "fl", "score") );
assertTrue( rf.wantsScore() );
assertTrue( rf.wantsField( "id" ) );
assertTrue( rf.wantsField( "name" ) );
assertTrue( rf.wantsField( "test" ) );
assertTrue( rf.wantsField( "subject" ) );
assertTrue( rf.wantsField( "score" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ScoreAugmenter);
}
@Test
public void testFunctions() {
ReturnFields rf = new SolrReturnFields( req("fl", "id sum(1,1)") );
assertFalse(rf.wantsScore());
assertTrue( rf.wantsField( "id" ) );
assertFalse( rf.wantsAllFields() );
assertFalse( rf.wantsField( "xxx" ) );
assertTrue( rf.getTransformer() instanceof ValueSourceAugmenter);
assertEquals("sum(1,1)", ((ValueSourceAugmenter) rf.getTransformer()).name);
}
@Test
public void testTransformers() {
ReturnFields rf = new SolrReturnFields( req("fl", "[explain]") );
assertFalse( rf.wantsScore() );
assertFalse(rf.wantsField("id"));
assertFalse(rf.wantsAllFields());
assertEquals( "[explain]", rf.getTransformer().getName() );
rf = new SolrReturnFields( req("fl", "[shard],id") );
assertFalse( rf.wantsScore() );
assertTrue(rf.wantsField("id"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertEquals( "[shard]", rf.getTransformer().getName() );
rf = new SolrReturnFields( req("fl", "[docid]") );
assertFalse( rf.wantsScore() );
assertFalse( rf.wantsField( "id" ) );
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertEquals( "[docid]", rf.getTransformer().getName() );
rf = new SolrReturnFields( req("fl", "mydocid:[docid]") );
assertFalse( rf.wantsScore() );
assertFalse( rf.wantsField( "id" ) );
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertEquals( "mydocid", rf.getTransformer().getName() );
rf = new SolrReturnFields( req("fl", "[docid][shard]") );
assertFalse( rf.wantsScore() );
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertTrue( rf.getTransformer() instanceof DocTransformers);
assertEquals(2, ((DocTransformers)rf.getTransformer()).size());
rf = new SolrReturnFields( req("fl", "[xxxxx]") );
assertFalse( rf.wantsScore() );
assertFalse( rf.wantsField( "id" ) );
assertFalse(rf.wantsAllFields());
assertNull(rf.getTransformer());
}
@Test
public void testAliases() {
ReturnFields rf = new SolrReturnFields( req("fl", "newId:id newName:name newTest:test newSubject:subject") );
assertTrue(rf.wantsField("id"));
assertTrue(rf.wantsField("name"));
assertTrue(rf.wantsField("test"));
assertTrue(rf.wantsField("subject"));
assertTrue(rf.wantsField("newId"));
assertTrue(rf.wantsField("newName"));
assertTrue(rf.wantsField("newTest"));
assertTrue(rf.wantsField("newSubject"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
rf = new SolrReturnFields( req("fl", "newId:id newName:name newTest:test newSubject:subject score") );
assertTrue(rf.wantsField("id"));
assertTrue(rf.wantsField("name"));
assertTrue(rf.wantsField("test"));
assertTrue(rf.wantsField("subject"));
assertTrue(rf.wantsField("newId"));
assertTrue(rf.wantsField("newName"));
assertTrue(rf.wantsField("newTest"));
assertTrue(rf.wantsField("newSubject"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertTrue( rf.getTransformer() instanceof DocTransformers);
assertEquals(5, ((DocTransformers)rf.getTransformer()).size()); // 4 rename and score
}
// hyphens in field names are not supported in all contexts, but we wanted
// the simplest case of fl=foo-bar to work
@Test
public void testHyphenInFieldName() {
ReturnFields rf = new SolrReturnFields(req("fl", "id-test"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id-test"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
}
@Test
public void testTrailingDotInFieldName() {
ReturnFields rf = new SolrReturnFields(req("fl", "id.test"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id.test"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
rf = new SolrReturnFields(req("fl", "test:id.test"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id.test"));
assertTrue(rf.wantsField("test"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
rf = new SolrReturnFields(req("fl", "test.id:id.test"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id.test"));
assertTrue(rf.wantsField("test.id"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
}
@Test
public void testTrailingDollarInFieldName() {
ReturnFields rf = new SolrReturnFields(req("fl", "id$test"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id$test"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
}
@Test
public void testFunkyFieldNames() {
ReturnFields rf = new SolrReturnFields(req("fl", "#foo_s", "fl", "id"));
assertFalse(rf.wantsScore());
assertTrue(rf.wantsField("id"));
assertTrue(rf.wantsField("#foo_s"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertQ(req("q","id:1", "fl","#foo_s", "fl","id")
,"//*[@numFound='1'] "
,"//str[@name='id'][.='1']"
,"//arr[@name='#foo_s']/str[.='how now brown cow']"
);
}
public void testWhitespace() {
Random r = random();
final int iters = atLeast(30);
for (int i = 0; i < iters; i++) {
final boolean aliasId = r.nextBoolean();
final boolean aliasFoo = r.nextBoolean();
final String id = _TestUtil.randomWhitespace(r, 0, 3) +
(aliasId ? "aliasId:" : "") +
"id" +
_TestUtil.randomWhitespace(r, 1, 3);
final String foo_i = _TestUtil.randomWhitespace(r, 0, 3) +
(aliasFoo ? "aliasFoo:" : "") +
"foo_i" +
_TestUtil.randomWhitespace(r, 0, 3);
final String fl = id + (r.nextBoolean() ? "" : ",") + foo_i;
ReturnFields rf = new SolrReturnFields(req("fl", fl));
assertFalse("score ("+fl+")", rf.wantsScore());
assertTrue("id ("+fl+")", rf.wantsField("id"));
assertTrue("foo_i ("+fl+")", rf.wantsField("foo_i"));
assertEquals("aliasId ("+fl+")", aliasId, rf.wantsField("aliasId"));
assertEquals("aliasFoo ("+fl+")", aliasFoo, rf.wantsField("aliasFoo"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
}
}
}