/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.search.filter;
import com.liferay.portal.kernel.search.BooleanClause;
import com.liferay.portal.kernel.search.BooleanClauseOccur;
import com.liferay.portal.kernel.search.generic.BooleanClauseImpl;
import com.liferay.portal.kernel.util.SortedArrayList;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import java.util.Comparator;
import java.util.List;
/**
* @author Michael C. Han
*/
public class BooleanFilter extends BaseFilter {
@Override
public <T> T accept(FilterVisitor<T> filterVisitor) {
return filterVisitor.visit(this);
}
public Filter add(Filter filter) {
return add(filter, BooleanClauseOccur.SHOULD);
}
public Filter add(Filter filter, BooleanClauseOccur booleanClauseOccur) {
BooleanClause<Filter> booleanClause = new BooleanClauseImpl<>(
filter, booleanClauseOccur);
if (booleanClauseOccur.equals(BooleanClauseOccur.MUST)) {
_mustBooleanClauses.add(booleanClause);
}
else if (booleanClauseOccur.equals(BooleanClauseOccur.MUST_NOT)) {
_mustNotBooleanClauses.add(booleanClause);
}
else {
_shouldBooleanClauses.add(booleanClause);
}
return filter;
}
public Filter addRangeTerm(String field, int startValue, int endValue) {
RangeTermFilter rangeTermFilter = new RangeTermFilter(
field, true, true, String.valueOf(startValue),
String.valueOf(endValue));
return add(rangeTermFilter, BooleanClauseOccur.SHOULD);
}
public Filter addRangeTerm(
String field, Integer startValue, Integer endValue) {
return addRangeTerm(field, startValue.intValue(), endValue.intValue());
}
public Filter addRangeTerm(String field, long startValue, long endValue) {
RangeTermFilter rangeTermFilter = new RangeTermFilter(
field, true, true, String.valueOf(startValue),
String.valueOf(endValue));
return add(rangeTermFilter, BooleanClauseOccur.SHOULD);
}
public Filter addRangeTerm(String field, Long startValue, Long endValue) {
return addRangeTerm(
field, startValue.longValue(), endValue.longValue());
}
public Filter addRangeTerm(String field, short startValue, short endValue) {
RangeTermFilter rangeTermFilter = new RangeTermFilter(
field, true, true, String.valueOf(startValue),
String.valueOf(endValue));
return add(rangeTermFilter, BooleanClauseOccur.SHOULD);
}
public Filter addRangeTerm(String field, Short startValue, Short endValue) {
return addRangeTerm(
field, startValue.shortValue(), endValue.shortValue());
}
public Filter addRangeTerm(
String field, String startValue, String endValue) {
RangeTermFilter rangeTermFilter = new RangeTermFilter(
field, true, true, startValue, endValue);
return add(rangeTermFilter, BooleanClauseOccur.SHOULD);
}
public Filter addRequiredTerm(String field, boolean value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, Boolean value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, double value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, Double value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, int value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, Integer value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, long value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, Long value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, short value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, Short value) {
return addRequiredTerm(field, String.valueOf(value));
}
public Filter addRequiredTerm(String field, String value) {
TermFilter termFilter = new TermFilter(field, value);
return add(termFilter, BooleanClauseOccur.MUST);
}
public Filter addTerm(String field, boolean value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, Boolean value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, double value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, Double value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, int value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, Integer value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, long value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, Long value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, short value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, Short value) {
return addTerm(field, String.valueOf(value));
}
public Filter addTerm(String field, String value) {
return addTerm(field, value, BooleanClauseOccur.SHOULD);
}
public Filter addTerm(
String field, String value, BooleanClauseOccur booleanClauseOccur) {
TermFilter termFilter = new TermFilter(field, value);
return add(termFilter, booleanClauseOccur);
}
public List<BooleanClause<Filter>> getMustBooleanClauses() {
return _mustBooleanClauses;
}
public List<BooleanClause<Filter>> getMustNotBooleanClauses() {
return _mustNotBooleanClauses;
}
public List<BooleanClause<Filter>> getShouldBooleanClauses() {
return _shouldBooleanClauses;
}
@Override
public int getSortOrder() {
return 10;
}
public boolean hasClauses() {
if (!_mustBooleanClauses.isEmpty() ||
!_mustNotBooleanClauses.isEmpty() ||
!_shouldBooleanClauses.isEmpty()) {
return true;
}
return false;
}
@Override
public String toString() {
StringBundler sb = new StringBundler(9);
sb.append("{MUST(");
sb.append(getBooleanClauseString(_mustBooleanClauses));
sb.append("), MUST_NOT(");
sb.append(getBooleanClauseString(_mustNotBooleanClauses));
sb.append("), SHOULD(");
sb.append(getBooleanClauseString(_shouldBooleanClauses));
sb.append("), ");
sb.append(super.toString());
sb.append("}");
return sb.toString();
}
protected String getBooleanClauseString(
List<BooleanClause<Filter>> booleanClauses) {
StringBundler sb = new StringBundler(2 * booleanClauses.size());
for (BooleanClause<Filter> booleanClause : _mustBooleanClauses) {
sb.append(booleanClause);
sb.append(StringPool.COMMA_AND_SPACE);
}
return sb.toString();
}
private final List<BooleanClause<Filter>> _mustBooleanClauses =
new SortedArrayList<>(new BooleanClauseComparator());
private final List<BooleanClause<Filter>> _mustNotBooleanClauses =
new SortedArrayList<>(new BooleanClauseComparator());
private final List<BooleanClause<Filter>> _shouldBooleanClauses =
new SortedArrayList<>(new BooleanClauseComparator());
private static class BooleanClauseComparator
implements Comparator<BooleanClause<Filter>> {
@Override
public int compare(
BooleanClause<Filter> booleanClause1,
BooleanClause<Filter> booleanClause2) {
Filter filter1 = booleanClause1.getClause();
Filter filter2 = booleanClause2.getClause();
if (filter1.getSortOrder() < filter2.getSortOrder()) {
return -1;
}
if (filter1.getSortOrder() > filter2.getSortOrder()) {
return 1;
}
return 0;
}
}
}