@@ -37,7 +37,7 @@ public final class OperationHelper {
3737
3838 private static final String ID_FIELD = "_id" ;
3939 private static final String DATA_BEFORE_FIELD = "beforeData" ;
40- private static final String DATA_AFTER_FIELD = "data" ;
40+ private static final String DATA_FIELD = "data" ;
4141 private static final String MESSAGE_FIELD = "message" ;
4242 private static final String HEADERS_FIELD = "headers" ;
4343 private static final String OPERATION_FIELD = "operation" ;
@@ -95,7 +95,7 @@ static BsonDocument createFilterDocument(final BsonDocument keyDocument) {
9595 .orElseGet (() -> new BsonDocument (ID_FIELD , new BsonObjectId ()));
9696 }
9797
98- static BsonDocument createFilterDocument (
98+ static BsonDocument createUpdateFilterDocument (
9999 final BsonDocument keyDocument , final BsonDocument valueDocument ) {
100100 BsonDocument filter =
101101 getFilterFromKeyDocument (keyDocument )
@@ -114,10 +114,31 @@ static BsonDocument createFilterDocument(
114114 return filter ;
115115 }
116116
117+ static BsonDocument createDeleteFilterDocument (
118+ final BsonDocument keyDocument , final BsonDocument valueDocument ) {
119+ BsonDocument filter =
120+ getFilterFromKeyDocument (keyDocument )
121+ .orElseGet (
122+ () -> {
123+ BsonDocument messageDocument =
124+ getSubDocumentOrOriginal (MESSAGE_FIELD , valueDocument );
125+ return getSubDocumentNotNullOrOriginal (
126+ DATA_BEFORE_FIELD ,
127+ getSubDocumentNotNullOrOriginal (DATA_FIELD , messageDocument ));
128+ });
129+ if (filter .isEmpty ()) {
130+ throw new DataException (
131+ format (
132+ "Error: Value Document does not contain the expected data, cannot create filter: %s." ,
133+ valueDocument .toJson ()));
134+ }
135+ return filter ;
136+ }
137+
117138 static BsonDocument createReplaceDocument (
118139 final BsonDocument filterDocument , final BsonDocument valueDocument ) {
119140 BsonDocument messageDocument = getSubDocumentOrOriginal (MESSAGE_FIELD , valueDocument );
120- BsonDocument afterDocument = getSubDocumentOrOriginal (DATA_AFTER_FIELD , messageDocument );
141+ BsonDocument afterDocument = getSubDocumentOrOriginal (DATA_FIELD , messageDocument );
121142
122143 BsonDocument replaceDocument = new BsonDocument ();
123144 if (filterDocument .containsKey (ID_FIELD )) {
@@ -132,7 +153,7 @@ static BsonDocument createReplaceDocument(
132153 static BsonDocument createUpdateDocument (final BsonDocument valueDocument ) {
133154 BsonDocument messageDocument = getSubDocumentOrOriginal (MESSAGE_FIELD , valueDocument );
134155 BsonDocument beforeDocument = getSubDocumentOrOriginal (DATA_BEFORE_FIELD , messageDocument );
135- BsonDocument afterDocument = getSubDocumentOrOriginal (DATA_AFTER_FIELD , messageDocument );
156+ BsonDocument afterDocument = getSubDocumentOrOriginal (DATA_FIELD , messageDocument );
136157
137158 if (afterDocument .isEmpty ()) {
138159 throw new DataException (
@@ -164,16 +185,31 @@ private static Optional<BsonDocument> getFilterFromKeyDocument(final BsonDocumen
164185 }
165186
166187 private static BsonDocument getSubDocumentOrOriginal (
167- final String field , final BsonDocument original ) {
168- if (original .containsKey (field )) {
169- BsonValue subDocument = original .get (field );
170- if (!subDocument .isDocument ()) {
188+ final String fieldName , final BsonDocument original ) {
189+ return getSubDocumentOrOriginal (fieldName , original , false );
190+ }
191+
192+ private static BsonDocument getSubDocumentNotNullOrOriginal (
193+ final String fieldName , final BsonDocument original ) {
194+ return getSubDocumentOrOriginal (fieldName , original , true );
195+ }
196+
197+ private static BsonDocument getSubDocumentOrOriginal (
198+ final String fieldName , final BsonDocument original , final boolean ignoreNull ) {
199+ if (original .containsKey (fieldName )) {
200+ BsonValue fieldValue = original .get (fieldName );
201+
202+ if (fieldValue .isNull () && ignoreNull ) {
203+ return original ;
204+ }
205+
206+ if (!fieldValue .isDocument ()) {
171207 throw new DataException (
172208 format (
173209 "Error: Value document contains a '%s' that is not a document: %s" ,
174- OperationHelper . MESSAGE_FIELD , original ));
210+ fieldName , original ));
175211 }
176- return subDocument .asDocument ();
212+ return fieldValue .asDocument ();
177213 }
178214 return original ;
179215 }
0 commit comments