Search in sources :

Example 11 with Join

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

the class SemanticValidator method checkAlternative.

public void checkAlternative(QueryData data, List<QueryNode> alternative, int alternativeIndex, boolean queryWasNormalized) {
    // check if there is at least one search expression
    if (alternative.isEmpty()) {
        throw new AnnisQLSemanticsException("Missing search expression.");
    }
    // there are not linguistic binary relations allowed if there is only one node
    if (alternative.size() == 1) {
        QueryNode n = alternative.get(0);
        for (Join j : n.getOutgoingJoins()) {
            if (j.getTarget() != null) {
                throw new AnnisQLSemanticsException(j.getParseLocation(), "No binary linguistic relations allowed if there is only one node in query.");
            }
        }
    }
    // get all nodes connected to the first one
    Multimap<Long, QueryNode> connected = calculateConnected(alternative);
    Set<Long> transitiveHull = new HashSet<>();
    transitiveHull.add(alternative.get(0).getId());
    createTransitiveHull(alternative.get(0), connected, transitiveHull);
    Multiset<String> variableNames = TreeMultiset.create();
    Set<Long> unconnectedNodes = new HashSet<>();
    for (QueryNode n : alternative) {
        unconnectedNodes.add(n.getId());
        variableNames.add(n.getVariable());
    }
    unconnectedNodes.removeAll(transitiveHull);
    // check if each node is contained in the connected nodes
    if (!unconnectedNodes.isEmpty()) {
        List<AqlParseError> errors = new LinkedList<>();
        for (QueryNode n : alternative) {
            if (unconnectedNodes.contains(n.getId())) {
                errors.add(new AqlParseError(n, "variable \"" + n.getVariable() + "\" not bound (use linguistic operators)"));
            }
        }
        if (!errors.isEmpty()) {
            if (queryWasNormalized) {
                // add the normalized query as "error" so the user is able to see it
                errors.add(new AqlParseError("Normalized query is: \n" + data.toAQL()));
            }
            throw new AnnisQLSemanticsException("Not all variables bound", errors);
        }
    }
    // check if any variable name was given more than once
    List<String> invalidNames = new LinkedList<>();
    for (Multiset.Entry<String> e : variableNames.entrySet()) {
        if (e.getCount() > 1) {
            invalidNames.add(e.getElement());
        }
    }
    if (!invalidNames.isEmpty()) {
        throw new AnnisQLSemanticsException("The following variable names are " + "used for more than one node: " + Joiner.on(", ").join(invalidNames) + "\nNormalized Query is: \n" + data.toAQL());
    }
    // check no non-reflexive operator is used with the same operands
    for (QueryNode source : alternative) {
        for (Join join : source.getOutgoingJoins()) {
            if (join instanceof Inclusion || join instanceof SameSpan || join instanceof Overlap || join instanceof RightOverlap || join instanceof LeftOverlap || join instanceof RightAlignment || join instanceof LeftAlignment) {
                if (source.equals(join.getTarget())) {
                    throw new AnnisQLSemanticsException(join, "Not-reflexive operator used with the same node as argument.");
                }
            }
        }
    }
}
Also used : Inclusion(annis.sqlgen.model.Inclusion) SameSpan(annis.sqlgen.model.SameSpan) RightAlignment(annis.sqlgen.model.RightAlignment) AqlParseError(annis.model.AqlParseError) RightOverlap(annis.sqlgen.model.RightOverlap) LeftAlignment(annis.sqlgen.model.LeftAlignment) AnnisQLSemanticsException(annis.exceptions.AnnisQLSemanticsException) NonBindingJoin(annis.sqlgen.model.NonBindingJoin) Join(annis.model.Join) RightOverlap(annis.sqlgen.model.RightOverlap) Overlap(annis.sqlgen.model.Overlap) LeftOverlap(annis.sqlgen.model.LeftOverlap) LinkedList(java.util.LinkedList) QueryNode(annis.model.QueryNode) LeftOverlap(annis.sqlgen.model.LeftOverlap) Multiset(com.google.common.collect.Multiset) TreeMultiset(com.google.common.collect.TreeMultiset) HashSet(java.util.HashSet)

Example 12 with Join

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

the class SemanticValidator method calculateConnected.

private Multimap<Long, QueryNode> calculateConnected(List<QueryNode> nodes) {
    Multimap<Long, QueryNode> result = HashMultimap.create();
    for (QueryNode n : nodes) {
        for (Join j : n.getOutgoingJoins()) {
            if (j.getTarget() != null && !(j instanceof NonBindingJoin)) {
                long left = n.getId();
                long right = j.getTarget().getId();
                result.put(left, j.getTarget());
                result.put(right, n);
            }
        }
    }
    return result;
}
Also used : QueryNode(annis.model.QueryNode) NonBindingJoin(annis.sqlgen.model.NonBindingJoin) Join(annis.model.Join) NonBindingJoin(annis.sqlgen.model.NonBindingJoin)

Example 13 with Join

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

the class TransitivePrecedenceOptimizer method createInitialJoinMap.

private Map<Long, Set<Precedence>> createInitialJoinMap(List<QueryNode> alternative) {
    Map<Long, Set<Precedence>> result = new HashMap<>();
    for (QueryNode node : alternative) {
        Set<Precedence> joinList = new HashSet<>();
        for (Join j : node.getOutgoingJoins()) {
            if (j instanceof Precedence) {
                joinList.add((Precedence) j);
            }
        }
        result.put(node.getId(), joinList);
    }
    return result;
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) TreeSet(java.util.TreeSet) HashMap(java.util.HashMap) QueryNode(annis.model.QueryNode) Join(annis.model.Join) Precedence(annis.sqlgen.model.Precedence) HashSet(java.util.HashSet)

Aggregations

Join (annis.model.Join)13 QueryNode (annis.model.QueryNode)12 QueryAnnotation (annis.model.QueryAnnotation)4 Dominance (annis.sqlgen.model.Dominance)4 Precedence (annis.sqlgen.model.Precedence)4 LinkedList (java.util.LinkedList)4 LeftDominance (annis.sqlgen.model.LeftDominance)3 PointingRelation (annis.sqlgen.model.PointingRelation)3 RightDominance (annis.sqlgen.model.RightDominance)3 HashSet (java.util.HashSet)3 Identical (annis.sqlgen.model.Identical)2 Inclusion (annis.sqlgen.model.Inclusion)2 LeftAlignment (annis.sqlgen.model.LeftAlignment)2 LeftOverlap (annis.sqlgen.model.LeftOverlap)2 NonBindingJoin (annis.sqlgen.model.NonBindingJoin)2 Overlap (annis.sqlgen.model.Overlap)2 RightAlignment (annis.sqlgen.model.RightAlignment)2 RightOverlap (annis.sqlgen.model.RightOverlap)2 SameSpan (annis.sqlgen.model.SameSpan)2 HashMap (java.util.HashMap)2