package org.genedb.querying.tmpquery; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.ConstantScoreRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.genedb.querying.core.QueryClass; import org.genedb.querying.core.QueryParam; import org.springframework.validation.Errors; @QueryClass( title="Transcripts by their type", shortDesc="Get a list of transcripts by type", longDesc="" ) public class GeneLocationQuery extends OrganismLuceneQuery { private transient Logger logger = Logger.getLogger(GeneLocationQuery.class); private static final long serialVersionUID = 215988209964782170L; @QueryParam( order=1, title="Name of feature" ) private String topLevelFeatureName; @QueryParam( order=2, title="Min coordinate" ) private int min; @QueryParam( order=3, title="Max coordinate" ) private int max; @QueryParam(order = 4, title = "Include pseudogenes") private boolean pseudogenes; @Override public String getQueryDescription() { return "Search for a gene by specifing its location on a chromosome, contig or other top level feature."; } @Override public String getQueryName() { return "Location"; } // ------ Autogenerated code below here public void setTopLevelFeatureName(String topLevelFeatureName) { logger.info("setting top level feature name " + topLevelFeatureName); this.topLevelFeatureName = topLevelFeatureName; } public String getTopLevelFeatureName() { return topLevelFeatureName; } public int getMin() { return min; } public int getMax() { return max; } public void setMin(int min) { logger.info("setting min " + min); this.min = min; } public void setMax(int max) { logger.info("setting max " + max); this.max = max; } public boolean isPseudogenes() { return pseudogenes; } public void setPseudogenes(boolean pseudogenes) { this.pseudogenes = pseudogenes; } @Override protected String[] getParamNames() { return new String[] {"topLevelFeatureName", "min", "max", "pseudogenes"}; } @Override protected void extraValidation(Errors errors) { //validate dependent properties if (!errors.hasErrors()) { if (getMin() > getMax()) { errors.reject("start.greater.than.end"); } } } @Override public Map<String, Object> prepareModelData() { Map<String, Object> map = new HashMap<String, Object>(); map.put("topLevelFeatureName", topLevelFeatureName); map.put("min", min); map.put("max", max); map.put("pseudogenes", pseudogenes); logger.info("model : " + map); return map; } @Override protected void getQueryTermsWithoutOrganisms(List<Query> queries) { BooleanQuery isInRegionAndIsOverlap = new BooleanQuery(); TermQuery isInRegion = new TermQuery(new Term("chr", topLevelFeatureName)); BooleanQuery spansBothSides = new BooleanQuery(); ConstantScoreRangeQuery startLowerThanRequested = new ConstantScoreRangeQuery("start", null, String.format("%09d", min), true, true); ConstantScoreRangeQuery endHigherThanRequested = new ConstantScoreRangeQuery("stop", String.format("%09d", max), null, true, true); spansBothSides.add(startLowerThanRequested, Occur.MUST); spansBothSides.add(endHigherThanRequested, Occur.MUST); BooleanQuery isInsideRange = new BooleanQuery(); // numeric_start >= start && numeric_end <= end ConstantScoreRangeQuery startQuery = new ConstantScoreRangeQuery("start", String.format("%09d", min), String.format("%09d", max), true, true); ConstantScoreRangeQuery endQuery = new ConstantScoreRangeQuery("stop", String.format("%09d", min), String.format("%09d", max), true, true); isInsideRange.add(startQuery, Occur.SHOULD); isInsideRange.add(endQuery, Occur.SHOULD); BooleanQuery isOverlap = new BooleanQuery(); isOverlap.add(spansBothSides, Occur.SHOULD); isOverlap.add(isInsideRange, Occur.SHOULD); isInRegionAndIsOverlap.add(isInRegion, Occur.MUST); isInRegionAndIsOverlap.add(isOverlap, Occur.MUST); queries.add(isInRegionAndIsOverlap); if (pseudogenes) { queries.add(productiveTranscriptQuery); } else { queries.add(mRNAQuery); } } @Override protected String getluceneIndexName() { return "org.gmod.schema.mapped.Feature"; } }