package org.genedb.crawl.dao.backend;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.genedb.crawl.CrawlException;
import org.genedb.crawl.mappers.FeatureMapper;
import org.genedb.crawl.mappers.FeaturesMapper;
import org.genedb.crawl.mappers.MapperUtil;
import org.genedb.crawl.mappers.OrganismsMapper;
import org.genedb.crawl.mappers.TermsMapper;
import org.genedb.crawl.mappers.MapperUtil.HierarchicalSearchType;
import org.genedb.crawl.model.BlastPair;
import org.genedb.crawl.model.Cvterm;
import org.genedb.crawl.model.Feature;
import org.genedb.crawl.model.Gene;
import org.genedb.crawl.model.HierarchicalFeature;
import org.genedb.crawl.model.Organism;
import org.genedb.crawl.model.Statistic;
import org.genedb.crawl.model.Transcript;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FeaturesDAO extends BaseDAO implements org.genedb.crawl.dao.FeaturesDAO {
private static Logger logger = Logger.getLogger(FeaturesDAO.class);
@Autowired
FeaturesMapper featuresMapper;
@Autowired
FeatureMapper featureMapper;
@Autowired
TermsMapper terms;
@Autowired
OrganismsMapper organismsMapper;
private String[] defaultRelationshipTypes = new String[] {"part_of", "derives_from"};
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#genes(java.util.List)
*/
@Override
public List<Feature> genes(List<String> features) {
return MapperUtil.getGeneFeatures(featuresMapper, features);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#hierarchy(java.util.List, java.lang.Boolean, java.lang.String[])
*/
@Override
public List<HierarchicalFeature> hierarchy(
List<String> features,
Boolean root_on_genes,
String[] relationships) throws CrawlException {
// JAX-WS does not know about defaultValue
if (root_on_genes == null)
root_on_genes = false;
if (relationships == null || relationships.length < 1) {
relationships = defaultRelationshipTypes;
}
List<Cvterm> relationshipTypes = getRelationshipTypes(Arrays.asList(relationships), terms);
List<String> featuresToRecurse = features;
List<HierarchicalFeature> hfs = new ArrayList<HierarchicalFeature>();
if (root_on_genes) {
featuresToRecurse = new ArrayList<String>();
Collection<Feature> featureGenes = MapperUtil.getGeneFeatures(featuresMapper,features);
for (Feature fg : featureGenes) {
featuresToRecurse.addAll(fg.genes);
}
}
for (String feature : featuresToRecurse) {
HierarchicalFeature hf = new HierarchicalFeature();
hf.uniqueName = feature;
Feature f = featureMapper.get(feature, null, null, null);
hf.type = f.type.name;
MapperUtil.searchForRelations(featuresMapper, hf, relationshipTypes, HierarchicalSearchType.CHILDREN);
MapperUtil.searchForRelations(featuresMapper, hf, relationshipTypes, HierarchicalSearchType.PARENTS);
hfs.add(hf);
}
return hfs;
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#coordinates(java.util.List, java.lang.String)
*/
@Override
public List<Feature> coordinates(
List<String> features,
String region ) {
return featuresMapper.coordinates(features, region);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#synonyms(java.util.List, java.util.List)
*/
@Override
public List<Feature> synonyms(
List<String> features,
List<String> types) {
return featuresMapper.synonyms(features, types);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#withnamelike(java.lang.String, boolean, java.lang.String)
*/
@Override
public List<Feature> withnamelike(
String term,
boolean regex,
String region) {
List<Feature> synonyms = featuresMapper.synonymsLike(term, regex, region);
List<Feature> matchingFeatures = featuresMapper.featuresLike(term, regex, region);
matchingFeatures.addAll(synonyms);
return matchingFeatures;
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#properties(java.util.List, java.util.List)
*/
@Override
public List<Feature> properties(
List<String> features,
List<String> types) {
return featuresMapper.properties(features,types);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#withproperty(java.lang.String, boolean, java.lang.String, java.lang.String)
*/
@Override
public List<Feature> withproperty(
String value,
boolean regex,
String region,
String type) {
return featuresMapper.withproperty(value, regex, region, type);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#pubs(java.util.List)
*/
@Override
public List<Feature> pubs(List<String> features) {
return featuresMapper.pubs(features);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#dbxrefs(java.util.List)
*/
@Override
public List<Feature> dbxrefs(List<String> features) {
return featuresMapper.dbxrefs(features);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#terms(java.util.List, java.util.List)
*/
@Override
public List<Feature> terms(List<String> features, List<String> cvs) {
return featuresMapper.terms(features, cvs);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#withterm(java.lang.String, java.lang.String, boolean, java.lang.String)
*/
@Override
public List<Feature> withterm(
String term,
String cv,
boolean regex,
String region) {
logger.info(String.format("%s - %s - %s - %s", term, cv, regex, region));
return featuresMapper.withterm(term, cv, regex, region);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#orthologues(java.util.List)
*/
@Override
public List<Feature> orthologues(List<String> features) {
return featuresMapper.orthologues(features);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#clusters(java.util.List)
*/
@Override
public List<Feature> clusters(List<String> features) {
return featuresMapper.clusters(features);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#annotationModified(java.util.Date, java.lang.String, java.lang.String)
*/
@Override
public List<Feature> annotationModified(
Date date,
String organism,
String region) throws CrawlException {
Organism o = util.getOrganism(organism);
return featuresMapper.annotationModified(date, o.ID, region);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#annotationModifiedStatistics(java.util.Date, java.lang.String, java.lang.String)
*/
@Override
public List<Statistic> annotationModifiedStatistics(
Date date,
String organism,
String region) throws CrawlException {
Organism o = util.getOrganism(organism);
return featuresMapper.annotationModifiedStatistics(date, o.ID, region);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#blastpair(java.lang.String, int, int, java.lang.String, int, int, java.lang.Integer, java.lang.Double)
*/
@Override
public List<BlastPair> blastpair(
String f1,
int start1,
int end1,
String f2,
int start2,
int end2,
Integer length,
Double score) {
logger.info("Filtering on score :");
logger.info(score);
return featuresMapper.blastPairs(f1, start1, end1, f2, start2, end2, length, score);
}
/* (non-Javadoc)
* @see org.genedb.crawl.controller.backend.FeaturesControllerInterface#transcripts(java.lang.String, boolean)
*/
@Override
public List<Gene> transcripts(String gene, boolean exons) {
List<Gene> l = new ArrayList<Gene>();
Gene geneFeature = (Gene) featureMapper.get(gene, null, null, "gene");
if (geneFeature != null) {
logger.info(geneFeature.getClass());
logger.info(geneFeature.uniqueName);
geneFeature.transcripts = featureMapper.transcripts(geneFeature, exons);
logger.info(geneFeature.transcripts);
for (Transcript t : geneFeature.transcripts) {
logger.info(t.uniqueName);
}
l.add(geneFeature);
}
return l;
//return featuresMapper.pubs(features);
}
}