Search in sources :

Example 16 with Edge

use of annis.model.Edge in project ANNIS by korpling.

the class AomAnnotateExtractor method fixNodes.

protected void fixNodes(Edge edge, Map<Long, Edge> edgeByRankID, Map<Long, AnnisNode> nodeById) {
    // pull source node from parent edge
    AnnisNode source = edge.getSource();
    if (source == null) {
        return;
    }
    long nodeID = source.getId();
    Edge parentEdge = edgeByRankID.get(nodeID);
    AnnisNode parent = parentEdge != null ? parentEdge.getDestination() : null;
    // log.debug("looking for node with rank.pre =
    // " + pre + "; found: " + parent);
    edge.setSource(parent);
    // pull destination node from mapping function
    long destinationId = edge.getDestination().getId();
    edge.setDestination(nodeById.get(destinationId));
}
Also used : AnnisNode(annis.model.AnnisNode) Edge(annis.model.Edge)

Example 17 with Edge

use of annis.model.Edge in project ANNIS by korpling.

the class AomAnnotateExtractor method extractData.

@Override
public List<AnnotationGraph> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
    TableAccessStrategy tableAccessStrategy = outerQueryTableAccessStrategy;
    // function result
    List<AnnotationGraph> graphs = new LinkedList<>();
    // fn: match group -> annotation graph
    Map<List<Long>, AnnotationGraph> graphByMatchGroup = new HashMap<>();
    // fn: node id -> node
    Map<Long, AnnisNode> nodeById = new HashMap<>();
    // fn: edge pre order value -> edge
    Map<Long, Edge> edgeByRankID = new HashMap<>();
    // maps span that are continous to their coverage component
    Map<List<Long>, Map<Long, ComponentEntry>> keyToSpanToComponent = new HashMap<>();
    int rowNum = 0;
    while (resultSet.next()) {
        // process result by match group
        // match group is identified by the ids of the matched
        // nodes
        Array sqlKey = resultSet.getArray("key");
        Validate.isTrue(!resultSet.wasNull(), "Match group identifier must not be null");
        Validate.isTrue(sqlKey.getBaseType() == Types.BIGINT, "Key in database must be from the type \"bigint\" but was \"" + sqlKey.getBaseTypeName() + "\"");
        Long[] keyArray = (Long[]) sqlKey.getArray();
        List<Long> key = Arrays.asList(keyArray);
        if (!graphByMatchGroup.containsKey(key)) {
            log.debug("starting annotation graph for match: " + key);
            Map<Long, ComponentEntry> spans = new HashMap<>();
            AnnotationGraph graph = new AnnotationGraph();
            graphs.add(graph);
            graphByMatchGroup.put(key, graph);
            keyToSpanToComponent.put(key, spans);
            // clear mapping functions for this graph
            // assumes that the result set is sorted by key, pre
            nodeById.clear();
            edgeByRankID.clear();
            // set the matched keys
            for (Long l : key) {
                if (l != null) {
                    graph.addMatchedNodeId(l);
                }
            }
        }
        AnnotationGraph graph = graphByMatchGroup.get(key);
        Map<Long, ComponentEntry> spanToComponent = keyToSpanToComponent.get(key);
        graph.setDocumentName(new DocumentNameMapRow().mapRow(resultSet, rowNum));
        Array path = resultSet.getArray("path");
        graph.setPath((String[]) path.getArray());
        // get node data
        AnnisNode node = mapNode(resultSet, tableAccessStrategy, spanToComponent);
        // add node to graph if it is new, else get known copy
        long id = node.getId();
        if (!nodeById.containsKey(id)) {
            log.debug("new node: " + id);
            nodeById.put(id, node);
            graph.addNode(node);
        } else {
            node = nodeById.get(id);
        }
        // we now have the id of the node and the general key,
        // so we can
        // add the matched node index to the graph (if matched)
        long matchIndex = 1;
        // node.setMatchedNodeInQuery(null);
        for (Long l : key) {
            if (l != null) {
                if (id == l) {
                    node.setMatchedNodeInQuery(matchIndex);
                    break;
                }
                matchIndex++;
            }
        }
        // get edge data
        Edge edge = mapEdge(resultSet, tableAccessStrategy);
        // add edge to graph if it is new, else get known copy
        long rank_id = edge.getId();
        if (!edgeByRankID.containsKey(rank_id)) {
            // fix source references in edge
            edge.setDestination(node);
            fixNodes(edge, edgeByRankID, nodeById);
            // add edge to src and dst nodes
            node.addIncomingEdge(edge);
            AnnisNode source = edge.getSource();
            if (source != null) {
                source.addOutgoingEdge(edge);
            }
            log.debug("new edge: " + edge);
            edgeByRankID.put(edge.getId(), edge);
            graph.addEdge(edge);
        } else {
            edge = edgeByRankID.get(rank_id);
        }
        // add annotation data
        Annotation nodeAnnotation = mapAnnotation(resultSet, tableAccessStrategy, TableAccessStrategy.NODE_ANNOTATION_TABLE);
        if (nodeAnnotation != null) {
            node.addNodeAnnotation(nodeAnnotation);
        }
        Annotation edgeAnnotation = mapAnnotation(resultSet, tableAccessStrategy, TableAccessStrategy.EDGE_ANNOTATION_TABLE);
        if (edgeAnnotation != null) {
            edge.addAnnotation(edgeAnnotation);
        }
        rowNum++;
    }
    // remove edges from the graph with a source node inside the match
    for (Entry<List<Long>, AnnotationGraph> entry : graphByMatchGroup.entrySet()) {
        AnnotationGraph graph = entry.getValue();
        ListIterator<Edge> itEdge = graph.getEdges().listIterator();
        while (itEdge.hasNext()) {
            Edge edge = itEdge.next();
            if (edge.getSource() == null) {
                edge.getDestination().getIncomingEdges().remove(edge);
                itEdge.remove();
            }
        }
        Map<Long, ComponentEntry> spans = keyToSpanToComponent.get(entry.getKey());
        // filter out the continuous spans by finding all discontinuous spans
        // discontinuos spans will have a an entry for token
        createMissingSpanningRelations(graph, spans, nodeById);
    }
    return graphs;
}
Also used : HashMap(java.util.HashMap) DocumentNameMapRow(annis.dao.DocumentNameMapRow) LinkedList(java.util.LinkedList) List(java.util.List) LinkedList(java.util.LinkedList) Annotation(annis.model.Annotation) AnnotationGraph(annis.model.AnnotationGraph) Array(java.sql.Array) AnnisNode(annis.model.AnnisNode) Edge(annis.model.Edge) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

Edge (annis.model.Edge)17 AnnisNode (annis.model.AnnisNode)9 LinkedList (java.util.LinkedList)3 Annotation (annis.model.Annotation)2 Point2D (java.awt.geom.Point2D)2 Rectangle2D (java.awt.geom.Rectangle2D)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 Test (org.junit.Test)2 DocumentNameMapRow (annis.dao.DocumentNameMapRow)1 AnnotationGraph (annis.model.AnnotationGraph)1 AnnisResult (annis.service.ifaces.AnnisResult)1 AbstractImageGraphicsItem (annis.visualizers.component.tree.backends.staticimg.AbstractImageGraphicsItem)1 DirectedSparseGraph (edu.uci.ics.jung.graph.DirectedSparseGraph)1 Graphics2D (java.awt.Graphics2D)1 AffineTransform (java.awt.geom.AffineTransform)1 CubicCurve2D (java.awt.geom.CubicCurve2D)1 BufferedImage (java.awt.image.BufferedImage)1 IOException (java.io.IOException)1