package org.jboss.seam.wiki.core.search.metamodel; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.jboss.seam.wiki.core.search.PropertySearch; import org.jboss.seam.wiki.core.search.annotations.SearchableType; /** * A logical searchable property that is a composite of several indexed fields. * * @author Christian Bauer */ public class SearchablePropertyComposite extends SearchableProperty { private String[] names; public SearchablePropertyComposite(String[] names, String description, SearchableType type) { super(description, type); this.names = names; } public String[] getNames() { return names; } public void setNames(String[] names) { this.names = names; } public String toString() { String name = "Composite: "; for (String s : getNames()) { name += s + " "; } return name; } public Query getQuery(PropertySearch search) { BooleanQuery query = new BooleanQuery(); BooleanQuery includeQuery = new BooleanQuery(); BooleanQuery excludeQuery = new BooleanQuery(); for (String s : getNames()) { Query iq = buildIncludeQuery(s, search); if (iq != null) { log.debug("include query: " + iq.toString()); includeQuery.add(iq, BooleanClause.Occur.SHOULD); Query eq = buildExcludeQuery(s, search); if (eq != null) { log.debug("exclude query: " + eq.toString()); excludeQuery.add(eq, BooleanClause.Occur.SHOULD); } } } if (includeQuery.getClauses().length > 0) query.add(includeQuery, BooleanClause.Occur.MUST); if (excludeQuery.getClauses().length > 0) query.add(excludeQuery, BooleanClause.Occur.MUST_NOT); return query.getClauses().length > 0 ? query : null; } }