package org.simpleflatmapper.jdbc.named;
import org.simpleflatmapper.jdbc.SizeSupplier;
import org.simpleflatmapper.util.Asserts;
import java.util.ArrayList;
import java.util.List;
public class NamedSqlQuery implements ParameterizedQuery {
private static final SizeSupplier DEFAULT_SIZE_SUPPLIER = new SizeSupplier() {
@Override
public int getSize(int columnIndex) {
return 1;
}
};
private final String sql;
private final NamedParameter[] parameters;
private NamedSqlQuery(String sql, NamedParameter[] parameters) {
this.sql = Asserts.requireNonNull("sql", sql);
this.parameters = Asserts.requireNonNull("parameters", parameters);
}
public static NamedSqlQuery parse(final CharSequence charSequence) {
Asserts.requireNonNull("charSequence", charSequence);
final List<NamedParameter> sqlParameters = new ArrayList<NamedParameter>();
new NamedSqlQueryParser(new NamedSqlQueryParser.Callback() {
@Override
public void param(NamedParameter namedParameter) {
sqlParameters.add(namedParameter);
}
}).parse(charSequence);
return new NamedSqlQuery(
charSequence.toString(),
sqlParameters.toArray(new NamedParameter[0]));
}
public String toSqlQuery() {
return toSqlQuery(DEFAULT_SIZE_SUPPLIER);
}
public String toSqlQuery(SizeSupplier sizeSupplier) {
StringBuilder sb = new StringBuilder(sql.length());
int start = 0;
for(int i = 0; i < parameters.length; i++) {
NamedParameter sqlParameter = parameters[i];
sb.append(sql, start, sqlParameter.getPosition().getStart());
appendParam(sizeSupplier, sb, i);
start = sqlParameter.getPosition().getEnd();
}
sb.append(sql, start, sql.length());
return sb.toString();
}
public void appendParam(SizeSupplier sizeSupplier, StringBuilder sb, int index) {
int size = sizeSupplier.getSize(index);
for(int i = 0; i < size; i++) {
if (i != 0) sb.append(", ");
sb.append("?");
}
}
public int getParametersSize() {
return parameters.length;
}
public NamedParameter getParameter(int i) {
return parameters[i];
}
}