package org.jooq.impl;
import java.sql.SQLException;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.jooq.BindContext;
import org.jooq.Configuration;
import org.jooq.Field;
import org.jooq.Param;
import org.jooq.QueryPart;
import org.jooq.QueryPartInternal;
import org.jooq.tools.StringUtils;
final class ParamCollector extends AbstractBindContext {
final Map<String, Param<?>> resultFlat = new LinkedHashMap<>();
final Map<String, List<Param<?>>> result = new LinkedHashMap<>();
final List<Entry<String, Param<?>>> resultList = new ArrayList<>();
private final boolean includeInlinedParams;
ParamCollector(Configuration configuration, boolean includeInlinedParams) {
super(configuration, null);
this.includeInlinedParams = includeInlinedParams;
}
@Override
protected final void bindInternal(QueryPartInternal internal) {
if (internal instanceof Param) {
Param<?> param = (Param<?>) internal;
if (includeInlinedParams || !param.isInline()) {
String i = String.valueOf(nextIndex());
String paramName = param.getParamName();
if (StringUtils.isBlank(paramName)) {
resultFlat.put(i, param);
resultList.add(new SimpleImmutableEntry<>(i, param));
result(i).add(param);
}
else {
resultFlat.put(param.getParamName(), param);
resultList.add(new SimpleImmutableEntry<>(param.getParamName(), param));
result(param.getParamName()).add(param);
}
}
}
else {
super.bindInternal(internal);
}
}
private final List<Param<?>> result(String key) {
List<Param<?>> list = result.get(key);
if (list == null) {
list = new ArrayList<>();
result.put(key, list);
}
return list;
}
@Override
protected final BindContext bindValue0(Object value, Field<?> field) throws SQLException {
throw new UnsupportedOperationException();
}
}