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}