Skip to content

Commit 329d591

Browse files
bahusoidhazzik
andauthored
Remove most RemoveAsAliasesFromSql usages (#2248)
Co-authored-by: Alexander Zaytsev <hazzik@gmail.com>
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
}

src/NHibernate/Criterion/IdentifierEqExpression.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ private void AddValueOrProjection(Parameter[] parameters, int paramIndex, ICrite
6969
}
7070
else
7171
{
72-
SqlString sql = _projection.ToSqlString(criteria, GetHashCode(), criteriaQuery);
73-
result.Add(SqlStringHelper.RemoveAsAliasesFromSql(sql));
72+
result.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(_projection, criteriaQuery, criteria));
7473
}
7574
}
7675

src/NHibernate/Criterion/InsensitiveLikeExpression.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
6363
{
6464
//TODO: add default capacity
6565
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
66-
SqlString[] columnNames =
67-
CriterionUtil.GetColumnNames(propertyName, projection, criteriaQuery, criteria);
66+
var columnNames =
67+
CriterionUtil.GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria);
6868

6969
if (columnNames.Length != 1)
7070
{
@@ -73,14 +73,14 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
7373

7474
if (criteriaQuery.Factory.Dialect is PostgreSQLDialect)
7575
{
76-
sqlBuilder.Add(columnNames[0]);
76+
sqlBuilder.AddObject(columnNames[0]);
7777
sqlBuilder.Add(" ilike ");
7878
}
7979
else
8080
{
8181
sqlBuilder.Add(criteriaQuery.Factory.Dialect.LowercaseFunction)
8282
.Add("(")
83-
.Add(columnNames[0])
83+
.AddObject(columnNames[0])
8484
.Add(")")
8585
.Add(" like ");
8686
}
@@ -106,11 +106,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
106106
public TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery)
107107
{
108108
var matchValue = value.ToString().ToLower();
109-
if (projection != null)
110-
{
111-
return CriterionUtil.GetTypedValues(criteriaQuery, criteria, projection, null, matchValue).Single();
112-
}
113-
return criteriaQuery.GetTypedValue(criteria, propertyName, matchValue);
109+
return CriterionUtil.GetTypedValue(criteriaQuery, criteria, projection, propertyName, matchValue);
114110
}
115111

116112
public override IProjection[] GetProjections()
@@ -127,4 +123,4 @@ public override string ToString()
127123
return (projection ?? (object)propertyName) + " ilike " + value;
128124
}
129125
}
130-
}
126+
}

src/NHibernate/Criterion/LikeExpression.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public LikeExpression(string propertyName, string value, MatchMode matchMode, ch
5959

6060
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
6161
{
62-
SqlString[] columns = CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria);
62+
var columns = CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
6363
if (columns.Length != 1)
6464
throw new HibernateException("Like may only be used with single-column properties / projections.");
6565

@@ -70,11 +70,11 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
7070
Dialect.Dialect dialect = criteriaQuery.Factory.Dialect;
7171
lhs.Add(dialect.LowercaseFunction)
7272
.Add(StringHelper.OpenParen)
73-
.Add(columns[0])
73+
.AddObject(columns[0])
7474
.Add(StringHelper.ClosedParen);
7575
}
7676
else
77-
lhs.Add(columns[0]);
77+
lhs.AddObject(columns[0]);
7878

7979
if (ignoreCase)
8080
{

src/NHibernate/Criterion/NotNullExpression.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
3939
//TODO: add default capacity
4040
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
4141

42-
SqlString[] columnNames =
43-
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
42+
var columnNames =
43+
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);
4444

4545
bool opNeeded = false;
4646

@@ -52,7 +52,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
5252
}
5353
opNeeded = true;
5454

55-
sqlBuilder.Add(columnNames[i])
55+
sqlBuilder.AddObject(columnNames[i])
5656
.Add(" is not null");
5757
}
5858

src/NHibernate/Criterion/NullExpression.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
3838
//TODO: add default capacity
3939
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
4040

41-
SqlString[] columnNames =
42-
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
41+
var columnNames =
42+
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);
4343

4444
for (int i = 0; i < columnNames.Length; i++)
4545
{
@@ -48,7 +48,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
4848
sqlBuilder.Add(" and ");
4949
}
5050

51-
sqlBuilder.Add(columnNames[i])
51+
sqlBuilder.AddObject(columnNames[i])
5252
.Add(" is null");
5353
}
5454

src/NHibernate/Criterion/Order.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private object[] GetColumnsOrAliases(ICriteria criteria, ICriteriaQuery criteria
7575
var propName = propertyName ?? (projection as IPropertyProjection)?.PropertyName;
7676
return propName != null
7777
? criteriaQuery.GetColumnAliasesUsingProjection(criteria, propName)
78-
: (object[]) CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria);
78+
: CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
7979
}
8080

8181
private SqlType[] SqlTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)

0 commit comments

Comments
 (0)