Coverage Summary for Class: Parameters (net.sf.persism)
Class |
Class, %
|
Method, %
|
Line, %
|
Parameters |
100%
(1/1)
|
100%
(15/15)
|
100%
(47/47)
|
1 package net.sf.persism;
2
3 import java.util.*;
4
5 /**
6 * Helper Class to represent parameters to a query.
7 */
8 public final class Parameters {
9
10 private static final Log log = Log.getLogger(Parameters.class);
11
12 List<Object> parameters;
13 Map<String, Object> namedParameters;
14 Map<String, List<Integer>> parameterMap;
15
16 boolean areKeys = false;
17 boolean areNamed = false;
18
19 private static final Parameters none = new Parameters();
20
21 // Default constructor for empty parameters or for constructing a parameter list. For internal use.
22 Parameters() {
23 this.parameters = new ArrayList<>();
24 }
25
26 // this version is internal. The static method is the better way to call this.
27 Parameters(Object... parameters) {
28 this.parameters = new ArrayList<>(Arrays.asList(parameters));
29 }
30
31 Parameters(Map<String, Object> params) {
32 this();
33 areNamed = true;
34 namedParameters = params;
35 }
36
37 /**
38 * Static initializer for a new set of Parameters.
39 * <pre>{@code
40 * Employee employee = session.fetch(Employee.class, sql("SELECT * FROM Employees WHERE LastName=? and FirstName=?"), params("Leverling", "Janet"));
41 * }</pre>
42 *
43 * @param values varargs list of arbitrary parameters for a query.
44 * @return new Parameters object
45 */
46 public static Parameters params(Object... values) {
47 return new Parameters(values);
48 }
49
50 /**
51 * Static initializer for named parameters.
52 * <pre>{@code
53 * List<Contact> contacts;
54 * contacts = session.query(Contact.class,
55 * where("(:firstname = @name OR :company = @name) and :lastname = @last and :city = @city and :amountOwed > @owe ORDER BY :dateAdded"),
56 * params(Map.of("name", "Fred", "last", "Flintstone", "owe", 10, "city", "Somewhere")));
57 * }</pre>
58 *
59 * @param nameValuePair - use Map.of("key1", value, "key2", value) etc.
60 * @return new Parameters object
61 */
62 public static Parameters params(Map<String, Object> nameValuePair) {
63 return new Parameters(nameValuePair);
64 }
65
66 /**
67 * Represents no Parameters.
68 *
69 * @return empty array instance of Parameters
70 */
71 public static Parameters none() {
72 return none;
73 }
74
75 int size() {
76 return parameters.size();
77 }
78
79 void add(Object parameter) {
80 parameters.add(parameter);
81 }
82
83 Object get(int index) {
84 return parameters.get(index);
85 }
86
87 void set(int index, Object parameter) {
88 parameters.set(index, parameter);
89 }
90
91 void setParameterMap(Map<String, List<Integer>> parameterMap) {
92 this.parameterMap = parameterMap;
93
94 assert areNamed;
95
96 // find largest index
97 int max = 0;
98 for (List<Integer> integers : parameterMap.values()) {
99 Optional<Integer> x = integers.stream().max(Integer::compare);
100 if (x.isPresent() && x.get() > max) {
101 max = x.get();
102 }
103 }
104
105 log.debug("setParameterMap MAX? %d", max);
106 Object[] arr = new Object[max];
107 Set<String> paramsNotFound = new TreeSet<>();
108
109 parameterMap.keySet().forEach((key) -> {
110 if (namedParameters.containsKey(key)) {
111 Object value = namedParameters.get(key);
112
113 List<Integer> list = parameterMap.get(key);
114 for (Integer integer : list) {
115 arr[integer - 1] = value;
116 }
117 } else {
118 paramsNotFound.add(key);
119 }
120 });
121
122 Set<String> mistypeSet = new TreeSet<>(namedParameters.keySet());
123 mistypeSet.removeAll(parameterMap.keySet());
124
125 if (paramsNotFound.size() > 0) {
126 throw new PersismException(Message.QueryParameterNamesMissingOrNotFound.message(paramsNotFound, mistypeSet));
127 }
128 parameters.clear();
129 parameters.addAll(Arrays.asList(arr));
130 }
131
132 Object[] toArray() {
133 return parameters.toArray();
134 }
135
136 /**
137 * @hidden
138 */
139 @Override
140 public String toString() {
141 return "" + parameters;
142 }
143 }