未验证 提交 c9bc9c18 编写于 作者: S Shay Rojansky 提交者: GitHub

Fix translation of Take over array (#2763)

上级 4e34209b
...@@ -202,7 +202,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis ...@@ -202,7 +202,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis
} }
when sourceColumn.Table == sourceTable: when sourceColumn.Table == sourceTable:
{ {
//s.IntArray @> ARRAY[v.Value]
return BuildSimplifiedShapedQuery(source, _sqlExpressionFactory.ContainedBy(GetArray(sourceTable), otherArray)); return BuildSimplifiedShapedQuery(source, _sqlExpressionFactory.ContainedBy(GetArray(sourceTable), otherArray));
} }
...@@ -541,7 +540,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis ...@@ -541,7 +540,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis
/// </summary> /// </summary>
protected override ShapedQueryExpression? TranslateCount(ShapedQueryExpression source, LambdaExpression? predicate) protected override ShapedQueryExpression? TranslateCount(ShapedQueryExpression source, LambdaExpression? predicate)
{ {
// TODO: Does json_array_length pass through here? Most probably not, since it's not mapped with ElementTypeMapping...
// Simplify x.Array.Count() => cardinality(x.Array) instead of SELECT COUNT(*) FROM unnest(x.Array) // Simplify x.Array.Count() => cardinality(x.Array) instead of SELECT COUNT(*) FROM unnest(x.Array)
if (predicate is null && source.QueryExpression is SelectExpression if (predicate is null && source.QueryExpression is SelectExpression
{ {
...@@ -630,7 +628,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis ...@@ -630,7 +628,6 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis
Expression index, Expression index,
bool returnDefault) bool returnDefault)
{ {
// TODO: Does json_array_length pass through here? Most probably not, since it's not mapped with ElementTypeMapping...
// Simplify x.Array[1] => x.Array[1] (using the PG array subscript operator) instead of a subquery with LIMIT/OFFSET // Simplify x.Array[1] => x.Array[1] (using the PG array subscript operator) instead of a subquery with LIMIT/OFFSET
if (!returnDefault && source.QueryExpression is SelectExpression if (!returnDefault && source.QueryExpression is SelectExpression
{ {
...@@ -766,37 +763,25 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis ...@@ -766,37 +763,25 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis
Orderings: [], Orderings: [],
Limit: null, Limit: null,
Offset: null Offset: null
} selectExpression }
&& TryGetProjectedColumn(source, out var projectedColumn)
&& TranslateExpression(count) is { } translatedCount) && TranslateExpression(count) is { } translatedCount)
{ {
// Extract the column projected out of the source, and simplify the subquery to a simple JsonScalarExpression var selectExpression = new SelectExpression(
var shaperExpression = source.ShaperExpression; new PostgresUnnestExpression(
if (shaperExpression is UnaryExpression { NodeType: ExpressionType.Convert } unaryExpression unnestExpression.Alias,
&& unaryExpression.Operand.Type.IsNullableType() new PostgresArraySliceExpression(
&& unaryExpression.Operand.Type.UnwrapNullableType() == unaryExpression.Type) array,
{ lowerBound: GenerateOneBasedIndexExpression(translatedCount),
shaperExpression = unaryExpression.Operand; upperBound: null),
} "value"),
"value",
projectedColumn.Type,
projectedColumn.TypeMapping);
if (shaperExpression is ProjectionBindingExpression projectionBindingExpression return source.Update(
&& selectExpression.GetProjection(projectionBindingExpression) is SqlExpression projection) selectExpression,
{ new ProjectionBindingExpression(selectExpression, new ProjectionMember(), projectedColumn.Type));
selectExpression = new SelectExpression(
new PostgresUnnestExpression(
unnestExpression.Alias,
new PostgresArraySliceExpression(
array,
lowerBound: GenerateOneBasedIndexExpression(translatedCount),
upperBound: null),
"value"),
"value",
projection.Type,
projection.TypeMapping);
return source.Update(
selectExpression,
new ProjectionBindingExpression(selectExpression, new ProjectionMember(), projection.Type));
}
} }
return base.TranslateSkip(source, count); return base.TranslateSkip(source, count);
...@@ -863,12 +848,15 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis ...@@ -863,12 +848,15 @@ protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVis
sliceExpression = new PostgresArraySliceExpression(array, lowerBound: null, upperBound: translatedCount); sliceExpression = new PostgresArraySliceExpression(array, lowerBound: null, upperBound: translatedCount);
} }
return source.UpdateQueryExpression( var selectExpression = new SelectExpression(
new SelectExpression( new PostgresUnnestExpression(unnestExpression.Alias, sliceExpression, "value"),
new PostgresUnnestExpression(unnestExpression.Alias, sliceExpression, "value"), "value",
"value", projectedColumn.Type,
projectedColumn.Type, projectedColumn.TypeMapping);
projectedColumn.TypeMapping));
return source.Update(
selectExpression,
new ProjectionBindingExpression(selectExpression, new ProjectionMember(), projectedColumn.Type));
} }
return base.TranslateTake(source, count); return base.TranslateTake(source, count);
......
...@@ -474,10 +474,7 @@ public override async Task Column_collection_Take(bool async) ...@@ -474,10 +474,7 @@ public override async Task Column_collection_Take(bool async)
""" """
SELECT p."Id", p."Bool", p."Bools", p."DateTime", p."DateTimes", p."Enum", p."Enums", p."Int", p."Ints", p."NullableInt", p."NullableInts", p."String", p."Strings" SELECT p."Id", p."Bool", p."Bools", p."DateTime", p."DateTimes", p."Enum", p."Enums", p."Int", p."Ints", p."NullableInt", p."NullableInts", p."String", p."Strings"
FROM "PrimitiveCollectionsEntity" AS p FROM "PrimitiveCollectionsEntity" AS p
WHERE EXISTS ( WHERE 11 = ANY (p."Ints"[:2])
SELECT 1
FROM unnest(p."Ints"[:2]) AS i(value)
WHERE i.value = 11)
"""); """);
} }
...@@ -489,10 +486,7 @@ public override async Task Column_collection_Skip_Take(bool async) ...@@ -489,10 +486,7 @@ public override async Task Column_collection_Skip_Take(bool async)
""" """
SELECT p."Id", p."Bool", p."Bools", p."DateTime", p."DateTimes", p."Enum", p."Enums", p."Int", p."Ints", p."NullableInt", p."NullableInts", p."String", p."Strings" SELECT p."Id", p."Bool", p."Bools", p."DateTime", p."DateTimes", p."Enum", p."Enums", p."Int", p."Ints", p."NullableInt", p."NullableInts", p."String", p."Strings"
FROM "PrimitiveCollectionsEntity" AS p FROM "PrimitiveCollectionsEntity" AS p
WHERE EXISTS ( WHERE 11 = ANY (p."Ints"[2:3])
SELECT 1
FROM unnest(p."Ints"[2:3]) AS i(value)
WHERE i.value = 11)
"""); """);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册