package org.apache.solr.response;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.util.Bits;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.handler.batch.BatchProviderDumpIndex;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.search.ReturnFields;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.SolrReturnFields;
/**
* This class is here only to provide a convenient way to dump
* documents into a file. It is used from the BatchProviders
*
* As it is package protected, we cannot instantiate it from
* inside .batch package
*
* @see BatchProviderDumpIndex
*
*/
public class JSONDumper extends JSONWriter {
public JSONDumper(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) {
super(writer, req, rsp);
}
private Bits liveDocs = null;
public static JSONDumper create(SolrQueryRequest req, File jobFile, Bits bitSet) throws IOException {
SolrQueryResponse rsp = new SolrQueryResponse();
FileWriter writer = new FileWriter(jobFile);
ReturnFields returnFields = new SolrReturnFields( req );
rsp.setReturnFields( returnFields );
JSONDumper d = new JSONDumper(writer, req, rsp);
d.setBitset(bitSet);
return d;
}
public void setBitset(Bits bitSet) {
this.liveDocs = bitSet;
}
public void writeResponse() throws IOException {
Boolean omitHeader = req.getParams().getBool(CommonParams.OMIT_HEADER);
if(omitHeader != null && omitHeader) rsp.getValues().remove("responseHeader");
SolrIndexSearcher searcher = req.getSearcher();
if (liveDocs == null) {
liveDocs = searcher.getSlowAtomicReader().getLiveDocs();
}
int maxDoc = searcher.maxDoc();
try {
//responseWriter.write(sw,req,rsp);
ReturnFields fields = rsp.getReturnFields(); // return everything
Set<String> fnames = fields.getLuceneFieldNames();
int docCounter = 0;
for (int i=0; i<maxDoc; i++) {
if (liveDocs!=null && !liveDocs.get(i)) {
continue;
}
Document doc = searcher.doc(i);
SolrDocument sdoc = toSolrDocument( doc , schema);
writeSolrDocument( null, sdoc, fields, docCounter++ );
getWriter().write("\n");
}
}
finally {
close();
writer.write('\n'); // ending with a newline looks much better from the command line
writer.close();
}
}
public static final SolrDocument toSolrDocument( Document doc, final IndexSchema schema ) {
SolrDocument out = new SolrDocument();
for( IndexableField f : doc.getFields()) {
// Make sure multivalued fields are represented as lists
Object existing = out.get(f.name());
if (existing == null) {
SchemaField sf = schema.getFieldOrNull(f.name());
if (sf != null && sf.multiValued()) {
List<Object> vals = new ArrayList<>();
vals.add( f );
out.setField( f.name(), vals );
}
else{
out.setField( f.name(), f );
}
}
else {
out.addField( f.name(), f );
}
}
return out;
}
}