Skip to content

Commit bc9939b

Browse files
committed
Merge branch 'NH-3609'
Closes nhibernate#261
2 parents 41bed92 + 3aa8bd0 commit bc9939b

File tree

10 files changed

+182
-49
lines changed

10 files changed

+182
-49
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3609
4+
{
5+
class Entity
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual string Name { get; set; }
9+
}
10+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using NHibernate.Criterion;
2+
using NHibernate.Transform;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.NHSpecificTest.NH3609
6+
{
7+
[TestFixture]
8+
public class Fixture : BugTestCase
9+
{
10+
protected override void OnSetUp()
11+
{
12+
using (var session = OpenSession())
13+
using (var transaction = session.BeginTransaction())
14+
{
15+
var e1 = new Entity {Name = "Bob"};
16+
session.Save(e1);
17+
18+
var e2 = new Entity {Name = "Sally"};
19+
session.Save(e2);
20+
21+
session.Flush();
22+
transaction.Commit();
23+
}
24+
}
25+
26+
protected override void OnTearDown()
27+
{
28+
using (var session = OpenSession())
29+
using (var transaction = session.BeginTransaction())
30+
{
31+
session.Delete("from System.Object");
32+
33+
session.Flush();
34+
transaction.Commit();
35+
}
36+
}
37+
38+
[Test]
39+
public void AvgWithConditionalDoesNotThrow()
40+
{
41+
using (var session = OpenSession())
42+
using (session.BeginTransaction())
43+
{
44+
MappingEntity mappingEntity = null;
45+
Assert.DoesNotThrow(
46+
() =>
47+
session.QueryOver<Entity>().SelectList(
48+
builder =>
49+
builder.Select(
50+
Projections.Avg(
51+
Projections.Conditional(
52+
Restrictions.Eq(Projections.Property<Entity>(x => x.Name), "FOO"),
53+
Projections.Constant("", NHibernateUtil.String),
54+
Projections.Constant(null, NHibernateUtil.String))).WithAlias(() => mappingEntity.Count))
55+
).TransformUsing(Transformers.AliasToBean<MappingEntity>()).List<MappingEntity>()
56+
);
57+
}
58+
}
59+
60+
[Test]
61+
public void CountWithConditionalDoesNotThrow()
62+
{
63+
using (var session = OpenSession())
64+
using (session.BeginTransaction())
65+
{
66+
MappingEntity mappingEntity = null;
67+
Assert.DoesNotThrow(
68+
() =>
69+
session.QueryOver<Entity>().SelectList(
70+
builder =>
71+
builder.Select(
72+
Projections.Count(
73+
Projections.Conditional(
74+
Restrictions.Eq(Projections.Property<Entity>(x => x.Name), "FOO"),
75+
Projections.Constant("", NHibernateUtil.String),
76+
Projections.Constant(null, NHibernateUtil.String))).WithAlias(() => mappingEntity.Count))
77+
).TransformUsing(Transformers.AliasToBean<MappingEntity>()).List<MappingEntity>()
78+
);
79+
}
80+
}
81+
82+
[Test, Ignore("Not fixed yet")]
83+
public void GroupByClauseHasParameterSet()
84+
{
85+
using (var session = OpenSession())
86+
using (session.BeginTransaction())
87+
{
88+
MappingEntity mappingEntity = null;
89+
Assert.DoesNotThrow(
90+
() =>
91+
session.QueryOver<Entity>().SelectList(
92+
builder =>
93+
builder.Select(
94+
Projections.GroupProperty(
95+
Projections.Conditional(
96+
Restrictions.Eq(Projections.Property<Entity>(x => x.Name), ""),
97+
Projections.Constant(1),
98+
Projections.Constant(2)))
99+
.WithAlias(() => mappingEntity.Count))
100+
).TransformUsing(Transformers.AliasToBean<MappingEntity>()).List<MappingEntity>()
101+
);
102+
}
103+
}
104+
}
105+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3609
4+
{
5+
class MappingEntity
6+
{
7+
public virtual int Count { get; set; }
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH3609">
3+
4+
<class name="Entity">
5+
<id name="Id" generator="guid.comb" />
6+
<property name="Name" />
7+
</class>
8+
9+
</hibernate-mapping>

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,9 @@
718718
<Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Fixture.cs" />
719719
<Compile Include="Linq\ByMethod\DistinctTests.cs" />
720720
<Compile Include="Component\Basic\ComponentWithUniqueConstraintTests.cs" />
721+
<Compile Include="NHSpecificTest\NH3609\MappingEntity.cs" />
722+
<Compile Include="NHSpecificTest\NH3609\Entity.cs" />
723+
<Compile Include="NHSpecificTest\NH3609\Fixture.cs" />
721724
<Compile Include="NHSpecificTest\NH2839\FixtureByCode.cs" />
722725
<Compile Include="NHSpecificTest\NH3564\FixtureByCode.cs" />
723726
<Compile Include="NHSpecificTest\NH3583\Entity.cs" />
@@ -3147,6 +3150,7 @@
31473150
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
31483151
</ItemGroup>
31493152
<ItemGroup>
3153+
<EmbeddedResource Include="NHSpecificTest\NH3609\Mappings.hbm.xml" />
31503154
<EmbeddedResource Include="NHSpecificTest\NH3818\Mappings.hbm.xml" />
31513155
<EmbeddedResource Include="NHSpecificTest\NH3666\Mappings.hbm.xml">
31523156
<SubType>Designer</SubType>

src/NHibernate/Criterion/AggregateProjection.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,23 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer
5050

5151
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
5252
{
53-
if (projection != null)
54-
{
55-
return
56-
new SqlString(new object[]
57-
{
58-
aggregate, "(",
59-
SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery,
60-
enabledFilters)), ") as y",
61-
loc.ToString(), "_"
62-
});
63-
}
64-
else
53+
if (projection == null)
6554
{
66-
return
67-
new SqlString(new object[]
68-
{aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_"});
55+
return new SqlString(aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_");
6956
}
57+
58+
return new SqlString(
59+
aggregate,
60+
"(",
61+
SqlStringHelper.RemoveAsAliasesFromSql(
62+
projection.ToSqlString(
63+
criteria,
64+
loc,
65+
criteriaQuery,
66+
enabledFilters)),
67+
") as y",
68+
loc.ToString(),
69+
"_");
7070
}
7171

7272
public override bool IsGrouped
@@ -87,4 +87,4 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
8787
return base.GetTypedValues(criteria, criteriaQuery);
8888
}
8989
}
90-
}
90+
}

