blob: e56f265b47fb83804b9f92badcb8c950b369c671 [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 java.util.List;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.cloud.TestCloudPseudoReturnFields;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.Before;
import org.junit.BeforeClass;
/** @see TestCloudPseudoReturnFields */
public class TestPseudoReturnFields extends SolrTestCaseJ4 {
// :TODO: datatypes produced by the functions used may change
/**
* values of the fl param that mean all real fields
*/
public static String[] ALL_REAL_FIELDS = new String[] { "", "*" };
/**
* values of the fl param that mean all real fields and score
*/
public static String[] SCORE_AND_REAL_FIELDS = new String[] {
"score,*", "*,score"
};
@BeforeClass
public static void beforeTests() throws Exception {
initCore("solrconfig-tlog.xml","schema-psuedo-fields.xml");
assertU(adoc("id", "42", "val_i", "1", "ssto", "X", "subject", "aaa"));
assertU(adoc("id", "43", "val_i", "9", "ssto", "X", "subject", "bbb"));
assertU(adoc("id", "44", "val_i", "4", "ssto", "X", "subject", "aaa"));
assertU(adoc("id", "45", "val_i", "6", "ssto", "X", "subject", "aaa"));
assertU(adoc("id", "46", "val_i", "3", "ssto", "X", "subject", "ggg"));
assertU(commit());
}
@Before
private void addUncommittedDoc99() throws Exception {
// uncommitted doc in transaction log at start of every test
// Even if an RTG causes ulog to re-open realtime searcher, next test method
// will get another copy of doc 99 in the ulog
assertU(adoc("id", "99", "val_i", "1", "ssto", "X", "subject", "uncommitted"));
}
public void testMultiValued() throws Exception {
// the response writers used to consult isMultiValued on the field
// but this doesn't work when you alias a single valued field to
// a multi valued field (the field value is copied first, then
// if the type lookup is done again later, we get the wrong thing). SOLR-4036
// score as psuedo field - precondition checks
for (String name : new String[] {"score", "val_ss"}) {
SchemaField sf = h.getCore().getLatestSchema().getFieldOrNull(name);
assertNotNull("Test depends on a (dynamic) field mtching '"+name+
"', schema was changed out from under us!",sf);
assertTrue("Test depends on a multivalued dynamic field matching '"+name+
"', schema was changed out from under us!", sf.multiValued());
}
// score as psuedo field
assertJQ(req("q","*:*", "fq", "id:42", "fl","id,score")
,"/response/docs==[{'id':'42','score':1.0}]");
// single value int using alias that matches multivalued dynamic field
assertJQ(req("q","id:42", "fl","val_ss:val_i, val2_ss:10")
,"/response/docs==[{'val2_ss':10,'val_ss':1}]"
);
assertJQ(req("qt","/get", "id","42", "fl","val_ss:val_i, val2_ss:10")
,"/doc=={'val2_ss':10,'val_ss':1}"
);
}
public void testMultiValuedRTG() throws Exception {
// single value int using alias that matches multivalued dynamic field - via RTG
assertJQ(req("qt","/get", "id","42", "fl","val_ss:val_i, val2_ss:10, subject")
,"/doc=={'val2_ss':10,'val_ss':1, 'subject':'aaa'}"
);
// also check real-time-get from transaction log
assertJQ(req("qt","/get", "id","99", "fl","val_ss:val_i, val2_ss:10, subject")
,"/doc=={'val2_ss':10,'val_ss':1,'subject':'uncommitted'}"
);
}
public void testAllRealFields() throws Exception {
for (String fl : ALL_REAL_FIELDS) {
assertQ("fl="+fl+" ... all real fields",
req("q","*:*", "rows", "1", "fl",fl)
,"//result[@numFound='5']"
,"//result/doc/str[@name='id']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='ssto']"
,"//result/doc/str[@name='subject']"
,"//result/doc[count(*)=5]"
);
}
}
public void testAllRealFieldsRTG() throws Exception {
// shouldn't matter if we use RTG (committed or otherwise)
for (String fl : ALL_REAL_FIELDS) {
for (String id : Arrays.asList("42","99")) {
assertQ("id="+id+", fl="+fl+" ... all real fields",
req("qt","/get","id",id, "wt","xml","fl",fl)
,"count(//doc)=1"
,"//doc/str[@name='id']"
,"//doc/int[@name='val_i']"
,"//doc/str[@name='ssto']"
,"//doc/str[@name='subject']"
,"//doc[count(*)=5]"
);
}
}
}
public void testFilterAndOneRealFieldRTG() throws Exception {
// shouldn't matter if we use RTG (committed or otherwise)
// only one of these docs should match...
assertQ("RTG w/ 2 ids & fq that only matches 1 uncommitted doc",
req("qt","/get","ids","42,99", "wt","xml","fl","id,val_i",
"fq","{!field f='subject' v=$my_var}","my_var","uncommitted")
,"//result[@numFound='1']"
,"//result/doc/str[@name='id'][.='99']"
,"//result/doc/int[@name='val_i'][.='1']"
,"//result/doc[count(*)=2]"
);
}
public void testScoreAndAllRealFields() throws Exception {
for (String fl : SCORE_AND_REAL_FIELDS) {
assertQ("fl="+fl+" ... score and real fields",
req("q","*:*", "rows", "1", "fl",fl)
,"//result[@numFound='5']"
,"//result/doc/str[@name='id']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='ssto']"
,"//result/doc/str[@name='subject']"
,"//result/doc/float[@name='score']"
,"//result/doc[count(*)=6]"
);
}
}
public void testScoreAndAllRealFieldsRTG() throws Exception {
// if we use RTG (committed or otherwise) score should be ignored
for (String fl : SCORE_AND_REAL_FIELDS) {
for (String id : Arrays.asList("42","99")) {
assertQ("id="+id+", fl="+fl+" ... score real fields",
req("qt","/get","id",id, "wt","xml","fl",fl)
,"count(//doc)=1"
,"//doc/str[@name='id']"
,"//doc/int[@name='val_i']"
,"//doc/str[@name='ssto']"
,"//doc/str[@name='subject']"
,"//doc[count(*)=5]"
);
}
}
}
public void testScoreAndExplicitRealFields() throws Exception {
assertQ("fl=score,val_i",
req("q","*:*", "rows", "1", "fl","score,val_i")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/float[@name='score']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=score&fl=val_i",
req("q","*:*", "rows", "1", "fl","score","fl","val_i")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/float[@name='score']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=val_i",
req("q","*:*", "rows", "1", "fl","val_i")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc[count(*)=1]"
);
}
public void testScoreAndExplicitRealFieldsRTG() throws Exception {
// if we use RTG (committed or otherwise) score should be ignored
for (String id : Arrays.asList("42","99")) {
assertQ("id="+id+", fl=score,val_i",
req("qt","/get","id",id, "wt","xml", "fl","score,val_i")
,"count(//doc)=1"
,"//doc/int[@name='val_i']"
,"//doc[count(*)=1]"
);
}
}
public void testFunctions() throws Exception {
assertQ("fl=log(val_i)",
req("q","*:*", "rows", "1", "fl","log(val_i)")
,"//result[@numFound='5']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc[count(*)=1]"
);
assertQ("fl=log(val_i),abs(val_i)",
req("q","*:*", "rows", "1", "fl","log(val_i),abs(val_i)")
,"//result[@numFound='5']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/float[@name='abs(val_i)']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=log(val_i)&fl=abs(val_i)",
req("q","*:*", "rows", "1", "fl","log(val_i)","fl","abs(val_i)")
,"//result[@numFound='5']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/float[@name='abs(val_i)']"
,"//result/doc[count(*)=2]"
);
}
public void testFunctionsRTG() throws Exception {
// if we use RTG (committed or otherwise) functions should behave the same
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList(params("qt","/get","id",id,"wt","xml",
"fl","log(val_i),abs(val_i)"),
params("qt","/get","id",id,"wt","xml",
"fl","log(val_i)","fl", "abs(val_i)"))) {
assertQ("id="+id+", params="+p, req(p)
,"count(//doc)=1"
// true for both these specific docs
,"//doc/double[@name='log(val_i)'][.='0.0']"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
,"//doc[count(*)=2]"
);
}
}
}
public void testFunctionsAndExplicit() throws Exception {
assertQ("fl=log(val_i),val_i",
req("q","*:*", "rows", "1", "fl","log(val_i),val_i")
,"//result[@numFound='5']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/int[@name='val_i']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=log(val_i)&fl=val_i",
req("q","*:*", "rows", "1", "fl","log(val_i)","fl","val_i")
,"//result[@numFound='5']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/int[@name='val_i']"
,"//result/doc[count(*)=2]"
);
}
public void testFunctionsAndExplicitRTG() throws Exception {
// shouldn't matter if we use RTG (committed or otherwise)
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList(params("fl","log(val_i),val_i"),
params("fl","log(val_i)","fl","val_i"))) {
assertQ(id + " " + p,
req(p, "qt","/get", "wt","xml","id",id)
,"count(//doc)=1"
// true for both these specific docs
,"//doc/double[@name='log(val_i)'][.='0.0']"
,"//doc/int[@name='val_i'][.='1']"
,"//doc[count(*)=2]"
);
}
}
}
public void testFunctionsAndScore() throws Exception {
assertQ("fl=log(val_i),score",
req("q","*:*", "rows", "1", "fl","log(val_i),score")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=log(val_i)&fl=score",
req("q","*:*", "rows", "1", "fl","log(val_i)","fl","score")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc[count(*)=2]"
);
assertQ("fl=score,log(val_i),abs(val_i)",
req("q","*:*", "rows", "1",
"fl","score,log(val_i),abs(val_i)")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/float[@name='abs(val_i)']"
,"//result/doc[count(*)=3]"
);
assertQ("fl=score&fl=log(val_i)&fl=abs(val_i)",
req("q","*:*", "rows", "1",
"fl","score","fl","log(val_i)","fl","abs(val_i)")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/double[@name='log(val_i)']"
,"//result/doc/float[@name='abs(val_i)']"
,"//result/doc[count(*)=3]"
);
}
public void testFunctionsAndScoreRTG() throws Exception {
// if we use RTG (committed or otherwise) score should be ignored
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList(params("fl","score","fl","log(val_i)","fl","abs(val_i)"),
params("fl","score","fl","log(val_i),abs(val_i)"),
params("fl","score,log(val_i)","fl","abs(val_i)"),
params("fl","score,log(val_i),abs(val_i)"))) {
assertQ("id="+id+", p="+p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/double[@name='log(val_i)']"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
,"//doc[count(*)=2]"
);
}
}
}
public void testGlobs() throws Exception {
assertQ("fl=val_*",
req("q","*:*", "rows", "1", "fl","val_*")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc[count(*)=1]"
);
for (SolrParams p : Arrays.asList(params("q", "*:*", "rows", "1", "fl","val_*,subj*,ss*"),
params("q", "*:*", "rows", "1", "fl","val_*","fl","subj*,ss*"),
params("q", "*:*", "rows", "1", "fl","val_*","fl","subj*","fl","ss*"))) {
assertQ(p.toString(),
req(p)
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='subject']"
,"//result/doc/str[@name='ssto'][.='X']"
,"//result/doc[count(*)=3]"
);
}
}
public void testGlobsRTG() throws Exception {
// behavior shouldn't matter if we are committed or uncommitted
for (String id : Arrays.asList("42","99")) {
assertQ(id + ": fl=val_*",
req("qt","/get","id",id, "wt","xml", "fl","val_*")
,"count(//doc)=1"
,"//doc/int[@name='val_i'][.=1]"
,"//doc[count(*)=1]"
);
for (SolrParams p : Arrays.asList(params("fl","val_*,subj*,ss*"),
params("fl","val_*","fl","subj*,ss*"))) {
assertQ(id + ": " + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/int[@name='val_i'][.=1]"
,"//doc/str[@name='subject']" // value differs between docs
,"//doc/str[@name='ssto'][.='X']"
,"//doc[count(*)=3]"
);
}
}
}
public void testGlobsAndExplicit() throws Exception {
assertQ("fl=val_*,id",
req("q","*:*", "rows", "1", "fl","val_*,id")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='id']"
,"//result/doc[count(*)=2]"
);
for (SolrParams p : Arrays.asList(params("fl","val_*,subj*,id"),
params("fl","val_*","fl","subj*","fl","id"),
params("fl","val_*","fl","subj*,id"))) {
assertQ("" + p,
req(p, "q","*:*", "rows", "1")
,"//result[@numFound='5']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='subject']"
,"//result/doc/str[@name='id']"
,"//result/doc[count(*)=3]"
);
}
}
public void testGlobsAndExplicitRTG() throws Exception {
// behavior shouldn't matter if we are committed or uncommitted
for (String id : Arrays.asList("42","99")) {
assertQ(id + " + fl=val_*,id",
req("qt","/get","id",id, "wt","xml", "fl","val_*,id")
,"count(//doc)=1"
,"//doc/int[@name='val_i'][.=1]"
,"//doc/str[@name='id']"
,"//doc[count(*)=2]"
);
for (SolrParams p : Arrays.asList(params("fl","val_*,subj*,id"),
params("fl","val_*","fl","subj*","fl","id"),
params("fl","val_*","fl","subj*,id"))) {
assertQ(id + " + " + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/int[@name='val_i'][.=1]"
,"//doc/str[@name='subject']"
,"//doc/str[@name='id']"
,"//doc[count(*)=3]"
);
}
}
}
public void testGlobsAndScore() throws Exception {
assertQ("fl=val_*,score",
req("q","*:*", "rows", "1", "fl","val_*,score", "indent", "true")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/int[@name='val_i']"
,"//result/doc[count(*)=2]"
);
for (SolrParams p : Arrays.asList(params("fl","val_*,subj*,score"),
params("fl","val_*","fl","subj*","fl","score"),
params("fl","val_*","fl","subj*,score"))) {
assertQ("" + p,
req(p, "q","*:*", "rows", "1")
,"//result[@numFound='5']"
,"//result/doc/float[@name='score']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/str[@name='subject']"
,"//result/doc[count(*)=3]"
);
}
}
public void testGlobsAndScoreRTG() throws Exception {
// behavior shouldn't matter if we are committed or uncommitted, score should be ignored
for (String id : Arrays.asList("42","99")) {
assertQ(id + ": fl=val_*,score",
req("qt","/get","id",id, "wt","xml", "fl","val_*,score")
,"count(//doc)=1"
,"//doc/int[@name='val_i']"
,"//doc[count(*)=1]"
);
for (SolrParams p : Arrays.asList(params("fl","val_*,subj*,score"),
params("fl","val_*","fl","subj*","fl","score"),
params("fl","val_*","fl","subj*,score"))) {
assertQ("" + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/int[@name='val_i']"
,"//doc/str[@name='subject']"
,"//doc[count(*)=2]"
);
}
}
}
public void testAugmenters() throws Exception {
assertQ("fl=[docid]",
req("q","*:*", "rows", "1", "fl","[docid]")
,"//result[@numFound='5']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc[count(*)=1]"
);
for (SolrParams p : Arrays.asList(params("fl","[docid],[shard],[explain],x_alias:[value v=10 t=int]"),
params("fl","[docid],[shard]","fl","[explain],x_alias:[value v=10 t=int]"),
params("fl","[docid]","fl","[shard]","fl","[explain]","fl","x_alias:[value v=10 t=int]"))) {
assertQ("" + p,
req(p, "q","*:*", "rows", "1")
,"//result[@numFound='5']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc/str[@name='[shard]'][.='[not a shard request]']"
,"//result/doc/str[@name='[explain]']"
,"//result/doc/int[@name='x_alias'][.=10]"
,"//result/doc[count(*)=4]"
);
}
}
public void testDocIdAugmenterRTG() throws Exception {
// for an uncommitted doc, we should get -1
for (String id : Arrays.asList("42","99")) {
assertQ(id + ": fl=[docid]",
req("qt","/get","id",id, "wt","xml", "fl","[docid]")
,"count(//doc)=1"
,"//doc/int[@name='[docid]'][.>=-1]"
,"//doc[count(*)=1]"
);
}
}
public void testAugmentersRTG() throws Exception {
// behavior shouldn't matter if we are committed or uncommitted
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList
(params("fl","[docid],[shard],[explain],x_alias:[value v=10 t=int],abs(val_i)"),
params("fl","[docid],[shard],abs(val_i)","fl","[explain],x_alias:[value v=10 t=int]"),
params("fl","[docid],[shard]","fl","[explain],x_alias:[value v=10 t=int]","fl","abs(val_i)"),
params("fl","[docid]","fl","[shard]","fl","[explain]","fl","x_alias:[value v=10 t=int]","fl","abs(val_i)"))) {
assertQ(id + ": " + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/int[@name='[docid]'][.>=-1]"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
,"//doc/str[@name='[shard]'][.='[not a shard request]']"
// RTG: [explain] should be missing (ignored)
,"//doc/int[@name='x_alias'][.=10]"
,"//doc[count(*)=4]"
);
}
}
}
public void testAugmentersAndExplicit() throws Exception {
for (SolrParams p : Arrays.asList(params("fl","id,[docid],[explain],x_alias:[value v=10 t=int]"),
params("fl","id","fl","[docid],[explain],x_alias:[value v=10 t=int]"),
params("fl","id","fl","[docid]","fl","[explain]","fl","x_alias:[value v=10 t=int]"))) {
assertQ(p.toString(),
req(p, "q","*:*", "rows", "1")
,"//result[@numFound='5']"
,"//result/doc/str[@name='id']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc/str[@name='[explain]']"
,"//result/doc/int[@name='x_alias'][.=10]"
,"//result/doc[count(*)=4]"
);
}
}
public void testAugmentersAndExplicitRTG() throws Exception {
// behavior shouldn't matter if we are committed or uncommitted
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList
(params("fl","id,[docid],[explain],x_alias:[value v=10 t=int],abs(val_i)"),
params("fl","id,[docid],abs(val_i)","fl","[explain],x_alias:[value v=10 t=int]"),
params("fl","id","fl","[docid]","fl","[explain]","fl","x_alias:[value v=10 t=int]","fl","abs(val_i)"))) {
assertQ(id + ": " + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/str[@name='id']"
,"//doc/int[@name='[docid]'][.>=-1]"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
// RTG: [explain] should be missing (ignored)
,"//doc/int[@name='x_alias'][.=10]"
,"//doc[count(*)=4]"
);
}
}
}
public void testAugmentersAndScore() throws Exception {
assertQ(req("q","*:*", "rows", "1",
"fl","[docid],x_alias:[value v=10 t=int],score")
,"//result[@numFound='5']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc/int[@name='x_alias'][.=10]"
,"//result/doc/float[@name='score']"
,"//result/doc[count(*)=3]"
);
for (SolrParams p : Arrays.asList(params("fl","[docid],x_alias:[value v=10 t=int],[explain],score"),
params("fl","[docid]","fl","x_alias:[value v=10 t=int],[explain]","fl","score"),
params("fl","[docid]","fl","x_alias:[value v=10 t=int]","fl","[explain]","fl","score"))) {
assertQ(p.toString(),
req(p, "q","*:*", "rows", "1")
,"//result[@numFound='5']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc/int[@name='x_alias'][.=10]"
,"//result/doc/str[@name='[explain]']"
,"//result/doc/float[@name='score']"
,"//result/doc[count(*)=4]"
);
}
}
public void testAugmentersAndScoreRTG() throws Exception {
// if we use RTG (committed or otherwise) score should be ignored
for (String id : Arrays.asList("42","99")) {
assertQ(id,
req("qt","/get","id",id, "wt","xml",
"fl","x_alias:[value v=10 t=int],score,abs(val_i),[docid]")
,"//doc/int[@name='[docid]'][.>=-1]"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
,"//doc/int[@name='x_alias'][.=10]"
,"//doc[count(*)=3]"
);
for (SolrParams p : Arrays.asList(params("fl","[docid],x_alias:[value v=10 t=int],[explain],score,abs(val_i)"),
params("fl","x_alias:[value v=10 t=int],[explain]","fl","[docid],score,abs(val_i)"),
params("fl","[docid]","fl","x_alias:[value v=10 t=int]","fl","[explain]","fl","score","fl","abs(val_i)"))) {
assertQ(p.toString(),
req(p, "qt","/get","id",id, "wt","xml")
,"//doc/int[@name='[docid]']" // TODO
,"//doc/float[@name='abs(val_i)'][.='1.0']"
,"//doc/int[@name='x_alias'][.=10]"
// RTG: [explain] and score should be missing (ignored)
,"//doc[count(*)=3]"
);
}
}
}
public void testAugmentersGlobsExplicitAndScoreOhMy() throws Exception {
Random random = random();
// NOTE: 'ssto' is the missing one
final List<String> fl = Arrays.asList
("id","[docid]","[explain]","score","val_*","subj*");
final int iters = atLeast(random, 10);
for (int i = 0; i< iters; i++) {
Collections.shuffle(fl, random);
final SolrParams singleFl = params("q","*:*", "rows", "1","fl",String.join(",", fl));
final ModifiableSolrParams multiFl = params("q","*:*", "rows", "1");
for (String item : fl) {
multiFl.add("fl",item);
}
for (SolrParams p : Arrays.asList(singleFl, multiFl)) {
assertQ(p.toString(),
req(p)
,"//result[@numFound='5']"
,"//result/doc/str[@name='id']"
,"//result/doc/float[@name='score']"
,"//result/doc/str[@name='subject']"
,"//result/doc/int[@name='val_i']"
,"//result/doc/int[@name='[docid]']"
,"//result/doc/str[@name='[explain]']"
,"//result/doc[count(*)=6]"
);
}
}
}
public void testAugmentersGlobsExplicitAndScoreOhMyRTG() throws Exception {
Random random = random();
// NOTE: 'ssto' is the missing one
final List<String> fl = Arrays.asList
("id","[explain]","score","val_*","subj*","abs(val_i)","[docid]");
final int iters = atLeast(random, 10);
for (int i = 0; i< iters; i++) {
Collections.shuffle(fl, random);
final SolrParams singleFl = params("fl",String.join(",", fl));
final ModifiableSolrParams multiFl = params();
for (String item : fl) {
multiFl.add("fl",item);
}
// RTG behavior should be consistent, (committed or otherwise)
for (String id : Arrays.asList("42","99")) {
for (SolrParams p : Arrays.asList(singleFl, multiFl)) {
assertQ(id + ": " + p,
req(p, "qt","/get","id",id, "wt","xml")
,"count(//doc)=1"
,"//doc/str[@name='id']"
,"//doc/int[@name='[docid]'][.>=-1]"
,"//doc/float[@name='abs(val_i)'][.='1.0']"
// RTG: [explain] and score should be missing (ignored)
,"//doc/int[@name='val_i'][.=1]"
,"//doc/str[@name='subject']"
,"//doc[count(*)=5]"
);
}
}
}
}
}