content: /*
   * Copyright (c) 2009 Andrejs Jermakovics.
   * 
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of the Eclipse Public License v1.0
   * which accompanies this distribution, and is available at
   * http://www.eclipse.org/legal/epl-v10.html
   *
   * Contributors:
   *     Andrejs Jermakovics - initial implementation
   */
  package it.unibz.instasearch.indexing;
  
  import java.util.Map;
  import java.util.Set;
  
  /**
   * A search query
   */
  public class SearchQuery 
  {
  	private String searchString;
  	/**
  	 * maximum number of results to return ({@link #UNLIMITED_RESULTS} for all results)
  	 */
  	private int maxResults = UNLIMITED_RESULTS;
  	private boolean exact = true;
  	private boolean fuzzy = false;
  	private boolean canceled = false;
  	private String currentProject;
  	private Map<Field, Set<String>> filter;
  	
  	/**
  	 * Unlimited search results
  	 */
  	public static final int UNLIMITED_RESULTS = -1;
  	
  	public SearchQuery(String searchString, int maxResults)
  	{
  		this.searchString = searchString;
  		this.maxResults = maxResults;
  	}
  	
  	/**
  	 * 
  	 * @param searchQuery
  	 */
  	public SearchQuery(SearchQuery searchQuery) {
  		this.searchString = searchQuery.searchString;
  		this.maxResults = searchQuery.maxResults;
  		this.fuzzy = searchQuery.fuzzy;
  		this.exact = searchQuery.exact;
  	}
  
  	/**
  	 * @return the searchString
  	 */
  	public String getSearchString()
  	{
  		return searchString;
  	}
  	
  	/**
  	 * @return maxResults
  	 */
  	public int getMaxResults()
  	{
  		return maxResults;
  	}
  	
  	public boolean isLimited() 
  	{
  		return (maxResults != UNLIMITED_RESULTS);
  	}
  	
  	/**
  	 * @param maxResults
  	 */
  	public void setMaxResults(int maxResults)
  	{
  		this.maxResults = maxResults;
  	}
  	
  	/**
  	 * Whether the query is exact or should be split into tokens
  	 * @return the exact
  	 */
  	public boolean isExact()
  	{
  		return exact;
  	}
  	
  	/**
  	 * @param exact Whether the query is exact or should be split into tokens
  	 */
  	public void setExact(boolean exact)
  	{
  		this.exact = exact;
  	}
  	
  	/**
  	 * 
  	 * @return fuzzy
  	 */
  	public boolean isFuzzy() {
  		return fuzzy;
  	}
  	
  	/**
  	 * Make a fuzzy query to find similar matches
  	 * @param fuzzy
  	 */
  	public void setFuzzy(boolean fuzzy) {
  		this.fuzzy = fuzzy;
  	}
  	
  	@Override
  	public boolean equals(Object obj)
  	{
  		if( obj == this ) return true;
  		if( obj == null || ! (obj instanceof SearchQuery) ) return false;
  		
  		SearchQuery sq = (SearchQuery) obj;
  		
  		if( fuzzy != sq.isFuzzy() ) return false;
  		if( exact != sq.isExact() ) return false;
  		if( maxResults != sq.getMaxResults() ) return false;
  		if( ! searchString.equals(sq.getSearchString()) ) return false;
  		if( filter != null && sq.filter != null )
  		{
  			if( ! filter.equals(sq.filter) ) return false;
  		}
  		else if( filter != sq.filter ) return false; // one is null
  		
  		return true; 
  	}
  
  	/**
  	 * Cancel the query during its execution
  	 * @param canceled 
  	 */
  	public void setCanceled(boolean canceled) {
  		 this.canceled = canceled;
  	}
  	
  	/**
  	 * @param searchString the searchString to set
  	 */
  	public void setSearchString(String searchString) {
  		this.searchString = searchString;
  	}
  	
  	/**
  	 * 
  	 * @return true if search query has been canceled
  	 */
  	public boolean isCanceled() {
  		return canceled;
  	}
  	
  	/**
  	 * The project that was active when the query was run
  	 * @return the current Project
  	 */
  	public String getCurrentProject() {
  		return currentProject;
  	}
  	
  	/**
  	 * @param currentProject
  	 */
  	public void setCurrentProject(String currentProject) {
  		this.currentProject = currentProject;
  	}
  
  	/**
  	 * @param filter
  	 */
  	public void setFilter(Map<Field, Set<String>> filter) {
  		 this.filter = filter;
  	}
  	
  	/**
  	 * @return the filter
  	 */
  	public Map<Field, Set<String>> getFilter() {
  		return filter;
  	}
  }
  