src/NHibernate/Criterion/AvgProjection.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,32 @@ namespace NHibernate.Criterion
1212
public class AvgProjection : AggregateProjection
1313
{
1414
public AvgProjection(IProjection projection) : base("avg", projection) {}
15-
public AvgProjection(String propertyName) : base("avg", propertyName) {}
15+
public AvgProjection(string propertyName) : base("avg", propertyName) {}
1616

17-
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery,
18-
IDictionary<string, IFilter> enabledFilters)
17+
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
1918
{
2019
ISessionFactoryImplementor factory = criteriaQuery.Factory;
2120
SqlType[] sqlTypeCodes = NHibernateUtil.Double.SqlTypes(factory);
2221
string sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]);
23-
string parameter;
22+
23+
var sql = new SqlStringBuilder().Add(aggregate).Add("(");
24+
sql.Add("cast(");
2425
if (projection != null)
2526
{
26-
parameter =
27-
SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery, enabledFilters)).ToString();
27+
sql.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery, enabledFilters)));
2828
}
2929
else
3030
{
31-
parameter = criteriaQuery.GetColumn(criteria, propertyName);
31+
sql.Add(criteriaQuery.GetColumn(criteria, propertyName));
3232
}
33-
string expression = string.Format("{0}(cast({1} as {2})) as {3}", aggregate, parameter, sqlType,
34-
GetColumnAliases(loc, criteria, criteriaQuery)[0]);
35-
return new SqlString(expression);
33+
sql.Add(" as ").Add(sqlType).Add(")");
34+
sql.Add(") as ").Add(GetColumnAliases(loc, criteria, criteriaQuery)[0]);
35+
return sql.ToSqlString();
3636
}
3737

