@@ -46,17 +46,19 @@ public class CollectionOptions {
46
46
private @ Nullable Collation collation ;
47
47
private ValidationOptions validationOptions ;
48
48
private @ Nullable TimeSeriesOptions timeSeriesOptions ;
49
+ private @ Nullable CollectionChangeStreamOptions changeStreamOptions ;
49
50
50
51
private CollectionOptions (@ Nullable Long size , @ Nullable Long maxDocuments , @ Nullable Boolean capped ,
51
52
@ Nullable Collation collation , ValidationOptions validationOptions ,
52
- @ Nullable TimeSeriesOptions timeSeriesOptions ) {
53
+ @ Nullable TimeSeriesOptions timeSeriesOptions , @ Nullable CollectionChangeStreamOptions changeStreamOptions ) {
53
54
54
55
this .maxDocuments = maxDocuments ;
55
56
this .size = size ;
56
57
this .capped = capped ;
57
58
this .collation = collation ;
58
59
this .validationOptions = validationOptions ;
59
60
this .timeSeriesOptions = timeSeriesOptions ;
61
+ this .changeStreamOptions = changeStreamOptions ;
60
62
}
61
63
62
64
/**
@@ -70,7 +72,7 @@ public static CollectionOptions just(Collation collation) {
70
72
71
73
Assert .notNull (collation , "Collation must not be null" );
72
74
73
- return new CollectionOptions (null , null , null , collation , ValidationOptions .none (), null );
75
+ return new CollectionOptions (null , null , null , collation , ValidationOptions .none (), null , null );
74
76
}
75
77
76
78
/**
@@ -80,7 +82,7 @@ public static CollectionOptions just(Collation collation) {
80
82
* @since 2.0
81
83
*/
82
84
public static CollectionOptions empty () {
83
- return new CollectionOptions (null , null , null , null , ValidationOptions .none (), null );
85
+ return new CollectionOptions (null , null , null , null , ValidationOptions .none (), null , null );
84
86
}
85
87
86
88
/**
@@ -97,6 +99,18 @@ public static CollectionOptions timeSeries(String timeField) {
97
99
return empty ().timeSeries (TimeSeriesOptions .timeSeries (timeField ));
98
100
}
99
101
102
+ /**
103
+ * Quick way to set up {@link CollectionOptions} for emitting (pre & post) change events.
104
+ *
105
+ * @return new instance of {@link CollectionOptions}.
106
+ * @see #changeStream(CollectionChangeStreamOptions)
107
+ * @see CollectionChangeStreamOptions#preAndPostImages(boolean)
108
+ * @since 4.0
109
+ */
110
+ public static CollectionOptions emitChangedRevisions () {
111
+ return empty ().changeStream (CollectionChangeStreamOptions .preAndPostImages (true ));
112
+ }
113
+
100
114
/**
101
115
* Create new {@link CollectionOptions} with already given settings and capped set to {@literal true}. <br />
102
116
* <strong>NOTE</strong> Using capped collections requires defining {@link #size(long)}.
@@ -105,7 +119,7 @@ public static CollectionOptions timeSeries(String timeField) {
105
119
* @since 2.0
106
120
*/
107
121
public CollectionOptions capped () {
108
- return new CollectionOptions (size , maxDocuments , true , collation , validationOptions , null );
122
+ return new CollectionOptions (size , maxDocuments , true , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
109
123
}
110
124
111
125
/**
@@ -116,7 +130,7 @@ public CollectionOptions capped() {
116
130
* @since 2.0
117
131
*/
118
132
public CollectionOptions maxDocuments (long maxDocuments ) {
119
- return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions );
133
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
120
134
}
121
135
122
136
/**
@@ -127,7 +141,7 @@ public CollectionOptions maxDocuments(long maxDocuments) {
127
141
* @since 2.0
128
142
*/
129
143
public CollectionOptions size (long size ) {
130
- return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions );
144
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
131
145
}
132
146
133
147
/**
@@ -138,7 +152,7 @@ public CollectionOptions size(long size) {
138
152
* @since 2.0
139
153
*/
140
154
public CollectionOptions collation (@ Nullable Collation collation ) {
141
- return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions );
155
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
142
156
}
143
157
144
158
/**
@@ -258,7 +272,7 @@ public CollectionOptions schemaValidationAction(ValidationAction validationActio
258
272
public CollectionOptions validation (ValidationOptions validationOptions ) {
259
273
260
274
Assert .notNull (validationOptions , "ValidationOptions must not be null" );
261
- return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions );
275
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
262
276
}
263
277
264
278
/**
@@ -271,7 +285,20 @@ public CollectionOptions validation(ValidationOptions validationOptions) {
271
285
public CollectionOptions timeSeries (TimeSeriesOptions timeSeriesOptions ) {
272
286
273
287
Assert .notNull (timeSeriesOptions , "TimeSeriesOptions must not be null" );
274
- return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions );
288
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
289
+ }
290
+
291
+ /**
292
+ * Create new {@link CollectionOptions} with the given {@link TimeSeriesOptions}.
293
+ *
294
+ * @param changeStreamOptions must not be {@literal null}.
295
+ * @return new instance of {@link CollectionOptions}.
296
+ * @since 3.3
297
+ */
298
+ public CollectionOptions changeStream (CollectionChangeStreamOptions changeStreamOptions ) {
299
+
300
+ Assert .notNull (changeStreamOptions , "ChangeStreamOptions must not be null" );
301
+ return new CollectionOptions (size , maxDocuments , capped , collation , validationOptions , timeSeriesOptions , changeStreamOptions );
275
302
}
276
303
277
304
/**
@@ -332,6 +359,16 @@ public Optional<TimeSeriesOptions> getTimeSeriesOptions() {
332
359
return Optional .ofNullable (timeSeriesOptions );
333
360
}
334
361
362
+ /**
363
+ * Get the {@link CollectionChangeStreamOptions} if available.
364
+ *
365
+ * @return {@link Optional#empty()} if not specified.
366
+ * @since 4.0
367
+ */
368
+ public Optional <CollectionChangeStreamOptions > getChangeStreamOptions () {
369
+ return Optional .ofNullable (changeStreamOptions );
370
+ }
371
+
335
372
/**
336
373
* Encapsulation of ValidationOptions options.
337
374
*
@@ -428,6 +465,34 @@ boolean isEmpty() {
428
465
}
429
466
}
430
467
468
+ /**
469
+ * Encapsulation of options applied to define collections change stream behaviour.
470
+ *
471
+ * @author Christoph Strobl
472
+ * @since 4.0
473
+ */
474
+ public static class CollectionChangeStreamOptions {
475
+
476
+ private final boolean preAndPostImages ;
477
+
478
+ private CollectionChangeStreamOptions (boolean emitChangedRevisions ) {
479
+ this .preAndPostImages = emitChangedRevisions ;
480
+ }
481
+
482
+ /**
483
+ * Output the version of a document before and after changes (the document pre- and post-images).
484
+ *
485
+ * @return new instance of {@link CollectionChangeStreamOptions}.
486
+ */
487
+ public static CollectionChangeStreamOptions preAndPostImages (boolean emitChangedRevisions ) {
488
+ return new CollectionChangeStreamOptions (true );
489
+ }
490
+
491
+ public boolean getPreAndPostImages () {
492
+ return preAndPostImages ;
493
+ }
494
+ }
495
+
431
496
/**
432
497
* Options applicable to Time Series collections.
433
498
*
0 commit comments