You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ry...@apache.org on 2012/04/25 23:26:51 UTC
svn commit: r1330568 - in /lucene/dev/trunk/solr:
core/src/java/org/apache/solr/response/transform/
core/src/java/org/apache/solr/search/ core/src/test/org/apache/solr/search/
solrj/src/test/org/apache/solr/client/solrj/
Author: ryan
Date: Wed Apr 25 21:26:51 2012
New Revision: 1330568
URL: http://svn.apache.org/viewvc?rev=1330568&view=rev
Log:
SOLR-3413: support multiple copies in return fields
Added:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldTransformer.java
- copied, changed from r1330525, lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java
Removed:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java
Modified:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ReturnFields.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java
lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
Copied: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldTransformer.java (from r1330525, lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldTransformer.java?p2=lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldTransformer.java&p1=lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java&r1=1330525&r2=1330568&rev=1330568&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldTransformer.java Wed Apr 25 21:26:51 2012
@@ -26,37 +26,30 @@ import org.apache.solr.request.SolrQuery
*
* @since solr 4.0
*/
-public class RenameFieldsTransformer extends DocTransformer
+public class RenameFieldTransformer extends DocTransformer
{
- final NamedList<String> rename;
+ final String from;
+ final String to;
+ final boolean copy;
- public RenameFieldsTransformer( NamedList<String> rename )
+ public RenameFieldTransformer( String from, String to, boolean copy )
{
- this.rename = rename;
+ this.from = from;
+ this.to = to;
+ this.copy = copy;
}
@Override
public String getName()
{
- StringBuilder str = new StringBuilder();
- str.append( "Rename[" );
- for( int i=0; i< rename.size(); i++ ) {
- if( i > 0 ) {
- str.append( "," );
- }
- str.append( rename.getName(i) ).append( ">>" ).append( rename.getVal( i ) );
- }
- str.append( "]" );
- return str.toString();
+ return "Rename["+from+">>"+to+"]";
}
@Override
public void transform(SolrDocument doc, int docid) {
- for( int i=0; i<rename.size(); i++ ) {
- Object v = doc.remove( rename.getName(i) );
- if( v != null ) {
- doc.setField(rename.getVal(i), v);
- }
+ Object v = (copy)?doc.get(from) : doc.remove( from );
+ if( v != null ) {
+ doc.setField(to, v);
}
}
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ReturnFields.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ReturnFields.java?rev=1330568&r1=1330567&r2=1330568&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ReturnFields.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ReturnFields.java Wed Apr 25 21:26:51 2012
@@ -32,7 +32,7 @@ import org.apache.solr.common.util.Named
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.transform.DocTransformer;
import org.apache.solr.response.transform.DocTransformers;
-import org.apache.solr.response.transform.RenameFieldsTransformer;
+import org.apache.solr.response.transform.RenameFieldTransformer;
import org.apache.solr.response.transform.ScoreAugmenter;
import org.apache.solr.response.transform.TransformerFactory;
import org.apache.solr.response.transform.ValueSourceAugmenter;
@@ -61,6 +61,9 @@ public class ReturnFields
// Field names that are OK to include in the response.
// This will include pseudo fields, lucene fields, and matching globs
private Set<String> okFieldNames = new HashSet<String>();
+
+ // The list of explicitly requested fields
+ private Set<String> reqFieldNames = null;
private DocTransformer transformer;
private boolean _wantsScore = false;
@@ -111,11 +114,24 @@ public class ReturnFields
for (String fieldList : fl) {
add(fieldList,rename,augmenters,req);
}
- if( rename.size() > 0 ) {
- for( int i=0; i<rename.size(); i++ ) {
- okFieldNames.add( rename.getVal(i) );
+ for( int i=0; i<rename.size(); i++ ) {
+ String from = rename.getName(i);
+ String to = rename.getVal(i);
+ okFieldNames.add( to );
+ boolean copy = (reqFieldNames!=null && reqFieldNames.contains(from));
+ if(!copy) {
+ // Check that subsequent copy/rename requests have the field they need to copy
+ for(int j=i+1; j<rename.size(); j++) {
+ if(from.equals(rename.getName(j))) {
+ rename.setName(j, to); // copy from the current target
+ if(reqFieldNames==null) {
+ reqFieldNames = new HashSet<String>();
+ }
+ reqFieldNames.add(to); // don't rename our current target
+ }
+ }
}
- augmenters.addTransformer( new RenameFieldsTransformer( rename ) );
+ augmenters.addTransformer( new RenameFieldTransformer( from, to, copy ) );
}
if( !_wantsAllFields ) {
@@ -348,13 +364,21 @@ public class ReturnFields
private void addField( String field, String key, DocTransformers augmenters, SolrQueryRequest req )
{
- String disp = (key==null) ? field : key;
+ if(key==null) {
+ if(reqFieldNames==null) {
+ reqFieldNames = new HashSet<String>();
+ }
+ reqFieldNames.add(field);
+ }
+
fields.add(field); // need to put in the map to maintain order for things like CSVResponseWriter
okFieldNames.add( field );
okFieldNames.add( key );
// a valid field name
if(SCORE.equals(field)) {
_wantsScore = true;
+
+ String disp = (key==null) ? field : key;
augmenters.addTransformer( new ScoreAugmenter( disp ) );
}
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java?rev=1330568&r1=1330567&r2=1330568&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java Wed Apr 25 21:26:51 2012
@@ -18,6 +18,8 @@
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.junit.BeforeClass;
import org.junit.Test;
@@ -50,6 +52,46 @@ public class ReturnFieldsTest extends So
}
@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 ReturnFields( req("fl", "id name test subject score") );
assertTrue( rf.wantsScore() );
@@ -202,7 +244,6 @@ public class ReturnFieldsTest extends So
assertTrue(rf.wantsField("newSubject"));
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
- assertTrue( rf.getTransformer() instanceof RenameFieldsTransformer);
rf = new ReturnFields( req("fl", "newId:id newName:name newTest:test newSubject:subject score") );
assertTrue(rf.wantsField("id"));
@@ -216,7 +257,7 @@ public class ReturnFieldsTest extends So
assertFalse(rf.wantsField("xxx"));
assertFalse(rf.wantsAllFields());
assertTrue( rf.getTransformer() instanceof DocTransformers);
- assertEquals(2, ((DocTransformers)rf.getTransformer()).size());
+ assertEquals(5, ((DocTransformers)rf.getTransformer()).size()); // 4 rename and score
}
// hyphens in field names are not supported in all contexts, but we wanted
Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java?rev=1330568&r1=1330567&r2=1330568&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java Wed Apr 25 21:26:51 2012
@@ -31,9 +31,6 @@ public class StartSolrJetty
{
//System.setProperty("solr.solr.home", "../../../example/solr");
- javax.servlet.FilterRegistration xx;
-
-
Server server = new Server();
SocketConnector connector = new SocketConnector();
// Set some timeout options to make debugging easier.