package rdf; import graphexpr.ConsumerExpr; import graphexpr.GraphExpr; import graphexpr.PatternExpr; import graphexpr.ProducerExpr; import java.util.HashMap; import java.util.List; import org.apache.commons.lang3.tuple.Pair; import pregroup.PhraseString; import pregroup.SimpleType; import pregroup.TypeString; import util.NotFoundException; import util.UnknownTagException; import xmllexicon.InputException; import xmllexicon.SemanticLexicon; public class GraphString extends PhraseString { private static final long serialVersionUID = 1L; private HashMap<Integer, PatternExpr> patterns; public GraphString(SemanticLexicon lex, List<Pair<String,String>> sen, TypeString target) throws UnknownTagException, TypeException { this(lex.graphExprs(sen), sen, target); } public GraphString(SemanticLexicon lex, List<Pair<String,String>> sen, SimpleType target) throws UnknownTagException, TypeException { this(lex.graphExprs(sen), sen, new TypeString(target)); } public PatternExpr getPattern(int index) { return patterns.get(index); } public void shiftPattern(HashMap<Integer, Integer> map, int idx, String name) throws NotFoundException { PatternExpr p = getPattern(idx); p.shift(map, name); patterns.put(idx, p); } public GraphString(List<List<List<GraphExpr>>> lst, List<Pair<String,String>> sen, TypeString target) throws TypeException { //! TODO Redesign this method : separate HashMap generation and type string generation patterns = new HashMap<Integer, PatternExpr>(); int widx = 0; for(List<List<GraphExpr>> candidates : lst) { HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); if(candidates.size() == 1 && candidates.get(0).size() == 1 && candidates.get(0).get(0).getType().isUnit()) continue; addLB(); addStar(); for(List<GraphExpr> type : candidates) { int idx = this.size(); TypeString str = new TypeString(); for(GraphExpr ge : type) { if(ge.isConsumer()) { ConsumerExpr c = (ConsumerExpr)ge; map.put(c.var, idx); } idx++; } idx = this.size(); for(GraphExpr ge : type) { if(ge.isProducer()) { ProducerExpr p = (ProducerExpr) ge; try { p.pattern.shift(map, sen.get(widx).getLeft()); } catch(NotFoundException e) { throw new TypeException("Invalid pattern \""+p.pattern.toString()+ "\": variable "+e.i+" is undefined."); } patterns.put(idx,p.pattern); } str.add(ge.getType()); idx++; } addType(str); addStar(); } addRB(); widx++; } //! Add the candidate addLB(); addStar(); addType(target.right()); } }