SearchResponse.java

package gov.usgs.earthquake.indexer;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

/**
 * Results from a SearchRequest.
 */
public class SearchResponse {

	/** The queries with results. */
	private final List<SearchQuery> results = new LinkedList<SearchQuery>();

	/**
	 * Construct a new Search response.
	 */
	public SearchResponse() {
	}

	/**
	 * Add a search result to this response.
	 *
	 * @param result a searchQuery result
	 */
	public void addResult(final SearchQuery result) {
		results.add(result);
	}

	/**
	 * @return The search results.
	 */
	public List<SearchQuery> getResults() {
		return results;
	}

	/**
	 * Test by comparing each result.
	 */
	@Override
	public boolean equals(final Object obj) {
		if (!(obj instanceof SearchResponse)) {
			return false;
		}

		SearchResponse that = (SearchResponse) obj;
		if (this.getResults().size() != that.getResults().size()) {
			return false;
		}

		Iterator<SearchQuery> thisIter = this.getResults().iterator();
		Iterator<SearchQuery> thatIter = that.getResults().iterator();
		while (thisIter.hasNext() && thatIter.hasNext()) {
			if (!thisIter.next().equals(thatIter.next())) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Also override hashCode, using hash of result objects.
	 */
	@Override
	public int hashCode() {
		return Objects.hash(this.getResults().toArray());
	}

	/**
	 * Get a distinct list of events from EventDetailQuery results.
	 *
	 * @return List of found events. List will be empty if there were no
	 *         EventDetailQueries, or no matching events were found.
	 */
	public List<Event> getEvents() {
		List<Event> events = new LinkedList<Event>();

		// Get the results out of the SearchRequest and into a list
		Iterator<SearchQuery> iter = getResults().iterator();
		while (iter.hasNext()) {
			SearchQuery query = iter.next();

			if (query instanceof EventDetailQuery) {
				List<Event> queryEvents = ((EventDetailQuery) query)
						.getResult();
				Iterator<Event> queryIter = queryEvents.iterator();
				while (queryIter.hasNext()) {
					Event event = queryIter.next();
					if (!events.contains(event)) {
						// since events may be returned multiple times by
						// search query (one per query).
						events.add(event);
					}
				}
			}
		}

		return events;
	}

}