[ 
https://issues.apache.org/jira/browse/LUCENE-4985?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13721923#comment-13721923
 ] 

Shai Erera commented on LUCENE-4985:
------------------------------------

Didn't expect I'd run into it so quickly, but there are issues with adding 
createFacetsAccumulator to FacetRequest. Here are some details:

* RangeAccumulator only requires List<FacetRequest>
* TaxonomyFacetsAccumulator requires: List<FacetRequest>, FacetIndexingParams, 
TaxonomyReader and IndexReader
* SortedSetDVAccumulator requires: List<FacetRequest>, SortedSetDVReaderState

At first I made:

* FacetsAccumulator.create(FacetSearchParams, TaxonomyReader, IndexReader)
** FacetSearchParams covers List<FacetRequest> and FacetIndexingParams
* FacetRequest.createFacestAccumulator(FacetSearchParams, TxonomyReader, 
IndexReader).

But this is problematic on several fronts:

* A FacetRequest does not need List<FacetRequest> in createFacetsAccumulator(), 
only FacetIndexingParams
* Not all requests need FacetIndexingParams, TaxonomyReader and IndexReader
** While declaring parameters that aren't needed is not a big deal, it does 
mean that someone will need to pass e.g. taxoReader=null and hope for the best. 
Especially if someone uses only RangeAccumulator and SortedSetDVAccumulator.
* Some requests may need more than that, e.g. SortedSetDVReaderState.

So what's the best solution? It would be best if FacetRequest is 
self-descriptive so that apps can really just call FacetsAccumulator.create().

If we make FacetRequest take all the parameters it needs in the ctor, we sort 
of get that. A request is fully self-descriptive and FR.createFacetsAccumulator 
does not need any arguments. However, each {{new CountFacetRequest()}} will now 
need to pass many parameters, which is annoying and makes the code less 
readable, IMO.

I was thinking perhaps we can extend FacetSearchParams to include additional 
parameters. So ctor takes only the facet requests, and you can optionally set 
FacetIndexingParams, IndexReader, TaxonomyReader, SortedSetDVReaderState. There 
are minor issues that I think can be resolved easily:

* If in the future we'll create an accumulator which requires a different 
setting, we'll need to add that to FSP. That's easy.
* An app may not know which parameters to set on FSP in the first place -- sort 
of easy to fix (on app side) cause it will hit a hard exception, probably NPE 
or some sort, immediately.
** This does show a slight problem though, as you need to create your FRs and 
then "remember" to set the right parameters on FSP.

There is another problem with FR.createFacetsAccumulator -- the accumulators 
already take a List<FacetRequest> when created, however at the single FR level, 
it doesn't know the "global picture" and cannot pass all the requests up front. 
I was thinking that perhaps it can return a FacetAccumulatorBuilder which has 
API for addFacetRequest() and build(). FacetAccumulator.create() will call 
FR.createFacetAccumulatorBuilder() and will group all the requests that return 
the same builder, and then call builder.build() to get the proper 
FacetAccumulator instance. This is an orthogonal problem BTW to the fact that 
this builder will also need to know e.g. the SortedSetDVReaderState up front...

So ... making FR completely self-descriptive by taking all the parameters 
needed to execute it solves most of the problems -- you have to resolve the 
needed parameters at ctor-time. But, it makes the code uglier. Moving 
parameters to FacetSearchParams keeps the FR ctors clean, but might be trappy 
for an app. I'll think about it more, but if someone has an idea how to tackle 
this ... don't be shy :).
                
> Make it easier to mix different kinds of FacetRequests
> ------------------------------------------------------
>
>                 Key: LUCENE-4985
>                 URL: https://issues.apache.org/jira/browse/LUCENE-4985
>             Project: Lucene - Core
>          Issue Type: Improvement
>          Components: modules/facet
>            Reporter: Michael McCandless
>             Fix For: 5.0, 4.5
>
>
> Spinoff from LUCENE-4980, where we added a strange class called 
> RangeFacetsAccumulatorWrapper, which takes an incoming FSP, splits out the 
> FacetRequests into range and non-range, delegates to two accumulators for 
> each set, and then zips the results back together in order.
> Somehow we should generalize this class and make it work with 
> SortedSetDocValuesAccumulator as well.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to