package net.sourceforge.seqware.common.dao.hibernate;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
import net.sourceforge.seqware.common.dao.LibraryDAO;
import net.sourceforge.seqware.common.model.Sample;
import net.sourceforge.seqware.common.model.SampleAttribute;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
/**
* <p>LibraryDAOHibernate class.</p>
*
* @author boconnor
* @version $Id: $Id
*/
public class LibraryDAOHibernate implements LibraryDAO {
@Autowired
private SessionFactory sessionFactory;
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
/** {@inheritDoc} */
@Override
public Sample findBySWAccession(Long swAccession) {
String queryStringCase = "from Sample as s where s.swAccession = :swAccession";
Query query = currentSession().createQuery(queryStringCase);
query.setLong("swAccession", swAccession);
return (Sample) query.uniqueResult();
}
/** {@inheritDoc} */
@Override
public List<Sample> getLibraries(String attributeName, String attributeValue) {
String queryString = "select distinct sample from Sample as sample inner join sample.sampleAttributes as attribute where attribute.tag like :attributeName and attribute.value like :attributeValue";
Query query = currentSession().createQuery(queryString);
query.setString("attributeName", attributeName);
query.setString("attributeValue", attributeValue);
@SuppressWarnings("unchecked")
List<Sample> records = query.list();
Map<Sample, Sample> tmp = Maps.newHashMap();
for (Sample sample : records) {
findChildLibraries(tmp, sample);
}
List<Sample> result = Lists.newArrayList(tmp.values());
return result;
}
private void findChildLibraries(Map<Sample, Sample> libraries, Sample node) {
if (isLibrary(node)) {
libraries.put(node, node);
}
for (Sample sample : node.getChildren()) {
findChildLibraries(libraries, sample);
}
}
private boolean isLibrary(Sample sample) {
for (SampleAttribute sampleAttribute : sample.getSampleAttributes()) {
if (sampleAttribute.getTag().equals(Sample.GEO_REACTION_ID_ATTR_TAG)) {
return true;
}
}
return false;
}
/** {@inheritDoc} */
@Override
public List<Sample> getLibraries() {
String queryStringCase = "select distinct sample from Sample as sample inner join fetch sample.sampleAttributes as attribute where attribute.tag like 'geo_reaction_id'";
Query query = currentSession().createQuery(queryStringCase);
@SuppressWarnings("unchecked")
List<Sample> records = query.list();
return records;
}
}