package org.genedb.querying.tmpquery;
import org.genedb.db.taxon.TaxonNodeList;
import org.genedb.db.taxon.TaxonNodeManager;
import org.genedb.querying.core.LuceneQuery;
import org.genedb.querying.core.QueryParam;
import org.gmod.schema.cfg.OrganismHeirachy;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import java.util.List;
public abstract class OrganismLuceneQuery extends LuceneQuery implements TaxonQuery {
private static final long serialVersionUID = -1581819678507010911L;
private static final Logger logger = Logger.getLogger(OrganismLuceneQuery.class);
protected static final TermQuery isCurrentQuery = new TermQuery(new Term("obsolete", "false"));
protected static final TermQuery geneQuery = new TermQuery(new Term("type.name","gene"));
protected static final TermQuery pseudogeneQuery = new TermQuery(new Term("type.name","pseudogene"));
protected static final BooleanQuery geneOrPseudogeneQuery = new BooleanQuery();
static {
geneOrPseudogeneQuery.add(geneQuery, Occur.SHOULD);
geneOrPseudogeneQuery.add(pseudogeneQuery, Occur.SHOULD);
}
protected static final TermQuery mRNAQuery = new TermQuery(new Term("type.name", "mRNA"));
protected static final TermQuery pseudogenicTranscriptQuery = new TermQuery(new Term("type.name","pseudogenic_transcript"));
protected BooleanQuery productiveTranscriptQuery = new BooleanQuery();
private transient OrganismHeirachy organismHeirachy;
@Autowired
protected transient TaxonNodeManager taxonNodeManager;
@QueryParam(
order=3,
title="Organism restriction"
)
protected TaxonNodeList taxons;
@Autowired
public void setOrganismHeirachy(OrganismHeirachy organismHeirachy) {
this.organismHeirachy = organismHeirachy;
for (Integer id : organismHeirachy.getIds()) {
productiveTranscriptQuery.add(new TermQuery(new Term("type.cvTermId", "" + id)), Occur.SHOULD);
}
}
/* (non-Javadoc)
* @see org.genedb.querying.tmpquery.TaxonQuery#getTaxons()
*/
public TaxonNodeList getTaxons() {
return taxons;
}
/* (non-Javadoc)
* @see org.genedb.querying.tmpquery.TaxonQuery#setTaxons(org.genedb.db.taxon.TaxonNode[])
*/
public void setTaxons(TaxonNodeList taxons) {
logger.info("The taxons in setTaxons is '"+taxons.getNodes().get(0)+"'");
this.taxons = taxons;
}
@Override
protected void getQueryTerms(List<Query> queries) {
getQueryTermsWithoutOrganisms(queries);
if (taxons==null) {
throw new NullPointerException();
}
makeQueryForOrganisms(taxons, queries);
}
abstract protected void getQueryTermsWithoutOrganisms(List<Query> queries);
private void makeQueryForOrganisms(TaxonNodeList taxons, List<org.apache.lucene.search.Query> queries) {
logger.info("The taxons in makeQueryFO is '"+taxons.getNodes().get(0)+"'");
List<String> taxonNames = taxonNodeManager.getNamesListForTaxons(taxons);
if (taxonNames.size() == 0) {
return;
}
BooleanQuery organismQuery = new BooleanQuery();
for (String organism : taxonNames) {
organismQuery.add(new TermQuery(new Term("organism.commonName",organism)), Occur.SHOULD);
}
queries.add(organismQuery);
}
// @Override
// protected GeneSummary convertDocumentToReturnType(Document document) {
// GeneSummary ret = new GeneSummary(
// document.get("uniqueName"), // systematic
// document.get("organism.commonName"), // taxon-name,
// document.get("product"), // product
// document.get("chr"), // toplevename
// Integer.parseInt(document.get("start")) // leftpos
// );
// return ret;
// }
@Override
protected void extraValidation(Errors errors) {
// Deliberately empty
}
/**
* Replace all lucene reserved characters by escaping them
* @param searchText
* @return escaped searchText
*/
protected String escapseSearchText(String searchText){
if (!StringUtils.isEmpty(searchText)){
String escapeChars ="[\\\\+\\-\\!\\(\\)\\:\\^\\]\\{\\}\\~\\*\\?]";
String escaped = searchText.replaceAll(escapeChars, "\\\\$0");
return escaped;
}
return searchText;
}
}