use of au.gov.asd.tac.constellation.utilities.gui.HandleIoProgress in project constellation by constellation-app.
the class GetRecordStore method callService.
@Override
public void callService(final PluginParameters parameters, final InputStream in, final OutputStream out) throws IOException {
final String graphId = parameters.getStringValue(GRAPH_ID_PARAMETER_ID);
final boolean selected = parameters.getBooleanValue(SELECTED_PARAMETER_ID);
final boolean vx = parameters.getBooleanValue(VX_PARAMETER_ID);
final boolean tx = parameters.getBooleanValue(TX_PARAMETER_ID);
final String attrsParam = parameters.getStringValue(ATTRS_PARAMETER_ID);
// Allow the user to specify a specific set of attributes,
// cutting down data transfer and processing a lot,
// particularly on the Python side.
final String[] attrsArray = attrsParam != null ? attrsParam.split(",") : new String[0];
// Maintain the order specified by the user.
final Set<String> attrs = new LinkedHashSet<>();
Collections.addAll(attrs, attrsArray);
// Build the JSON in a form suitable for passing to pandas.DataFrame.from_items().
// This includes the datatypes with the names, so the client can do transforms
// where required (for example, converting strings to timestamps).
//
final IoProgress ioph = new HandleIoProgress("External script: get RecordStore");
ioph.start();
ioph.progress("Building RecordStore...");
final GraphRecordStore recordStore;
final Graph graph = graphId == null ? RestUtilities.getActiveGraph() : GraphNode.getGraph(graphId);
if (graph == null) {
throw new RestServiceException(HTTP_UNPROCESSABLE_ENTITY, "No graph with id " + graphId);
}
final ReadableGraph rg = graph.getReadableGraph();
try {
if ((vx && tx) || !(vx || tx)) {
// We're getting the entire graph. We don't want all
// of the vertices: since all of the vertices with
// transactions are already included, we only want
// the rest of the vertices, ie the singletons.
recordStore = GraphRecordStoreUtilities.getAll(rg, true, selected, false);
} else if (vx) {
recordStore = GraphRecordStoreUtilities.getVertices(rg, false, selected, false);
} else {
recordStore = GraphRecordStoreUtilities.getTransactions(rg, selected, false);
}
} finally {
rg.release();
}
// Create a mapping from "attrname" to "attrname<type>" for
// all of the RecordStore attributes.
final Map<String, String> attrToTypedAttr = new HashMap<>();
for (final String kt : recordStore.keysWithType()) {
final int ix = kt.lastIndexOf('<');
final String key = kt.substring(0, ix);
attrToTypedAttr.put(key, kt);
}
if (!attrs.isEmpty() && recordStore.size() > 0) {
// Check that all of the user-specified attributes exist.
final StringJoiner buf = new StringJoiner(",");
for (final String key : attrs) {
if (!attrToTypedAttr.containsKey(key)) {
buf.add(key);
}
}
if (buf.length() != 0) {
throw new RestServiceException("The following attributes do not exist in the record store: " + buf.toString());
}
} else {
// The user didn't specify any attributes, so use all of
// the RecordStore keys.
attrs.addAll(attrToTypedAttr.keySet());
}
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, false);
mapper.configure(SerializationFeature.CLOSE_CLOSEABLE, false);
final ObjectNode root = mapper.createObjectNode();
// We want to build a JSON document that looks like:
//
// {"columns":["A","B"],"data":[[1,"a"],[2,"b"],[3,"c"]]}
//
// which can be read by pandas.read_json(..., orient="split").
// (It appears that the index parameter is not required.)
final ArrayNode columns = root.putArray("columns");
final ArrayNode data = root.putArray("data");
if (recordStore.size() > 0) {
ioph.progress("Building DataFrame...");
for (final String attr : attrs) {
final String kt = attrToTypedAttr.get(attr);
columns.add(keyedName(kt));
}
recordStore.reset();
while (recordStore.next()) {
final ArrayNode row = data.addArray();
for (final String attr : attrs) {
final String kt = attrToTypedAttr.get(attr);
final String type = kt.substring(kt.lastIndexOf('<') + 1, kt.length() - 1);
final String value = recordStore.get(kt);
RestUtilities.addData(row, type, value);
}
}
}
mapper.writeValue(out, root);
ioph.finish();
}
use of au.gov.asd.tac.constellation.utilities.gui.HandleIoProgress in project constellation by constellation-app.
the class OpenGraph method callService.
@Override
public void callService(final PluginParameters parameters, final InputStream in, final OutputStream out) throws IOException {
final String filePath = parameters.getStringValue(FILE_PARAMETER_ID);
final String existingId = RestServiceUtilities.activeGraphId();
final File fnam = new File(filePath).getAbsoluteFile();
String name = fnam.getName();
if (StringUtils.endsWithIgnoreCase(name, GraphDataObject.FILE_EXTENSION)) {
name = name.substring(0, name.length() - GraphDataObject.FILE_EXTENSION.length());
}
try {
final Graph g = new GraphJsonReader().readGraphZip(fnam, new HandleIoProgress(String.format("Loading graph %s...", fnam)));
GraphOpener.getDefault().openGraph(g, name, false);
final String newId = RestServiceUtilities.waitForGraphChange(existingId);
final Graph graph = GraphNode.getGraphNode(newId).getGraph();
final ObjectMapper mapper = new ObjectMapper();
final ObjectNode root = mapper.createObjectNode();
root.put("id", graph.getId());
root.put("name", GraphNode.getGraphNode(graph.getId()).getDisplayName());
root.put("schema", graph.getSchema().getFactory().getName());
mapper.writeValue(out, root);
} catch (final GraphParseException | FileNotFoundException ex) {
throw new RestServiceException(HTTP_UNPROCESSABLE_ENTITY, ex.getMessage());
}
}
Aggregations