16
16
17
17
package com .mongodb .client .model ;
18
18
19
+ import com .mongodb .lang .Nullable ;
20
+ import org .bson .BsonArray ;
21
+ import org .bson .BsonDocument ;
22
+ import org .bson .BsonString ;
23
+
24
+ import java .util .List ;
25
+
26
+ import static java .util .stream .Collectors .toList ;
27
+
19
28
/**
20
29
* Builders for accumulators used in the group pipeline stage of an aggregation pipeline.
21
30
*
@@ -38,7 +47,7 @@ public final class Accumulators {
38
47
* @mongodb.driver.manual reference/operator/aggregation/sum/ $sum
39
48
*/
40
49
public static <TExpression > BsonField sum (final String fieldName , final TExpression expression ) {
41
- return accumulator ("$sum" , fieldName , expression );
50
+ return accumulatorOperator ("$sum" , fieldName , expression );
42
51
}
43
52
44
53
/**
@@ -52,7 +61,7 @@ public static <TExpression> BsonField sum(final String fieldName, final TExpress
52
61
* @mongodb.driver.manual reference/operator/aggregation/avg/ $avg
53
62
*/
54
63
public static <TExpression > BsonField avg (final String fieldName , final TExpression expression ) {
55
- return accumulator ("$avg" , fieldName , expression );
64
+ return accumulatorOperator ("$avg" , fieldName , expression );
56
65
}
57
66
58
67
/**
@@ -66,7 +75,7 @@ public static <TExpression> BsonField avg(final String fieldName, final TExpress
66
75
* @mongodb.driver.manual reference/operator/aggregation/first/ $first
67
76
*/
68
77
public static <TExpression > BsonField first (final String fieldName , final TExpression expression ) {
69
- return accumulator ("$first" , fieldName , expression );
78
+ return accumulatorOperator ("$first" , fieldName , expression );
70
79
}
71
80
72
81
/**
@@ -80,7 +89,7 @@ public static <TExpression> BsonField first(final String fieldName, final TExpre
80
89
* @mongodb.driver.manual reference/operator/aggregation/last/ $last
81
90
*/
82
91
public static <TExpression > BsonField last (final String fieldName , final TExpression expression ) {
83
- return accumulator ("$last" , fieldName , expression );
92
+ return accumulatorOperator ("$last" , fieldName , expression );
84
93
}
85
94
86
95
/**
@@ -94,7 +103,7 @@ public static <TExpression> BsonField last(final String fieldName, final TExpres
94
103
* @mongodb.driver.manual reference/operator/aggregation/max/ $max
95
104
*/
96
105
public static <TExpression > BsonField max (final String fieldName , final TExpression expression ) {
97
- return accumulator ("$max" , fieldName , expression );
106
+ return accumulatorOperator ("$max" , fieldName , expression );
98
107
}
99
108
100
109
/**
@@ -108,7 +117,7 @@ public static <TExpression> BsonField max(final String fieldName, final TExpress
108
117
* @mongodb.driver.manual reference/operator/aggregation/min/ $min
109
118
*/
110
119
public static <TExpression > BsonField min (final String fieldName , final TExpression expression ) {
111
- return accumulator ("$min" , fieldName , expression );
120
+ return accumulatorOperator ("$min" , fieldName , expression );
112
121
}
113
122
114
123
/**
@@ -122,7 +131,7 @@ public static <TExpression> BsonField min(final String fieldName, final TExpress
122
131
* @mongodb.driver.manual reference/operator/aggregation/push/ $push
123
132
*/
124
133
public static <TExpression > BsonField push (final String fieldName , final TExpression expression ) {
125
- return accumulator ("$push" , fieldName , expression );
134
+ return accumulatorOperator ("$push" , fieldName , expression );
126
135
}
127
136
128
137
/**
@@ -136,7 +145,7 @@ public static <TExpression> BsonField push(final String fieldName, final TExpres
136
145
* @mongodb.driver.manual reference/operator/aggregation/addToSet/ $addToSet
137
146
*/
138
147
public static <TExpression > BsonField addToSet (final String fieldName , final TExpression expression ) {
139
- return accumulator ("$addToSet" , fieldName , expression );
148
+ return accumulatorOperator ("$addToSet" , fieldName , expression );
140
149
}
141
150
142
151
/**
@@ -155,7 +164,7 @@ public static <TExpression> BsonField addToSet(final String fieldName, final TEx
155
164
* @since 3.2
156
165
*/
157
166
public static <TExpression > BsonField stdDevPop (final String fieldName , final TExpression expression ) {
158
- return accumulator ("$stdDevPop" , fieldName , expression );
167
+ return accumulatorOperator ("$stdDevPop" , fieldName , expression );
159
168
}
160
169
161
170
/**
@@ -173,10 +182,125 @@ public static <TExpression> BsonField stdDevPop(final String fieldName, final TE
173
182
* @since 3.2
174
183
*/
175
184
public static <TExpression > BsonField stdDevSamp (final String fieldName , final TExpression expression ) {
176
- return accumulator ("$stdDevSamp" , fieldName , expression );
185
+ return accumulatorOperator ("$stdDevSamp" , fieldName , expression );
186
+ }
187
+
188
+ /**
189
+ * Creates an $accumulator pipeline stage
190
+ *
191
+ * @param fieldName the field name
192
+ * @param initFunction a function used to initialize the state
193
+ * @param accumulateFunction a function used to accumulate documents
194
+ * @param mergeFunction a function used to merge two internal states, e.g. accumulated on different shards or threads. It
195
+ * returns the resulting state of the accumulator.
196
+ * @return the $accumulator pipeline stage
197
+ * @mongodb.driver.manual reference/operator/aggregation/accumulator/ $accumulator
198
+ * @mongodb.server.release 4.4
199
+ * @since 4.1
200
+ */
201
+ public static BsonField accumulator (final String fieldName , final String initFunction , final String accumulateFunction ,
202
+ final String mergeFunction ) {
203
+ return accumulator (fieldName , initFunction , null , accumulateFunction , null , mergeFunction , null , "js" );
204
+ }
205
+
206
+ /**
207
+ * Creates an $accumulator pipeline stage
208
+ *
209
+ * @param fieldName the field name
210
+ * @param initFunction a function used to initialize the state
211
+ * @param accumulateFunction a function used to accumulate documents
212
+ * @param mergeFunction a function used to merge two internal states, e.g. accumulated on different shards or threads. It
213
+ * returns the resulting state of the accumulator.
214
+ * @param finalizeFunction a function used to finalize the state and return the result (may be null)
215
+ * @return the $accumulator pipeline stage
216
+ * @mongodb.driver.manual reference/operator/aggregation/accumulator/ $accumulator
217
+ * @mongodb.server.release 4.4
218
+ * @since 4.1
219
+ */
220
+ public static BsonField accumulator (final String fieldName , final String initFunction , final String accumulateFunction ,
221
+ final String mergeFunction , @ Nullable final String finalizeFunction ) {
222
+ return accumulator (fieldName , initFunction , null , accumulateFunction , null , mergeFunction , finalizeFunction , "js" );
223
+ }
224
+
225
+ /**
226
+ * Creates an $accumulator pipeline stage
227
+ *
228
+ * @param fieldName the field name
229
+ * @param initFunction a function used to initialize the state
230
+ * @param initArgs init function’s arguments (may be null)
231
+ * @param accumulateFunction a function used to accumulate documents
232
+ * @param accumulateArgs additional accumulate function’s arguments (may be null). The first argument to the function
233
+ * is ‘state’.
234
+ * @param mergeFunction a function used to merge two internal states, e.g. accumulated on different shards or threads. It
235
+ * returns the resulting state of the accumulator.
236
+ * @param finalizeFunction a function used to finalize the state and return the result (may be null)
237
+ * @return the $accumulator pipeline stage
238
+ * @mongodb.driver.manual reference/operator/aggregation/accumulator/ $accumulator
239
+ * @mongodb.server.release 4.4
240
+ * @since 4.1
241
+ */
242
+ public static BsonField accumulator (final String fieldName , final String initFunction , @ Nullable final List <String > initArgs ,
243
+ final String accumulateFunction , @ Nullable final List <String > accumulateArgs ,
244
+ final String mergeFunction , @ Nullable final String finalizeFunction ) {
245
+ return accumulator (fieldName , initFunction , initArgs , accumulateFunction , accumulateArgs , mergeFunction , finalizeFunction , "js" );
246
+ }
247
+
248
+ /**
249
+ * Creates an $accumulator pipeline stage
250
+ *
251
+ * @param fieldName the field name
252
+ * @param initFunction a function used to initialize the state
253
+ * @param accumulateFunction a function used to accumulate documents
254
+ * @param mergeFunction a function used to merge two internal states, e.g. accumulated on different shards or threads. It
255
+ * returns the resulting state of the accumulator.
256
+ * @param finalizeFunction a function used to finalize the state and return the result (may be null)
257
+ * @param lang a language specifier
258
+ * @return the $accumulator pipeline stage
259
+ * @mongodb.driver.manual reference/operator/aggregation/accumulator/ $accumulator
260
+ * @mongodb.server.release 4.4
261
+ * @since 4.1
262
+ */
263
+ public static BsonField accumulator (final String fieldName , final String initFunction , final String accumulateFunction ,
264
+ final String mergeFunction , @ Nullable final String finalizeFunction , final String lang ) {
265
+ return accumulator (fieldName , initFunction , null , accumulateFunction , null , mergeFunction , finalizeFunction , lang );
266
+ }
267
+
268
+ /**
269
+ * Creates an $accumulator pipeline stage
270
+ *
271
+ * @param fieldName the field name
272
+ * @param initFunction a function used to initialize the state
273
+ * @param initArgs init function’s arguments (may be null)
274
+ * @param accumulateFunction a function used to accumulate documents
275
+ * @param accumulateArgs additional accumulate function’s arguments (may be null). The first argument to the function
276
+ * is ‘state’.
277
+ * @param mergeFunction a function used to merge two internal states, e.g. accumulated on different shards or threads. It
278
+ * returns the resulting state of the accumulator.
279
+ * @param finalizeFunction a function used to finalize the state and return the result (may be null)
280
+ * @param lang a language specifier
281
+ * @return the $accumulator pipeline stage
282
+ * @mongodb.driver.manual reference/operator/aggregation/accumulator/ $accumulator
283
+ * @mongodb.server.release 4.4
284
+ * @since 4.1
285
+ */
286
+ public static BsonField accumulator (final String fieldName , final String initFunction , @ Nullable final List <String > initArgs ,
287
+ final String accumulateFunction , @ Nullable final List <String > accumulateArgs ,
288
+ final String mergeFunction , @ Nullable final String finalizeFunction , final String lang ) {
289
+ BsonDocument accumulatorStage = new BsonDocument ("init" , new BsonString (initFunction ))
290
+ .append ("initArgs" , initArgs != null ? new BsonArray (initArgs .stream ().map (initArg ->
291
+ new BsonString (initArg )).collect (toList ())) : new BsonArray ())
292
+ .append ("accumulate" , new BsonString (accumulateFunction ))
293
+ .append ("accumulateArgs" , accumulateArgs != null ? new BsonArray (accumulateArgs .stream ().map (accumulateArg ->
294
+ new BsonString (accumulateArg )).collect (toList ())) : new BsonArray ())
295
+ .append ("merge" , new BsonString (mergeFunction ))
296
+ .append ("lang" , new BsonString (lang ));
297
+ if (finalizeFunction != null ) {
298
+ accumulatorStage .append ("finalize" , new BsonString (finalizeFunction ));
299
+ }
300
+ return accumulatorOperator ("$accumulator" , fieldName , accumulatorStage );
177
301
}
178
302
179
- private static <TExpression > BsonField accumulator (final String name , final String fieldName , final TExpression expression ) {
303
+ private static <TExpression > BsonField accumulatorOperator (final String name , final String fieldName , final TExpression expression ) {
180
304
return new BsonField (fieldName , new SimpleExpression <TExpression >(name , expression ));
181
305
}
182
306
0 commit comments