// Path: src/main/java/in/cubestack/android/lib/storm/FetchType.java
// public enum FetchType {
// 
// 	EAGER, LAZY;
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/SortOrder.java
// public enum SortOrder {
//     ASC,
//     DESC
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Order.java
// public class Order {
// 
// 	private SortOrder sortOrder;
// 	private String orderSql;
// 	private TableInformation information;
// 	private QueryGenerator queryGenerator = new QueryGenerator();
// 
// 	public Order(SortOrder order, TableInformation information) {
// 		this.sortOrder = order;
// 		this.information = information;
// 	}
// 
// 	public static <T> Order orderFor(Class<T> entity, String[] props, SortOrder sortOrder) {
// 		try {
// 			TableInformation information = EntityMetaDataCache.getMetaData(entity);
// 			Order order = new Order(sortOrder, information);
// 			validate(props, information);
// 			order.addProperty(props);
// 			return order;
// 		} catch (Exception e) {
// 			throw new StormRuntimeException("Invalid entity, please check your mapppings for " + entity, e);
// 		}
// 	}
// 
// 	private static void validate(String[] props, TableInformation tabInformation) {
// 		for(String prop: props) {
// 			ColumnMetaData columnInfo = tabInformation.getColumnMetaData(prop);
// 			if(columnInfo == null) {
// 				throw new StormRuntimeException("Could not find column mapped to alias " + prop +". Pl check your mapppings for " + tabInformation.getMappedClass());
// 			}
// 		}
// 	}
// 
// 	public void addProperty(String[] props) {
// 		orderSql = queryGenerator.orderBy(props, information, sortOrder);
// 	}
// 
// 	public String orderSql() {
// 		return orderSql;
// 	}
// 
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Projection.java
// public interface Projection {
// 	
// 	Projection add(String property);
// 	
// 	Projection sum(String property);
// 	
// 	Projection count(String property);
// 
// 	Projection max(String property);
// 	
// 	Projection min(String property);
// 
// 	Projection average(String property);
// 
// 	Projection total(String property);
// 	
// 	List<SQLFunction> getAggregateFunctions() ;
// 	List<String> getColumns();
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Restriction.java
// public interface Restriction {
// 
// 	public String toSqlString();
// 
// 	boolean valueStored();
// 
// 	String[] values();
// 
// 	Restriction page(int page);
// 
// 	Restriction limit(int offset, int limit);
// 
// 	public Object sqlString(Order order);
// 	
// 	public TableInformation getTableInformation();
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/SQLFunction.java
// public interface SQLFunction {
// 
// 	public String toSqlString();
// }


import in.cubestack.android.lib.storm.FetchType;
import in.cubestack.android.lib.storm.SortOrder;
import in.cubestack.android.lib.storm.criteria.Order;
import in.cubestack.android.lib.storm.criteria.Projection;
import in.cubestack.android.lib.storm.criteria.Restriction;
import in.cubestack.android.lib.storm.criteria.SQLFunction;


	public String insertQuery(TableInformation tableInformation, boolean autoGenerate) throws IllegalArgumentException, IllegalAccessException,
			InstantiationException {
		StringBuilder insert = new StringBuilder(INSERT_INTO).append(tableInformation.getTableName()).append(OPEN_BRACES);

		if ( ! autoGenerate) {
			insert.append(tableInformation.getPrimaryKeyData().getColumnName()).append(COMMA);
		}

		for (ColumnMetaData columnMetaData : tableInformation.getColumnMetaDataList()) {
			insert.append(columnMetaData.getColumnName()).append(COMMA);
		}

		insert = new StringBuilder(insert.substring(0, insert.length() - 1));

		insert.append(CLOSE_BRACES).append(VALUES);

		if (! autoGenerate) {
			insert.append(QUESTION_MARK).append(COMMA);
		}

		for (int columns = 0; columns < tableInformation.getColumnMetaDataList().size(); columns++) {
			insert.append(QUESTION_MARK).append(COMMA);
		}
		insert = new StringBuilder(insert.substring(0, insert.length() - 1));

		// Primary Key
		return insert.append(CLOSE_BRACES).toString();
	}


