package com.turtleplayer.persistance.source.sql.query;
import com.turtleplayer.persistance.source.relational.Field;
import com.turtleplayer.persistance.source.relational.View;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* TURTLE PLAYER
* <p/>
* Licensed under MIT & GPL
* <p/>
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
* <p/>
* More Information @ www.turtle-player.co.uk
*
* @author Simon Honegger (Hoene84)
*/
public class Select implements Sql
{
private final String sql;
private WhereClause whereClause;
private OrderClause orderClause;
private Limit limit;
public enum SelectMethod{
NORMAL,
COUNT,
DISTINCT
}
public Select(View view)
{
this.sql = "SELECT * FROM " + getTableList(view);
}
public Select(View view, Field... fields)
{
this(view, SelectMethod.NORMAL, fields);
}
public Select(View view, SelectMethod selectMethod, Field... fields)
{
this.sql = "SELECT " +
getFieldsList(selectMethod, fields) +
" FROM " + getTableList(view);
}
private String getFieldsList(SelectMethod selectMethod, Field... fields)
{
switch (selectMethod)
{
case NORMAL:
return new FieldsPart(Arrays.asList(fields)).toSql();
case COUNT:
return " COUNT(" + new FieldsPart(Arrays.asList(fields)).toSql() + ")";
case DISTINCT:
return " DISTINCT " + new FieldsPart(Arrays.asList(fields)).toSql() + " ";
default:
throw new RuntimeException("Implement SelectMethod " + selectMethod.name());
}
}
private String getTableList(View view)
{
return new TablesPart(view.getTables()).toSql();
}
public String toSql()
{
return sql
+ (whereClause != null ? " WHERE " + whereClause.toSql() : "")
+ (orderClause != null ? " ORDER BY " + orderClause.toSql() : "")
+ (limit != null ? limit.toSql() : "");
}
public List<Object> getParams()
{
List<Object> params = new ArrayList<Object>();
params.addAll(whereClause != null ? whereClause.getParams() : new ArrayList<Object>());
return params;
}
public void setWhereClause(WhereClause whereClause)
{
this.whereClause = whereClause;
}
public void setOrderClause(OrderClause orderClause)
{
this.orderClause = orderClause;
}
public void setLimit(Limit limit){
this.limit = limit;
}
}