Search in sources :

Example 1 with IoProgress

use of au.gov.asd.tac.constellation.utilities.gui.IoProgress 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();
}
Also used : LinkedHashSet(java.util.LinkedHashSet) ReadableGraph(au.gov.asd.tac.constellation.graph.ReadableGraph) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) HashMap(java.util.HashMap) HandleIoProgress(au.gov.asd.tac.constellation.utilities.gui.HandleIoProgress) RestServiceException(au.gov.asd.tac.constellation.webserver.restapi.RestServiceException) ReadableGraph(au.gov.asd.tac.constellation.graph.ReadableGraph) Graph(au.gov.asd.tac.constellation.graph.Graph) GraphRecordStore(au.gov.asd.tac.constellation.graph.processing.GraphRecordStore) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) StringJoiner(java.util.StringJoiner) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) HandleIoProgress(au.gov.asd.tac.constellation.utilities.gui.HandleIoProgress) IoProgress(au.gov.asd.tac.constellation.utilities.gui.IoProgress)

Aggregations

Graph (au.gov.asd.tac.constellation.graph.Graph)1 ReadableGraph (au.gov.asd.tac.constellation.graph.ReadableGraph)1 GraphRecordStore (au.gov.asd.tac.constellation.graph.processing.GraphRecordStore)1 HandleIoProgress (au.gov.asd.tac.constellation.utilities.gui.HandleIoProgress)1 IoProgress (au.gov.asd.tac.constellation.utilities.gui.IoProgress)1 RestServiceException (au.gov.asd.tac.constellation.webserver.restapi.RestServiceException)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 HashMap (java.util.HashMap)1 LinkedHashSet (java.util.LinkedHashSet)1 StringJoiner (java.util.StringJoiner)1