package annis.sqlgen;
import annis.model.Join;
import annis.model.QueryAnnotation;
import annis.model.QueryNode;
import annis.ql.parser.QueryData;
import static annis.sqlgen.TableAccessStrategy.EDGE_ANNOTATION_TABLE;
import static annis.sqlgen.TableAccessStrategy.NODE_ANNOTATION_TABLE;
import annis.sqlgen.model.CommonAncestor;
import annis.sqlgen.model.Dominance;
import annis.sqlgen.model.EqualValue;
import annis.sqlgen.model.Identical;
import annis.sqlgen.model.Inclusion;
import annis.sqlgen.model.LeftAlignment;
import annis.sqlgen.model.LeftDominance;
import annis.sqlgen.model.LeftOverlap;
import annis.sqlgen.model.Near;
import annis.sqlgen.model.NotEqualValue;
import annis.sqlgen.model.Overlap;
import annis.sqlgen.model.PointingRelation;
import annis.sqlgen.model.Precedence;
import annis.sqlgen.model.RightAlignment;
import annis.sqlgen.model.RightDominance;
import annis.sqlgen.model.RightOverlap;
import annis.sqlgen.model.SameSpan;
import annis.sqlgen.model.Sibling;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public abstract class AbstractWhereClauseGenerator extends
TableAccessStrategyFactory implements WhereClauseSqlGenerator<QueryData>
{
@Override
public Set<String> whereConditions(QueryData queryData,
List<QueryNode> alternative, String indent)
{
List<String> conditions = new ArrayList<>();
for (QueryNode node : alternative)
{
// node constraints
if (node.getSpannedText() != null)
{
addSpanConditions(conditions, queryData, node);
}
if (node.isToken())
{
addIsTokenConditions(conditions, queryData, node);
}
if (node.isRoot())
{
addIsRootConditions(conditions, queryData, node);
}
if (node.getArity() != null)
{
addNodeArityConditions(conditions, queryData, node);
}
if (node.getTokenArity() != null)
{
addTokenArityConditions(conditions, queryData, node);
}
// node joins
for (Join join : node.getOutgoingJoins())
{
QueryNode target = join.getTarget();
if (join instanceof SameSpan)
{
addSameSpanConditions(conditions, node, target, (SameSpan) join,
queryData);
} else if (join instanceof Identical)
{
addIdenticalConditions(conditions, node, target, (Identical) join,
queryData);
} else if (join instanceof LeftAlignment)
{
addLeftAlignmentConditions(conditions, node, target,
(LeftAlignment) join, queryData);
} else if (join instanceof RightAlignment)
{
addRightAlignmentConditions(conditions, node, target,
(RightAlignment) join, queryData);
} else if (join instanceof Inclusion)
{
addInclusionConditions(conditions, node, target, (Inclusion) join,
queryData);
} else if (join instanceof Overlap)
{
addOverlapConditions(conditions, node, target, (Overlap) join,
queryData);
} else if (join instanceof LeftOverlap)
{
addLeftOverlapConditions(conditions, target, node,
(LeftOverlap) join, queryData);
} else if (join instanceof RightOverlap)
{
addRightOverlapConditions(conditions, target, node,
(RightOverlap) join, queryData);
} else if (join instanceof Precedence)
{
addPrecedenceConditions(conditions, node, target, (Precedence) join,
queryData);
} else if (join instanceof Near)
{
addNearConditions(conditions, node, target, (Near) join,
queryData);
} else if (join instanceof Sibling)
{
addSiblingConditions(conditions, node, target, (Sibling) join,
queryData);
} else if (join instanceof CommonAncestor)
{
addCommonAncestorConditions(conditions, node, target,
(CommonAncestor) join, queryData);
} else if (join instanceof LeftDominance)
{
addLeftDominanceConditions(conditions, node, target,
(LeftDominance) join, queryData);
} else if (join instanceof RightDominance)
{
addRightDominanceConditions(conditions, node, target,
(RightDominance) join, queryData);
} else if (join instanceof Dominance)
{
addDominanceConditions(conditions, node, target, (Dominance) join,
queryData);
} else if (join instanceof PointingRelation)
{
addPointingRelationConditions(conditions, node, target,
(PointingRelation) join, queryData);
} else if (join instanceof EqualValue)
{
addEqualValueConditions(conditions, node, target, (EqualValue) join, queryData);
} else if (join instanceof NotEqualValue)
{
addNotEqualValueConditions(conditions, node, target, (NotEqualValue) join, queryData);
}
}
// node annotations
int i = 0;
for (QueryAnnotation annotation : node.getNodeAnnotations())
{
++i;
addAnnotationConditions(conditions, node, i, annotation,
NODE_ANNOTATION_TABLE, queryData);
}
// relation annotations
int j = 0;
for (QueryAnnotation annotation : node.getEdgeAnnotations())
{
++j;
addAnnotationConditions(conditions, node, j, annotation,
EDGE_ANNOTATION_TABLE, queryData);
}
}
return new HashSet<>(conditions);
}
protected abstract void addSpanConditions(List<String> conditions,
QueryData queryData, QueryNode node);
protected abstract void addIsTokenConditions(List<String> conditions,
QueryData queryData, QueryNode node);
protected abstract void addIsRootConditions(List<String> conditions,
QueryData queryData, QueryNode node);
protected abstract void addNodeArityConditions(List<String> conditions,
QueryData queryData, QueryNode node);
protected abstract void addTokenArityConditions(List<String> conditions,
QueryData queryData, QueryNode node);
protected abstract void addSingleRelationCondition(QueryNode node,
QueryNode target, List<String> conditions, Join join,
final String relationType);
protected abstract void addSiblingConditions(List<String> conditions,
QueryNode node, QueryNode target, Sibling join, QueryData queryData);
protected abstract void addCommonAncestorConditions(List<String> conditions,
QueryNode node, QueryNode target, CommonAncestor join, QueryData queryData);
protected abstract void addSameSpanConditions(List<String> conditions,
QueryNode node, QueryNode target, SameSpan join, QueryData queryData);
protected abstract void addIdenticalConditions(List<String> conditions,
QueryNode node, QueryNode target, Identical join, QueryData queryData);
protected abstract void addLeftAlignmentConditions(List<String> conditions,
QueryNode node, QueryNode target, LeftAlignment join, QueryData queryData);
protected abstract void addRightAlignmentConditions(List<String> conditions,
QueryNode node, QueryNode target, RightAlignment join, QueryData queryData);
protected abstract void addInclusionConditions(List<String> conditions,
QueryNode node, QueryNode target, Inclusion join, QueryData queryData);
protected abstract void addOverlapConditions(List<String> conditions,
QueryNode node, QueryNode target, Overlap join, QueryData queryData);
protected abstract void addLeftOverlapConditions(List<String> conditions,
QueryNode target, QueryNode node, LeftOverlap join, QueryData queryData);
protected abstract void addRightOverlapConditions(List<String> conditions,
QueryNode target, QueryNode node, RightOverlap join, QueryData queryData);
protected abstract void addPrecedenceConditions(List<String> conditions,
QueryNode node, QueryNode target, Precedence join, QueryData queryData);
protected abstract void addNearConditions(List<String> conditions,
QueryNode node, QueryNode target, Near join, QueryData queryData);
protected abstract void addAnnotationConditions(List<String> conditions,
QueryNode node, int index, QueryAnnotation annotation, String table,
QueryData queryData);
protected abstract void addLeftDominanceConditions(List<String> conditions,
QueryNode node, QueryNode target, LeftDominance join, QueryData queryData);
protected abstract void addRightDominanceConditions(List<String> conditions,
QueryNode node, QueryNode target, RightDominance join, QueryData queryData);
protected abstract void addDominanceConditions(List<String> conditions,
QueryNode node, QueryNode target, Dominance join, QueryData queryData);
protected abstract void addPointingRelationConditions(
List<String> conditions, QueryNode node, QueryNode target,
PointingRelation join, QueryData queryData);
protected abstract void addEqualValueConditions(
List<String> conditions, QueryNode node, QueryNode target,
EqualValue join, QueryData queryData);
protected abstract void addNotEqualValueConditions(
List<String> conditions, QueryNode node, QueryNode target,
NotEqualValue join, QueryData queryData);
}