Skip to content

Commit 3aec265

Browse files
author
Oleksandr Poliakov
committed
PR
1 parent 4255410 commit 3aec265

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Ast/Optimizers/AstSimplifier.cs

+22
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,29 @@ arg is AstBinaryExpression argBinaryExpression &&
609609
return AstExpression.Binary(oppositeComparisonOperator, argBinaryExpression.Arg1, argBinaryExpression.Arg2);
610610
}
611611

612+
// { $arrayToObject : [[{ k : 'A', v : '$A' }, { k : 'B', v : '$B' }]] } => { A : '$A', B : '$B' }
613+
if (node.Operator is AstUnaryOperator.ArrayToObject &&
614+
arg is AstComputedArrayExpression computedArrayExpression &&
615+
computedArrayExpression.Items.All(
616+
i => i is AstComputedDocumentExpression computedDocumentExpression &&
617+
computedDocumentExpression.Fields.FirstOrDefault(f => f.Path == "k")?.Value is AstConstantExpression &&
618+
computedDocumentExpression.Fields.Any(f => f.Path == "v"))
619+
)
620+
{
621+
var fields = computedArrayExpression.Items.Select(KeyValuePairDocumentToComputedField);
622+
return AstExpression.ComputedDocument(fields);
623+
}
624+
612625
return node.Update(arg);
626+
627+
static AstComputedField KeyValuePairDocumentToComputedField(AstExpression expression)
628+
{
629+
var documentExpression = (AstComputedDocumentExpression)expression;
630+
var keyExpression = documentExpression.Fields.First(f => f.Path == "k").Value;
631+
var valueExpression = documentExpression.Fields.First(f => f.Path == "v").Value;
632+
633+
return AstExpression.ComputedField(((AstConstantExpression)keyExpression).Value.AsString, valueExpression);
634+
}
613635
}
614636
}
615637
}

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/NewDictionaryExpressionToAggregationExpressionTranslatorTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void NewDictionary_with_KeyValuePairs_should_translate()
4545

4646
var stages = Translate(collection, queryable);
4747

48-
AssertStages(stages, "{ $project : { _v : { $arrayToObject : [[{ k : 'A', v : '$A' }, { k : 'B', v : '$B' }]] }, _id : 0 } }");
48+
AssertStages(stages, "{ $project : { _v : { A : '$A', B: '$B' }, _id : 0 } }");
4949

5050
var result = queryable.Single();
5151
result.Should().Equal(new Dictionary<string, string>{ ["A"] = "a", ["B"] = "b" });

0 commit comments

Comments
 (0)