/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.statistics.content.filter;
import org.dspace.statistics.SolrLoggerServiceImpl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
/**
* Encapsulate a range of dates for Solr query filtering.
*
* @author Kevin Van de Velde (kevin at atmire dot com)
*/
public class StatisticsSolrDateFilter implements StatisticsFilter {
private Date startDate;
private Date endDate;
private String startStr;
private String endStr;
private String typeStr;
public StatisticsSolrDateFilter() {
}
/**
* Set the start date as a string expression.
*
* @param startStr
* statistics start date as a string
*
* Must be paired with {@link #setEndStr(String)}.
*/
public void setStartStr(String startStr) {
this.startStr = startStr;
}
/**
* Set the end date as a string expression.
*
* @param endStr
* statistics end date as a string
*
* Must be paired with {@link #setStartStr(String)}.
*/
public void setEndStr(String endStr) {
this.endStr = endStr;
}
/**
* Set the range granularity: DAY, MONTH, or YEAR.
*
* @param typeStr
* which granularity (case insensitive string: "day" / "month" / "year")
*/
public void setTypeStr(String typeStr) {
this.typeStr = typeStr;
}
/**
* Set the start date as a Date object.
*
* @param startDate
* statistics start date object
*
* Must be paired with {@link #setEndDate(Date)}.
*/
public void setStartDate(Date startDate) {
this.startDate = (startDate == null ? null : new Date(startDate.getTime()));
}
/**
* Set the end date as a Date object.
*
* @param endDate
* statistics end date object
*
* Must be paired with {@link #setStartDate(Date)}.
*/
public void setEndDate(Date endDate) {
this.endDate = (endDate == null ? null : new Date(endDate.getTime()));
}
/**
* Convert the date range to a filter expression.
* @return Solr date filter expression
*/
@Override
public String toQuery() {
if (startDate == null || endDate == null) {
// We have got strings instead of dates so calculate our dates out
// of these strings
Calendar startCal = Calendar.getInstance();
startCal.clear(Calendar.MILLISECOND);
startCal.clear(Calendar.SECOND);
startCal.clear(Calendar.MINUTE);
startCal.set(Calendar.HOUR_OF_DAY, 0);
int dateType = -1;
if (typeStr.equalsIgnoreCase("day")) {
dateType = Calendar.DATE;
} else if (typeStr.equalsIgnoreCase("month")) {
dateType = Calendar.MONTH;
startCal.set(Calendar.DATE, 1);
} else if (typeStr.equalsIgnoreCase("year")) {
startCal.clear(Calendar.MONTH);
startCal.set(Calendar.DATE, 1);
dateType = Calendar.YEAR;
} else
{
return "";
}
Calendar endCal = (Calendar) startCal.clone();
if (startDate == null)
{
if (startStr.startsWith("+"))
{
startStr = startStr.substring(startStr.indexOf('+') + 1);
}
startCal.add(dateType, Integer.parseInt(startStr));
startDate = startCal.getTime();
}
if (endDate == null)
{
if (endStr.startsWith("+"))
{
endStr = endStr.substring(endStr.indexOf('+') + 1);
}
endCal.add(dateType, Integer.parseInt(endStr));
endDate = endCal.getTime();
}
}
//Parse the dates
SimpleDateFormat formatter = new SimpleDateFormat(SolrLoggerServiceImpl.DATE_FORMAT_8601);
String startDateParsed = formatter.format(startDate);
String endDateParsed = formatter.format(endDate);
//Create our string
return "time:[" + startDateParsed + " TO " + endDateParsed + "]";
}
}