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 2010/10/19 22:10:03 UTC

svn commit: r1024389 - in /lucene/dev/trunk/solr: example/solr/conf/ src/java/org/apache/solr/core/ src/java/org/apache/solr/handler/component/

Author: ryan
Date: Tue Oct 19 20:10:03 2010
New Revision: 1024389

URL: http://svn.apache.org/viewvc?rev=1024389&view=rev
Log:
SOLR-792 -- adding pivot to the FacetComponent

Added:
    lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetHelper.java
      - copied, changed from r1024323, lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetComponent.java
Removed:
    lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetComponent.java
Modified:
    lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml
    lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/FacetComponent.java

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=1024389&r1=1024388&r2=1024389&view=diff
==============================================================================
--- lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml (original)
+++ lucene/dev/trunk/solr/example/solr/conf/solrconfig.xml Tue Oct 19 20:10:03 2010
@@ -498,9 +498,6 @@
        <str name="version">2.1</str>
         -->
      </lst>
-     <arr name="last-components">
-       <str>pivot</str> <!-- not included by default -->
-     </arr>
   </requestHandler>
   
   <!-- 
@@ -668,7 +665,6 @@
     
    <searchComponent name="query"     class="org.apache.solr.handler.component.QueryComponent" />
    <searchComponent name="facet"     class="org.apache.solr.handler.component.FacetComponent" />
-   <searchComponent name="pivot"     class="org.apache.solr.handler.component.PivotFacetComponent" />
    <searchComponent name="mlt"       class="org.apache.solr.handler.component.MoreLikeThisComponent" />
    <searchComponent name="highlight" class="org.apache.solr.handler.component.HighlightComponent" />
    <searchComponent name="stats"     class="org.apache.solr.handler.component.StatsComponent" />

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java?rev=1024389&r1=1024388&r2=1024389&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/core/SolrCore.java Tue Oct 19 20:10:03 2010
@@ -834,7 +834,6 @@ public final class SolrCore implements S
     addIfNotPresent(components,HighlightComponent.COMPONENT_NAME,HighlightComponent.class);
     addIfNotPresent(components,QueryComponent.COMPONENT_NAME,QueryComponent.class);
     addIfNotPresent(components,FacetComponent.COMPONENT_NAME,FacetComponent.class);
-    addIfNotPresent(components,PivotFacetComponent.COMPONENT_NAME,PivotFacetComponent.class);
     addIfNotPresent(components,MoreLikeThisComponent.COMPONENT_NAME,MoreLikeThisComponent.class);
     addIfNotPresent(components,StatsComponent.COMPONENT_NAME,StatsComponent.class);
     addIfNotPresent(components,DebugComponent.COMPONENT_NAME,DebugComponent.class);
