package edu.stanford.nlp.sempre.tables.alter;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.util.*;
import edu.stanford.nlp.sempre.tables.StringNormalizationUtils;
import edu.stanford.nlp.sempre.tables.TableKnowledgeGraph;
import edu.stanford.nlp.sempre.tables.serialize.TableWriter;
import fig.basic.IOUtils;
import fig.basic.LogInfo;
import fig.basic.Option;
public class TableAltererCache {
public static class Options {
@Option(gloss = "central path for saving altered tables")
public String baseAlteredTablesDir = null;
@Option(gloss = "path for altered table concat file (to reduce file server load)")
public String alteredTablesConcatCache = null;
}
public static Options opts = new Options();
private BufferedReader concatCache = null;
public TableAltererCache() {
if (opts.alteredTablesConcatCache != null) {
if (opts.baseAlteredTablesDir != null)
throw new RuntimeException("Cannot specify both baseAlteredTablesDir and alteredTablesConcatCache");
concatCache = IOUtils.openInHard(opts.alteredTablesConcatCache);
}
}
public boolean existsSaveDir(String id) {
return opts.alteredTablesConcatCache != null
|| (opts.baseAlteredTablesDir != null && new File(opts.baseAlteredTablesDir, id).isDirectory());
}
public TableKnowledgeGraph load(String id, int alteredTableIndex) {
return load(id, "" + alteredTableIndex);
}
// Load table from |baseAlteredTablesDir|/nt-??/??.tsv
// or the next chunk of |alteredTablesConcatCache|
public TableKnowledgeGraph load(String id, String alteredTableIndex) {
if (opts.baseAlteredTablesDir == null) {
if (concatCache == null) return null;
try {
String line = concatCache.readLine();
String[] metadata = line.split("\t");
if (metadata.length != 3 || !id.equals(metadata[0]) || !alteredTableIndex.equals(metadata[1]))
throw new RuntimeException("Incorrect metadata. Expected " + id + " " + alteredTableIndex + " ___; found " + line);
int numLines = Integer.parseInt(metadata[2]);
if (BatchTableAlterer.opts.verbose >= 1)
LogInfo.logs("Reading %d lines from %s", numLines, opts.alteredTablesConcatCache);
List<String[]> data = new ArrayList<>();
for (int i = 0; i < numLines; i++) {
line = concatCache.readLine();
String[] fields = line.split("\t", -1); // Include trailing spaces
for (int j = 0; j < fields.length; j++)
fields[j] = StringNormalizationUtils.unescapeTSV(fields[j]);
data.add(fields);
}
return new TableKnowledgeGraph(id + "/" + alteredTableIndex + ".tsv", data);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Error reading " + opts.alteredTablesConcatCache);
}
} else {
File tablePath = new File(new File(opts.baseAlteredTablesDir, id), alteredTableIndex + ".tsv");
if (!tablePath.exists()) return null;
if (BatchTableAlterer.opts.verbose >= 1)
LogInfo.logs("Reading from %s", tablePath.getPath());
try {
return TableKnowledgeGraph.fromRootedFilename(tablePath.getPath());
} catch (Exception e) {
LogInfo.warnings("Error reading %s: %s", tablePath.getPath(), e);
return null;
}
}
}
public void dump(TableKnowledgeGraph graph, String id, int alteredTableIndex) {
dump(graph, id, "" + alteredTableIndex);
}
// Dump table to |baseAlteredTablesDir|/nt-??/??.tsv
public void dump(TableKnowledgeGraph graph, String id, String alteredTableIndex) {
if (opts.baseAlteredTablesDir == null)
throw new RuntimeException("cannot dump if baseAlteredTablesDir = null");
File outDir = new File(opts.baseAlteredTablesDir, id);
outDir.mkdirs();
new TableWriter(graph).writeTSV(new File(outDir, alteredTableIndex + ".tsv").getPath());
}
// Dump tables to |baseAlteredTablesDir|/nt-??/??.tsv
public void dump(List<TableKnowledgeGraph> graphs, String id) {
for (int i = 0; i < graphs.size(); i++) {
dump(graphs.get(i), id, i);
}
}
}