/**
* 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.search.solr.internal.filter;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.filter.BooleanFilter;
import com.liferay.portal.kernel.search.filter.DateRangeTermFilter;
import com.liferay.portal.kernel.search.filter.ExistsFilter;
import com.liferay.portal.kernel.search.filter.Filter;
import com.liferay.portal.kernel.search.filter.FilterTranslator;
import com.liferay.portal.kernel.search.filter.FilterVisitor;
import com.liferay.portal.kernel.search.filter.GeoBoundingBoxFilter;
import com.liferay.portal.kernel.search.filter.GeoDistanceFilter;
import com.liferay.portal.kernel.search.filter.GeoDistanceRangeFilter;
import com.liferay.portal.kernel.search.filter.GeoPolygonFilter;
import com.liferay.portal.kernel.search.filter.MissingFilter;
import com.liferay.portal.kernel.search.filter.PrefixFilter;
import com.liferay.portal.kernel.search.filter.QueryFilter;
import com.liferay.portal.kernel.search.filter.RangeTermFilter;
import com.liferay.portal.kernel.search.filter.TermFilter;
import com.liferay.portal.kernel.search.filter.TermsFilter;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.search.solr.filter.BooleanFilterTranslator;
import com.liferay.portal.search.solr.filter.DateRangeTermFilterTranslator;
import com.liferay.portal.search.solr.filter.ExistsFilterTranslator;
import com.liferay.portal.search.solr.filter.GeoBoundingBoxFilterTranslator;
import com.liferay.portal.search.solr.filter.GeoDistanceFilterTranslator;
import com.liferay.portal.search.solr.filter.GeoDistanceRangeFilterTranslator;
import com.liferay.portal.search.solr.filter.GeoPolygonFilterTranslator;
import com.liferay.portal.search.solr.filter.MissingFilterTranslator;
import com.liferay.portal.search.solr.filter.PrefixFilterTranslator;
import com.liferay.portal.search.solr.filter.QueryFilterTranslator;
import com.liferay.portal.search.solr.filter.RangeTermFilterTranslator;
import com.liferay.portal.search.solr.filter.TermFilterTranslator;
import com.liferay.portal.search.solr.filter.TermsFilterTranslator;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Michael C. Han
*/
@Component(
immediate = true, property = {"search.engine.impl=Solr"},
service = FilterTranslator.class
)
public class SolrFilterTranslator
implements FilterTranslator<String>,
FilterVisitor<org.apache.lucene.search.Query> {
@Override
public String translate(Filter filter, SearchContext searchContext) {
String filterString = StringPool.BLANK;
if (filter != null) {
org.apache.lucene.search.Query luceneQuery = filter.accept(this);
if (luceneQuery != null) {
filterString = luceneQuery.toString();
}
}
if (searchContext != null) {
filterString = includeCompanyId(filterString, searchContext);
}
return filterString;
}
@Override
public org.apache.lucene.search.Query visit(BooleanFilter booleanFilter) {
return _booleanQueryTranslator.translate(booleanFilter, this);
}
@Override
public org.apache.lucene.search.Query visit(
DateRangeTermFilter dateRangeTermFilter) {
return _dateRangeTermFilterTranslator.translate(dateRangeTermFilter);
}
@Override
public org.apache.lucene.search.Query visit(ExistsFilter existsFilter) {
return _existsFilterTranslator.translate(existsFilter);
}
@Override
public org.apache.lucene.search.Query visit(
GeoBoundingBoxFilter geoBoundingBoxFilter) {
return _geoBoundingBoxFilterTranslator.translate(geoBoundingBoxFilter);
}
@Override
public org.apache.lucene.search.Query visit(
GeoDistanceFilter geoDistanceFilter) {
return _geoDistanceFilterTranslator.translate(geoDistanceFilter);
}
@Override
public org.apache.lucene.search.Query visit(
GeoDistanceRangeFilter geoDistanceRangeFilter) {
return _geoDistanceRangeFilterTranslator.translate(
geoDistanceRangeFilter);
}
@Override
public org.apache.lucene.search.Query visit(
GeoPolygonFilter geoPolygonFilter) {
return _geoPolygonFilterTranslator.translate(geoPolygonFilter);
}
@Override
public org.apache.lucene.search.Query visit(MissingFilter missingFilter) {
return _missingFilterTranslator.translate(missingFilter);
}
@Override
public org.apache.lucene.search.Query visit(PrefixFilter prefixFilter) {
return _prefixFilterTranslator.translate(prefixFilter);
}
@Override
public org.apache.lucene.search.Query visit(QueryFilter queryFilter) {
return _queryFilterTranslator.translate(queryFilter);
}
@Override
public org.apache.lucene.search.Query visit(
RangeTermFilter rangeTermFilter) {
return _rangeTermFilterTranslator.translate(rangeTermFilter);
}
@Override
public org.apache.lucene.search.Query visit(TermFilter termFilter) {
return _termFilterTranslator.translate(termFilter);
}
@Override
public org.apache.lucene.search.Query visit(TermsFilter termsFilter) {
return _termsFilterTranslator.translate(termsFilter);
}
protected String includeCompanyId(
String filterString, SearchContext searchContext) {
StringBundler sb = null;
if (Validator.isNotNull(filterString)) {
sb = new StringBundler(11);
sb.append(StringPool.PLUS);
sb.append(StringPool.OPEN_PARENTHESIS);
sb.append(filterString);
sb.append(StringPool.CLOSE_PARENTHESIS);
sb.append(StringPool.SPACE);
}
else {
sb = new StringBundler(6);
}
sb.append(StringPool.PLUS);
sb.append(StringPool.OPEN_PARENTHESIS);
sb.append(Field.COMPANY_ID);
sb.append(StringPool.COLON);
sb.append(searchContext.getCompanyId());
sb.append(StringPool.CLOSE_PARENTHESIS);
return sb.toString();
}
@Reference(unbind = "-")
protected void setBooleanQueryTranslator(
BooleanFilterTranslator booleanQueryTranslator) {
_booleanQueryTranslator = booleanQueryTranslator;
}
@Reference(unbind = "-")
protected void setDateRangeTermFilterTranslator(
DateRangeTermFilterTranslator dateRangeTermFilterTranslator) {
_dateRangeTermFilterTranslator = dateRangeTermFilterTranslator;
}
@Reference(unbind = "-")
protected void setExistsFilterTranslator(
ExistsFilterTranslator existsFilterTranslator) {
_existsFilterTranslator = existsFilterTranslator;
}
@Reference(unbind = "-")
protected void setGeoBoundingBoxFilterTranslator(
GeoBoundingBoxFilterTranslator geoBoundingBoxFilterTranslator) {
_geoBoundingBoxFilterTranslator = geoBoundingBoxFilterTranslator;
}
@Reference(unbind = "-")
protected void setGeoDistanceFilterTranslator(
GeoDistanceFilterTranslator geoDistanceFilterTranslator) {
_geoDistanceFilterTranslator = geoDistanceFilterTranslator;
}
@Reference(unbind = "-")
protected void setGeoDistanceRangeFilterTranslator(
GeoDistanceRangeFilterTranslator geoDistanceRangeFilterTranslator) {
_geoDistanceRangeFilterTranslator = geoDistanceRangeFilterTranslator;
}
@Reference(unbind = "-")
protected void setGeoPolygonFilterTranslator(
GeoPolygonFilterTranslator geoPolygonFilterTranslator) {
_geoPolygonFilterTranslator = geoPolygonFilterTranslator;
}
@Reference(unbind = "-")
protected void setMissingFilterTranslator(
MissingFilterTranslator missingFilterTranslator) {
_missingFilterTranslator = missingFilterTranslator;
}
@Reference(unbind = "-")
protected void setPrefixFilterTranslator(
PrefixFilterTranslator prefixFilterTranslator) {
_prefixFilterTranslator = prefixFilterTranslator;
}
@Reference(unbind = "-")
protected void setQueryFilterTranslator(
QueryFilterTranslator queryFilterTranslator) {
_queryFilterTranslator = queryFilterTranslator;
}
@Reference(unbind = "-")
protected void setRangeTermFilterTranslator(
RangeTermFilterTranslator rangeTermFilterTranslator) {
_rangeTermFilterTranslator = rangeTermFilterTranslator;
}
@Reference(unbind = "-")
protected void setTermFilterTranslator(
TermFilterTranslator termFilterTranslator) {
_termFilterTranslator = termFilterTranslator;
}
@Reference(unbind = "-")
protected void setTermsFilterTranslator(
TermsFilterTranslator termsFilterTranslator) {
_termsFilterTranslator = termsFilterTranslator;
}
private BooleanFilterTranslator _booleanQueryTranslator;
private DateRangeTermFilterTranslator _dateRangeTermFilterTranslator;
private ExistsFilterTranslator _existsFilterTranslator;
private GeoBoundingBoxFilterTranslator _geoBoundingBoxFilterTranslator;
private GeoDistanceFilterTranslator _geoDistanceFilterTranslator;
private GeoDistanceRangeFilterTranslator _geoDistanceRangeFilterTranslator;
private GeoPolygonFilterTranslator _geoPolygonFilterTranslator;
private MissingFilterTranslator _missingFilterTranslator;
private PrefixFilterTranslator _prefixFilterTranslator;
private QueryFilterTranslator _queryFilterTranslator;
private RangeTermFilterTranslator _rangeTermFilterTranslator;
private TermFilterTranslator _termFilterTranslator;
private TermsFilterTranslator _termsFilterTranslator;
}