package com.intuit.tank.search.util;
/*
* #%L
* DocumentUtil
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.util.Arrays;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
/**
* MultiSearchParam
*
*/
public class MultiSearchParam implements SearchParam {
/**
*/
public enum Operator {
OR("OR", Occur.SHOULD),
AND("AND", Occur.MUST),
NOT("AND NOT", Occur.MUST_NOT);
private String joinTerm;
private Occur occur;
Operator(String joinTerm, Occur occur) {
this.joinTerm = joinTerm;
this.occur = occur;
}
public Occur getOccur() {
return occur;
}
public String getJoinTerm() {
return joinTerm;
}
}
private Operator operator;
private SearchParam[] params;
/**
*
* @param operator
* the operator to specify
* @param params
* must be at least one param
*/
public MultiSearchParam(Operator operator, SearchParam... params) {
this.operator = operator;
this.params = Arrays.copyOf(params, params.length);
assert params.length != 0;
}
/**
* {@inheritDoc}
*/
public String getQuery() {
StringBuilder sb = new StringBuilder();
if (params.length != 1) {
sb.append('(');
}
for (SearchParam param : params) {
if (sb.length() > 1) {
sb.append(' ').append(operator.joinTerm).append(' ');
}
sb.append(param.getQuery());
}
if (params.length != 1) {
sb.append(')');
}
return sb.toString();
}
/**
* {@inheritDoc}
*/
public Query getLuceneQuery() {
BooleanQuery ret = new BooleanQuery();
for (SearchParam param : params) {
if (param != null) {
ret.add(new BooleanClause(param.getLuceneQuery(), operator.occur));
}
}
return ret;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MultiSearchParam)) {
return false;
}
if (this == obj) {
return true;
}
MultiSearchParam so = (MultiSearchParam) obj;
return new EqualsBuilder().append(operator, so.operator).append(params, so.params).isEquals();
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return new HashCodeBuilder(43, 19).append(operator).append(params).toHashCode();
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return getQuery();
}
}