package eu.europeana.cloud.service.dls.solr;
import eu.europeana.cloud.common.model.CompoundDataSetId;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.*;
import eu.europeana.cloud.common.model.Revision;
import org.apache.solr.client.solrj.SolrServerException;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import eu.europeana.cloud.common.model.File;
import eu.europeana.cloud.common.model.Representation;
import eu.europeana.cloud.service.dls.RepresentationSearchParams;
import eu.europeana.cloud.service.dls.TestUtil;
import eu.europeana.cloud.service.dls.solr.exception.SolrDocumentNotFoundException;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = { "classpath:/solrTestContext.xml" })
public class SolrDAOSearchTest {
@Autowired
private SolrDAO solrDAO;
@Autowired
private SolrConnectionProvider connectionProvider;
@After
public void deleteData()
throws IOException, SolrServerException {
connectionProvider.getSolrServer().deleteByQuery("*:*");
connectionProvider.getSolrServer().commit();
}
@Test
public void searchBySchema()
throws IOException, SolrServerException {
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp", true, new Date());
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp", true, new Date());
Representation r3 = insertRepresentation("c1", "jpg", "v3", "dp", true, new Date());
Representation r4 = insertRepresentation("c1", "jpg", "v4", "dp", true, new Date());
List<Representation> foundRepresentations = solrDAO.search(RepresentationSearchParams.builder().setSchema("dc")
.build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r1, r2), foundRepresentations);
}
@Test
public void searchByDataSet()
throws IOException, SolrServerException, SolrDocumentNotFoundException {
// insert some representations
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp", true, new Date());
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp", true, new Date());
Representation r3 = insertRepresentation("c1", "jpg", "v3", "dp", true, new Date());
Representation r4 = insertRepresentation("c1", "jpg", "v4", "dp", true, new Date());
// assign them to different sets
solrDAO.addAssignment("v1", new CompoundDataSetId("dataSetProvider", "DS1"));
solrDAO.addAssignment("v2", new CompoundDataSetId("dataSetProvider", "DS2"));
solrDAO.addAssignment("v3", new CompoundDataSetId("anotherDataSetProvider", "DS1"));
solrDAO.addAssignment("v4", new CompoundDataSetId("anotherDataSet", "ProviderDS1"));
// search by data set provider and data set id
TestUtil.assertSameContent(
Arrays.asList(r1),
solrDAO.search(
RepresentationSearchParams.builder().setDataSetProviderId("dataSetProvider").setDataSetId("DS1")
.build(), 0, 10));
// search by data set provider
TestUtil.assertSameContent(Arrays.asList(r1, r2),
solrDAO.search(RepresentationSearchParams.builder().setDataSetProviderId("dataSetProvider").build(), 0, 10));
// search by data set id
TestUtil.assertSameContent(Arrays.asList(r1, r3),
solrDAO.search(RepresentationSearchParams.builder().setDataSetId("DS1").build(), 0, 10));
}
@Test
public void searchByProvider()
throws IOException, SolrServerException {
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp1", true, new Date());
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp", true, new Date());
Representation r3 = insertRepresentation("c1", "jpg", "v3", "dp", true, new Date());
Representation r4 = insertRepresentation("c1", "jpg", "v4", "dp1", true, new Date());
List<Representation> foundRepresentations = solrDAO.search(RepresentationSearchParams.builder()
.setDataProvider("dp1").build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r1, r4), foundRepresentations);
}
@Test
public void searchBySchemaAndProvider()
throws Exception {
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp1", true, new Date());
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp", true, new Date());
Representation r3 = insertRepresentation("c1", "jpg", "v3", "dp", true, new Date());
Representation r4 = insertRepresentation("c1", "jpg", "v4", "dp1", true, new Date());
List<Representation> foundRepresentations = solrDAO.search(RepresentationSearchParams.builder()
.setDataProvider("dp1").setSchema("dc").build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r1), foundRepresentations);
}
@Test
public void searchByPersistent()
throws Exception {
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp1", true, new Date());
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp", false, new Date());
List<Representation> onlyPersistent = solrDAO.search(RepresentationSearchParams.builder().setSchema("dc")
.setPersistent(Boolean.TRUE).build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r1), onlyPersistent);
List<Representation> onlyNotPersistent = solrDAO.search(RepresentationSearchParams.builder().setSchema("dc")
.setPersistent(Boolean.FALSE).build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r2), onlyNotPersistent);
List<Representation> regardlessPersistence = solrDAO.search(RepresentationSearchParams.builder()
.setSchema("dc").build(), 0, 10);
TestUtil.assertSameContent(Arrays.asList(r1, r2), regardlessPersistence);
}
@Test
public void searchByDate()
throws IOException, SolrServerException {
Calendar c = GregorianCalendar.getInstance();
c.set(2000, 05, 15, 15, 15);
Representation r1 = insertRepresentation("c1", "dc", "v1", "dp1", true, c.getTime());
c.set(2000, 05, 15, 15, 17);
Representation r2 = insertRepresentation("c1", "dc", "v2", "dp1", true, c.getTime());
c.set(2001, 05, 15, 15, 0);
Representation r3 = insertRepresentation("c1", "dc", "v3", "dp1", true, c.getTime());
c.set(2002, 05, 15, 15, 15);
Representation r4 = insertRepresentation("c1", "dc", "v4", "dp1", true, c.getTime());
List<Representation> foundRepresentations = solrDAO.search(
RepresentationSearchParams.builder().setFromDate(r2.getCreationDate()).setToDate(r3.getCreationDate())
.build(), 0, 10);
TestUtil.assertSameContent(foundRepresentations, Arrays.asList(r2, r3));
}
@Test
public void shouldIterateThroughAllRepresentations()
throws Exception {
int count = 50;
Set<Representation> generatedRepresentations = new HashSet<>(count, 1f);
for (int i = 0; i < count; i++) {
generatedRepresentations.add(insertRepresentation("id", "dc", UUID.randomUUID().toString(), "dp", true,
new Date()));
}
RepresentationSearchParams searchParams = RepresentationSearchParams.builder().setSchema("dc").build();
Set<Representation> foundRepresentations = new HashSet<>(count, 1f);
boolean hasNext = true;
int offset = 0;
int pageLimit = 8;
while (hasNext) {
List<Representation> searchResults = solrDAO.search(searchParams, offset, pageLimit);
foundRepresentations.addAll(searchResults);
hasNext = !searchResults.isEmpty();
offset += pageLimit;
}
assertThat(foundRepresentations.size(), is(count));
assertThat(foundRepresentations, is(generatedRepresentations));
}
private Representation insertRepresentation(String cloudId, String schema, String version, String dataProvider,
boolean persistent, Date date)
throws IOException, SolrServerException {
Representation rep = new Representation(cloudId, schema, version, null, null, dataProvider,
new ArrayList<File>(), new ArrayList<Revision>(), persistent, date);
solrDAO.insertRepresentation(rep, null);
return rep;
}
}