package net.yacy.cora.federate.solr.connector;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import net.yacy.cora.federate.solr.instance.EmbeddedInstance;
import net.yacy.search.schema.CollectionSchema;
import net.yacy.search.schema.WebgraphSchema;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.junit.AfterClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
public class EmbeddedSolrConnectorTest {
static EmbeddedSolrConnector solr;
static EmbeddedInstance localCollectionInstance;
public EmbeddedSolrConnectorTest() {
}
/**
* init for all test cases (via BeforeClass annotation),
* for the expensive creating or loading of index
*/
@BeforeClass
public static void initTesting() {
File solr_config = new File("defaults/solr");
File storage = new File("test/DATA/INDEX/webportal/SEGMENTS/text/solr/");
storage.mkdirs();
System.out.println("setup EmeddedSolrConnector using config dir: " + solr_config.getAbsolutePath());
try {
localCollectionInstance = new EmbeddedInstance(solr_config, storage, CollectionSchema.CORE_NAME, new String[]{CollectionSchema.CORE_NAME, WebgraphSchema.CORE_NAME});
solr = new EmbeddedSolrConnector(localCollectionInstance);
solr.clear(); // delete all documents in index (for clean testing)
} catch (final IOException ex) {
fail("IOException starting Jetty");
}
}
@AfterClass
public static void finalizeTesting() {
localCollectionInstance.close();
}
/**
* Test of query solr via jetty
*/
@Test
public void testQuery() throws IOException {
System.out.println("adding test document to solr");
SolrInputDocument doc = new SolrInputDocument();
String id = Long.toString(System.currentTimeMillis());
doc.addField(CollectionSchema.id.name(), id);
doc.addField(CollectionSchema.title.name(), "Lorem ipsum");
doc.addField(CollectionSchema.host_s.name(), "yacy.net");
// mixing in the id as unique word
doc.addField(CollectionSchema.text_t.name(), "Lorem ipsum dolor sit amet, consectetur adipisicing elit, x"+id+ " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
solr.add(doc);
solr.commit(true);
System.out.println("query solr");
long expResult = 1;
long result = solr.getCountByQuery(CollectionSchema.text_t.name() + ":x" + id);
System.out.println("found = " + result + " (expected = 1 )");
assertEquals(expResult, result);
}
/**
* Test of update (partial update)
*/
@Test
public void testUdate() throws IOException {
SolrInputDocument doc = new SolrInputDocument();
String id = Long.toString(System.currentTimeMillis());
System.out.println("testUpdate: adding test document to solr ID=" + id);
doc.addField(CollectionSchema.id.name(), id);
doc.addField(CollectionSchema.title.name(), "Lorem ipsum");
doc.addField(CollectionSchema.host_s.name(), "yacy.net");
doc.addField(CollectionSchema.text_t.name(), "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
solr.add(doc);
solr.commit(true);
System.out.println("testUpdate: update one document ID=" + id);
HashSet<String> fieldnames = new HashSet<String>();
fieldnames.addAll(doc.getFieldNames());
SolrInputDocument sid = new SolrInputDocument();
sid.addField(CollectionSchema.id.name(), doc.getFieldValue(CollectionSchema.id.name()));
sid.addField(CollectionSchema.host_s.name(), "yacy.yacyh");
solr.update(sid);
solr.commit(true);
long expResult = 1;
SolrDocumentList sl = solr.getDocumentListByQuery(CollectionSchema.host_s.name()+":yacy.yacyh",null,0,10);
assertTrue(sl.size() >= expResult);
System.out.println("testUpdate: verify update of document ID=" + id);
String foundid = null;
for (SolrDocument rdoc : sl) {
foundid = (String) rdoc.getFieldValue("id");
if (id.equals(foundid)) {
HashSet<String> newfieldnames = new HashSet<String>();
newfieldnames.addAll(rdoc.getFieldNames());
assertTrue(newfieldnames.containsAll(fieldnames));
break;
}
}
assertEquals(id, foundid);
}
/**
* Test for partial update for document containing a multivalued date field
* this is a Solr issue (2015-09-12)
* the test case is just to demonstrate the effect on YaCy (currently catching the solr exception and reinserting a document with fields missing)
*
* Solr 5.4.0 bugfix @see http://issues.apache.org/jira/browse/SOLR-8050 Partial update on document with multivalued date field fails
*/
@Test
public void testUdate_withMultivaluedDateField() throws SolrException, IOException {
SolrInputDocument doc = new SolrInputDocument();
String id = Long.toString(System.currentTimeMillis());
System.out.println("testUpdate: adding test document to solr ID=" + id);
doc.addField(CollectionSchema.id.name(), id);
doc.addField(CollectionSchema.title.name(), "Lorem ipsum");
doc.addField(CollectionSchema.host_s.name(), "yacy.net");
doc.addField(CollectionSchema.text_t.name(), "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
doc.addField(CollectionSchema.dates_in_content_dts.name(), new Date());
solr.add(doc);
solr.commit(true);
System.out.println("testUpdate: update one document ID=" + id);
HashSet<String> fieldnames = new HashSet<String>();
fieldnames.addAll(doc.getFieldNames());
SolrInputDocument sid = new SolrInputDocument();
sid.addField(CollectionSchema.id.name(), id);
sid.addField(CollectionSchema.host_s.name(), "yacy.yacy");
solr.update(sid);
solr.commit(true);
long expResult = 1;
SolrDocumentList sl = solr.getDocumentListByQuery(CollectionSchema.host_s.name()+":yacy.yacy",null,0,10);
assertTrue(sl.size() >= expResult);
System.out.println("testUpdate: verify update of document ID=" + id);
String foundid = null;
for (SolrDocument rdoc : sl) {
foundid = (String) rdoc.getFieldValue("id");
if (id.equals(foundid)) {
HashSet<String> newfieldnames = new HashSet<String>();
newfieldnames.addAll(rdoc.getFieldNames());
if (!newfieldnames.containsAll(fieldnames)) {
System.err.println("!!!++++++++++++++++++++++++++++++++++++!!!");
System.err.println("fields in original document: "+fieldnames.toString());
System.err.println("fields after partial update: "+newfieldnames.toString());
System.err.println("!!!++++++++++++++++++++++++++++++++++++!!!");
}
assertTrue (newfieldnames.containsAll(fieldnames));
break;
}
}
assertEquals(id, foundid);
}
/**
* Test of close and reopen embedded Solr
* test for issue http://mantis.tokeek.de/view.php?id=686
* and debug option for EmbeddedSolrConnector.close() (cause this.core.close())
*/
@Test
public void testClose() throws Throwable {
System.out.println("-close "+solr.toString());
// we must close the instance to free all resources instead of only closing the connector
// solr.close();
localCollectionInstance.close();
System.out.println("+reopen "+solr.toString());
initTesting();
assertTrue(!solr.isClosed());
}
}