22
22
23
23
import org .bson .BsonNull ;
24
24
import org .bson .Document ;
25
-
26
25
import org .springframework .data .domain .Range ;
27
26
import org .springframework .data .domain .Range .Bound ;
28
- import org .springframework .data .util .Streamable ;
29
27
import org .springframework .lang .Nullable ;
30
28
31
29
/**
30
+ * Encapsulation of individual {@link QueryCharacteristic query characteristics} used to define queries that can be
31
+ * executed when using queryable encryption.
32
+ *
32
33
* @author Christoph Strobl
33
34
* @since 4.5
34
35
*/
35
- public class QueryCharacteristics implements Streamable <QueryCharacteristic > {
36
+ public class QueryCharacteristics implements Iterable <QueryCharacteristic > {
36
37
38
+ /**
39
+ * instance indicating none
40
+ */
37
41
private static final QueryCharacteristics NONE = new QueryCharacteristics (Collections .emptyList ());
38
42
39
43
private final List <QueryCharacteristic > characteristics ;
@@ -42,18 +46,36 @@ public class QueryCharacteristics implements Streamable<QueryCharacteristic> {
42
46
this .characteristics = characteristics ;
43
47
}
44
48
49
+ /**
50
+ * @return marker instance indicating no characteristics have been defined.
51
+ */
45
52
public static QueryCharacteristics none () {
46
53
return NONE ;
47
54
}
48
55
56
+ /**
57
+ * Create new {@link QueryCharacteristics} from given list of {@link QueryCharacteristic characteristics}.
58
+ *
59
+ * @param characteristics must not be {@literal null}.
60
+ * @return new instance of {@link QueryCharacteristics}.
61
+ */
49
62
public static QueryCharacteristics of (List <QueryCharacteristic > characteristics ) {
50
63
return new QueryCharacteristics (List .copyOf (characteristics ));
51
64
}
52
65
66
+ /**
67
+ * Create new {@link QueryCharacteristics} from given {@link QueryCharacteristic characteristics}.
68
+ *
69
+ * @param characteristics must not be {@literal null}.
70
+ * @return new instance of {@link QueryCharacteristics}.
71
+ */
53
72
public static QueryCharacteristics of (QueryCharacteristic ... characteristics ) {
54
73
return new QueryCharacteristics (Arrays .asList (characteristics ));
55
74
}
56
75
76
+ /**
77
+ * @return the list of {@link QueryCharacteristic characteristics}.
78
+ */
57
79
public List <QueryCharacteristic > getCharacteristics () {
58
80
return characteristics ;
59
81
}
@@ -63,22 +85,50 @@ public Iterator<QueryCharacteristic> iterator() {
63
85
return this .characteristics .iterator ();
64
86
}
65
87
88
+ /**
89
+ * Create a new {@link RangeQuery range query characteristic} used to define range queries against an encrypted field.
90
+ *
91
+ * @param <T> targeted field type
92
+ * @return new instance of {@link RangeQuery}.
93
+ */
66
94
public static <T > RangeQuery <T > range () {
67
95
return new RangeQuery <>();
68
96
}
69
97
98
+ /**
99
+ * Create a new {@link EqualityQuery equality query characteristic} used to define equality queries against an
100
+ * encrypted field.
101
+ *
102
+ * @param <T> targeted field type
103
+ * @return new instance of {@link EqualityQuery}.
104
+ */
70
105
public static <T > EqualityQuery <T > equality () {
71
106
return new EqualityQuery <>(null );
72
107
}
73
108
109
+ /**
110
+ * {@link QueryCharacteristic} for equality comparison.
111
+ *
112
+ * @param <T>
113
+ * @since 4.5
114
+ */
74
115
public static class EqualityQuery <T > implements QueryCharacteristic {
75
116
76
117
private final @ Nullable Long contention ;
77
118
119
+ /**
120
+ * Create new instance of {@link EqualityQuery}.
121
+ *
122
+ * @param contention can be {@literal null}.
123
+ */
78
124
public EqualityQuery (@ Nullable Long contention ) {
79
125
this .contention = contention ;
80
126
}
81
127
128
+ /**
129
+ * @param contention concurrent counter partition factor.
130
+ * @return new instance of {@link EqualityQuery}.
131
+ */
82
132
public EqualityQuery <T > contention (long contention ) {
83
133
return new EqualityQuery <>(contention );
84
134
}
@@ -94,64 +144,120 @@ public Document toDocument() {
94
144
}
95
145
}
96
146
147
+ /**
148
+ * {@link QueryCharacteristic} for range comparison.
149
+ *
150
+ * @param <T>
151
+ * @since 4.5
152
+ */
97
153
public static class RangeQuery <T > implements QueryCharacteristic {
98
154
99
155
private final @ Nullable Range <T > valueRange ;
100
156
private final @ Nullable Integer trimFactor ;
101
157
private final @ Nullable Long sparsity ;
158
+ private final @ Nullable Long precision ;
102
159
private final @ Nullable Long contention ;
103
160
104
161
private RangeQuery () {
105
- this (Range .unbounded (), null , null , null );
162
+ this (Range .unbounded (), null , null , null , null );
106
163
}
107
164
165
+ /**
166
+ * Create new instance of {@link RangeQuery}.
167
+ *
168
+ * @param valueRange
169
+ * @param trimFactor
170
+ * @param sparsity
171
+ * @param contention
172
+ */
108
173
public RangeQuery (@ Nullable Range <T > valueRange , @ Nullable Integer trimFactor , @ Nullable Long sparsity ,
109
- @ Nullable Long contention ) {
174
+ @ Nullable Long precision , @ Nullable Long contention ) {
110
175
this .valueRange = valueRange ;
111
176
this .trimFactor = trimFactor ;
112
177
this .sparsity = sparsity ;
178
+ this .precision = precision ;
113
179
this .contention = contention ;
114
180
}
115
181
116
- @ Override
117
- public String queryType () {
118
- return "range" ;
119
- }
120
-
182
+ /**
183
+ * @param lower the lower value range boundary for the queryable field.
184
+ * @return new instance of {@link RangeQuery}.
185
+ */
121
186
public RangeQuery <T > min (T lower ) {
122
187
123
188
Range <T > range = Range .of (Bound .inclusive (lower ),
124
189
valueRange != null ? valueRange .getUpperBound () : Bound .unbounded ());
125
- return new RangeQuery <>(range , trimFactor , sparsity , contention );
190
+ return new RangeQuery <>(range , trimFactor , sparsity , precision , contention );
126
191
}
127
192
193
+ /**
194
+ * @param upper the upper value range boundary for the queryable field.
195
+ * @return new instance of {@link RangeQuery}.
196
+ */
128
197
public RangeQuery <T > max (T upper ) {
129
198
130
199
Range <T > range = Range .of (valueRange != null ? valueRange .getLowerBound () : Bound .unbounded (),
131
200
Bound .inclusive (upper ));
132
- return new RangeQuery <>(range , trimFactor , sparsity , contention );
201
+ return new RangeQuery <>(range , trimFactor , sparsity , precision , contention );
133
202
}
134
203
204
+ /**
205
+ * @param trimFactor value to control the throughput of concurrent inserts and updates.
206
+ * @return new instance of {@link RangeQuery}.
207
+ */
135
208
public RangeQuery <T > trimFactor (int trimFactor ) {
136
- return new RangeQuery <>(valueRange , trimFactor , sparsity , contention );
209
+ return new RangeQuery <>(valueRange , trimFactor , sparsity , precision , contention );
137
210
}
138
211
212
+ /**
213
+ * @param sparsity value to control the value density within the index.
214
+ * @return new instance of {@link RangeQuery}.
215
+ */
139
216
public RangeQuery <T > sparsity (long sparsity ) {
140
- return new RangeQuery <>(valueRange , trimFactor , sparsity , contention );
217
+ return new RangeQuery <>(valueRange , trimFactor , sparsity , precision , contention );
141
218
}
142
219
220
+ /**
221
+ * @param contention concurrent counter partition factor.
222
+ * @return new instance of {@link RangeQuery}.
223
+ */
143
224
public RangeQuery <T > contention (long contention ) {
144
- return new RangeQuery <>(valueRange , trimFactor , sparsity , contention );
225
+ return new RangeQuery <>(valueRange , trimFactor , sparsity , precision , contention );
226
+ }
227
+
228
+ /**
229
+ * @param precision digits considered comparing floating point numbers.
230
+ * @return new instance of {@link RangeQuery}.
231
+ */
232
+ public RangeQuery <T > precision (long precision ) {
233
+ return new RangeQuery <>(valueRange , trimFactor , sparsity , precision , contention );
234
+ }
235
+
236
+ @ Override
237
+ public String queryType () {
238
+ return "range" ;
145
239
}
146
240
147
241
@ Override
148
242
@ SuppressWarnings ("unchecked" )
149
243
public Document toDocument () {
150
244
151
- return QueryCharacteristic .super .toDocument ().append ("contention" , contention ).append ("trimFactor" , trimFactor )
152
- .append ("sparsity" , sparsity ).append ("min" , valueRange .getLowerBound ().getValue ().orElse ((T ) BsonNull .VALUE ))
153
- .append ("max" , valueRange .getUpperBound ().getValue ().orElse ((T ) BsonNull .VALUE ));
245
+ Document target = QueryCharacteristic .super .toDocument ();
246
+ if (contention != null ) {
247
+ target .append ("contention" , contention );
248
+ }
249
+ if (trimFactor != null ) {
250
+ target .append ("trimFactor" , trimFactor );
251
+ }
252
+ if (valueRange != null ) {
253
+ target .append ("min" , valueRange .getLowerBound ().getValue ().orElse ((T ) BsonNull .VALUE )).append ("max" ,
254
+ valueRange .getUpperBound ().getValue ().orElse ((T ) BsonNull .VALUE ));
255
+ }
256
+ if (sparsity != null ) {
257
+ target .append ("sparsity" , sparsity );
258
+ }
259
+
260
+ return target ;
154
261
}
155
262
}
156
-
157
263
}
0 commit comments