package rainbownlp.core;
import java.io.Serializable;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.Session;
import org.hibernate.annotations.GenericGenerator;
import rainbownlp.util.FileUtil;
import rainbownlp.util.HibernateUtil;
@Entity
@Table( name = "PhraseLink" )
public class PhraseLink implements Serializable {
int PhraseLinkId;
Phrase fromPhrase;
Phrase toPhrase;
LinkType linkType;
private LinkType linkTypeReal;
private LinkType linkTypeClosure;
private LinkType linkTypeIntegrated;
private String altLinkID;
public static PhraseLink getInstance(int pLinkID) {
String hql = "from PhraseLink where phraseLinkId = "+pLinkID;
PhraseLink phrase_link_obj =
(PhraseLink)HibernateUtil.executeReader(hql).get(0);
return phrase_link_obj;
}
public static PhraseLink getInstance(Phrase pfromPhrase, Phrase pToPhrase){
String hql = "from PhraseLink where fromPhrase = "+
pfromPhrase.getPhraseId()+" and toPhrase="+pToPhrase.getPhraseId();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
PhraseLink phraseLink_obj;
if(link_objects.size()==0)
{
phraseLink_obj = createInstance(pfromPhrase, pToPhrase);
}else
{
phraseLink_obj =
link_objects.get(0);
}
return phraseLink_obj;
}
public static PhraseLink createInstance(Phrase pfromPhrase, Phrase pToPhrase){
PhraseLink phraseLink_obj;
phraseLink_obj = new PhraseLink();
phraseLink_obj.setFromPhrase(pfromPhrase);
phraseLink_obj.setToPhrase(pToPhrase);
phraseLink_obj.setLinkType(LinkType.UNKNOWN);
HibernateUtil.save(phraseLink_obj);
FileUtil.logLine(null, "created link from phrase id="+ pfromPhrase.getPhraseId() +
"to id="+ pToPhrase.getPhraseId());
return phraseLink_obj;
}
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public int getPhraseLinkId() {
return PhraseLinkId;
}
public void setPhraseLinkId(int PhraseLinkId) {
this.PhraseLinkId = PhraseLinkId;
}
// @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY )
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="fromPhrase")
public Phrase getFromPhrase() {
return fromPhrase;
}
public void setFromPhrase(Phrase firstPhrase) {
this.fromPhrase = firstPhrase;
}
// @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY )
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="toPhrase")
public Phrase getToPhrase() {
return toPhrase;
}
public void setToPhrase(Phrase secondPhrase) {
this.toPhrase = secondPhrase;
}
public LinkType getLinkType() {
return linkType;
}
public void setLinkType(LinkType pLinkType) {
this.linkType = pLinkType;
}
public enum LinkType {
UNKNOWN(0),
BEFORE(1),
AFTER(2),
OVERLAP(3);
private static final Map<Integer,LinkType> lookup
= new HashMap<Integer,LinkType>();
static {
for(LinkType l : EnumSet.allOf(LinkType.class))
lookup.put(l.getCode(), l);
}
private int code;
private LinkType(int code) {
this.code = code;
}
public int getCode() { return code; }
public static LinkType getEnum(int code) {
return lookup.get(code);
}
}
public static boolean sentenceHasLink(Artifact sentence) {
boolean hasLink =false;
String hql = "from PhraseLink where fromPhrase.startArtifact.parentArtifact = "+
sentence.getArtifactId()+" and linkType <> 0";
Session session = HibernateUtil.sessionFactory.openSession();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql, null, null, session);
if(link_objects.size()!=0)
hasLink = true;
session.clear();
session.close();
return hasLink;
}
//This method will return all phraseLinks that in a sentence
public static List<PhraseLink> findPositivePhraseLinkInSentence(Artifact sentence, LinkType pExcludedLinkType) {
String hql = "from PhraseLink where fromPhrase.startArtifact.parentArtifact = :sentId "+
" and toPhrase.endArtifact.parentArtifact= :sentId and linkType<> :pExcludedLinkType ";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("sentId", sentence.getArtifactId());
params.put("pExcludedLinkType",pExcludedLinkType.ordinal());
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql,params);
return link_objects;
}
public static List<PhraseLink> findAllPhraseLinkInSentence(Artifact sentence) {
String hql = "from PhraseLink where fromPhrase.startArtifact.parentArtifact = :sentId "+
" and toPhrase.endArtifact.parentArtifact= :sentId ";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("sentId", sentence.getArtifactId());
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql,params);
return link_objects;
}
@Transient
String betweenContent = null;
@Transient
public String getBetweenContent() {
if(betweenContent == null)
{
Artifact curArtifact = getFirstPhrase().getEndArtifact().getNextArtifact();
if(curArtifact == null) betweenContent = "<BETWEENSENTENCE>";
Artifact to = getSecondPhrase().getStartArtifact();
if(betweenContent==null)
{
betweenContent = "";
while(curArtifact !=null && !curArtifact.equals(to)){
betweenContent += curArtifact.getContent() + " ";
curArtifact = curArtifact.getNextArtifact();
}
if(curArtifact==null) betweenContent="<BETWEENSENTENCE>";
else
betweenContent = betweenContent.trim();
}
}
return betweenContent;
}
@Transient
public Phrase getFirstPhrase() {
if(toPhrase.getStartArtifact().getStartIndex()<
fromPhrase.getStartArtifact().getStartIndex())
return toPhrase;
else
return fromPhrase;
}
@Transient
public Phrase getSecondPhrase() {
if(toPhrase.getStartArtifact().getStartIndex()<
fromPhrase.getStartArtifact().getStartIndex())
return fromPhrase;
else
return toPhrase;
}
public boolean linkedWithAnotherPhraseInBetween() {
String hql = "from PhraseLink where fromPhrase = "+ fromPhrase.getPhraseId()+
" and toPhrase <> "+ toPhrase.getPhraseId()+" and toPhrase.startArtifact.startIndex < "
+ toPhrase.getStartArtifact().getStartIndex();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
return link_objects.size()>0;
}
public void setAltLinkID(String altLinkID) {
this.altLinkID = altLinkID;
}
public String getAltLinkID() {
return altLinkID;
}
public static List<PhraseLink> findAllPhraseLinkInDocument(Artifact doc) {
String hql = "from PhraseLink where toPhrase.endArtifact.parentArtifact.parentArtifact= :docId ";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("docId", doc.getArtifactId());
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql,params);
return link_objects;
}
public static String findLargestAltLinkId(String filePath,String altIdNameGroup)
{
String largest_id = null;
String hql = "from PhraseLink where fromPhrase.startArtifact.associatedFilePath= :filePath " +
" and altLinkId like :altLinkIDGroup order by altLinkId desc ";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("filePath", filePath);
params.put("altLinkIDGroup", altIdNameGroup+'%');
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql,params);
PhraseLink pl = null;
String altId = null;
if (link_objects.get(0) != null)
{
pl = link_objects.get(0);
altId = pl.getAltLinkID();
largest_id = altId.replaceAll(altIdNameGroup+"(\\d+)", "$1");
}
return largest_id;
}
public static List<PhraseLink> getPhraseLinkBetweenSent() {
String hql = "from PhraseLink where " +
" fromPhrase.startArtifact.parentArtifact <> toPhrase.startArtifact.parentArtifact " +
" and altLinkID is not null and altLinkID not like 'SECTIME%'" +
" order by fromPhrase.startArtifact.parentArtifact.parentArtifact";
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
return link_objects;
}
public static List<PhraseLink> getPhraseLinkBetweenSentByType(LinkType type) {
String hql = "from PhraseLink where " +
" fromPhrase.startArtifact.parentArtifact <> toPhrase.startArtifact.parentArtifact " +
" and altLinkID is not null and altLinkID not like 'SECTIME%' " +
"and linkType ="+type.ordinal();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
return link_objects;
}
public static PhraseLink getInstance(Artifact artifact1, Artifact artifact2) {
Phrase phrase1 = Phrase.getInstance(artifact1.getContent(), artifact1, artifact1);
Phrase phrase2 = Phrase.getInstance(artifact2.getContent(), artifact2, artifact2);
return getInstance(phrase1, phrase2);
}
public static boolean sentencesLinked(Artifact sentence1, Artifact sentence2) {
String hql = "from PhraseLink where " +
" fromPhrase.startArtifact.parentArtifact = "+ sentence1.getArtifactId() +
" and toPhrase.startArtifact.parentArtifact = " + sentence2.getArtifactId() +
" and altLinkID is not null and altLinkID not like 'SECTIME%' ";
Session session = HibernateUtil.sessionFactory.openSession();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql, null, null, session);
session.clear();
session.close();
return link_objects.size()>0?true:false;
}
public static PhraseLink findPhraseLink(Phrase pfromPhrase, Phrase pToPhrase){
String hql = "from PhraseLink where fromPhrase = "+
pfromPhrase.getPhraseId()+" and toPhrase="+pToPhrase.getPhraseId();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
PhraseLink phraseLink_obj = null;
if(link_objects.size()!=0)
{
phraseLink_obj = link_objects.get(0);
}
return phraseLink_obj;
}
public static PhraseLink findPhraseLinkForExamples(Phrase pfromPhrase, Phrase pToPhrase){
String hql = "from PhraseLink where forTrain is null and fromPhrase = "+
pfromPhrase.getPhraseId()+" and toPhrase="+pToPhrase.getPhraseId();
List<PhraseLink> link_objects =
(List<PhraseLink>) HibernateUtil.executeReader(hql);
PhraseLink phraseLink_obj = null;
if(link_objects.size()!=0)
{
phraseLink_obj = link_objects.get(0);
}
// else
// {
// String hql2 = "from PhraseLink where fromPhrase = "+
// pToPhrase.getPhraseId()+" and toPhrase="+pfromPhrase.getPhraseId();
//
// link_objects =
// (List<PhraseLink>) HibernateUtil.executeReader(hql);
// if(link_objects.size()!=0)
// {
// phraseLink_obj = link_objects.get(0);
//
// }
// }
return phraseLink_obj;
}
@Transient
public boolean isLeftToRight() {
return getFirstPhrase().equals(fromPhrase);
}
public void setLinkTypeReal(LinkType linkTypeReal) {
this.linkTypeReal = linkTypeReal;
}
public LinkType getLinkTypeReal() {
return linkTypeReal;
}
public void setLinkTypeClosure(LinkType linkTypeClosure) {
this.linkTypeClosure = linkTypeClosure;
}
public LinkType getLinkTypeClosure() {
return linkTypeClosure;
}
public void setLinkTypeIntegrated(LinkType linkTypeIntegrated) {
this.linkTypeIntegrated = linkTypeIntegrated;
}
public LinkType getLinkTypeIntegrated() {
return linkTypeIntegrated;
}
}