001/* 002 * BioJava development code 003 * 004 * This code may be freely distributed and modified under the 005 * terms of the GNU Lesser General Public Licence. This should 006 * be distributed with the code. If you do not have a copy, 007 * see: 008 * 009 * http://www.gnu.org/copyleft/lesser.html 010 * 011 * Copyright for this code is held jointly by the individual 012 * authors. These should be listed in @author doc comments. 013 * 014 * For more information on the BioJava project and its aims, 015 * or to join the biojava-l mailing list, visit the home page 016 * at: 017 * 018 * http://www.biojava.org/ 019 * 020 */ 021package org.biojava.nbio.core.search.io; 022 023import java.util.HashMap; 024import java.util.Iterator; 025import java.util.List; 026import java.util.Set; 027import java.util.NoSuchElementException; 028 029import org.biojava.nbio.core.sequence.template.Sequence; 030 031/** 032 * This class models a search result. 033 * You will find one of this for every query sequence specified in the run. 034 * 035 * Designed by Paolo Pavan. 036 * You may want to find my contacts on Github and LinkedIn for code info 037 * or discuss major changes. 038 * https://github.com/paolopavan 039 * 040 * @author Paolo Pavan 041 */ 042 043public abstract class Result implements Iterable<Hit>{ 044 private String program; 045 private String version; 046 private String reference; 047 private String dbFile; 048 049 private HashMap<String,String> programSpecificParameters; 050 051 private int iterationNumber; 052 private String queryID; 053 private String queryDef; 054 private int queryLength; 055 private Sequence querySequence; 056 private List<Hit> hits; 057 private int hitCounter = -1; 058 059 public Result(String program, String version, String reference, String dbFile, HashMap<String, String> programSpecificParameters, int iterationNumber, String queryID, String queryDef, int queryLength, List<Hit> hits, Sequence querySequence) { 060 this.program = program; 061 this.version = version; 062 this.reference = reference; 063 this.dbFile = dbFile; 064 this.programSpecificParameters = programSpecificParameters; 065 this.iterationNumber = iterationNumber; 066 this.queryID = queryID; 067 this.queryDef = queryDef; 068 this.queryLength = queryLength; 069 this.hits = hits; 070 this.querySequence = querySequence; 071 } 072 073 @Override 074 public int hashCode() { 075 int hash = 7; 076 hash = 29 * hash + (this.queryID != null ? this.queryID.hashCode() : 0); 077 hash = 29 * hash + (this.queryDef != null ? this.queryDef.hashCode() : 0); 078 hash = 29 * hash + (this.hits != null ? this.hits.hashCode() : 0); 079 return hash; 080 } 081 /** 082 * Experimental. 083 * Wants to return an hashcode designed to allow conceptual comparisons of search results. 084 * Wants to implement conceptual comparisons of search results. 085 * Fields unrelated to search are deliberately not considered. 086 * @return 087 */ 088 @Override 089 public boolean equals(Object obj) { 090 if (obj == null) { 091 return false; 092 } 093 if (getClass() != obj.getClass()) { 094 return false; 095 } 096 final Result other = (Result) obj; 097 if ((this.queryID == null) ? (other.queryID != null) : !this.queryID.equals(other.queryID)) { 098 return false; 099 } 100 if ((this.queryDef == null) ? (other.queryDef != null) : !this.queryDef.equals(other.queryDef)) { 101 return false; 102 } 103 if (this.hits != other.hits && (this.hits == null || !this.hits.equals(other.hits))) { 104 return false; 105 } 106 return true; 107 } 108 109 public int getIterationNumber() { 110 return iterationNumber; 111 } 112 113 public String getQueryID() { 114 return queryID; 115 } 116 117 public String getQueryDef() { 118 return queryDef; 119 } 120 121 public int getQueryLength() { 122 return queryLength; 123 } 124 125 public int getHitCounter() { 126 return hitCounter; 127 } 128 129 public String getProgram() { 130 return program; 131 } 132 133 public String getVersion() { 134 return version; 135 } 136 137 public String getReference() { 138 return reference; 139 } 140 141 public String getDbFile() { 142 return dbFile; 143 } 144 145 public Set<String> getProgramSpecificParametersList() { 146 return programSpecificParameters.keySet(); 147 } 148 149 public String getProgramSpecificParameter(String key) { 150 return programSpecificParameters.get(key); 151 } 152 /** 153 * returns the reference to the original and whole sequence used to query the database. 154 * Available only if the ResultFactory implements setQueryReferences and 155 * it was used before the parsing with SearchIO 156 * @return Sequence object 157 */ 158 public Sequence getQuerySequence() { 159 return querySequence; 160 } 161 162 @Override 163 public Iterator<Hit> iterator() { 164 return new Iterator<Hit>() { 165 int currentResult = 0; 166 @Override 167 public boolean hasNext() { 168 return currentResult < hits.size(); 169 } 170 171 @Override 172 public Hit next() { 173 if(!hasNext()){ 174 throw new NoSuchElementException(); 175 } 176 return hits.get(currentResult++); 177 } 178 179 @Override 180 public void remove() { 181 throw new UnsupportedOperationException("The remove operation is not supported by this iterator"); 182 } 183 }; 184 } 185}