package com.jay.sql.builder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.jay.sql.builder.vo.ParameterizedSQL;
import com.jay.sql.builder.vo.TradeFilter;
public class SQLConditionBuilder {
public static ParameterizedSQL buildSQL(TradeFilter filter) {
Map<String, Object> paramMap = new HashMap<String, Object>();
String conditionSQL = buildConditionSQL(paramMap, filter);
ParameterizedSQL parameterizedSQL = new ParameterizedSQL("select * from trade_event where");
parameterizedSQL.appendSQL(conditionSQL);
parameterizedSQL.addParam(paramMap);
return parameterizedSQL;
}
private static String buildConditionSQL(Map<String, Object> paramMap, TradeFilter filter) {
Collection<String> sqlSegments = getCurrentLayerConditionSQL(paramMap, filter);
return joinByAND(sqlSegments);
}
private static String joinByAND(Collection<String> sqlSegments) {
StringBuilder builder = new StringBuilder();
if (sqlSegments.size() == 1) {
for (String sql : sqlSegments) {
builder.append(sql);
}
} else {
for (String sql : sqlSegments) {
builder.append("(").append(sql).append(")").append(" AND ");
}
removeEndKeyWord(builder, " AND ");
}
return builder.toString();
}
private static void removeEndKeyWord(StringBuilder builder, String keyWord) {
if (builder.lastIndexOf(keyWord) == builder.length() - keyWord.length()) {
builder.delete(builder.length() - keyWord.length(), builder.length());
}
}
public static Collection<String> getCurrentLayerConditionSQL(Map<String, Object> paramMap, TradeFilter filter) {
Collection<String> currentLayerCondition = new ArrayList<String>();
enrich(paramMap, currentLayerCondition, "trade_event.client_id", "=", filter.getClientID());
enrich(paramMap, currentLayerCondition, "trade_event.system_id", "=", filter.getSystemID());
enrich(paramMap, currentLayerCondition, "trade_event.client_platform", "=", filter.getClientPlatform());
enrich(paramMap, currentLayerCondition, "trade_event.po_group", "=", filter.getPOGroup());
enrich(paramMap, currentLayerCondition, "trade_event.counterParty", "=", filter.getCounterParty());
Collection<Collection<TradeFilter>> anyTradeFilters = filter.getAnyTradeFilters();
for (Collection<TradeFilter> anyTradeFilter : anyTradeFilters) {
String sql = joinByOR(paramMap, anyTradeFilter);
currentLayerCondition.add(sql);
}
return currentLayerCondition;
}
private static void enrich(Map<String, Object> paramMap, Collection<String> currentLayerCondition, String columeName, String comparator, String value) {
if (value == null) {
return;
}
currentLayerCondition.add(new StringBuilder().append(columeName).append(comparator).append(":").append(columeName).toString());
paramMap.put(":" + columeName, value);
}
private static String joinByOR(Map<String, Object> paramMap, Collection<TradeFilter> anyTradeFilter) {
StringBuilder builder = new StringBuilder();
if (anyTradeFilter.size() == 1) {
for (TradeFilter orFilter : anyTradeFilter) {
builder.append(buildConditionSQL(paramMap, orFilter));
}
} else {
for (TradeFilter orFilter : anyTradeFilter) {
builder.append("(").append(buildConditionSQL(paramMap, orFilter)).append(")").append(" OR ");
}
removeEndKeyWord(builder, " OR ");
}
String sql = builder.toString();
return sql;
}
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("you AND hihi AND ");
removeEndKeyWord(builder, " AND ");
System.out.println(builder.toString());
}
}