package com.browseengine.bobo.facets.impl; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Properties; import com.browseengine.bobo.api.BoboSegmentReader; import com.browseengine.bobo.api.BrowseSelection; import com.browseengine.bobo.api.FacetSpec; import com.browseengine.bobo.facets.FacetCountCollector; import com.browseengine.bobo.facets.FacetCountCollectorSource; import com.browseengine.bobo.facets.FacetHandler; import com.browseengine.bobo.facets.FacetHandler.FacetDataNone; import com.browseengine.bobo.facets.data.FacetDataCache; import com.browseengine.bobo.facets.filter.RandomAccessFilter; import com.browseengine.bobo.sort.DocComparatorSource; public class FilteredRangeFacetHandler extends FacetHandler<FacetDataNone> { private final List<String> _predefinedRanges; private final String _inner; private RangeFacetHandler _innerHandler; public FilteredRangeFacetHandler(String name, String underlyingHandler, List<String> predefinedRanges) { super(name, new HashSet<String>(Arrays.asList(underlyingHandler))); _predefinedRanges = predefinedRanges; _inner = underlyingHandler; _innerHandler = null; } @Override public RandomAccessFilter buildRandomAccessFilter(String value, Properties selectionProperty) throws IOException { return _innerHandler.buildRandomAccessFilter(value, selectionProperty); } @Override public RandomAccessFilter buildRandomAccessAndFilter(String[] vals, Properties prop) throws IOException { return _innerHandler.buildRandomAccessAndFilter(vals, prop); } @Override public RandomAccessFilter buildRandomAccessOrFilter(String[] vals, Properties prop, boolean isNot) throws IOException { return _innerHandler.buildRandomAccessOrFilter(vals, prop, isNot); } @Override public FacetCountCollectorSource getFacetCountCollectorSource(final BrowseSelection sel, final FacetSpec fspec) { return new FacetCountCollectorSource() { @Override public FacetCountCollector getFacetCountCollector(BoboSegmentReader reader, int docBase) { FacetDataCache<?> dataCache = _innerHandler.getFacetData(reader); return new RangeFacetCountCollector(_name, dataCache, docBase, fspec, _predefinedRanges); } }; } @Override public String[] getFieldValues(BoboSegmentReader reader, int id) { return _innerHandler.getFieldValues(reader, id); } @Override public Object[] getRawFieldValues(BoboSegmentReader reader, int id) { return _innerHandler.getRawFieldValues(reader, id); } @Override public DocComparatorSource getDocComparatorSource() { return _innerHandler.getDocComparatorSource(); } @Override public FacetDataNone load(BoboSegmentReader reader) throws IOException { FacetHandler<?> handler = reader.getFacetHandler(_inner); if (handler instanceof RangeFacetHandler) { _innerHandler = (RangeFacetHandler) handler; return FacetDataNone.instance; } else { throw new IOException("inner handler is not instance of " + RangeFacetHandler.class); } } }