@@ -843,6 +842,9 @@ public final class SolrCore implements S
   private <T> void addIfNotPresent(Map<String ,T> registry, String name, Class<? extends  T> c){
     if(!registry.containsKey(name)){
       T searchComp = (T) resourceLoader.newInstance(c.getName());
+      if (searchComp instanceof NamedListInitializedPlugin){
+        ((NamedListInitializedPlugin)searchComp).init( new NamedList() );
+      }
       registry.put(name, searchComp);
       if (searchComp instanceof SolrInfoMBean){
         infoRegistry.put(((SolrInfoMBean)searchComp).getName(), (SolrInfoMBean)searchComp);

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/FacetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/FacetComponent.java?rev=1024389&r1=1024388&r2=1024389&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/FacetComponent.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/FacetComponent.java Tue Oct 19 20:10:03 2010
@@ -41,10 +41,20 @@ import org.apache.lucene.queryParser.Par
  * @version $Id$
  * @since solr 1.3
  */
-public class  FacetComponent extends SearchComponent
+public class FacetComponent extends SearchComponent
 {
   public static final String COMPONENT_NAME = "facet";
 
+  static final String PIVOT_KEY = "facet_pivot";
+
+  PivotFacetHelper pivotHelper;
+
+  @Override
+  public void init( NamedList args )
+  {
+    pivotHelper = new PivotFacetHelper(); // Maybe this would configurable?
+  }
+
   @Override
   public void prepare(ResponseBuilder rb) throws IOException
   {
@@ -68,8 +78,17 @@ public class  FacetComponent extends Sea
               params,
               rb );
 
+      NamedList counts = f.getFacetCounts();
+      String[] pivots = params.getParams( FacetParams.FACET_PIVOT );
+      if( pivots != null && pivots.length > 0 ) {
+        NamedList v = pivotHelper.process(rb, params, pivots);
+        if( v != null ) {
+          counts.add( PIVOT_KEY, v );
+        }
+      }
+      
       // TODO ???? add this directly to the response, or to the builder?
-      rb.rsp.add( "facet_counts", f.getFacetCounts() );
+      rb.rsp.add( "facet_counts", counts );
     }
   }
 

Copied: lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetHelper.java (from r1024323, lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetComponent.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetHelper.java?p2=lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetHelper.java&p1=lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetComponent.java&r1=1024323&r2=1024389&rev=1024389&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetComponent.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/handler/component/PivotFacetHelper.java Tue Oct 19 20:10:03 2010
@@ -31,7 +31,6 @@ import org.apache.solr.schema.FieldType;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.document.Field.Index;
 import org.apache.lucene.document.Field.Store;
 import org.apache.lucene.index.Term;
@@ -44,42 +43,23 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * 
+ * This is thread safe
  * @since solr 4.0
  */
-public class PivotFacetComponent extends SearchComponent 
+public class PivotFacetHelper
 {
-  public static final String COMPONENT_NAME = "pivot";
-
-  static final String PIVOT_KEY = "facet_pivot";
-
-  
   /**
    * Designed to be overridden by subclasses that provide different faceting implementations.
    * TODO: Currently this is returning a SimpleFacets object, but those capabilities would
    *       be better as an extracted abstract class or interface.
    */
-  protected SimpleFacets getFacetImplementation(SolrQueryRequest req,
-                                                DocSet docs,
-                                                SolrParams params) {
+  protected SimpleFacets getFacetImplementation(SolrQueryRequest req, DocSet docs, SolrParams params) {
     return new SimpleFacets(req, docs, params);
   }
 
-  @Override
-  public void prepare(ResponseBuilder rb) throws IOException
-  {
-    if (rb.req.getParams().getBool(FacetParams.FACET,false)) {
-      rb.setNeedDocSet( true );
-      rb.doFacets = true;
-    }
-  }
-
-  public void process(ResponseBuilder rb) throws IOException {
-    if (!rb.doFacets) return;
-
-    SolrParams params = rb.req.getParams();
-    String[] pivots = params.getParams(FacetParams.FACET_PIVOT);  // example: author,type  (for types by author / types within author)
-    if (pivots == null) return;
+  public SimpleOrderedMap<List<NamedList<Object>>> process(ResponseBuilder rb, SolrParams params, String[] pivots) throws IOException {
+    if (!rb.doFacets || pivots == null) 
+      return null;
     
     int minMatch = params.getInt( FacetParams.FACET_PIVOT_MINCOUNT, 1 );
     
@@ -105,12 +85,7 @@ public class PivotFacetComponent extends
       
       pivotResponse.add(pivot, doPivots(superFacets, field, subField, fnames, rb, docs, minMatch));
     }
-    NamedList facetCounts = (NamedList) rb.rsp.getValues().get("facet_counts");
-    if (facetCounts == null) {
-      facetCounts = new NamedList();
-      rb.rsp.add("facet_counts", facetCounts);
-    }
-    facetCounts.add( PIVOT_KEY, pivotResponse);
+    return pivotResponse;
   }
   
   /**
@@ -160,123 +135,125 @@ public class PivotFacetComponent extends
     fnames.push( nextField );
     return values;
   }
-
-  @Override
-  public int distributedProcess(ResponseBuilder rb) throws IOException {
-    if (!rb.doFacets) {
-      return ResponseBuilder.STAGE_DONE;
-    }
-
-    if (rb.stage == ResponseBuilder.STAGE_GET_FIELDS) {
-      SolrParams params = rb.req.getParams();
-      String[] pivots = params.getParams(FacetParams.FACET_PIVOT);
-      for ( ShardRequest sreq : rb.outgoing ) {
-        if (( sreq.purpose & ShardRequest.PURPOSE_GET_FIELDS ) != 0
-            && sreq.shards != null && sreq.shards.length == 1 ) {
-          sreq.params.set( FacetParams.FACET, "true" );
-          sreq.params.set( FacetParams.FACET_PIVOT, pivots );
-          sreq.params.set( FacetParams.FACET_PIVOT_MINCOUNT, 1 ); // keep this at 1 regardless so that it accumulates everything
-            }
-      }
-    }
-    return ResponseBuilder.STAGE_DONE;
-  }
-
-  @Override
-  public void handleResponses(ResponseBuilder rb, ShardRequest sreq) {
-    if (!rb.doFacets) return;
-
-
-    if ((sreq.purpose & ShardRequest.PURPOSE_GET_FACETS)!=0) {
-      SimpleOrderedMap<List<NamedList<Object>>> tf = rb._pivots;
-      if ( null == tf ) {
-        tf = new SimpleOrderedMap<List<NamedList<Object>>>();
-        rb._pivots = tf;
-      }
-      for (ShardResponse srsp: sreq.responses) {
-        int shardNum = rb.getShardNum(srsp.getShard());
-
-        NamedList facet_counts = (NamedList)srsp.getSolrResponse().getResponse().get("facet_counts");
-
-        // handle facet trees from shards
-        SimpleOrderedMap<List<NamedList<Object>>> shard_pivots = 
-          (SimpleOrderedMap<List<NamedList<Object>>>)facet_counts.get( PIVOT_KEY );
-        
-        if ( shard_pivots != null ) {
-          for (int j=0; j< shard_pivots.size(); j++) {
-            // TODO -- accumulate the results from each shard
-            // The following code worked to accumulate facets for an previous 
-            // two level patch... it is here for reference till someone can upgrade
-            /**
-            String shard_tree_name = (String) shard_pivots.getName( j );
-            SimpleOrderedMap<NamedList> shard_tree = (SimpleOrderedMap<NamedList>)shard_pivots.getVal( j );
-            SimpleOrderedMap<NamedList> facet_tree = tf.get( shard_tree_name );
-            if ( null == facet_tree) { 
-              facet_tree = new SimpleOrderedMap<NamedList>(); 
-              tf.add( shard_tree_name, facet_tree );
-            }
-
-            for( int o = 0; o < shard_tree.size() ; o++ ) {
-              String shard_outer = (String) shard_tree.getName( o );
-              NamedList shard_innerList = (NamedList) shard_tree.getVal( o );
-              NamedList tree_innerList  = (NamedList) facet_tree.get( shard_outer );
-              if ( null == tree_innerList ) { 
-                tree_innerList = new NamedList();
-                facet_tree.add( shard_outer, tree_innerList );
-              }
-
-              for ( int i = 0 ; i < shard_innerList.size() ; i++ ) {
-                String shard_term = (String) shard_innerList.getName( i );
-                long shard_count  = ((Number) shard_innerList.getVal(i)).longValue();
-                int tree_idx      = tree_innerList.indexOf( shard_term, 0 );
-
-                if ( -1 == tree_idx ) {
-                  tree_innerList.add( shard_term, shard_count );
-                } else {
-                  long tree_count = ((Number) tree_innerList.getVal( tree_idx )).longValue();
-                  tree_innerList.setVal( tree_idx, shard_count + tree_count );
-                }
-              } // innerList loop
-            } // outer loop
-              **/
-          } // each tree loop
-        }
-      }
-    } 
-    return ;
-  }
-
-  @Override
-  public void finishStage(ResponseBuilder rb) {
-    if (!rb.doFacets || rb.stage != ResponseBuilder.STAGE_GET_FIELDS) return;
-    // wait until STAGE_GET_FIELDS
-    // so that "result" is already stored in the response (for aesthetics)
-
-    SimpleOrderedMap<List<NamedList<Object>>> tf = rb._pivots;
-
-    // get 'facet_counts' from the response
-    NamedList facetCounts = (NamedList) rb.rsp.getValues().get("facet_counts");
-    if (facetCounts == null) {
-      facetCounts = new NamedList();
-      rb.rsp.add("facet_counts", facetCounts);
-    }
-    facetCounts.add( PIVOT_KEY, tf );
-    rb._pivots = null;
-  }
-
-  public String getDescription() {
-    return "Handle Pivot (multi-level) Faceting";
-  }
-
-  public String getSourceId() {
-    return "$Id$";
-  }
-
-  public String getSource() {
-    return "$URL$";
-  }
-
-  public String getVersion() {
-    return "$Revision$";
-  }
+// TODO: This is code from various patches to support distributed search.
+//  Some parts may be helpful for whoever implements distributed search.
+//
+//  @Override
+//  public int distributedProcess(ResponseBuilder rb) throws IOException {
+//    if (!rb.doFacets) {
+//      return ResponseBuilder.STAGE_DONE;
+//    }
+//
+//    if (rb.stage == ResponseBuilder.STAGE_GET_FIELDS) {
+//      SolrParams params = rb.req.getParams();
+//      String[] pivots = params.getParams(FacetParams.FACET_PIVOT);
+//      for ( ShardRequest sreq : rb.outgoing ) {
+//        if (( sreq.purpose & ShardRequest.PURPOSE_GET_FIELDS ) != 0
+//            && sreq.shards != null && sreq.shards.length == 1 ) {
+//          sreq.params.set( FacetParams.FACET, "true" );
+//          sreq.params.set( FacetParams.FACET_PIVOT, pivots );
+//          sreq.params.set( FacetParams.FACET_PIVOT_MINCOUNT, 1 ); // keep this at 1 regardless so that it accumulates everything
+//            }
+//      }
+//    }
+//    return ResponseBuilder.STAGE_DONE;
+//  }
+//
+//  @Override
+//  public void handleResponses(ResponseBuilder rb, ShardRequest sreq) {
+//    if (!rb.doFacets) return;
+//
+//
+//    if ((sreq.purpose & ShardRequest.PURPOSE_GET_FACETS)!=0) {
+//      SimpleOrderedMap<List<NamedList<Object>>> tf = rb._pivots;
+//      if ( null == tf ) {
+//        tf = new SimpleOrderedMap<List<NamedList<Object>>>();
+//        rb._pivots = tf;
+//      }
+//      for (ShardResponse srsp: sreq.responses) {
+//        int shardNum = rb.getShardNum(srsp.getShard());
+//
+//        NamedList facet_counts = (NamedList)srsp.getSolrResponse().getResponse().get("facet_counts");
+//
+//        // handle facet trees from shards
+//        SimpleOrderedMap<List<NamedList<Object>>> shard_pivots = 
+//          (SimpleOrderedMap<List<NamedList<Object>>>)facet_counts.get( PIVOT_KEY );
+//        
+//        if ( shard_pivots != null ) {
+//          for (int j=0; j< shard_pivots.size(); j++) {
+//            // TODO -- accumulate the results from each shard
+//            // The following code worked to accumulate facets for an previous 
+//            // two level patch... it is here for reference till someone can upgrade
+//            /**
+//            String shard_tree_name = (String) shard_pivots.getName( j );
+//            SimpleOrderedMap<NamedList> shard_tree = (SimpleOrderedMap<NamedList>)shard_pivots.getVal( j );
+//            SimpleOrderedMap<NamedList> facet_tree = tf.get( shard_tree_name );
+//            if ( null == facet_tree) { 
+//              facet_tree = new SimpleOrderedMap<NamedList>(); 
+//              tf.add( shard_tree_name, facet_tree );
+//            }
+//
+//            for( int o = 0; o < shard_tree.size() ; o++ ) {
+//              String shard_outer = (String) shard_tree.getName( o );
+//              NamedList shard_innerList = (NamedList) shard_tree.getVal( o );
+//              NamedList tree_innerList  = (NamedList) facet_tree.get( shard_outer );
+//              if ( null == tree_innerList ) { 
+//                tree_innerList = new NamedList();
+//                facet_tree.add( shard_outer, tree_innerList );
+//              }
+//
+//              for ( int i = 0 ; i < shard_innerList.size() ; i++ ) {
+//                String shard_term = (String) shard_innerList.getName( i );
+//                long shard_count  = ((Number) shard_innerList.getVal(i)).longValue();
+//                int tree_idx      = tree_innerList.indexOf( shard_term, 0 );
+//
+//                if ( -1 == tree_idx ) {
+//                  tree_innerList.add( shard_term, shard_count );
+//                } else {
+//                  long tree_count = ((Number) tree_innerList.getVal( tree_idx )).longValue();
+//                  tree_innerList.setVal( tree_idx, shard_count + tree_count );
+//                }
+//              } // innerList loop
+//            } // outer loop
+//              **/
+//          } // each tree loop
+//        }
+//      }
+//    } 
+//    return ;
+//  }
+//
+//  @Override
+//  public void finishStage(ResponseBuilder rb) {
+//    if (!rb.doFacets || rb.stage != ResponseBuilder.STAGE_GET_FIELDS) return;
+//    // wait until STAGE_GET_FIELDS
+//    // so that "result" is already stored in the response (for aesthetics)
+//
+//    SimpleOrderedMap<List<NamedList<Object>>> tf = rb._pivots;
+//
+//    // get 'facet_counts' from the response
+//    NamedList facetCounts = (NamedList) rb.rsp.getValues().get("facet_counts");
+//    if (facetCounts == null) {
+//      facetCounts = new NamedList();
+//      rb.rsp.add("facet_counts", facetCounts);
+//    }
+//    facetCounts.add( PIVOT_KEY, tf );
+//    rb._pivots = null;
+//  }
+//
+//  public String getDescription() {
+//    return "Handle Pivot (multi-level) Faceting";
+//  }
+//
+//  public String getSourceId() {
+//    return "$Id$";
+//  }
+//
+//  public String getSource() {
+//    return "$URL$";
+//  }
+//
+//  public String getVersion() {
+//    return "$Revision$";
+//  }
 }