You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gs...@apache.org on 2011/11/18 22:07:14 UTC

svn commit: r1203839 - in /lucene/dev/trunk/solr: core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/handler/component/ core/src/java/org/apache/solr/response/ core/src/java/org/apache/solr/response/transform/ core/src/test/org/apache/so...

Author: gsingers
Date: Fri Nov 18 21:07:13 2011
New Revision: 1203839

URL: http://svn.apache.org/viewvc?rev=1203839&view=rev
Log:
SOLR-2037: hook in DocTransformer for QueryElevationComponent to mark documents that have been boosted

Added:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/EditorialMarkerFactory.java
Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformers.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/RenameFieldsTransformer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ScoreAugmenter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/TransformContext.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java
    lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrDocument.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/QueryElevationParams.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Fri Nov 18 21:07:13 2011
@@ -1705,6 +1705,10 @@ public final class SolrCore implements S
   public TransformerFactory getTransformerFactory(String name) {
     return transformerFactories.get(name);
   }
+
+  public void addTransformerFactory(String name, TransformerFactory factory){
+    transformerFactories.put(name, factory);
+  }
   
 
   /**

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Fri Nov 18 21:07:13 2011
@@ -23,14 +23,10 @@ import java.io.InputStream;
 import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
+import java.util.*;
 
 import org.apache.solr.common.params.QueryElevationParams;
+import org.apache.solr.response.transform.EditorialMarkerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -103,6 +99,7 @@ public class QueryElevationComponent ext
     final BooleanClause[] exclude;
     final BooleanQuery include;
     final Map<BytesRef,Integer> priority;
+    final Set<String> ids;
     
     // use singletons so hashCode/equals on Sort will just work
     final FieldComparatorSource comparatorSource;
@@ -111,12 +108,14 @@ public class QueryElevationComponent ext
     {
       this.text = qstr;
       this.analyzed = getAnalyzedQuery( this.text );
+      this.ids = new HashSet<String>();
       
       this.include = new BooleanQuery();
       this.include.setBoost( 0 );
       this.priority = new HashMap<BytesRef, Integer>();
       int max = elevate.size()+5;
       for( String id : elevate ) {
+        ids.add(id);
         TermQuery tq = new TermQuery( new Term( idField, id ) );
         include.add( tq, BooleanClause.Occur.SHOULD );
         this.priority.put( new BytesRef(id), max-- );
@@ -161,7 +160,13 @@ public class QueryElevationComponent ext
           "QueryElevationComponent requires the schema to have a uniqueKeyField implemented using StrField" );
     }
     idField = sf.getName();
-    
+    //register the EditorialMarkerFactory
+    EditorialMarkerFactory factory = new EditorialMarkerFactory();
+    String markerName = initArgs.get(QueryElevationParams.EDITORIAL_MARKER_FIELD_NAME, "elevated");
+    if (markerName == null || markerName.equals("") == true){
+      markerName = "elevated";
+    }
+    core.addTransformerFactory(markerName, factory);
     forceElevation = initArgs.getBool( QueryElevationParams.FORCE_ELEVATION, forceElevation );
     try {
       synchronized( elevationCache ) {
@@ -357,6 +362,8 @@ public class QueryElevationComponent ext
     }
     
     if( booster != null ) {
+      rb.req.getContext().put("BOOSTED", booster.ids);
+      
       // Change the query to insert forced documents
       if (exclusive == true){
         //we only want these results

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java Fri Nov 18 21:07:13 2011
@@ -31,6 +31,7 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.response.transform.DocTransformer;
+import org.apache.solr.response.transform.TransformContext;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
@@ -40,6 +41,7 @@ import org.apache.solr.update.DocumentBu
 import org.apache.solr.update.UpdateLog;
 import org.apache.solr.util.RefCounted;
 
+import javax.xml.transform.Transformer;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -103,6 +105,11 @@ public class RealTimeGetComponent extend
     RefCounted<SolrIndexSearcher> searcherHolder = null;
 
     DocTransformer transformer = rsp.getReturnFields().getTransformer();
+    if (transformer != null) {
+      TransformContext context = new TransformContext();
+      context.req = req;
+      transformer.setContext(context);
+    }
    try {
      SolrIndexSearcher searcher = null;
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java Fri Nov 18 21:07:13 2011
@@ -119,17 +119,17 @@ public class BinaryResponseWriter implem
     protected void writeResultsBody( ResultContext res, JavaBinCodec codec ) throws IOException 
     {
       DocList ids = res.docs;
-      TransformContext context = new TransformContext();
-      context.query = res.query;
-      context.wantsScores = returnFields.wantsScore() && ids.hasScores();
-      
       int sz = ids.size();
       codec.writeTag(JavaBinCodec.ARR, sz);
       if(searcher == null) searcher = solrQueryRequest.getSearcher();
-      if(schema == null) schema = solrQueryRequest.getSchema(); 
-      
-      context.searcher = searcher;
+      if(schema == null) schema = solrQueryRequest.getSchema();
+
       DocTransformer transformer = returnFields.getTransformer();
+      TransformContext context = new TransformContext();
+      context.query = res.query;
+      context.wantsScores = returnFields.wantsScore() && ids.hasScores();
+      context.req = solrQueryRequest;
+      context.searcher = searcher;
       if( transformer != null ) {
         transformer.setContext( context );
       }
@@ -141,7 +141,7 @@ public class BinaryResponseWriter implem
         Document doc = searcher.doc(id, fnames);
         SolrDocument sdoc = getDoc(doc);
         if( transformer != null ) {
-          transformer.transform(sdoc, id );
+          transformer.transform(sdoc, id);
         }
         codec.writeSolrDocument(sdoc);
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java Fri Nov 18 21:07:13 2011
@@ -146,8 +146,12 @@ public abstract class TextResponseWriter
       writeDouble(name, ((Double)val).doubleValue());
     } else if (val instanceof Document) {
       SolrDocument doc = toSolrDocument( (Document)val );
-      if( returnFields.getTransformer() != null ) {
-        returnFields.getTransformer().transform( doc, -1 );
+      DocTransformer transformer = returnFields.getTransformer();
+      if( transformer != null ) {
+        TransformContext context = new TransformContext();
+        context.req = req;
+        transformer.setContext(context);
+        transformer.transform(doc, -1);
       }
       writeSolrDocument(name, doc, returnFields, 0 );
     } else if (val instanceof SolrDocument) {
@@ -232,6 +236,7 @@ public abstract class TextResponseWriter
     TransformContext context = new TransformContext();
     context.query = res.query;
     context.wantsScores = fields.wantsScore() && ids.hasScores();
+    context.req = req;
     writeStartDocumentList(name, ids.offset(), ids.size(), ids.matches(), 
         context.wantsScores ? new Float(ids.maxScore()) : null );
     
@@ -248,7 +253,7 @@ public abstract class TextResponseWriter
       Document doc = context.searcher.doc(id, fnames);
       SolrDocument sdoc = toSolrDocument( doc );
       if( transformer != null ) {
-        transformer.transform( sdoc, id );
+        transformer.transform( sdoc, id);
       }
       writeSolrDocument( null, sdoc, returnFields, i );
     }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformer.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformer.java Fri Nov 18 21:07:13 2011
@@ -20,16 +20,41 @@ package org.apache.solr.response.transfo
 import java.io.IOException;
 
 import org.apache.solr.common.SolrDocument;
+import org.apache.solr.request.SolrQueryRequest;
 
 /**
+ * A DocTransformer can add, remove or alter a Document before it is written out to the Response.  For instance, there are implementations
+ * that can put explanations inline with a document, add constant values and mark items as being artificially boosted (see {@link org.apache.solr.handler.component.QueryElevationComponent})
+ *
+ * <p/>
  * New instance for each request
  *
+ * @see TransformerFactory
  *
  */
 public abstract class DocTransformer
 {
+  /**
+   *
+   * @return The name of the transformer
+   */
   public abstract String getName();
+
+  /**
+   * This is called before transform and sets
+   * @param context The {@link org.apache.solr.response.transform.TransformContext} stores information about the current state of things in Solr that may be
+   * useful for doing transformations.
+   */
   public void setContext( TransformContext context ) {}
+
+  /**
+   * This is where implementations do the actual work
+   *
+   *
+   * @param doc The document to alter
+   * @param docid The Lucene internal doc id
+   * @throws IOException
+   */
   public abstract void transform(SolrDocument doc, int docid) throws IOException;
 
   @Override

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformers.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformers.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformers.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/DocTransformers.java Fri Nov 18 21:07:13 2011
@@ -23,6 +23,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.solr.common.SolrDocument;
+import org.apache.solr.request.SolrQueryRequest;
 
 /**
  * Transform a document before it gets sent out
@@ -73,7 +74,7 @@ public class DocTransformers extends Doc
   @Override
   public void transform(SolrDocument doc, int docid) throws IOException {
     for( DocTransformer a : children ) {
-      a.transform( doc, docid );
+      a.transform( doc, docid);
     }
   }
 }

Added: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/EditorialMarkerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/EditorialMarkerFactory.java?rev=1203839&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/EditorialMarkerFactory.java (added)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/EditorialMarkerFactory.java Fri Nov 18 21:07:13 2011
@@ -0,0 +1,75 @@
+package org.apache.solr.response.transform;
+
+/*
+ * 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.
+ */
+
+import java.util.Set;
+
+import org.apache.lucene.document.Field;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.request.SolrQueryRequest;
+
+/**
+ *
+ * @since solr 4.0
+ */
+public class EditorialMarkerFactory extends TransformerFactory
+{
+  @Override
+  public DocTransformer create(String field, SolrParams params, SolrQueryRequest req) {
+    String idfield = req.getSchema().getUniqueKeyField().getName();
+    return new MarkTransformer(field,idfield);
+  }
+}
+
+class MarkTransformer extends TransformerWithContext
+{
+  final String name;
+  final String idFieldName;
+
+  public MarkTransformer( String name, String idFieldName)
+  {
+    this.name = name;
+    this.idFieldName = idFieldName;
+  }
+
+  @Override
+  public String getName()
+  {
+    return name;
+  }
+
+  @Override
+  public void transform(SolrDocument doc, int docid) {
+    Set<?> ids = (Set<?>)context.req.getContext().get("BOOSTED");
+    if(ids!=null) {
+      String key;
+      Object field = doc.get(idFieldName);
+      if (field instanceof Field){
+        key = ((Field)field).stringValue();
+      } else {
+        key = field.toString();
+      }
+      doc.setField(name, ids.contains(key));
+    } else {
+      //if we have no ids, that means we weren't boosting, but the user still asked for the field to be added, so just mark everything as false
+      doc.setField(name, Boolean.FALSE);
+    }
+  }
+}
+

Modified: 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/RenameFieldsTransformer.java?rev=1203839&r1=1203838&r2=1203839&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/RenameFieldsTransformer.java Fri Nov 18 21:07:13 2011
@@ -18,6 +18,7 @@ package org.apache.solr.response.transfo
 
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.request.SolrQueryRequest;
 
 /**
  * Return a field with a name that is different that what is indexed

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ScoreAugmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ScoreAugmenter.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ScoreAugmenter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ScoreAugmenter.java Fri Nov 18 21:07:13 2011
@@ -17,6 +17,7 @@
 package org.apache.solr.response.transform;
 
 import org.apache.solr.common.SolrDocument;
+import org.apache.solr.request.SolrQueryRequest;
 
 /**
  * Simple Augmenter that adds the docId

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/TransformContext.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/TransformContext.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/TransformContext.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/TransformContext.java Fri Nov 18 21:07:13 2011
@@ -17,6 +17,7 @@
 package org.apache.solr.response.transform;
 
 import org.apache.lucene.search.Query;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.DocIterator;
 import org.apache.solr.search.SolrIndexSearcher;
 
@@ -32,4 +33,5 @@ public class TransformContext
   public boolean wantsScores = false;
   public DocIterator iterator;
   public SolrIndexSearcher searcher;
+  public SolrQueryRequest req;
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java Fri Nov 18 21:07:13 2011
@@ -25,6 +25,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.util.ReaderUtil;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.SolrIndexSearcher;
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java Fri Nov 18 21:07:13 2011
@@ -118,6 +118,45 @@ public class QueryElevationComponentTest
   }
 
   @Test
+  public void testMarker() throws Exception {
+    assertU(adoc("id", "1", "title", "XXXX XXXX",           "str_s1", "a" ));
+    assertU(adoc("id", "2", "title", "YYYY",      "str_s1", "b" ));
+    assertU(adoc("id", "3", "title", "ZZZZ", "str_s1", "c" ));
+
+    assertU(adoc("id", "4", "title", "XXXX XXXX",                 "str_s1", "x" ));
+    assertU(adoc("id", "5", "title", "YYYY YYYY",         "str_s1", "y" ));
+    assertU(adoc("id", "6", "title", "XXXX XXXX", "str_s1", "z" ));
+    assertU(adoc("id", "7", "title", "AAAA", "str_s1", "a" ));
+    assertU(commit());
+
+    assertQ("", req(CommonParams.Q, "XXXX", CommonParams.QT, "/elevate",
+        CommonParams.FL, "id, score, [elevated]")
+            ,"//*[@numFound='3']"
+            ,"//result/doc[1]/str[@name='id'][.='1']"
+            ,"//result/doc[2]/str[@name='id'][.='4']"
+            ,"//result/doc[3]/str[@name='id'][.='6']",
+            "//result/doc[1]/bool[@name='[elevated]'][.='true']",
+            "//result/doc[2]/bool[@name='[elevated]'][.='false']",
+            "//result/doc[3]/bool[@name='[elevated]'][.='false']"
+            );
+
+    assertQ("", req(CommonParams.Q, "AAAA", CommonParams.QT, "/elevate",
+        CommonParams.FL, "id, score, [elevated]")
+            ,"//*[@numFound='1']"
+            ,"//result/doc[1]/str[@name='id'][.='7']",
+            "//result/doc[1]/bool[@name='[elevated]'][.='false']"
+            );
+
+    assertQ("", req(CommonParams.Q, "AAAA", CommonParams.QT, "/elevate",
+        CommonParams.FL, "id, score, [elev]")
+            ,"//*[@numFound='1']"
+            ,"//result/doc[1]/str[@name='id'][.='7']",
+            "not(//result/doc[1]/bool[@name='[elevated]'][.='false'])",
+            "not(//result/doc[1]/bool[@name='[elev]'][.='false'])" // even though we asked for elev, there is no Transformer registered w/ that, so we shouldn't get a result
+            );
+  }
+
+  @Test
   public void testSorting() throws IOException
   {
     assertU(adoc("id", "a", "title", "ipod",           "str_s1", "a" ));

Modified: lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml (original)
+++ lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml Fri Nov 18 21:07:13 2011
@@ -1631,6 +1631,10 @@
      <transformer name="mytrans3" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
        <double name="defaultValue">5</double>
      </transformer>
+
+      If you are using the QueryElevationComponent, you may wish to mark documents that get boosted.  The
+      EditorialMarkerFactory will do exactly that:
+     <transformer name="qecBooster" class="org.apache.solr.response.transform.EditorialMarkerFactory" />
     -->
     
 

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrDocument.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrDocument.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrDocument.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrDocument.java Fri Nov 18 21:07:13 2011
@@ -275,7 +275,7 @@ public class SolrDocument implements Map
   public Set<Entry<String, Object>> entrySet() {
     return _fields.entrySet();
   }
-
+  //TODO: Shouldn't the input parameter here be a String?  The _fields map requires a String.
   public Object get(Object key) {
     return _fields.get(key);
   }

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/QueryElevationParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/QueryElevationParams.java?rev=1203839&r1=1203838&r2=1203839&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/QueryElevationParams.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/params/QueryElevationParams.java Fri Nov 18 21:07:13 2011
@@ -27,4 +27,11 @@ public interface QueryElevationParams {
   String ENABLE = "enableElevation";
   String EXCLUSIVE = "exclusive";
   String FORCE_ELEVATION = "forceElevation";
+  /**
+   * The name of the field that editorial results will be written out as when using the QueryElevationComponent, which
+   * automatically configures the EditorialMarkerFactory.  The default name is "elevated"
+   * <br/>
+   * See http://wiki.apache.org/solr/DocTransformers
+   */
+  String EDITORIAL_MARKER_FIELD_NAME = "editorialMarkerFieldName";
 }