/*
* 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 java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.jdbi.v3.core.argument.Argument;
import org.jdbi.v3.core.argument.NamedArgumentFinder;
import org.jdbi.v3.core.argument.internal.TypedValue;
import org.jdbi.v3.core.internal.JdbiOptionals;
import org.jdbi.v3.core.qualifier.QualifiedType;
import static org.jdbi.v3.core.statement.ArgumentBinder.unwrap;
Represents the arguments bound to a particular statement.
/**
* Represents the arguments bound to a particular statement.
*/
public class Binding {
protected final Map<Integer, Object> positionals = new HashMap<>();
protected final Map<String, Object> named = new HashMap<>();
protected final List<NamedArgumentFinder> namedArgumentFinder = new ArrayList<>();
private final StatementContext ctx;
protected Binding(StatementContext ctx) {
this.ctx = ctx;
}
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) {
addPositional(position, (Object) 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) {
addNamed(name, (Object) argument);
}
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, Object 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, Object argument) {
named.put(name, argument);
}
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, Object argument, QualifiedType<?> type) {
positionals.put(position, new TypedValue(type, 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, Object argument, QualifiedType<?> type) {
named.put(name, new TypedValue(type, 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
- ctx2 – the statement context
Deprecated: don't inspect a Binding: keep your own state! Returns: the bound Argument
/**
* Look up an argument by name.
*
* @param name the key to lookup the value of
* @param ctx2 the statement context
*
* @deprecated don't inspect a Binding: keep your own state!
* @return the bound Argument
*/
@Deprecated
public Optional<Argument> findForName(String name, StatementContext ctx2) {
final Object found = named.get(name);
if (found != null || named.containsKey(name)) {
return Optional.of(new ArgumentBinder<>(null, ctx2, ParsedParameters.NONE).toArgument(found));
}
return namedArgumentFinder.stream()
.flatMap(arguments -> JdbiOptionals.stream(arguments.find(name, ctx2)))
.findFirst();
}
Returns: the set of known binding names Deprecated: this is expensive to compute, and it's bad practice to inspect a Binding: keep track of your own state!
/**
* @return the set of known binding names
* @deprecated this is expensive to compute, and it's bad practice to inspect a Binding: keep track of your own state!
*/
@Deprecated
public Collection<String> getNames() {
final Set<String> names = new HashSet<>(named.keySet());
namedArgumentFinder.forEach(args -> names.addAll(args.getNames()));
return Collections.unmodifiableSet(names);
}
Look up an argument by position.
Params: - position – starts at 0, not 1
Deprecated: don't inspect a Binding: keep your own state! Returns: argument bound to that position
/**
* Look up an argument by position.
*
* @param position starts at 0, not 1
* @deprecated don't inspect a Binding: keep your own state!
* @return argument bound to that position
*/
@Deprecated
public Optional<Argument> findForPosition(int position) {
return Optional.ofNullable(new ArgumentBinder<>(null, ctx, ParsedParameters.NONE).toArgument(positionals.get(position)));
}
@Override
public String toString() {
String positionalsDescription = positionals.entrySet().stream()
.map(x -> x.getKey().toString() + ':' + unwrap(x.getValue()))
.collect(Collectors.joining(","));
String namedDescription = named.entrySet().stream()
.map(x -> x.getKey() + ':' + unwrap(x.getValue()))
.collect(Collectors.joining(","));
String found = namedArgumentFinder.stream()
.map(Object::toString)
.collect(Collectors.joining(","));
return "{positional:{" + positionalsDescription + "}, named:{" + namedDescription + "}, finder:[" + found + "]}";
}
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();
}
}