/* Copyright (2012) Schibsted ASA
* This file is part of Possom.
*
* Possom 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 3 of the License, or
* (at your option) any later version.
*
* Possom 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Possom. If not, see <http://www.gnu.org/licenses/>.
*/
package no.sesat.search.query.transform;
import no.sesat.search.datamodel.junkyard.JunkYardDataObject;
import no.sesat.search.query.Clause;
import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
/**
* Adds a filter to the query
* <p/>
* <b>Note:</b> This queryTransformer ignores all earlier transforms on the query. It uses the raw querystring
* to transform the query. All transforms to the resulting query should be done after this.
*/
public final class NewsClusterQueryTransformer extends AbstractQueryTransformer {
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
private final static Logger LOG = Logger.getLogger(NewsClusterQueryTransformer.class);
private final NewsClusterQueryTransformerConfig config;
/**
* @param config
*/
public NewsClusterQueryTransformer(final QueryTransformerConfig config) {
this.config = (NewsClusterQueryTransformerConfig) config;
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
}
/**
* @param clause
*/
public void visitImpl(final Clause clause) {
final String transformedQuery = transformQuery(getContext().getQuery().getQueryString());
if (transformedQuery != null) {
for (Clause keyClause : getContext().getTransformedTerms().keySet()) {
getContext().getTransformedTerms().put(keyClause, "");
}
LOG.debug("New query is: '" + transformedQuery + "'");
if (transformedQuery.length() > 0) {
getContext().getTransformedTerms().put(getContext().getQuery().getFirstLeafClause(), transformedQuery);
}
}
}
private String transformQuery(String originalQuery) {
// No transformation, only filter
StringBuilder sb = new StringBuilder();
final boolean emptyQuery = originalQuery == null || originalQuery.trim().length() == 0;
if (!emptyQuery) {
sb.append("and(");
}
// Using Junkyard, since the parameters seems to be incomplete...
sb.append(getQueryFilter(getContext().getDataModel().getJunkYard()));
if (!emptyQuery) {
sb.append(',');
sb.append(originalQuery);
sb.append(')');
}
return sb.toString();
}
/**
* @param parameters
* @return
*/
public String getQueryFilter(final JunkYardDataObject parameters) {
StringBuilder filter = new StringBuilder();
int paramAddCount = 0;
for (String paramField : config.getParamFields()) {
String paramValue = (String) parameters.getValue(paramField);
LOG.debug("Adding param from datamodel: " + paramField + "=" + paramValue);
if (paramValue != null) {
if (paramAddCount > 0) {
filter.append(" and ");
}
filter.append(paramField).append(':');
filter.append("equals(");
filter.append('\"').append(paramValue).append("\")");
paramAddCount++;
}
}
String clusterId = (String) parameters.getValue(config.getClusterIdField());
if (clusterId != null) {
if (paramAddCount > 0) {
filter.append(" and ");
}
filter.append(config.getClusterField()).append(":").append('\"').append(clusterId).append("\" ");
} else if (config.isClusterFilter()) {
if (paramAddCount > 0) {
filter.append(" and ");
}
filter.append(config.getClusterField()).append(":range(1,max) ");
if (config.getMaxAgeInDays() > 0) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
calendar.add(Calendar.DAY_OF_WEEK, -config.getMaxAgeInDays());
filter.append("and ").append(config.getTimestampField()).append(':');
filter.append("range(").append(sdf.format(calendar.getTime())).append(",max)");
}
}
return filter.toString();
}
}