package org.neo4j.shell.tools.imp;
import org.neo4j.cypher.export.CypherResultSubGraph;
import org.neo4j.cypher.export.DatabaseSubGraph;
import org.neo4j.cypher.export.SubGraph;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.shell.*;
import org.neo4j.shell.kernel.GraphDatabaseShellServer;
import org.neo4j.shell.tools.imp.format.kryo.KryoWriter;
import org.neo4j.shell.tools.imp.util.Config;
import org.neo4j.shell.tools.imp.util.FileUtils;
import org.neo4j.shell.tools.imp.util.ProgressReporter;
import java.io.*;
import java.util.zip.DeflaterOutputStream;
/**
* Created by efulton on 5/5/16.
*/
public class ExportBinaryApp extends BinaryApp {
{
addOptionDefinition( "o", new OptionDefinition( OptionValueType.MUST, "Output Binary file" ) );
addOptionDefinition( "f", new OptionDefinition( OptionValueType.MAY, "Binary format (kryo is the default/only option right now)" ) );
}
@Override
public String getName() {
return "export-binary";
}
@Override
public GraphDatabaseShellServer getServer() {
return (GraphDatabaseShellServer) super.getServer();
}
@Override
public Continuation execute(AppCommandParser parser, Session session, Output out) throws Exception {
Config config = Config.fromOptions(parser);
String fileName = parser.option("o", null);
String format = parser.option("f", "kryo");
ProgressReporter reporter = new ProgressReporter(null, out);
GraphDatabaseService db = getServer().getDb();
SubGraph graph = new DatabaseSubGraph(db);
if (fileName == null) {
throw new RuntimeException("Output file option is required");
}
switch (format) {
case KRYO:
writeOutputType(KRYO, fileName);
writeKryo(fileName, db, graph, reporter, config);
break;
case CBOR:
throw new RuntimeException(String.format("%s is not supported yet", CBOR));
case PACKSTREAM:
throw new RuntimeException(String.format("%s is not supported yet", PACKSTREAM));
}
reporter.progress("Wrote to binary file " + fileName);
return Continuation.INPUT_COMPLETE;
}
private void writeOutputType(String type, String fileName) throws IOException {
try (FileWriter fileWriter = new FileWriter(fileName)) {
fileWriter.write(type);
fileWriter.flush();
fileWriter.close();
}
}
private void writeKryo(String fileName, GraphDatabaseService db, SubGraph graph, ProgressReporter reporter, Config config) throws Exception {
OutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new FileOutputStream(fileName, true), false), FileUtils.MEGABYTE);
com.esotericsoftware.kryo.io.Output output = new com.esotericsoftware.kryo.io.Output(outputStream, FileUtils.MEGABYTE);
try (Transaction tx = db.beginTx()) {
KryoWriter kryoWriter = new KryoWriter();
kryoWriter.write(graph, output, reporter, config);
tx.success();
} finally {
output.close();
}
}
private SubGraph cypherResultSubGraph(String query, boolean relsBetween) {
GraphDatabaseAPI db = getServer().getDb();
try (Transaction tx = db.beginTx()) {
Result result = db.execute(query);
SubGraph subGraph = CypherResultSubGraph.from(result, db, relsBetween);
tx.success();
return subGraph;
}
}
}