package org.solrmarc.index;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;
import org.marc4j.MarcReader;
import org.marc4j.marc.Record;
import org.marc4j.marc.impl.RecordImpl;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.solrmarc.driver.Indexer;
import org.solrmarc.index.collector.MultiValueCollector;
import org.solrmarc.index.extractor.impl.constant.ConstantMultiValueExtractor;
import org.solrmarc.index.extractor.impl.patternMapping.PatternMapping;
import org.solrmarc.index.indexer.AbstractValueIndexer;
import org.solrmarc.index.indexer.MultiValueIndexer;
import org.solrmarc.index.indexer.ValueIndexerFactory;
import org.solrmarc.index.mapping.AbstractMultiValueMapping;
import org.solrmarc.index.mapping.impl.MultiValuePatternMapping;
import org.solrmarc.index.mapping.impl.MultiValueTranslationMapping;
import org.solrmarc.solr.SolrProxy;
import java.io.IOException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
public class IndexerTests
{
private Record testRecord;
private Properties translationMappingProperties = new Properties();
private final AbstractMultiValueMapping[] translationMapping = new AbstractMultiValueMapping[]{
new MultiValueTranslationMapping(translationMappingProperties)
};
private final AbstractMultiValueMapping[] patternMapping = new AbstractMultiValueMapping[]{
new MultiValuePatternMapping(Collections.singletonList(new PatternMapping("[A-Z]", "X", 0)), true, false, false)
};
private final AbstractMultiValueMapping[] translationAndPatternMapping = new AbstractMultiValueMapping[]{
new MultiValueTranslationMapping(translationMappingProperties),
new MultiValuePatternMapping(Collections.singletonList(new PatternMapping("(FOO)", "Foo $1", 0)))
};
private final MultiValueCollector singleCollector = new MultiValueCollector();
private final ConstantMultiValueExtractor constantExtractor = new ConstantMultiValueExtractor("Foo Bar");
private static ValueIndexerFactory factory;
static
{
factory = ValueIndexerFactory.initialize(new String[]{System.getProperty("test.data.dir", "test/data")});
}
@Before
public void setup()
{
testRecord = new RecordImpl();
testRecord.setId(1L);
translationMappingProperties.clear();
translationMappingProperties.put("Foo Bar", "BAR FOO");
}
@Test
public void testNoMappings() throws Exception
{
final MultiValueIndexer valueIndexer = factory.createValueIndexer("testField", "\"Foo Bar\"");
final SolrProxy proxy = Mockito.mock(SolrProxy.class);
final Indexer indexer = new Indexer(Collections.<AbstractValueIndexer<?>>singletonList(valueIndexer), proxy);
indexer.indexToSolr(new TestReader(Collections.singletonList(testRecord)));
List<SolrInputDocument> documents = extractDocuments(proxy);
assertEquals(1, documents.size());
SolrInputDocument document = documents.get(0);
assertEquals("Foo Bar", document.getField("testField").getValue().toString());
}
@Test
public void testWithTranslationMap() throws Exception
{
final MultiValueIndexer valueIndexer = new MultiValueIndexer("testField", constantExtractor, translationMapping, singleCollector);
final SolrProxy proxy = Mockito.mock(SolrProxy.class);
final Indexer indexer = new Indexer(Collections.<AbstractValueIndexer<?>>singletonList(valueIndexer), proxy);
indexer.indexToSolr(new TestReader(Collections.singletonList(testRecord)));
List<SolrInputDocument> documents = extractDocuments(proxy);
assertEquals(1, documents.size());
SolrInputDocument document = documents.get(0);
assertEquals("BAR FOO", document.getField("testField").getValue().toString());
}
@Test
public void testWithPatternMap() throws Exception
{
final MultiValueIndexer valueIndexer = new MultiValueIndexer("testField", constantExtractor, patternMapping, singleCollector);
final SolrProxy proxy = Mockito.mock(SolrProxy.class);
final Indexer indexer = new Indexer(Collections.<AbstractValueIndexer<?>>singletonList(valueIndexer), proxy);
indexer.indexToSolr(new TestReader(Collections.singletonList(testRecord)));
List<SolrInputDocument> documents = extractDocuments(proxy);
assertEquals(1, documents.size());
SolrInputDocument document = documents.get(0);
assertEquals("Xoo Xar", document.getField("testField").getValue().toString());
}
@Test
public void testWithTranslationAndPatternMap() throws Exception
{
final MultiValueIndexer valueIndexer = new MultiValueIndexer("testField", constantExtractor, translationAndPatternMapping, singleCollector);
final SolrProxy proxy = Mockito.mock(SolrProxy.class);
final Indexer indexer = new Indexer(Collections.<AbstractValueIndexer<?>>singletonList(valueIndexer), proxy);
indexer.indexToSolr(new TestReader(Collections.singletonList(testRecord)));
List<SolrInputDocument> documents = extractDocuments(proxy);
assertEquals(1, documents.size());
SolrInputDocument document = documents.get(0);
assertEquals("Foo FOO", document.getField("testField").getValue().toString());
}
@Test
public void testNoValueIndexer() throws Exception
{
final SolrProxy proxy = Mockito.mock(SolrProxy.class);
final Indexer indexer = new Indexer(new ArrayList<AbstractValueIndexer<?>>(), proxy);
indexer.indexToSolr(new TestReader(Collections.singletonList(testRecord)));
List<SolrInputDocument> documents = extractDocuments(proxy);
assertEquals(1, documents.size());
assertTrue(documents.get(0).isEmpty());
}
private List<SolrInputDocument> extractDocuments(final SolrProxy proxy) throws IOException
{
final ArgumentCaptor<SolrInputDocument> mapArgumentCaptor = ArgumentCaptor.forClass(SolrInputDocument.class);
verify(proxy).addDoc(mapArgumentCaptor.capture());
return mapArgumentCaptor.getAllValues();
}
class TestReader implements MarcReader
{
final Iterator<Record> iterator;
TestReader(final Iterator<Record> iterator)
{
this.iterator = iterator;
}
TestReader(final List<Record> list)
{
this(list.iterator());
}
@Override
public boolean hasNext()
{
return iterator.hasNext();
}
@Override
public Record next()
{
return iterator.next();
}
}
}