/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jdbi.v3.core.statement;
import static org.jdbi.v3.core.internal.JdbiStreams.toStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.jdbi.v3.core.argument.Argument;
import org.jdbi.v3.core.argument.NamedArgumentFinder;
Represents the arguments bound to a particular statement.
/**
* Represents the arguments bound to a particular statement.
*/
public class Binding {
private final Map<Integer, Argument> positionals = new HashMap<>();
private final Map<String, Argument> named = new HashMap<>();
private final List<NamedArgumentFinder> namedArgumentFinder = new ArrayList<>();
Bind a positional parameter at the given index (0-based)
Params: - position – binding position
- argument – the argument to bind
/**
* Bind a positional parameter at the given index (0-based)
* @param position binding position
* @param argument the argument to bind
*/
public void addPositional(int position, Argument argument) {
positionals.put(position, argument);
}
Bind a named parameter for the given name
Params: - name – bound argument name
- argument – the argument to bind
/**
* Bind a named parameter for the given name
* @param name bound argument name
* @param argument the argument to bind
*/
public void addNamed(String name, Argument argument) {
this.named.put(name, argument);
}
Bind a named argument finder
Params: - args – the argument finder to bind
/**
* Bind a named argument finder
* @param args the argument finder to bind
*/
public void addNamedArgumentFinder(NamedArgumentFinder args) {
namedArgumentFinder.add(args);
}
Look up an argument by name
Params: - name – the key to lookup the value of
- ctx – the statement context
Returns: the bound Argument
/**
* Look up an argument by name
*
* @param name the key to lookup the value of
* @param ctx the statement context
*
* @return the bound Argument
*/
public Optional<Argument> findForName(String name, StatementContext ctx) {
if (named.containsKey(name)) {
return Optional.of(named.get(name));
}
return namedArgumentFinder.stream()
.flatMap(arguments -> toStream(arguments.find(name, ctx)))
.findFirst();
}
Look up an argument by position
Params: - position – starts at 0, not 1
Returns: argument bound to that position
/**
* Look up an argument by position
*
* @param position starts at 0, not 1
*
* @return argument bound to that position
*/
public Optional<Argument> findForPosition(int position) {
return Optional.ofNullable(positionals.get(position));
}
@Override
public String toString() {
boolean wrote = false;
StringBuilder b = new StringBuilder();
b.append("{ positional:{");
for (Map.Entry<Integer, Argument> entry : positionals.entrySet()) {
wrote = true;
b.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
}
if (wrote) {
wrote = false;
b.deleteCharAt(b.length() - 1);
}
b.append("}");
b.append(", named:{");
for (Map.Entry<String, Argument> entry : named.entrySet()) {
wrote = true;
b.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
}
if (wrote) {
wrote = false;
b.deleteCharAt(b.length() - 1);
}
b.append("}");
b.append(", finder:[");
for (NamedArgumentFinder argument : namedArgumentFinder) {
wrote = true;
b.append(argument).append(",");
}
if (wrote) {
b.deleteCharAt(b.length() - 1);
}
b.append("]");
b.append("}");
return b.toString();
}
Remove all bindings from this Binding.
/**
* Remove all bindings from this Binding.
*/
public void clear() {
positionals.clear();
named.clear();
namedArgumentFinder.clear();
}
Returns: true if there are no bindings yet
/**
* @return true if there are no bindings yet
*/
public boolean isEmpty() {
return positionals.isEmpty() && named.isEmpty() && namedArgumentFinder.isEmpty();
}
}