package com.krickert.ipsearch;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import junit.framework.TestCase;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexReader.FieldOption;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.spatial.tier.DistanceFieldComparatorSource;
import org.apache.lucene.spatial.tier.DistanceQueryBuilder;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import com.krickert.ipsearch.city.IpSearchCityBean;
import com.krickert.lucene.IndexWriterManager;
public class IndexIpAddressTaskTest extends TestCase {
String[] expectedFields = { "zip_code", "metro_code", "ip_start", "country_name", "city", "region_name", "ip_end", "ip_start_d",
"ip_start_c", "ip_start_b", "lat", "ip_start_a", "lon", "_localTier13", "country_code", "_localTier14", "_localTier15",
"_localTier10", "ip_end_d", "_localTier12", "_localTier5", "_localTier11", "region_code", "ip_end_a", "_localTier6", "_localTier7",
"_localTier8", "ip_end_c", "_localTier9", "ip_end_b" };
private IndexWriterManager writerManager;
private Directory directory;
private IndexWriter writer;
private IndexReader reader;
@Override
public void setUp() throws Exception {
super.setUp();
BlockingQueue<IpSearchCityBean> queue = new ArrayBlockingQueue<IpSearchCityBean>(1820);
IpDataReaderTask task = new IpDataReaderTask("src/test/resources/ipsearch_test.zip", "ip_group_city.csv", queue);
task.fire();
RAMDirectory directory = new RAMDirectory();
this.directory = directory;
WhitespaceAnalyzer analyzer = new WhitespaceAnalyzer();
int numThreads = 2;
int queueSize = 2000;// over 1800 for faster testing
int ramBufferSizeMb = 20;
int mergeFactor = 10;
this.writerManager = new IndexWriterManager(directory, analyzer, numThreads, queueSize, ramBufferSizeMb, mergeFactor);
IndexIpAddressTask indexTask = new IndexIpAddressTask(writerManager, queue, 2);
indexTask.insertIntoIndex();
indexTask.commit();
this.writer = writerManager.getWriter();
this.reader = writer.getReader();
}
public void testFieldNames() throws IOException {
int i = 0;
System.out.println(reader.getFieldNames(FieldOption.ALL));
for (String field : reader.getFieldNames(FieldOption.ALL)) {
assertEquals(expectedFields[i], field);
i++;
}
}
public void testDistanceQuery() throws CorruptIndexException, IOException {
DistanceQueryBuilder dq;
dq = new DistanceQueryBuilder(34.0285, -118.318, 10, "lat", "lon", "_localTier", true);
Query tq;
tq = new TermQuery(new Term("region_name", "California"));
DistanceFieldComparatorSource dsort;
dsort = new DistanceFieldComparatorSource(dq.getDistanceFilter());
Sort sort = new Sort(new SortField("city", dsort));
IndexSearcher searcher = new IndexSearcher(directory);
TopDocs hits = searcher.search(tq, dq.getFilter(), 10, sort);
int numResults = hits.totalHits;
assertEquals(numResults, 15);
}
}