package org.infinispan.lucenedemo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;
import org.infinispan.Cache;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.remoting.transport.Address;
/**
* DemoActions does some basic operations on the Lucene index,
* to be used by DemoDriver to show base operations on Lucene.
*
* @author Sanne Grinovero
* @since 4.0
*/
public class DemoActions {
/** The MAIN_FIELD */
private static final String MAIN_FIELD = "myField";
private static final Version luceneVersion = Version.LATEST;
/** The Analyzer used in all methods **/
private static final Analyzer analyzer = new StandardAnalyzer();
private final Directory index;
private final Cache<?, ?> cache;
public DemoActions(Directory index, Cache<?, ?> cache) {
this.index = index;
this.cache = cache;
}
/**
* Runs a Query and returns the stored field for each matching document
* @throws IOException
*/
public List<String> listStoredValuesMatchingQuery(Query query) {
try {
final DirectoryReader reader = DirectoryReader.open(index);
try {
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs topDocs = searcher.search(query, null, 100);// demo limited to 100 documents!
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List<String> list = new ArrayList<String>();
for (ScoreDoc sd : scoreDocs) {
Document doc = searcher.doc(sd.doc);
list.add(doc.get(MAIN_FIELD));
}
return list;
}
finally {
reader.close();
}
} catch (IOException ioe) {
// not recommended: in the simple demo this likely means that the index was not yet
// initialized, so returning empty list.
return Collections.emptyList();
}
}
/**
* Returns a list of the values of all stored fields
* @throws IOException
*/
public List<String> listAllDocuments() {
MatchAllDocsQuery q = new MatchAllDocsQuery();
return listStoredValuesMatchingQuery(q);
}
/**
* Creates a new document having just one field containing a string
*
* @param line The text snippet to add
* @throws IOException
*/
public void addNewDocument(String line) throws IOException {
IndexWriterConfig config = makeIndexWriterConfig();
IndexWriter iw = new IndexWriter(index, config);
try {
Document doc = new Document();
TextField field = new TextField(MAIN_FIELD, line, Store.YES);
doc.add(field);
iw.addDocument(doc);
iw.commit();
} finally {
iw.close();
}
}
private IndexWriterConfig makeIndexWriterConfig() {
return new IndexWriterConfig(analyzer);
}
/**
* Parses a query using the single field as default
*
* @throws ParseException
*/
public Query parseQuery(String queryLine) throws ParseException {
QueryParser parser = new QueryParser(MAIN_FIELD, analyzer);
return parser.parse(queryLine);
}
/**
* Returns a list of Addresses of all members in the cluster
*/
public List<Address> listAllMembers() {
EmbeddedCacheManager cacheManager = cache.getCacheManager();
return cacheManager.getMembers();
}
}