Skip to content

Remove most RemoveAsAliasesFromSql usages #2248

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Apr 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,18 @@ public async Task QueryOverOrderByAndWhereWithIdProjectionDoesntThrowAsync()
}
}

[Test]
public async Task CriteriaGroupProjectionAsync()
{
using (ISession s = OpenSession())
{
await (s.CreateCriteria<ClassWithCompositeId>()
.SetProjection(Projections.GroupProperty(Projections.Id()))
.Add(Restrictions.Eq(Projections.Id(), id))
.ListAsync<Id>());
}
}

[Test]
public async Task QueryOverInClauseAsync()
{
Expand Down
12 changes: 12 additions & 0 deletions src/NHibernate.Test/CompositeId/ClassWithCompositeIdFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,18 @@ public void QueryOverOrderByAndWhereWithIdProjectionDoesntThrow()
}
}

[Test]
public void CriteriaGroupProjection()
{
using (ISession s = OpenSession())
{
s.CreateCriteria<ClassWithCompositeId>()
.SetProjection(Projections.GroupProperty(Projections.Id()))
.Add(Restrictions.Eq(Projections.Id(), id))
.List<Id>();
}
}

[Test]
public void QueryOverInClause()
{
Expand Down
12 changes: 2 additions & 10 deletions src/NHibernate/Criterion/AggregateProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using NHibernate.SqlCommand;
using NHibernate.Engine;
using NHibernate.Type;
using NHibernate.Util;

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

public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery)
{
if (projection == null)
{
return new SqlString(aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_");
}
var column = CriterionUtil.GetColumnNameAsSqlStringPart(propertyName, projection, criteriaQuery, criteria);

return new SqlString(
aggregate,
"(",
SqlStringHelper.RemoveAsAliasesFromSql(
projection.ToSqlString(
criteria,
loc,
criteriaQuery)),
column,
") as y",
loc.ToString(),
"_");
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Criterion/AvgProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuer
sql.Add("cast(");
if (projection != null)
{
sql.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery)));
sql.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria));
}
else
{
Expand Down
10 changes: 5 additions & 5 deletions src/NHibernate/Criterion/BetweenExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
var parametersTypes = GetTypedValues(criteria, criteriaQuery).ToArray();
var lowType = parametersTypes[0];
var highType = parametersTypes[1];
SqlString[] columnNames =
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
var columnNames =
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);

if (columnNames.Length == 1)
{
sqlBuilder
.Add(columnNames[0])
.AddObject(columnNames[0])
.Add(" between ")
.Add(criteriaQuery.NewQueryParameter(lowType).Single())
.Add(" and ")
Expand All @@ -78,7 +78,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
}
andNeeded = true;

sqlBuilder.Add(columnNames[i])
sqlBuilder.AddObject(columnNames[i])
.Add(" >= ")
.Add(lowParameters[i]);
}
Expand All @@ -87,7 +87,7 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
for (int i = 0; i < columnNames.Length; i++)
{
sqlBuilder.Add(" AND ")
.Add(columnNames[i])
.AddObject(columnNames[i])
.Add(" <= ")
.Add(highParameters[i]);
}
Expand Down
4 changes: 1 addition & 3 deletions src/NHibernate/Criterion/CastProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri
throw new QueryException("invalid Hibernate type for CastProjection");
}
string sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]);
int loc = position*GetHashCode();
SqlString val = projection.ToSqlString(criteria, loc, criteriaQuery);
val = SqlStringHelper.RemoveAsAliasesFromSql(val);
var val = CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria);

