Coverage Summary for Class: Parameters (net.sf.persism)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
| Parameters |
100%
(1/1)
|
100%
(15/15)
|
85.7%
(12/14)
|
100%
(44/44)
|
package net.sf.persism;
import java.util.*;
/**
* Helper Class to represent parameters to a query.
*/
public final class Parameters {
private static final Log log = Log.getLogger(Parameters.class);
List<Object> parameters;
Map<String, Object> namedParameters;
Map<String, List<Integer>> parameterMap;
boolean areKeys = false;
boolean areNamed = false;
private static final Parameters none = new Parameters();
// Default constructor for empty parameters or for constructing a parameter list. For internal use.
Parameters() {
this.parameters = new ArrayList<>();
}
// this version is internal. The static method is the better way to call this.
Parameters(Object... parameters) {
this.parameters = new ArrayList<>(Arrays.asList(parameters));
}
Parameters(Map<String, Object> params) {
this();
areNamed = true;
namedParameters = params;
}
/**
* Static initializer for a new set of Parameters.
* <pre>{@code
* Employee employee = session.fetch(Employee.class, sql("SELECT * FROM Employees WHERE LastName=? and FirstName=?"), params("Leverling", "Janet"));
* }</pre>
*
* @param values varargs list of arbitrary parameters for a query.
* @return new Parameters object
*/
public static Parameters params(Object... values) {
return new Parameters(values);
}
/**
* Static initializer for named parameters.
* <pre>{@code
* List<Contact> contacts;
* contacts = session.query(Contact.class,
* where("(:firstname = @name OR :company = @name) and :lastname = @last and :city = @city and :amountOwed > @owe ORDER BY :dateAdded"),
* params(Map.of("name", "Fred", "last", "Flintstone", "owe", 10, "city", "Somewhere")));
* }</pre>
*
* @param nameValuePair - use Map.of("key1", value, "key2", value) etc.
* @return new Parameters object
*/
public static Parameters params(Map<String, Object> nameValuePair) {
return new Parameters(nameValuePair);
}
/**
* Represents no Parameters.
*
* @return empty array instance of Parameters
*/
public static Parameters none() {
return none;
}
int size() {
return parameters.size();
}
void add(Object parameter) {
parameters.add(parameter);
}
Object get(int index) {
return parameters.get(index);
}
void set(int index, Object parameter) {
parameters.set(index, parameter);
}
void setParameterMap(Map<String, List<Integer>> parameterMap) {
this.parameterMap = parameterMap;
assert areNamed;
// find largest index
int max = 0;
for (List<Integer> integers : parameterMap.values()) {
Optional<Integer> x = integers.stream().max(Integer::compare);
if (x.isPresent() && x.get() > max) {
max = x.get();
}
}
log.debug("setParameterMap MAX? %d", max);
Object[] arr = new Object[max];
Set<String> paramsNotFound = new TreeSet<>();
parameterMap.keySet().forEach((key) -> {
if (namedParameters.containsKey(key)) {
Object value = namedParameters.get(key);
List<Integer> list = parameterMap.get(key);
for (Integer integer : list) {
arr[integer - 1] = value;
}
} else {
paramsNotFound.add(key);
}
});
Set<String> mistypeSet = new TreeSet<>(namedParameters.keySet());
mistypeSet.removeAll(parameterMap.keySet());
if (!paramsNotFound.isEmpty()) {
throw new PersismException(Message.QueryParameterNamesMissingOrNotFound.message(paramsNotFound, mistypeSet));
}
parameters.clear();
parameters.addAll(Arrays.asList(arr));
}
Object[] toArray() {
return parameters.toArray();
}
/**
* @hidden
*/
@Override
public String toString() {
return "" + parameters;
}
}