3838
public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)
3939
{
4040
return new IType[] {NHibernateUtil.Double};
4141
}
4242
}
43-
}
43+
}

src/NHibernate/Criterion/CountProjection.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,23 @@ public override string ToString()
2727
return (distinct) ? "distinct " + base.ToString() : base.ToString();
2828
}
2929

30-
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery,
31-
IDictionary<string, IFilter> enabledFilters)
30+
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
3231
{
33-
SqlStringBuilder buf = new SqlStringBuilder().Add("count(");
32+
var buf = new SqlStringBuilder().Add("count(");
3433
if (distinct)
3534
{
3635
buf.Add("distinct ");
3736
}
38-
string column;
39-
if(projection!=null)
40-
{
41-
column =
42-
SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery,
43-
enabledFilters)).ToString();
44-
}
45-
else
46-
{
47-
column = criteriaQuery.GetColumn(criteria, propertyName);
48-
}
37+
if (projection != null)
38+
{
39+
buf.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, position, criteriaQuery, enabledFilters)));
40+
}
41+
else
42+
{
43+
buf.Add(criteriaQuery.GetColumn(criteria, propertyName));
44+
}
4945

50-
buf.Add(column).Add(") as y").Add(position.ToString()).Add("_");
46+
buf.Add(") as y").Add(position.ToString()).Add("_");
5147
return buf.ToSqlString();
5248
}
5349

@@ -57,4 +53,4 @@ public CountProjection SetDistinct()
5753
return this;
5854
}
5955
}
60-
}
56+
}

src/NHibernate/Loader/AbstractEntityJoinWalker.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ protected void InitProjection(SqlString projectionString, SqlString whereString,
4343
{
4444
WalkEntityTree(persister, Alias);
4545
Persisters = new ILoadable[0];
46-
InitStatementString(projectionString, whereString, orderByString, groupByString.ToString(), havingString, lockMode);
46+
InitStatementString(projectionString, whereString, orderByString, groupByString, havingString, lockMode);
4747
}
4848

4949
private void InitStatementString(SqlString condition, SqlString orderBy, LockMode lockMode)
5050
{
51-
InitStatementString(null, condition, orderBy, string.Empty, null, lockMode);
51+
InitStatementString(null, condition, orderBy, null, null, lockMode);
5252
}
5353

54-
private void InitStatementString(SqlString projection,SqlString condition, SqlString orderBy, string groupBy, SqlString having, LockMode lockMode)
54+
private void InitStatementString(SqlString projection,SqlString condition, SqlString orderBy, SqlString groupBy, SqlString having, LockMode lockMode)
5555
{
5656
int joins = CountEntityPersisters(associations);
5757
Suffixes = BasicLoader.GenerateSuffixes(joins + 1);

src/NHibernate/SqlCommand/SqlSelectBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class SqlSelectBuilder : SqlBaseBuilder, ISqlStringBuilder
1818
private SqlString whereClause;
1919
private SqlString outerJoinsAfterWhere;
2020
private SqlString orderByClause;
21-
private string groupByClause;
21+
private SqlString groupByClause;
2222
private SqlString havingClause;
2323
private LockMode lockMode;
2424
private string comment;
@@ -83,7 +83,7 @@ public SqlSelectBuilder SetOrderByClause(SqlString orderByClause)
8383
/// </summary>
8484
/// <param name="groupByClause">The groupByClause to set</param>
8585
/// <returns>The SqlSelectBuilder</returns>
86-
public SqlSelectBuilder SetGroupByClause(string groupByClause)
86+
public SqlSelectBuilder SetGroupByClause(SqlString groupByClause)
8787
{
8888
this.groupByClause = groupByClause;
8989
return this;
@@ -247,7 +247,7 @@ public SqlString ToSqlString()
247247
}
248248
}
249249

250-
if (StringHelper.IsNotEmpty(groupByClause))
250+
if (SqlStringHelper.IsNotEmpty(groupByClause))
251251
{
252252
sqlBuilder.Add(" GROUP BY ")
253253
.Add(groupByClause);

0 commit comments

Comments
 (0)