1
1
/*
2
- * Copyright 2013-2016 the original author or authors.
2
+ * Copyright 2013-2017 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
49
49
50
50
/**
51
51
* Renders the AST of a SpEL expression as a MongoDB Aggregation Framework projection expression.
52
- *
52
+ *
53
53
* @author Thomas Darimont
54
54
* @author Christoph Strobl
55
+ * @author Mark Paluch
55
56
*/
56
57
class SpelExpressionTransformer implements AggregationExpressionTransformer {
57
58
@@ -84,7 +85,7 @@ public SpelExpressionTransformer() {
84
85
* {@link AggregationOperationContext} {@code context}.
85
86
* <p>
86
87
* Exposes the given @{code params} as <code>[0] ... [n]</code>.
87
- *
88
+ *
88
89
* @param expression must not be {@literal null}
89
90
* @param context must not be {@literal null}
90
91
* @param params must not be {@literal null}
@@ -114,7 +115,7 @@ public Object transform(AggregationExpressionTransformationContext<ExpressionNod
114
115
/**
115
116
* Returns an appropriate {@link ExpressionNodeConversion} for the given {@code node}. Throws an
116
117
* {@link IllegalArgumentException} if no conversion could be found.
117
- *
118
+ *
118
119
* @param node
119
120
* @return the appropriate {@link ExpressionNodeConversion} for the given {@link ExpressionNode}.
120
121
*/
@@ -133,7 +134,7 @@ private ExpressionNodeConversion<ExpressionNode> lookupConversionFor(ExpressionN
133
134
134
135
/**
135
136
* Abstract base class for {@link SpelNode} to (Db)-object conversions.
136
- *
137
+ *
137
138
* @author Thomas Darimont
138
139
* @author Oliver Gierke
139
140
*/
@@ -145,7 +146,7 @@ private static abstract class ExpressionNodeConversion<T extends ExpressionNode>
145
146
146
147
/**
147
148
* Creates a new {@link ExpressionNodeConversion}.
148
- *
149
+ *
149
150
* @param transformer must not be {@literal null}.
150
151
*/
151
152
@ SuppressWarnings ("unchecked" )
@@ -161,7 +162,7 @@ public ExpressionNodeConversion(AggregationExpressionTransformer transformer) {
161
162
/**
162
163
* Returns whether the current conversion supports the given {@link ExpressionNode}. By default we will match the
163
164
* node type against the genric type the subclass types the type parameter to.
164
- *
165
+ *
165
166
* @param node will never be {@literal null}.
166
167
* @return true if {@literal this} conversion can be applied to the given {@code node}.
167
168
*/
@@ -171,7 +172,7 @@ protected boolean supports(ExpressionNode node) {
171
172
172
173
/**
173
174
* Triggers the transformation for the given {@link ExpressionNode} and the given current context.
174
- *
175
+ *
175
176
* @param node must not be {@literal null}.
176
177
* @param context must not be {@literal null}.
177
178
* @return
@@ -187,7 +188,7 @@ protected Object transform(ExpressionNode node, AggregationExpressionTransformat
187
188
/**
188
189
* Triggers the transformation with the given new {@link ExpressionNode}, new parent node, the current operation and
189
190
* the previous context.
190
- *
191
+ *
191
192
* @param node must not be {@literal null}.
192
193
* @param parent
193
194
* @param operation
@@ -204,7 +205,7 @@ protected Object transform(ExpressionNode node, ExpressionNode parent, Document
204
205
context .getAggregationContext ()));
205
206
}
206
207
207
- /*
208
+ /*
208
209
* (non-Javadoc)
209
210
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#transform(org.springframework.data.mongodb.core.aggregation.AggregationExpressionTransformer.AggregationExpressionTransformationContext)
210
211
*/
@@ -215,7 +216,7 @@ public Object transform(AggregationExpressionTransformationContext<ExpressionNod
215
216
216
217
/**
217
218
* Performs the actual conversion from {@link SpelNode} to the corresponding representation for MongoDB.
218
- *
219
+ *
219
220
* @param context
220
221
* @return
221
222
*/
@@ -224,7 +225,7 @@ public Object transform(AggregationExpressionTransformationContext<ExpressionNod
224
225
225
226
/**
226
227
* A {@link ExpressionNodeConversion} that converts arithmetic operations.
227
- *
228
+ *
228
229
* @author Thomas Darimont
229
230
*/
230
231
private static class OperatorNodeConversion extends ExpressionNodeConversion <OperatorNode > {
@@ -233,7 +234,7 @@ public OperatorNodeConversion(AggregationExpressionTransformer transformer) {
233
234
super (transformer );
234
235
}
235
236
236
- /*
237
+ /*
237
238
* (non-Javadoc)
238
239
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
239
240
*/
@@ -258,8 +259,10 @@ protected Object convert(AggregationExpressionTransformationContext<OperatorNode
258
259
return convertUnaryMinusOp (context , leftResult );
259
260
}
260
261
261
- // we deliberately ignore the RHS result
262
- transform (currentNode .getRight (), currentNode , operationObject , context );
262
+ if (!currentNode .isUnaryOperator ()) {
263
+ // we deliberately ignore the RHS result
264
+ transform (currentNode .getRight (), currentNode , operationObject , context );
265
+ }
263
266
264
267
return operationObject ;
265
268
}
@@ -299,7 +302,7 @@ private Object convertUnaryMinusOp(ExpressionTransformationContextSupport<Operat
299
302
return result ;
300
303
}
301
304
302
- /*
305
+ /*
303
306
* (non-Javadoc)
304
307
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#supports(java.lang.Class)
305
308
*/
@@ -311,7 +314,7 @@ protected boolean supports(ExpressionNode node) {
311
314
312
315
/**
313
316
* A {@link ExpressionNodeConversion} that converts indexed expressions.
314
- *
317
+ *
315
318
* @author Thomas Darimont
316
319
* @author Oliver Gierke
317
320
*/
@@ -321,7 +324,7 @@ public IndexerNodeConversion(AggregationExpressionTransformer transformer) {
321
324
super (transformer );
322
325
}
323
326
324
- /*
327
+ /*
325
328
* (non-Javadoc)
326
329
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
327
330
*/
@@ -330,7 +333,7 @@ protected Object convert(AggregationExpressionTransformationContext<ExpressionNo
330
333
return context .addToPreviousOrReturn (context .getCurrentNode ().getValue ());
331
334
}
332
335
333
- /*
336
+ /*
334
337
* (non-Javadoc)
335
338
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode)
336
339
*/
@@ -342,7 +345,7 @@ protected boolean supports(ExpressionNode node) {
342
345
343
346
/**
344
347
* A {@link ExpressionNodeConversion} that converts in-line list expressions.
345
- *
348
+ *
346
349
* @author Thomas Darimont
347
350
*/
348
351
private static class InlineListNodeConversion extends ExpressionNodeConversion <ExpressionNode > {
@@ -351,7 +354,7 @@ public InlineListNodeConversion(AggregationExpressionTransformer transformer) {
351
354
super (transformer );
352
355
}
353
356
354
- /*
357
+ /*
355
358
* (non-Javadoc)
356
359
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
357
360
*/
@@ -368,7 +371,7 @@ protected Object convert(AggregationExpressionTransformationContext<ExpressionNo
368
371
return transform (currentNode .getChild (0 ), currentNode , null , context );
369
372
}
370
373
371
- /*
374
+ /*
372
375
* (non-Javadoc)
373
376
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode)
374
377
*/
@@ -380,7 +383,7 @@ protected boolean supports(ExpressionNode node) {
380
383
381
384
/**
382
385
* A {@link ExpressionNodeConversion} that converts property or field reference expressions.
383
- *
386
+ *
384
387
* @author Thomas Darimont
385
388
* @author Oliver Gierke
386
389
*/
@@ -401,7 +404,7 @@ protected Object convert(AggregationExpressionTransformationContext<ExpressionNo
401
404
return context .addToPreviousOrReturn (fieldReference );
402
405
}
403
406
404
- /*
407
+ /*
405
408
* (non-Javadoc)
406
409
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode)
407
410
*/
@@ -413,7 +416,7 @@ protected boolean supports(ExpressionNode node) {
413
416
414
417
/**
415
418
* A {@link ExpressionNodeConversion} that converts literal expressions.
416
- *
419
+ *
417
420
* @author Thomas Darimont
418
421
* @author Oliver Gierke
419
422
*/
@@ -423,7 +426,7 @@ public LiteralNodeConversion(AggregationExpressionTransformer transformer) {
423
426
super (transformer );
424
427
}
425
428
426
- /*
429
+ /*
427
430
* (non-Javadoc)
428
431
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
429
432
*/
@@ -448,7 +451,7 @@ protected Object convert(AggregationExpressionTransformationContext<LiteralNode>
448
451
return value ;
449
452
}
450
453
451
- /*
454
+ /*
452
455
* (non-Javadoc)
453
456
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#supports(org.springframework.expression.spel.SpelNode)
454
457
*/
@@ -460,7 +463,7 @@ protected boolean supports(ExpressionNode node) {
460
463
461
464
/**
462
465
* A {@link ExpressionNodeConversion} that converts method reference expressions.
463
- *
466
+ *
464
467
* @author Thomas Darimont
465
468
* @author Oliver Gierke
466
469
*/
@@ -470,7 +473,7 @@ public MethodReferenceNodeConversion(AggregationExpressionTransformer transforme
470
473
super (transformer );
471
474
}
472
475
473
- /*
476
+ /*
474
477
* (non-Javadoc)
475
478
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
476
479
*/
@@ -489,7 +492,7 @@ protected Object convert(AggregationExpressionTransformationContext<MethodRefere
489
492
Document dbo = new Document ();
490
493
491
494
int i = 0 ;
492
- for (ExpressionNode child : node ) {
495
+ for (ExpressionNode child : node ) {
493
496
dbo .put (methodReference .getArgumentMap ()[i ++], transform (child , context ));
494
497
}
495
498
args = dbo ;
@@ -510,7 +513,7 @@ protected Object convert(AggregationExpressionTransformationContext<MethodRefere
510
513
511
514
/**
512
515
* A {@link ExpressionNodeConversion} that converts method compound expressions.
513
- *
516
+ *
514
517
* @author Thomas Darimont
515
518
* @author Oliver Gierke
516
519
*/
@@ -520,7 +523,7 @@ public CompoundExpressionNodeConversion(AggregationExpressionTransformer transfo
520
523
super (transformer );
521
524
}
522
525
523
- /*
526
+ /*
524
527
* (non-Javadoc)
525
528
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext)
526
529
*/
@@ -537,7 +540,7 @@ protected Object convert(AggregationExpressionTransformationContext<ExpressionNo
537
540
return context .addToPreviousOrReturn (currentNode .getValue ());
538
541
}
539
542
540
- /*
543
+ /*
541
544
* (non-Javadoc)
542
545
* @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode)
543
546
*/
0 commit comments