/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2010, 2014, all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.index.impl.lucene;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import org.apache.lucene.index.Term;
import org.apache.lucene.queries.TermsFilter;
import org.apache.lucene.search.CachingWrapperFilter;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.NGramPhraseQuery;
import org.apache.lucene.search.PrefixFilter;
import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.WildcardQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Set;
public class LuceneFilterCacheManager {
private static final Logger logger = LoggerFactory.getLogger(LuceneFilterCacheManager.class);
public static enum FilterType {
PREFIX, TERMS, WILDCARD, NGRAM
}
private final LoadingCache<Term, CachingWrapperFilter> prefixCache;
private final LoadingCache<Set<Term>, CachingWrapperFilter> termsCache;
private final LoadingCache<Term, CachingWrapperFilter> wildcardCache;
private final LoadingCache<List<Term>, CachingWrapperFilter> nGramCache;
public LuceneFilterCacheManager() {
prefixCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader<Term, CachingWrapperFilter>() {
@Override
public CachingWrapperFilter load(Term t) throws Exception {
logger.debug("Encountered a new PrefixFilter term: {}", t);
return new CachingWrapperFilter(new PrefixFilter(t));
}
}
);
wildcardCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader<Term, CachingWrapperFilter>() {
@Override
public CachingWrapperFilter load(Term t) throws Exception {
logger.debug("Encountered a new WildcardQuery term: {}", t);
return new CachingWrapperFilter(new QueryWrapperFilter(new WildcardQuery(t)));
}
}
);
termsCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader<Set<Term>, CachingWrapperFilter>() {
@Override
public CachingWrapperFilter load(Set<Term> t) throws Exception {
logger.debug("Encountered a new TermsFilter term: {}", t);
TermsFilter termsFilter = new TermsFilter(Lists.newArrayList(t));
return new CachingWrapperFilter(termsFilter);
}
}
);
nGramCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader<List<Term>, CachingWrapperFilter>() {
@Override
public CachingWrapperFilter load(List<Term> t) throws Exception {
logger.debug("Encountered a new NGramPhaseQuery term: {}", t);
NGramPhraseQuery pq = new NGramPhraseQuery(LuceneIdentifierAnalyzer.MIN_NGRAM_SIZE);
for (Term term : t) {
pq.add(term);
}
return new CachingWrapperFilter(new QueryWrapperFilter(pq));
}
}
);
}
public Filter get(FilterType name, Term... key) {
switch (name) {
case NGRAM:
return nGramCache.getUnchecked(ImmutableList.copyOf(key));
case PREFIX:
return prefixCache.getUnchecked(key[0]);
case WILDCARD:
return wildcardCache.getUnchecked(key[0]);
case TERMS:
default:
return termsCache.getUnchecked(ImmutableSet.copyOf(key));
}
}
}