package com.alimama.mdrill.index.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alimama.mdrill.index.IndexReducer;
public class RamWriter {
public static Logger LOG = LoggerFactory.getLogger(RamWriter.class);
private RAMDirectory dir;
private IndexWriter writer;
private int numDocs = 0;
public RamWriter() throws IOException {
dir = new RAMDirectory();
writer = new IndexWriter(dir, null,
new KeepOnlyLastCommitDeletionPolicy(),
MaxFieldLength.UNLIMITED);
writer.setUseCompoundFile(false);
// writer.setMergeScheduler(new SerialMergeScheduler());
writer.setMergeFactor(10);
writer.setTermIndexInterval(128);
numDocs = 0;
}
public Directory getDirectory() {
return dir;
}
public int getNumDocs() {
return numDocs;
}
public void process(Collection<Document> docs, Analyzer analyzer)
throws IOException {
writer.addDocuments(docs, analyzer);
numDocs += docs.size();
}
public void process(RamWriter form) throws IOException {
if(form.getNumDocs()>0)
{
writer.addIndexesNoOptimize(new Directory[] { form.dir });
numDocs += form.getNumDocs();
}
}
public void closeWriter()
throws IOException {
writer.optimize();
writer.close();
writer = null;
}
public void closeDir() {
this.dir.close();
this.dir = null;
}
public long totalSizeInBytes() throws IOException {
if (dir == null) {
return 0l;
}
long size = dir.sizeInBytes();
if (writer != null) {
size += writer.ramSizeInBytes();
}
return size;
}
}