return new SqlString("cast( ", val, " as ", sqlType, ") as ", GetColumnAliases(position, criteria, criteriaQuery)[0]);
}
Expand Down
6 changes: 2 additions & 4 deletions src/NHibernate/Criterion/ConditionalProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,8 @@ public override bool IsAggregate
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery)
{
SqlString condition = criterion.ToSqlString(criteria, criteriaQuery);
SqlString ifTrue = whenTrue.ToSqlString(criteria, position + GetHashCode() + 1, criteriaQuery);
ifTrue = SqlStringHelper.RemoveAsAliasesFromSql(ifTrue);
SqlString ifFalse = whenFalse.ToSqlString(criteria, position + GetHashCode() + 2, criteriaQuery);
ifFalse = SqlStringHelper.RemoveAsAliasesFromSql(ifFalse);
var ifTrue = CriterionUtil.GetColumnNameAsSqlStringPart(whenTrue, criteriaQuery, criteria);
var ifFalse = CriterionUtil.GetColumnNameAsSqlStringPart(whenFalse, criteriaQuery, criteria);
return new SqlString("(case when ", condition, " then ", ifTrue, " else ", ifFalse, " end) as ",
GetColumnAliases(position, criteria, criteriaQuery)[0]);
}
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Criterion/CountProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public override SqlString ToSqlString(ICriteria criteria, int position, ICriteri
}
if (projection != null)
{
buf.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery)));
buf.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(projection, criteriaQuery, criteria));
}
else
{
Expand Down
68 changes: 60 additions & 8 deletions src/NHibernate/Criterion/CriterionUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ namespace NHibernate.Criterion
using Engine;
using SqlCommand;
using Type;
using Util;

public static class CriterionUtil
{
Expand Down Expand Up @@ -51,13 +50,53 @@ internal static SqlString[] GetColumnNamesUsingProjection(IProjection projection
return GetColumnNamesUsingPropertyName(criteriaQuery, criteria, propertyProjection.PropertyName);
}

SqlString sqlString = projection.ToSqlString(criteria,
criteriaQuery.GetIndexForAlias(),
criteriaQuery);
return new SqlString[]
{
SqlStringHelper.RemoveAsAliasesFromSql(sqlString)
};
return GetProjectionColumns(projection, criteriaQuery, criteria);
}

internal static object[] GetColumnNamesAsSqlStringParts(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
{
if (propertyName != null)
return criteriaQuery.GetColumnsUsingProjection(criteria, propertyName);

return GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
}

internal static object[] GetColumnNamesAsSqlStringParts(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
{
if (projection is IPropertyProjection propertyProjection)
{
return criteriaQuery.GetColumnsUsingProjection(criteria, propertyProjection.PropertyName);
}

return GetProjectionColumns(projection, criteriaQuery, criteria);
}

internal static object GetColumnNameAsSqlStringPart(string propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
{
var columnNames = GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria);
if (columnNames.Length != 1)
{
throw new QueryException("property or projection does not map to a single column: " + (propertyName ?? projection.ToString()));
}

return columnNames[0];
}

internal static object GetColumnNameAsSqlStringPart(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
{
var columnNames = GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
if (columnNames.Length != 1)
{
throw new QueryException("property or projection does not map to a single column: " + (projection.ToString()));
}

return columnNames[0];
}

private static SqlString[] GetProjectionColumns(IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria)
{
var sqlString = projection.ToSqlString(criteria, criteriaQuery.GetIndexForAlias(), criteriaQuery);
return new[] {SqlStringHelper.RemoveAsAliasesFromSql(sqlString)};
}

private static SqlString[] GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, string propertyName)
Expand Down Expand Up @@ -121,5 +160,18 @@ public static TypedValue[] GetTypedValues(ICriteriaQuery criteriaQuery, ICriteri
}
return types.ToArray();
}

public static TypedValue GetTypedValue(
ICriteriaQuery criteriaQuery,
ICriteria criteria,
IProjection projection,
string propertyName,
object value)
{
if (propertyName != null || (propertyName = (projection as IPropertyProjection)?.PropertyName) != null)
return criteriaQuery.GetTypedValue(criteria, propertyName, value);

return new TypedValue(NHibernateUtil.GuessType(value), value);
}
}
}
3 changes: 3 additions & 0 deletions src/NHibernate/Criterion/GroupedProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public virtual SqlString ToSqlString(ICriteria criteria, int position, ICriteria

public virtual SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
if (projection is IPropertyProjection propertyProjection)
return new SqlString(string.Join(", ", criteriaQuery.GetColumns(criteria, propertyProjection.PropertyName)));

//This is kind of a hack. The hack is based on the fact that ToGroupSqlString always called after ToSqlString.
return SqlStringHelper.RemoveAsAliasesFromSql(renderedProjection);
}
Expand Down
3 changes: 1 addition & 2 deletions src/NHibernate/Criterion/IdentifierEqExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ private void AddValueOrProjection(Parameter[] parameters, int paramIndex, ICrite
}
else
{
SqlString sql = _projection.ToSqlString(criteria, GetHashCode(), criteriaQuery);
result.Add(SqlStringHelper.RemoveAsAliasesFromSql(sql));
result.AddObject(CriterionUtil.GetColumnNameAsSqlStringPart(_projection, criteriaQuery, criteria));
}
}

