[ https://issues.apache.org/jira/browse/SOLR-1672?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12849755#action_12849755 ]
Hoss Man commented on SOLR-1672: -------------------------------- Some old notes on this patch that i just found on my laptop (presumably from the last time i was on a plane) ... * The existing patch is in a weird format that i coulnd't apply * re-reading the patch, and comparing to the SimpleFacets and UnInvertedField source, i'm noticing some that several code paths for facet counts aren't being accounted for * I think what we should do conceptially is refactor all of the code that looks at the existing FacetParams.FACET_SORT param (or any of the constant values for it) into a helper function thta parses the new legal values we want to support and returns a Comparator, and then start passing that comparator arround to the various strategies (termenum, fieldcache, uninverted) for collecting facet constraints, instead of just passing arround the "sort" string value... ** "true","count","count desc" => a comparator that does descending count sort ** "count asc" => a comparator that does ascending count sort ** "false","index","index asc" => null (by returning a null comparator we would be signalling that no sorting or bounded collection is needed, terms can be processed in order) ** "index desc" => a comparater that does descendeing term sort (not requested in this Jira, but recently asked about on the mailing list) * The problem with that conceptual solution is that UnInvertedField doesn't maintain a BoundedTreeSet of CountPairs like all of hte other code paths, it uses a single Long to encode both the count and the index of the term, so it would need some special logic. ** Side question: I wonder if that Long encoded format would work for hte field cache based faceting as well? > RFE: facet reverse sort count > ----------------------------- > > Key: SOLR-1672 > URL: https://issues.apache.org/jira/browse/SOLR-1672 > Project: Solr > Issue Type: Improvement > Components: search > Affects Versions: 1.4 > Environment: Java, Solrj, http > Reporter: Peter Sturge > Priority: Minor > Attachments: SOLR-1672.patch > > Original Estimate: 0h > Remaining Estimate: 0h > > As suggested by Chris Hosstetter, I have added an optional Comparator to the > BoundedTreeSet<Long> in the UnInvertedField class. > This optional comparator is used when a new (and also optional) field facet > parameter called 'facet.sortorder' is set to the string 'dsc' > (e.g. &f.<facetname>.facet.sortorder=dsc for per field, or > &facet.sortorder=dsc for all facets). > Note that this parameter has no effect if facet.method=enum. > Any value other than 'dsc' (including no value) reverts the BoundedTreeSet to > its default behaviour. > > This change affects 2 source files: > > UnInvertedField.java > [line 438] The getCounts() method signature is modified to add the > 'facetSortOrder' parameter value to the end of the argument list. > > DIFF UnInvertedField.java: > - public NamedList getCounts(SolrIndexSearcher searcher, DocSet baseDocs, int > offset, int limit, Integer mincount, boolean missing, String sort, String > prefix) throws IOException { > + public NamedList getCounts(SolrIndexSearcher searcher, DocSet baseDocs, int > offset, int limit, Integer mincount, boolean missing, String sort, String > prefix, String facetSortOrder) throws IOException { > [line 556] The getCounts() method is modified to create an overridden > BoundedTreeSet<Long>(int, Comparator) if the 'facetSortOrder' parameter > equals 'dsc'. > DIFF UnInvertedField.java: > - final BoundedTreeSet<Long> queue = new BoundedTreeSet<Long>(maxsize); > + final BoundedTreeSet<Long> queue = (sort.equals("count") || > sort.equals("true")) ? (facetSortOrder.equals("dsc") ? new > BoundedTreeSet<Long>(maxsize, new Comparator() > { @Override > public int compare(Object o1, Object o2) > { > if (o1 == null || o2 == null) > return 0; > int result = ((Long) o1).compareTo((Long) o2); > return (result != 0 ? result > 0 ? -1 : 1 : 0); //lowest number first sort > }}) : new BoundedTreeSet<Long>(maxsize)) : null; > > SimpleFacets.java > [line 221] A getFieldParam(field, "facet.sortorder", "asc"); is added to > retrieve the new parameter, if present. 'asc' used as a default value. > DIFF SimpleFacets.java: > + String facetSortOrder = params.getFieldParam(field, "facet.sortorder", > "asc"); > > [line 253] The call to uif.getCounts() in the getTermCounts() method is > modified to pass the 'facetSortOrder' value string. > DIFF SimpleFacets.java: > - counts = uif.getCounts(searcher, base, offset, limit, > mincount,missing,sort,prefix); > + counts = uif.getCounts(searcher, base, offset, limit, > mincount,missing,sort,prefix, facetSortOrder); > Implementation Notes: > I have noted in testing that I was not able to retrieve any '0' counts as I > had expected. > I believe this could be because there appear to be some optimizations in > SimpleFacets/count caching such that zero counts are not iterated (at least > not by default) > as a performance enhancement. > I could be wrong about this, and zero counts may appear under some other as > yet untested circumstances. Perhaps an expert familiar with this part of the > code can clarify. > In fact, this is not such a bad thing (at least for my requirements), as a > whole bunch of zero counts is not necessarily useful (for my requirements, > starting at '1' is just right). > > There may, however, be instances where someone *will* want zero counts - e.g. > searching for zero product stock counts (e.g. 'what have we run out of'). I > was envisioning the facet.mincount field > being the preferred place to set where the 'lowest value' begins (e.g. 0 or 1 > or possibly higher), but because of the caching/optimization, the behaviour > is somewhat different than expected. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.