首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Bobo源码札记3(构建Filter)

2012-09-27 
Bobo源码笔记3(构建Filter)browse()函数中有一行代码:?? ?? filter handler.buildFilter(sel) ?用于构

Bobo源码笔记3(构建Filter)

browse()函数中有一行代码:

?

? ?? filter = handler.buildFilter(sel);

?

用于构建filter,下面是FacetHandler的函数buildFilter()的实现,其中buildRandomAccessFilter()是主要实现函数:

?

public final RandomAccessFilter buildFilter(BrowseSelection sel) throws IOException{      String[] selections = sel.getValues();//相当于BooleanQuery的MUST,就是必须要有的值      String[] notSelections = sel.getNotValues();//相当于NOT,不能有的属性值      Properties prop=sel.getSelectionProperties();            RandomAccessFilter filter = null;      if (selections!=null && selections.length > 0)      {        if (sel.getSelectionOperation() == ValueOperation.ValueOperationAnd)        {          filter = buildRandomAccessAndFilter(selections,prop);          if (filter == null)          {            filter = EmptyFilter.getInstance();          }        }        else        {          filter = buildRandomAccessOrFilter(selections, prop,false);          if (filter == null)          {            return EmptyFilter.getInstance();          }        }      }            if (notSelections!=null && notSelections.length>0)      {        RandomAccessFilter notFilter = buildRandomAccessOrFilter(notSelections, prop, true);        if (filter==null)        {          filter = notFilter;        }        else        {          RandomAccessFilter andFilter = new RandomAccessAndFilter(Arrays.asList(new RandomAccessFilter[]{filter,notFilter}));          filter = andFilter;        }      }            return filter;}

?

?在基类FacetHandler中有函数:

?

abstract public RandomAccessFilter buildRandomAccessFilter(String value,Properties selectionProperty) throws IOException;

?

那么在所有的具体实现类中都有自己的实现方法,以SimpleFacetHandler为例:

?

 @Override  public RandomAccessFilter buildRandomAccessFilter(String value, Properties prop) throws IOException  {    //各个FacetHanlder实例基本都是在这个地方不相同而已,比如MultiFacetHandler在这一行是    //  new MultiFacetFilter(this, value);?   FacetFilter f = new FacetFilter(this, value);                                                                        ?AdaptiveFacetFilter af = new AdaptiveFacetFilter(new FacetDataCacheBuilder(){@Overridepublic FacetDataCache build(BoboIndexReader reader) {return  getFacetData(reader);}@Overridepublic String getName() {return _name;}        }, f, new String[]{value});    return af;  }

?

每个FacetHandler基本都有自己专有的Filter,都是继承于RandomAccessFilter,下面是所有的继承关系图:

?

Bobo源码札记3(构建Filter)

?

?

public abstract class RandomAccessFilter extends Filter{  private static final long serialVersionUID = 1L;  @Override   public DocIdSet getDocIdSet(IndexReader reader) throws IOException  {if (reader instanceof BoboIndexReader){      return getRandomAccessDocIdSet((BoboIndexReader)reader);}else{  throw new IllegalStateException("reader not instance of "+BoboIndexReader.class);}  }    public abstract RandomAccessDocIdSet getRandomAccessDocIdSet(BoboIndexReader reader) throws IOException;  //返回该属性值在所有属性中的百分比  public double getFacetSelectivity(BoboIndexReader reader) { return 0.50; }  }
?

?可以看到RandomAccessFilter的主要的功能函数是返回一个RandomAccessDocIdSet,而RandomAccessDocIdSet接口的主要功能函数是get(int docid)和iterator()。get()判断某个doc是否满足条件:

?

public abstract class RandomAccessDocIdSet extends DocIdSet{  public abstract boolean get(int docId);}

?

?以及从Filter继承来的iterator()函数,用于返回一个满足条件的doc的迭代器:

?

public abstract DocIdSetIterator iterator() throws IOException;
?

?

?

热点排行