package com.fp.dto.query;

import java.io.Serializable;

/**
 * Objeto que contiene la definicion de un subquery asociado a un bean.
 *
 * @author Jorge Vaca.
 * @version 2.1
 */
public class SubQuery implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * Nombre del bean, asociado a una tabla a utilziar en el subquery.
	 */
	private String beanname;
	/**
	 * Campo a consultar en el subquery.
	 */
	private String field;
	/**
	 * Nombre con el cual se entrega la respuesta, si el alias es null toma el valor de campo.
	 */
	private String alias;
	/**
	 * Where con el cual se ejecuta el subquery. <br>
	 * Ejemplo considera i.pk.pais = t.pk.pais and i.provincia = t.provincia.<br>
	 * siempre va (i) para el bean del subquery y (t) para la tabla externa.
	 */
	private String where;

	/**
	 * Crea una instancia de SubQuery.
	 * @param beanname Nombre del bean con el que se realiza el subquery.
	 * @param campo Nombre de campo a consultar.
	 * @param alias Alias con el cual se entrega la respuesta.
	 * @param filtro Filtro a utilziar en el subquery.
	 * @throws Exception
	 */
	public SubQuery(String beanname, String field, String alias, String joinFields) throws Exception {
		this.beanname = beanname;
		this.field = field;
		this.alias = alias;
		if (this.alias == null) {
			this.alias = this.field;
		}
		where = " where " + joinFields;
	}

	public String getSubQuery() throws Exception {
		return "(select i." + field + " from " + beanname + " i " + where + ")";
	}

	/**
	 * Entrega el valor de: beanname
	 * @return String
	 */
	public String getBeanname() {
		return beanname;
	}

	/**
	 * Fija el valor de: beanname 
	 * @param Valor a fijar en el atributo.
	 */
	public void setBeanname(String beanname) {
		this.beanname = beanname;
	}

	/**
	 * Entrega el valor de: field
	 * @return String
	 */
	public String getField() {
		return field;
	}

	/**
	 * Fija el valor de: field 
	 * @param Valor a fijar en el atributo.
	 */
	public void setField(String field) {
		this.field = field;
	}

	/**
	 * Entrega el valor de: alias
	 * @return String
	 */
	public String getAlias() {
		return alias;
	}

	/**
	 * Fija el valor de: alias 
	 * @param Valor a fijar en el atributo.
	 */
	public void setAlias(String alias) {
		this.alias = alias;
	}

	/**
	 * Entrega el valor de: where
	 * @return String
	 */
	public String getWhere() {
		return where;
	}

	/**
	 * Fija el valor de: where 
	 * @param Valor a fijar en el atributo.
	 */
	public void setWhere(String where) {
		this.where = where;
	}

	
	
}
