package org.genedb.db.dao;
import org.gmod.schema.mapped.CvTerm;
import org.gmod.schema.mapped.Organism;
import org.gmod.schema.mapped.Phylonode;
import org.gmod.schema.mapped.Phylotree;
import org.hibernate.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Transactional(readOnly = true)
public class PhylogenyDao extends BaseDao {
public List<Phylonode> getPhyloNodesByCvTermInTree(CvTerm type, Phylotree tree) {
@SuppressWarnings("unchecked")
List<Phylonode> nodes = getSession().createQuery(
"from Phylonode pn where pn.type=:type and pn.tree=:tree")
.setParameter("type", type)
.setParameter("tree", tree)
.list();
return nodes;
}
public Phylotree getPhyloTreeByName(String name) {
@SuppressWarnings("unchecked")
List<Phylotree> trees = getSession().createQuery(
"from Phylotree where name=:name")
.setString("name", name)
.list();
return firstFromList(trees, "name", name);
}
@SuppressWarnings("unchecked")
public List<Phylonode> getAllPhylonodes() {
return getSession().createCriteria(Phylonode.class).list();
}
public List<Phylonode> getPhylonodesByDepthAndParent(double depth, Phylonode parent) {
final Query query;
if(parent == null) {
query = getSession().createQuery(
"from Phylonode p where p.distance=:depth")
.setDouble("depth", depth);
} else {
query = getSession().createQuery(
"from Phylonode p where p.distance=:depth and p.phylonode=:parent")
.setDouble("depth", depth)
.setParameter("parent", parent);
}
@SuppressWarnings("unchecked")
List<Phylonode> nodes = query.list();
return nodes;
}
public List<Phylonode> getPhylonodesByName(String name) {
@SuppressWarnings("unchecked")
List<Phylonode> nodes = getSession().createQuery(
"from Phylonode p where p.label=:name")
.setString("name", name)
.list();
return nodes;
}
public List<Phylonode> getPhylonodesByParent(Phylonode parent) {
@SuppressWarnings("unchecked")
List<Phylonode> nodes = getSession().createQuery(
"from Phylonode p where p.parent=:parent")
.setParameter("parent", parent)
.list();
return nodes;
}
public boolean isPhylonodeWithOrganismFeature(Organism orga){
return getSession().createQuery(
"select o.organismId from Organism o where o = :orga and exists elements(o.features)")
.setEntity("orga", orga).list().size()>0;
}
public boolean isPhylonodeWithOrganismFeature(Phylonode phylonode){
return getSession().createQuery(
"select p.phylonodeId " +
"from Phylonode p " +
"inner join p.phylonodeOrganisms po " +
"where p = :phylonode " +
"and exists elements(po.organism.features)")
.setEntity("phylonode", phylonode)
.list().size()>0;
}
}