Changeset 5125


Ignore:
Timestamp:
05/02/14 14:15:22 (10 years ago)
Author:
Twan Goosen
Message:

facet field values optimisation: caching of size and filtering

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProvider.java

    r5120 r5125  
    4444 * SOLR) present on a {@link FacetField}, sortable by either count or name
    4545 *
    46  * TODO: cache values list/size
    47  *
    4846 * @see FieldValuesOrder
    4947 * @author twagoo
     
    5553    private final int maxNumberOfItems;
    5654    private final Collection<String> lowPriorityValues;
     55
     56    /**
     57     * cached result size
     58     */
     59    private Long size;
     60    /**
     61     * cached filtered values
     62     */
     63    private Iterable<Count> filtered;
    5764
    5865    /**
     
    108115    @Override
    109116    public Iterator<? extends FacetField.Count> iterator(long first, long count) {
    110         // get all the values
    111         final List<FacetField.Count> values = model.getObject().getValues();
    112         // filter results
    113         final Iterable<Count> filtered = filter(values);
     117        final Iterable<Count> filtered = getFilteredValues();
    114118        // sort what remains
    115119        final ImmutableList sorted = getOrdering().immutableSortedCopy(filtered);
     
    124128    @Override
    125129    public long size() {
    126         if (hasFilter()) {
    127             final List<FacetField.Count> values = model.getObject().getValues();
    128             return Math.min(maxNumberOfItems, Iterables.size(filter(values)));
    129         } else {
    130             // Use value count from Solr, faster.
    131             //
    132             // Actual value count might be higher than what we want to show
    133             // so get minimum.
    134             return Math.min(maxNumberOfItems, model.getObject().getValueCount());
    135         }
     130        if (size == null) {
     131            size = getSize();
     132        }
     133        return size;
    136134    }
    137135
     
    141139    }
    142140
    143     @Override
    144     public void detach() {
    145         model.detach();
    146     }
    147 
     141    /*
     142     * CACHING AND FILTERING
     143     */
    148144    private Iterable<FacetField.Count> filter(List<FacetField.Count> list) {
    149145        if (hasFilter()) {
     
    159155    }
    160156
     157    private Iterable<Count> getFilteredValues() {
     158        if (filtered == null) {
     159            // get all the values
     160            final List<FacetField.Count> values = model.getObject().getValues();
     161            filtered = filter(values);
     162        }
     163        return filtered;
     164    }
     165
     166    private long getSize() {
     167        if (hasFilter()) {
     168            return Math.min(maxNumberOfItems, Iterables.size(getFilteredValues()));
     169        } else {
     170            // Use value count from Solr, faster.
     171            //
     172            // Actual value count might be higher than what we want to show
     173            // so get minimum.
     174            return Math.min(maxNumberOfItems, model.getObject().getValueCount());
     175        }
     176    }
     177
    161178    private boolean hasFilter() {
    162179        return getFilterModel() != null && getFilterModel().getObject() != null && !getFilterModel().getObject().isEmpty();
    163180    }
    164181
     182    /*
     183     * ORDERING
     184     */
    165185    private Ordering getOrdering() {
    166186        if (lowPriorityValues != null && getSort().getProperty() == FieldValuesOrder.COUNT) {
     
    256276
    257277    };
     278
     279    @Override
     280    public void detach() {
     281        model.detach();
     282        // invalidate cache variables
     283        size = null;
     284        filtered = null;
     285    }
    258286}
Note: See TracChangeset for help on using the changeset viewer.