package org.genedb.querying.tmpquery; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Hashtable; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.genedb.querying.core.QueryException; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; public class TopLevelFeaturesQuery extends OrganismLuceneQuery { @XStreamAlias("feature") public static class TopLevelFeature { @XStreamAlias("length") @XStreamAsAttribute public int length; @XStreamAlias("name") @XStreamAsAttribute public String name; } @Override public String getQueryDescription() { return "Returns the top level features in an organism."; } @Override public String getQueryName() { return "Top Level Features"; } @Override protected void getQueryTermsWithoutOrganisms(List<Query> queries) { BooleanQuery bq = new BooleanQuery(); } @Override protected String getluceneIndexName() { return "org.gmod.schema.mapped.Feature"; } @Override protected String[] getParamNames() { return new String[] {}; } @Override @SuppressWarnings("unchecked") public List getResults() throws QueryException { Hashtable <String, TopLevelFeature> results = new Hashtable<String, TopLevelFeature>(); try { TopDocs topDocs = lookupInLucene(); for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = fetchDocument(scoreDoc.doc); Field chr = document.getField("chr"); Field chrlen = document.getField("chrlen"); String chrValue = chr.stringValue(); if (results.containsKey(chrValue)) { continue; } Integer chrlenValue = Integer.parseInt(chrlen.stringValue()); //System.out.println(chrValue + " :: " + chrlenValue); TopLevelFeature top = new TopLevelFeature(); top.length = chrlenValue; top.name = chrValue; results.put(chrValue, top); } List<TopLevelFeature> tops = new ArrayList<TopLevelFeature>(results.values()); Collections.sort(tops, new TopLevelFeatureSorter()); if(luceneIndex.getMaxResults() == tops.size()){ isActualResultSizeSameAsMax = true; } return tops; } catch (CorruptIndexException exp) { throw new QueryException(exp); } catch (IOException exp) { throw new QueryException(exp); } } private class TopLevelFeatureSorter implements Comparator<TopLevelFeature> { @Override public int compare(TopLevelFeature f1, TopLevelFeature f2) { return f1.name.compareTo(f2.name); } } }