// Path: src/main/java/in/cubestack/android/lib/storm/FetchType.java
// public enum FetchType {
// 
// 	EAGER, LAZY;
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/SortOrder.java
// public enum SortOrder {
//     ASC,
//     DESC
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Order.java
// public class Order {
// 
// 	private SortOrder sortOrder;
// 	private String orderSql;
// 	private TableInformation information;
// 	private QueryGenerator queryGenerator = new QueryGenerator();
// 
// 	public Order(SortOrder order, TableInformation information) {
// 		this.sortOrder = order;
// 		this.information = information;
// 	}
// 
// 	public static <T> Order orderFor(Class<T> entity, String[] props, SortOrder sortOrder) {
// 		try {
// 			TableInformation information = EntityMetaDataCache.getMetaData(entity);
// 			Order order = new Order(sortOrder, information);
// 			validate(props, information);
// 			order.addProperty(props);
// 			return order;
// 		} catch (Exception e) {
// 			throw new StormRuntimeException("Invalid entity, please check your mapppings for " + entity, e);
// 		}
// 	}
// 
// 	private static void validate(String[] props, TableInformation tabInformation) {
// 		for(String prop: props) {
// 			ColumnMetaData columnInfo = tabInformation.getColumnMetaData(prop);
// 			if(columnInfo == null) {
// 				throw new StormRuntimeException("Could not find column mapped to alias " + prop +". Pl check your mapppings for " + tabInformation.getMappedClass());
// 			}
// 		}
// 	}
// 
// 	public void addProperty(String[] props) {
// 		orderSql = queryGenerator.orderBy(props, information, sortOrder);
// 	}
// 
// 	public String orderSql() {
// 		return orderSql;
// 	}
// 
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Projection.java
// public interface Projection {
// 	
// 	Projection add(String property);
// 	
// 	Projection sum(String property);
// 	
// 	Projection count(String property);
// 
// 	Projection max(String property);
// 	
// 	Projection min(String property);
// 
// 	Projection average(String property);
// 
// 	Projection total(String property);
// 	
// 	List<SQLFunction> getAggregateFunctions() ;
// 	List<String> getColumns();
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/Restriction.java
// public interface Restriction {
// 
// 	public String toSqlString();
// 
// 	boolean valueStored();
// 
// 	String[] values();
// 
// 	Restriction page(int page);
// 
// 	Restriction limit(int offset, int limit);
// 
// 	public Object sqlString(Order order);
// 	
// 	public TableInformation getTableInformation();
// }
// 
// Path: src/main/java/in/cubestack/android/lib/storm/criteria/SQLFunction.java
// public interface SQLFunction {
// 
// 	public String toSqlString();
// }


// Path: src/main/java/in/cubestack/android/lib/storm/core/QueryGenerator.java
import in.cubestack.android.lib.storm.FetchType;
import in.cubestack.android.lib.storm.SortOrder;
import in.cubestack.android.lib.storm.criteria.Order;
import in.cubestack.android.lib.storm.criteria.Projection;
import in.cubestack.android.lib.storm.criteria.Restriction;
import in.cubestack.android.lib.storm.criteria.SQLFunction;


	public String insertQuery(TableInformation tableInformation, boolean autoGenerate) throws IllegalArgumentException, IllegalAccessException,
			InstantiationException {
		StringBuilder insert = new StringBuilder(INSERT_INTO).append(tableInformation.getTableName()).append(OPEN_BRACES);

		if ( ! autoGenerate) {
			insert.append(tableInformation.getPrimaryKeyData().getColumnName()).append(COMMA);
		}

		for (ColumnMetaData columnMetaData : tableInformation.getColumnMetaDataList()) {
			insert.append(columnMetaData.getColumnName()).append(COMMA);
		}

		insert = new StringBuilder(insert.substring(0, insert.length() - 1));

		insert.append(CLOSE_BRACES).append(VALUES);

		if (! autoGenerate) {
			insert.append(QUESTION_MARK).append(COMMA);
		}

		for (int columns = 0; columns < tableInformation.getColumnMetaDataList().size(); columns++) {
			insert.append(QUESTION_MARK).append(COMMA);
		}
		insert = new StringBuilder(insert.substring(0, insert.length() - 1));

		// Primary Key
		return insert.append(CLOSE_BRACES).toString();
	}


	public String orderBy(String[] props, TableInformation information, SortOrder order) {
