21
21
using System . Text ;
22
22
using System . Text . RegularExpressions ;
23
23
using MongoDB . Bson ;
24
+ using MongoDB . Bson . Serialization ;
24
25
using MongoDB . Driver . Linq . Linq3Implementation . Ast . Filters ;
25
26
using MongoDB . Driver . Linq . Linq3Implementation . ExtensionMethods ;
26
27
using MongoDB . Driver . Linq . Linq3Implementation . Misc ;
@@ -147,33 +148,33 @@ public static bool CanTranslate(Expression expression)
147
148
return false ;
148
149
}
149
150
150
- // caller is responsible for ensuring constant is on the right
151
- public static bool CanTranslateComparisonExpression ( Expression leftExpression , AstComparisonFilterOperator comparisonOperator , Expression rightExpression )
151
+ public static bool TryTranslate ( TranslationContext context , Expression expression , out AstFilter filter )
152
152
{
153
- // (int)document.S[i] == c
154
- if ( IsGetCharsComparison ( leftExpression ) )
153
+ try
155
154
{
155
+ filter = Translate ( context , expression ) ;
156
156
return true ;
157
157
}
158
-
159
- // document.S == "abc"
160
- if ( IsStringComparison ( leftExpression ) )
158
+ catch ( ExpressionNotSupportedException )
161
159
{
162
- return true ;
160
+ filter = null ;
161
+ return false ;
163
162
}
163
+ }
164
164
165
- // document.S.IndexOf('a') == n etc...
166
- if ( IsStringIndexOfComparison ( leftExpression ) )
165
+ // caller is responsible for ensuring constant is on the right
166
+ public static bool TryTranslateComparisonExpression ( TranslationContext context , Expression expression , Expression leftExpression , AstComparisonFilterOperator comparisonOperator , Expression rightExpression , out AstFilter filter )
167
+ {
168
+ try
167
169
{
170
+ filter = TranslateComparisonExpression ( context , expression , leftExpression , comparisonOperator , rightExpression ) ;
168
171
return true ;
169
172
}
170
- // document.S.Length == n or document.S.Count() == n
171
- if ( IsStringLengthComparison ( leftExpression ) || IsStringCountComparison ( leftExpression ) )
173
+ catch ( ExpressionNotSupportedException )
172
174
{
173
- return true ;
175
+ filter = null ;
176
+ return false ;
174
177
}
175
-
176
- return false ;
177
178
}
178
179
179
180
public static AstFilter Translate ( TranslationContext context , Expression expression )
@@ -362,7 +363,7 @@ private static AstFilter TranslateGetCharsComparison(TranslationContext context,
362
363
var leftConvertExpression = ( UnaryExpression ) leftExpression ;
363
364
var leftGetCharsExpression = ( MethodCallExpression ) leftConvertExpression . Operand ;
364
365
var fieldExpression = leftGetCharsExpression . Object ;
365
- var ( field , modifiers ) = TranslateField ( context , fieldExpression ) ;
366
+ var ( field , modifiers ) = TranslateField ( context , expression , fieldExpression ) ;
366
367
367
368
var indexExpression = leftGetCharsExpression . Arguments [ 0 ] ;
368
369
var index = indexExpression . GetConstantValue < int > ( containingExpression : expression ) ;
@@ -383,18 +384,25 @@ private static AstFilter TranslateGetCharsComparison(TranslationContext context,
383
384
throw new ExpressionNotSupportedException ( expression ) ;
384
385
}
385
386
386
- private static ( AstFilterField , Modifiers ) TranslateField ( TranslationContext context , Expression fieldExpression )
387
+ private static ( AstFilterField , Modifiers ) TranslateField ( TranslationContext context , Expression expression , Expression fieldExpression )
387
388
{
388
389
if ( fieldExpression is MethodCallExpression fieldMethodCallExpression &&
389
390
fieldMethodCallExpression . Method . IsOneOf ( __modifierMethods ) )
390
391
{
391
- var ( field , modifiers ) = TranslateField ( context , fieldMethodCallExpression . Object ) ;
392
+ var ( field , modifiers ) = TranslateField ( context , expression , fieldMethodCallExpression . Object ) ;
392
393
modifiers = TranslateModifier ( modifiers , fieldMethodCallExpression ) ;
393
394
return ( field , modifiers ) ;
394
395
}
395
396
else
396
397
{
397
398
var field = ExpressionToFilterFieldTranslator . Translate ( context , fieldExpression ) ;
399
+
400
+ if ( field . Serializer is IRepresentationConfigurable representationConfigurable &&
401
+ representationConfigurable . Representation != BsonType . String )
402
+ {
403
+ throw new ExpressionNotSupportedException ( fieldExpression , expression , because : $ "field \" { field . Path } \" is not represented as a string") ;
404
+ }
405
+
398
406
return ( field , new Modifiers ( ) ) ;
399
407
}
400
408
}
@@ -424,7 +432,7 @@ private static AstFilter TranslateStartsWithOrContainsOrEndsWith(TranslationCont
424
432
var method = expression . Method ;
425
433
var arguments = expression . Arguments ;
426
434
427
- var ( field , modifiers ) = TranslateField ( context , expression . Object ) ;
435
+ var ( field , modifiers ) = TranslateField ( context , expression , expression . Object ) ;
428
436
var value = arguments [ 0 ] . GetConstantValue < string > ( containingExpression : expression ) ;
429
437
if ( method . IsOneOf ( StringMethod . StartsWithWithComparisonType , StringMethod . EndsWithWithComparisonType ) )
430
438
{
@@ -466,7 +474,7 @@ bool IsImpossibleMatch(Modifiers modifiers, string value)
466
474
467
475
private static AstFilter TranslateStringComparison ( TranslationContext context , Expression expression , Expression leftExpression , AstComparisonFilterOperator comparisonOperator , Expression rightExpression )
468
476
{
469
- var ( field , modifiers ) = TranslateField ( context , leftExpression ) ;
477
+ var ( field , modifiers ) = TranslateField ( context , expression , leftExpression ) ;
470
478
var comparand = rightExpression . GetConstantValue < string > ( containingExpression : expression ) ;
471
479
472
480
if ( comparisonOperator == AstComparisonFilterOperator . Eq || comparisonOperator == AstComparisonFilterOperator . Ne )
@@ -513,7 +521,7 @@ private static AstFilter TranslateStringIndexOfComparison(TranslationContext con
513
521
var arguments = leftMethodCallExpression . Arguments ;
514
522
515
523
var fieldExpression = leftMethodCallExpression . Object ;
516
- var ( field , modifiers ) = TranslateField ( context , fieldExpression ) ;
524
+ var ( field , modifiers ) = TranslateField ( context , expression , fieldExpression ) ;
517
525
518
526
var startIndex = 0 ;
519
527
if ( method . IsOneOf ( __indexOfWithStartIndexMethods ) )
@@ -653,7 +661,7 @@ private static AstFilter TranslateStringLengthComparison(TranslationContext cont
653
661
throw new ExpressionNotSupportedException ( expression ) ;
654
662
}
655
663
656
- var ( field , modifiers ) = TranslateField ( context , fieldExpression ) ;
664
+ var ( field , modifiers ) = TranslateField ( context , expression , fieldExpression ) ;
657
665
658
666
var comparand = rightExpression . GetConstantValue < int > ( containingExpression : expression ) ;
659
667
var pattern = comparisonOperator switch
0 commit comments