Expand Down
16 changes: 6 additions & 10 deletions src/NHibernate/Criterion/InsensitiveLikeExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
{
//TODO: add default capacity
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
SqlString[] columnNames =
CriterionUtil.GetColumnNames(propertyName, projection, criteriaQuery, criteria);
var columnNames =
CriterionUtil.GetColumnNamesAsSqlStringParts(propertyName, projection, criteriaQuery, criteria);

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

if (criteriaQuery.Factory.Dialect is PostgreSQLDialect)
{
sqlBuilder.Add(columnNames[0]);
sqlBuilder.AddObject(columnNames[0]);
sqlBuilder.Add(" ilike ");
}
else
{
sqlBuilder.Add(criteriaQuery.Factory.Dialect.LowercaseFunction)
.Add("(")
.Add(columnNames[0])
.AddObject(columnNames[0])
.Add(")")
.Add(" like ");
}
Expand All @@ -106,11 +106,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
public TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
var matchValue = value.ToString().ToLower();
if (projection != null)
{
return CriterionUtil.GetTypedValues(criteriaQuery, criteria, projection, null, matchValue).Single();
}
return criteriaQuery.GetTypedValue(criteria, propertyName, matchValue);
return CriterionUtil.GetTypedValue(criteriaQuery, criteria, projection, propertyName, matchValue);
}

public override IProjection[] GetProjections()
Expand All @@ -127,4 +123,4 @@ public override string ToString()
return (projection ?? (object)propertyName) + " ilike " + value;
}
}
}
}
6 changes: 3 additions & 3 deletions src/NHibernate/Criterion/LikeExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public LikeExpression(string propertyName, string value, MatchMode matchMode, ch

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

Expand All @@ -70,11 +70,11 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
Dialect.Dialect dialect = criteriaQuery.Factory.Dialect;
lhs.Add(dialect.LowercaseFunction)
.Add(StringHelper.OpenParen)
.Add(columns[0])
.AddObject(columns[0])
.Add(StringHelper.ClosedParen);
}
else
lhs.Add(columns[0]);
lhs.AddObject(columns[0]);

if (ignoreCase)
{
Expand Down
6 changes: 3 additions & 3 deletions src/NHibernate/Criterion/NotNullExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
//TODO: add default capacity
SqlStringBuilder sqlBuilder = new SqlStringBuilder();

SqlString[] columnNames =
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
var columnNames =
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);

bool opNeeded = false;

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

sqlBuilder.Add(columnNames[i])
sqlBuilder.AddObject(columnNames[i])
.Add(" is not null");
}

Expand Down
6 changes: 3 additions & 3 deletions src/NHibernate/Criterion/NullExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteri
//TODO: add default capacity
SqlStringBuilder sqlBuilder = new SqlStringBuilder();

SqlString[] columnNames =
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria);
var columnNames =
CriterionUtil.GetColumnNamesAsSqlStringParts(_propertyName, _projection, criteriaQuery, criteria);

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

sqlBuilder.Add(columnNames[i])
sqlBuilder.AddObject(columnNames[i])
.Add(" is null");
}

Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Criterion/Order.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ private object[] GetColumnsOrAliases(ICriteria criteria, ICriteriaQuery criteria
var propName = propertyName ?? (projection as IPropertyProjection)?.PropertyName;
return propName != null
? criteriaQuery.GetColumnAliasesUsingProjection(criteria, propName)
: (object[]) CriterionUtil.GetColumnNamesUsingProjection(projection, criteriaQuery, criteria);
: CriterionUtil.GetColumnNamesAsSqlStringParts(projection, criteriaQuery, criteria);
}

private SqlType[] SqlTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)
Expand Down
Loading