package net.ttddyy.dsproxy;
import net.ttddyy.dsproxy.proxy.ParameterSetOperation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @author Tadaya Tsuyukubo
*/
public class QueryInfoBuilder {
private static final Method DUMMY_METHOD;
static {
try {
DUMMY_METHOD = Object.class.getMethod("toString");
} catch (NoSuchMethodException e) {
throw new RuntimeException("Failed to register dummy method", e);
}
}
private String query;
private Map<String, Object> queryArgs = new LinkedHashMap<String, Object>();
// key:batch-index, val: map of query args
private SortedMap<Integer, Map<String, Object>> batchParams = new TreeMap<Integer, Map<String, Object>>();
public static QueryInfoBuilder create() {
return new QueryInfoBuilder();
}
public QueryInfoBuilder query(String query) {
this.query = query;
return this;
}
public QueryInfoBuilder param(int parameterIndex, Object value) {
return this.param(Integer.toString(parameterIndex), value);
}
public QueryInfoBuilder param(String parameterName, Object value) {
queryArgs.put(parameterName, value);
return this;
}
public QueryInfoBuilder batchParam(int batchIndex, int parameterName, Object value) {
return this.batchParam(batchIndex, Integer.toString(parameterName), value);
}
public QueryInfoBuilder batchParam(int batchIndex, String parameterIndex, Object value) {
Map<String, Object> args = batchParams.get(batchIndex);
if (args == null) {
args = new LinkedHashMap<String, Object>();
batchParams.put(batchIndex, args);
}
args.put(parameterIndex, value);
return this;
}
public QueryInfo build() {
QueryInfo queryInfo = new QueryInfo();
queryInfo.setQuery(query);
// query parameters
if (!batchParams.isEmpty()) { // consider it's batch mode
// already ordered by batchIndex
for (Map<String, Object> map : batchParams.values()) {
List<ParameterSetOperation> params = new ArrayList<ParameterSetOperation>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
ParameterSetOperation param = new ParameterSetOperation();
param.setArgs(new Object[]{entry.getKey(), entry.getValue()});
param.setMethod(DUMMY_METHOD);
params.add(param);
}
queryInfo.getParametersList().add(params);
}
} else {
List<ParameterSetOperation> params = new ArrayList<ParameterSetOperation>();
for (Map.Entry<String, Object> entry : queryArgs.entrySet()) {
ParameterSetOperation param = new ParameterSetOperation();
param.setArgs(new Object[]{entry.getKey(), entry.getValue()});
param.setMethod(DUMMY_METHOD);
params.add(param);
}
queryInfo.getParametersList().add(params);
}
return queryInfo;
}
}