Skip to content

Commit 329d591

Browse files
bahusoidhazzik
andauthored
Remove most RemoveAsAliasesFromSql usages (#2248)
Co-authored-by: Alexander Zaytsev <[email protected]>
1 parent b25f922 commit 329d591

20 files changed

+143
-83
lines changed

src/NHibernate.Test/Async/CompositeId/ClassWithCompositeIdFixture.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,18 @@ public async Task QueryOverOrderByAndWhereWithIdProjectionDoesntThrowAsync()
394394
}
395395
}
396396

397+
[Test]
398+
public async Task CriteriaGroupProjectionAsync()
399+
{
400+
using (ISession s = OpenSession())
401+
{
402+
await (s.CreateCriteria<ClassWithCompositeId>()
403+
.SetProjection(Projections.GroupProperty(Projections.Id()))
404+
.Add(Restrictions.Eq(Projections.Id(), id))
405+
.ListAsync<Id>());
406+
}
407+
}
408+
397409
[Test]
398410
public async Task QueryOverInClauseAsync()
399411
{

src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,18 @@ public void QueryOverOrderByAndWhereWithIdProjectionDoesntThrow()
383383
}
384384
}
385385

386+
[Test]
387+
public void CriteriaGroupProjection()
388+
{
389+
using (ISession s = OpenSession())
390+
{
391+
s.CreateCriteria<ClassWithCompositeId>()
392+
.SetProjection(Projections.GroupProperty(Projections.Id()))
393+
.Add(Restrictions.Eq(Projections.Id(), id))
394+
.List<Id>();
395+
}
396+
}
397+
386398
[Test]
387399
public void QueryOverInClause()
388400
{

src/NHibernate/Criterion/AggregateProjection.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using NHibernate.SqlCommand;
33
using NHibernate.Engine;
44
using NHibernate.Type;
5-
using NHibernate.Util;
65

76
namespace NHibernate.Criterion
87
{
@@ -49,19 +48,12 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer
4948

5049
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery)
5150
{
52-
if (projection == null)
53-
{
54-
return new SqlString(aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_");
55-
}
51+
var column = CriterionUtil.GetColumnNameAsSqlStringPart(propertyName, projection, criteriaQuery, criteria);
5652

5753
return new SqlString(
5854
aggregate,
5955
"(",
60-
SqlStringHelper.RemoveAsAliasesFromSql(
61-
projection.ToSqlString(
62-
criteria,
63-
loc,
64-
criteriaQuery)),
56+
column,
6557
") as y",
6658
loc.ToString(),
6759
"_");

src/NHibernate/Criterion/AvgProjection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuer
2323
sql.Add("cast(");
2424
if (projection != null)
2525
{
26-
sql.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery)));
26+
sql.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria));
2727
}
2828
else
2929
{

src/NHibernate/Criterion/BetweenExpression.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
5353
var parametersTypes = GetTypedValues(criteria, criteriaQuery).ToArray();
5454
var lowType = parametersTypes[0];
5555
var highType = parametersTypes[1];
56-
SqlString[] columnNames =
57-
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
56+
var columnNames =
57+
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);
5858

5959
if (columnNames.Length == 1)
6060
{
6161
sqlBuilder
62-
.Add(columnNames[0])
62+
.AddObject(columnNames[0])
6363
.Add(" between ")
6464
.Add(criteriaQuery.NewQueryParameter(lowType).Single())
6565
.Add(" and ")
@@ -78,7 +78,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
7878
}
7979
andNeeded = true;
8080

81-
sqlBuilder.Add(columnNames[i])
81+
sqlBuilder.AddObject(columnNames[i])
8282
.Add(" >= ")
8383
.Add(lowParameters[i]);
8484
}
@@ -87,7 +87,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
8787
for (int i = 0; i < columnNames.Length; i++)
8888
{
8989
sqlBuilder.Add(" AND ")
90-
.Add(columnNames[i])
90+
.AddObject(columnNames[i])
9191
.Add(" <= ")
9292
.Add(highParameters[i]);
9393
}

src/NHibernate/Criterion/CastProjection.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri
3737
throw new QueryException("invalid Hibernate type for CastProjection");
3838
}
3939
string sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]);
40-
int loc = position*GetHashCode();
41-
SqlString val = projection.ToSqlString(criteria, loc, criteriaQuery);
42-
val = SqlStringHelper.RemoveAsAliasesFromSql(val);
40+
var val = CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria);
4341

4442
return new SqlString("cast( ", val, " as ", sqlType, ") as ", GetColumnAliases(position, criteria, criteriaQuery)[0]);
4543
}

