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$";
+// }
}