001package org.biopax.paxtools.util; 002 003import org.apache.lucene.index.Term; 004import org.apache.lucene.search.BooleanClause.Occur; 005import org.apache.lucene.search.BooleanQuery; 006import org.apache.lucene.search.CachingWrapperFilter; 007import org.apache.lucene.search.Filter; 008import org.apache.lucene.search.QueryWrapperFilter; 009import org.apache.lucene.search.TermQuery; 010import org.hibernate.search.annotations.Factory; 011import org.hibernate.search.annotations.FullTextFilterDef; 012import org.hibernate.search.annotations.Key; 013import org.hibernate.search.filter.FilterKey; 014import org.hibernate.search.filter.StandardFilterKey; 015 016/** 017 * Basic filter factory implementation class. 018 * (See Hibernate Search documentation for more details) 019 * 020 * @see Factory 021 * @see Key 022 * @see FullTextFilterDef 023 * 024 * @author rodche 025 * @deprecated Hibernate ORM/Search will be removed in v5 026 */ 027public abstract class BasicFilterFactory { 028 029 private String[] values; 030 private final String searchField; 031 032 /** 033 * @param searchField search/index field name 034 */ 035 public BasicFilterFactory(String searchField) { 036 this.searchField = searchField; 037 } 038 039 040 public String[] getValues() { 041 return values; 042 } 043 044 public void setValues(String[] values) { 045 this.values = values; 046 } 047 048 049 @Key 050 public FilterKey getKey() { 051 StandardFilterKey key = new StandardFilterKey(); 052 key.addParameter(values); 053 return key; 054 } 055 056 057 @Factory 058 public Filter getFilter() { 059 /* a simpler, stricter, less confusing way filter search results: 060 * e.g., only full standard biopax names and IDs will work as filter values, 061 * while others will return empty result set (and the searchField is UN_TOKENIZED) 062 */ 063 BooleanQuery query = new BooleanQuery(); 064 for(String fv : values) { 065 String term = fv.trim(); 066 query.add(new TermQuery(new Term(searchField, term)), 067 Occur.SHOULD); // SHOULD here means "OR" 068 query.add(new TermQuery(new Term(searchField, term.toLowerCase())), 069 Occur.SHOULD); 070 } 071 072 return new CachingWrapperFilter( new QueryWrapperFilter(query) ); 073 } 074}