src/NHibernate/Criterion/ConditionalProjection.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@ public override bool IsAggregate
4545
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery)
4646
{
4747
SqlString condition = criterion.ToSqlString(criteria, criteriaQuery);
48-
SqlString ifTrue = whenTrue.ToSqlString(criteria, position + GetHashCode() + 1, criteriaQuery);
49-
ifTrue = SqlStringHelper.RemoveAsAliasesFromSql(ifTrue);
50-
SqlString ifFalse = whenFalse.ToSqlString(criteria, position + GetHashCode() + 2, criteriaQuery);
51-
ifFalse = SqlStringHelper.RemoveAsAliasesFromSql(ifFalse);
48+
var ifTrue = CriterionUtil.GetColumnNameAsSqlStringPart(whenTrue, criteriaQuery, criteria);
49+
var ifFalse = CriterionUtil.GetColumnNameAsSqlStringPart(whenFalse, criteriaQuery, criteria);
5250
return new SqlString("(case when ", condition, " then ", ifTrue, " else ", ifFalse, " end) as ",
5351
GetColumnAliases(position, criteria, criteriaQuery)[0]);
5452
}

src/NHibernate/Criterion/CountProjection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri
3535
}
3636
if (projection != null)
3737
{
38-
buf.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery)));
38+
buf.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria));
3939
}
4040
else
4141
{

src/NHibernate/Criterion/CriterionUtil.cs

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ namespace NHibernate.Criterion
55
using Engine;
66
using SqlCommand;
77
using Type;
8-
using Util;
98

109
public static class CriterionUtil
1110
{
@@ -51,13 +50,53 @@ internal static SqlString[] GetColumnNamesUsingProjection(IProjection projection
5150
return GetColumnNamesUsingPropertyName(criteriaQuery, criteria, propertyProjection.PropertyName);
5251
}
5352

54-
SqlString sqlString = projection.ToSqlString(criteria,
55-
criteriaQuery.GetIndexForAlias(),
56-
criteriaQuery);
57-
return new SqlString[]
58-
{
59-
SqlStringHelper.RemoveAsAliasesFromSql(sqlString)
60-
};
53+
return GetProjectionColumns(projection, criteriaQuery, criteria);
54+
}
55+
56+
internal static object[] GetColumnNamesAsSqlStringParts(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
57+
{
58+
if (propertyName != null)
59+
return criteriaQuery.GetColumnsUsingProjection(criteria, propertyName);
60+
61+
return GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
62+
}
63+
64+
internal static object[] GetColumnNamesAsSqlStringParts(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
65+
{
66+
if (projection is IPropertyProjection propertyProjection)
67+
{
68+
return criteriaQuery.GetColumnsUsingProjection(criteria, propertyProjection.PropertyName);
69+
}
70+
71+
return GetProjectionColumns(projection, criteriaQuery, criteria);
72+
}
73+
74+
internal static object GetColumnNameAsSqlStringPart(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
75+
{
76+
var columnNames = GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria);
77+
if (columnNames.Length != 1)
78+
{
79+
throw new QueryException("property or projection does not map to a single column: " + (propertyName ?? projection.ToString()));
80+
}
81+
82+
return columnNames[0];
83+
}
84+
85+
internal static object GetColumnNameAsSqlStringPart(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
86+
{
87+
var columnNames = GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
88+
if (columnNames.Length != 1)
89+
{
90+
throw new QueryException("property or projection does not map to a single column: " + (projection.ToString()));
91+
}
92+
93+
return columnNames[0];
94+
}
95+
96+
private static SqlString[] GetProjectionColumns(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
97+
{
98+
var sqlString = projection.ToSqlString(criteria, criteriaQuery.GetIndexForAlias(), criteriaQuery);
99+
return new[] {SqlStringHelper.RemoveAsAliasesFromSql(sqlString)};
61100
}
62101

63102
private static SqlString[] GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, string propertyName)
@@ -121,5 +160,18 @@ public static TypedValue[] GetTypedValues(ICriteriaQuery criteriaQuery, ICriteri
121160
}
122161
return types.ToArray();
123162
}
163+
164+
public static TypedValue GetTypedValue(
165+
ICriteriaQuery criteriaQuery,
166+
ICriteria criteria,
167+
IProjection projection,
168+
string propertyName,
169+
object value)
170+
{
171+
if (propertyName != null || (propertyName = (projection as IPropertyProjection)?.PropertyName) != null)
172+
return criteriaQuery.GetTypedValue(criteria, propertyName, value);
173+
174+
return new TypedValue(NHibernateUtil.GuessType(value), value);
175+
}
124176
}
125177
}

src/NHibernate/Criterion/GroupedProjection.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public virtual SqlString ToSqlString(ICriteria criteria, int position, ICriteria
2323

2424
public virtual SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
2525
{
26+
if (projection is IPropertyProjection propertyProjection)
27+
return new SqlString(string.Join(", ", criteriaQuery.GetColumns(criteria, propertyProjection.PropertyName)));
28+
2629
//This is kind of a hack. The hack is based on the fact that ToGroupSqlString always called after ToSqlString.
2730
return SqlStringHelper.RemoveAsAliasesFromSql(renderedProjection);
2831
}

0 commit comments

Comments
 (0)