package org.jboss.capedwarf.datastore.query;
import java.util.Arrays;
import java.util.Collection;
import org.apache.lucene.search.Query;
import org.hibernate.search.query.dsl.BooleanJunction;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.query.dsl.RangeMatchingContext;
import org.hibernate.search.query.dsl.TermMatchingContext;
/**
* @author <a href="mailto:mluksa@redhat.com">Marko Luksa</a>
*/
public class LuceneQueryBuilder {
private QueryBuilder queryBuilder;
public LuceneQueryBuilder(QueryBuilder queryBuilder) {
this.queryBuilder = queryBuilder;
}
public Query matchAll() {
return queryBuilder.all().createQuery();
}
public Query all(Collection<Query> subQueries) {
BooleanJunction<BooleanJunction> bool = queryBuilder.bool();
for (Query subQuery : subQueries) {
bool.must(subQuery);
}
return bool.createQuery();
}
public Query any(Query... subQueries) {
return any(Arrays.asList(subQueries));
}
public Query any(Collection<Query> subQueries) {
BooleanJunction<BooleanJunction> bool = queryBuilder.bool();
for (Query subQuery : subQueries) {
bool.should(subQuery);
}
return bool.createQuery();
}
public Query in(String fieldName, Collection<?> values) {
BooleanJunction<BooleanJunction> bool = queryBuilder.bool();
for (Object value : values) {
bool.should(equal(fieldName, value));
}
return bool.createQuery();
}
public Query notEqual(String fieldName, Object value) {
return any(
lessThan(fieldName, value),
greaterThan(fieldName, value));
}
public Query not(Query query) {
return queryBuilder.bool().must(query).not().createQuery();
}
public Query equal(String fieldName, Object value) {
return equal(fieldName, convertToString(value));
}
public Query equal(String fieldName, String stringValue) {
return keywordOnField(fieldName)
.matching(stringValue)
.createQuery();
}
private TermMatchingContext keywordOnField(String fieldName) {
return queryBuilder
.keyword().onField(fieldName)
.ignoreFieldBridge()
.ignoreAnalyzer();
}
public Query greaterThan(String fieldName, Object value) {
return rangeOnField(fieldName)
.above(convertToString(value)).excludeLimit()
.createQuery();
}
public Query greaterThanOrEqual(String fieldName, Object value) {
return rangeOnField(fieldName)
.above(convertToString(value))
.createQuery();
}
public Query lessThan(String fieldName, Object value) {
return rangeOnField(fieldName)
.below(convertToString(value)).excludeLimit()
.createQuery();
}
public Query lessThanOrEqual(String fieldName, Object value) {
return rangeOnField(fieldName)
.below(convertToString(value))
.createQuery();
}
public RangeMatchingContext rangeOnField(String fieldName) {
return queryBuilder
.range().onField(fieldName)
.ignoreFieldBridge()
.ignoreAnalyzer();
}
private String convertToString(Object value) {
return BridgeUtils.matchBridge(value).objectToString(value);
}
}