package pl.edu.icm.saos.search.analysis.solr;
import java.io.IOException;
import java.util.List;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
import org.joda.time.LocalDate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import pl.edu.icm.saos.common.chart.Point;
import pl.edu.icm.saos.common.chart.Series;
import pl.edu.icm.saos.common.chart.value.DayPeriod;
import pl.edu.icm.saos.common.chart.value.MonthPeriod;
import pl.edu.icm.saos.common.chart.value.SimpleLocalDate;
import pl.edu.icm.saos.common.chart.value.YearPeriod;
import pl.edu.icm.saos.common.testcommon.category.SlowTest;
import pl.edu.icm.saos.search.SearchTestConfiguration;
import pl.edu.icm.saos.search.analysis.request.JudgmentSeriesCriteria;
import pl.edu.icm.saos.search.analysis.request.Period;
import pl.edu.icm.saos.search.analysis.request.Period.PeriodUnit;
import pl.edu.icm.saos.search.analysis.request.XDateRange;
import pl.edu.icm.saos.search.analysis.request.XField;
import pl.edu.icm.saos.search.analysis.request.XSettings;
import com.google.common.collect.Lists;
/**
* @author madryk
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ SearchTestConfiguration.class })
@Category(SlowTest.class)
public class SeriesGeneratorJudgmentDateIntTest {
@Autowired
private SeriesGenerator seriesGenerator;
@Autowired
@Qualifier("solrJudgmentsServer")
private SolrServer judgmentsServer;
@Before
public void setUp() throws Exception {
judgmentsServer.deleteByQuery("*:*");
judgmentsServer.commit();
indexJudgments();
}
//------------------------ TESTS --------------------------
@Test
public void generateSeries_YEARS() {
// given
JudgmentSeriesCriteria jsc = new JudgmentSeriesCriteria();
jsc.setPhrase("content");
XSettings xSettings = createDateXSettings(
XField.JUDGMENT_DATE,
new LocalDate(2000, 1, 1),
new LocalDate(2004, 5, 31),
new Period(2, PeriodUnit.YEAR));
// execute
Series<Object, Integer> series = seriesGenerator.generateSeries(jsc, xSettings);
// assert
List<Point<Object, Integer>> expectedPoints = Lists.newArrayList();
expectedPoints.add(new Point<Object, Integer>(new YearPeriod(2000, 2001), 12));
expectedPoints.add(new Point<Object, Integer>(new YearPeriod(2002, 2003), 1));
expectedPoints.add(new Point<Object, Integer>(new YearPeriod(2004, 2005), 0));
Assert.assertEquals(expectedPoints, series.getPoints());
}
@Test
public void generateSeries_MONTHS() {
// given
JudgmentSeriesCriteria jsc = new JudgmentSeriesCriteria();
jsc.setPhrase("content");
XSettings xSettings = createDateXSettings(
XField.JUDGMENT_DATE,
new LocalDate(2000, 3, 1),
new LocalDate(2000, 6, 1),
new Period(1, PeriodUnit.MONTH));
// execute
Series<Object, Integer> series = seriesGenerator.generateSeries(jsc, xSettings);
// assert
List<Point<Object, Integer>> expectedPoints = Lists.newArrayList();
expectedPoints.add(new Point<Object, Integer>(new MonthPeriod(2000, 3, 2000, 3), 2));
expectedPoints.add(new Point<Object, Integer>(new MonthPeriod(2000, 4, 2000, 4), 0));
expectedPoints.add(new Point<Object, Integer>(new MonthPeriod(2000, 5, 2000, 5), 4));
expectedPoints.add(new Point<Object, Integer>(new MonthPeriod(2000, 6, 2000, 6), 3));
Assert.assertEquals(expectedPoints, series.getPoints());
}
@Test
public void generateSeries_WEEKS() {
// given
JudgmentSeriesCriteria jsc = new JudgmentSeriesCriteria();
jsc.setPhrase("content");
XSettings xSettings = createDateXSettings(
XField.JUDGMENT_DATE,
new LocalDate(2000, 5, 1),
new LocalDate(2000, 5, 31),
new Period(14, PeriodUnit.DAY));
// execute
Series<Object, Integer> series = seriesGenerator.generateSeries(jsc, xSettings);
// assert
List<Point<Object, Integer>> expectedPoints = Lists.newArrayList();
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 1), new SimpleLocalDate(2000, 5, 14)), 1));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 15), new SimpleLocalDate(2000, 5, 28)), 3));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 29), new SimpleLocalDate(2000, 6, 11)), 2));
Assert.assertEquals(expectedPoints, series.getPoints());
}
@Test
public void generateSeries_DAYS() {
// given
JudgmentSeriesCriteria jsc = new JudgmentSeriesCriteria();
jsc.setPhrase("content");
XSettings xSettings = createDateXSettings(
XField.JUDGMENT_DATE,
new LocalDate(2000, 5, 20),
new LocalDate(2000, 5, 26),
new Period(1, PeriodUnit.DAY));
// execute
Series<Object, Integer> series = seriesGenerator.generateSeries(jsc, xSettings);
// assert
List<Point<Object, Integer>> expectedPoints = Lists.newArrayList();
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 20), new SimpleLocalDate(2000, 5, 20)), 0));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 21), new SimpleLocalDate(2000, 5, 21)), 2));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 22), new SimpleLocalDate(2000, 5, 22)), 0));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 23), new SimpleLocalDate(2000, 5, 23)), 0));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 24), new SimpleLocalDate(2000, 5, 24)), 0));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 25), new SimpleLocalDate(2000, 5, 25)), 1));
expectedPoints.add(new Point<Object, Integer>(new DayPeriod(new SimpleLocalDate(2000, 5, 26), new SimpleLocalDate(2000, 5, 26)), 0));
Assert.assertEquals(expectedPoints, series.getPoints());
}
//------------------------ PRIVATE --------------------------
private XSettings createDateXSettings(XField xField, LocalDate startDate, LocalDate endDate, Period gap) {
XSettings xSettings = new XSettings();
xSettings.setField(XField.JUDGMENT_DATE);
XDateRange xDateRange = new XDateRange(startDate, endDate, gap);
xSettings.setRange(xDateRange);
return xSettings;
}
private void indexJudgments() throws SolrServerException, IOException {
judgmentsServer.add(fetchDocument(1L, "2000-01-01T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(2L, "2000-03-11T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(3L, "2000-03-25T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(31L, "2000-03-25T00:00:00Z", "other"));
judgmentsServer.add(fetchDocument(4L, "2000-05-01T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(5L, "2000-05-21T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(51L, "2000-05-21T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(6L, "2000-05-25T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(7L, "2000-06-02T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(71L, "2000-06-02T00:00:00Z", "other"));
judgmentsServer.add(fetchDocument(8L, "2000-06-03T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(9L, "2000-06-12T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(91L, "2001-06-12T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(92L, "2001-06-12T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(93L, "2002-06-12T00:00:00Z", "content"));
judgmentsServer.add(fetchDocument(10L, "2010-02-04T00:00:00Z", "content"));
judgmentsServer.commit();
}
private SolrInputDocument fetchDocument(long id, String judgmentDateString, String content) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("databaseId", id);
doc.addField("judgmentDate", judgmentDateString);
doc.addField("content", content);
return doc;
}
}