|
From: <jul...@us...> - 2010-11-21 17:14:56
|
Revision: 5267
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5267&view=rev
Author: julian-maughan
Date: 2010-11-21 17:14:48 +0000 (Sun, 21 Nov 2010)
Log Message:
-----------
In the Criteria API, fix the way in which query parameters are generated, so that they are in the same order as the parameters in the SQL statement (ref. NH-2409). Reverses a design change introduced in r3458 (see NH-1280).
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/AggregateProjection.cs
trunk/nhibernate/src/NHibernate/Criterion/BetweenExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/ConstantProjection.cs
trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs
trunk/nhibernate/src/NHibernate/Criterion/IdentifierEqExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/InExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/InsensitiveLikeExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/Order.cs
trunk/nhibernate/src/NHibernate/Criterion/SQLCriterion.cs
trunk/nhibernate/src/NHibernate/Criterion/SimpleExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/SimpleSubqueryExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs
trunk/nhibernate/src/NHibernate/Criterion/SubqueryProjection.cs
trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs
trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs
trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/AddNumberProjection.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Contest.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Message.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/MessageReading.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/User.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/AggregateProjection.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/AggregateProjection.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/AggregateProjection.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using NHibernate.SqlCommand;
+using NHibernate.Engine;
using NHibernate.Type;
using NHibernate.Util;
@@ -47,25 +48,24 @@
return new IType[] {criteriaQuery.GetType(criteria, propertyName)};
}
- public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
if (projection != null)
{
return
new SqlString(new object[]
- {
- aggregate, "(",
- StringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery,
- enabledFilters)), ") as y",
- loc.ToString(), "_"
- });
+ {
+ aggregate, "(",
+ StringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery,
+ enabledFilters)), ") as y",
+ loc.ToString(), "_"
+ });
}
else
{
return
new SqlString(new object[]
- {aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_"});
+ {aggregate, "(", criteriaQuery.GetColumn(criteria, propertyName), ") as y", loc.ToString(), "_"});
}
}
@@ -74,10 +74,17 @@
get { return false; }
}
- public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
throw new InvalidOperationException("not a grouping projection");
}
+
+ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
+ {
+ if (projection != null)
+ return projection.GetTypedValues(criteria, criteriaQuery);
+
+ return base.GetTypedValues(criteria, criteriaQuery);
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Criterion/BetweenExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/BetweenExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/BetweenExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,10 +1,10 @@
+using System;
+using System.Collections.Generic;
+using NHibernate.Engine;
+using NHibernate.SqlCommand;
+
namespace NHibernate.Criterion
{
- using System;
- using System.Collections.Generic;
- using Engine;
- using SqlCommand;
-
/// <summary>
/// An <see cref="ICriterion"/> that represents a "between" constraint.
/// </summary>
@@ -23,11 +23,11 @@
/// <param name="_projection">The _projection.</param>
/// <param name="_lo">The _lo.</param>
/// <param name="_hi">The _hi.</param>
- public BetweenExpression(IProjection _projection, object _lo, object _hi)
+ public BetweenExpression(IProjection projection, object lo, object hi)
{
- this._projection = _projection;
- this._lo = _lo;
- this._hi = _hi;
+ this._projection = projection;
+ this._lo = lo;
+ this._hi = hi;
}
/// <summary>
@@ -44,8 +44,7 @@
_hi = hi;
}
- public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
//TODO: add a default capacity
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
@@ -54,7 +53,6 @@
SqlString[] columnNames =
CriterionUtil.GetColumnNames(_propertyName, _projection, criteriaQuery, criteria, enabledFilters);
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
if (columnNames.Length == 1)
{
sqlBuilder
@@ -107,7 +105,6 @@
return null;
}
- /// <summary></summary>
public override string ToString()
{
return _propertyName + " between " + _lo + " and " + _hi;
Modified: trunk/nhibernate/src/NHibernate/Criterion/ConstantProjection.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/ConstantProjection.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/ConstantProjection.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,11 +1,11 @@
+using System;
+using System.Collections.Generic;
+using NHibernate.Engine;
+using NHibernate.SqlCommand;
+using NHibernate.Type;
+
namespace NHibernate.Criterion
{
- using System;
- using System.Collections.Generic;
- using Engine;
- using SqlCommand;
- using Type;
-
/// <summary>
/// This is useful if we want to send a value to the database
/// </summary>
@@ -14,17 +14,17 @@
{
private readonly object value;
private readonly IType type;
- public ConstantProjection(object value):this(value,NHibernateUtil.GuessType(value.GetType()))
+
+ public ConstantProjection(object value) : this(value, NHibernateUtil.GuessType(value.GetType()))
{
-
}
- public ConstantProjection(object value,IType type)
+
+ public ConstantProjection(object value, IType type)
{
this.value = value;
this.type = type;
}
-
public override bool IsAggregate
{
get { return false; }
@@ -42,7 +42,6 @@
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
- criteriaQuery.AddUsedTypedValues(new TypedValue[] { new TypedValue(type, value, EntityMode.Poco) });
return new SqlStringBuilder()
.AddParameter()
.Add(" as ")
Modified: trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -13,27 +13,27 @@
{
ISessionFactoryImplementor Factory { get; }
- /// <summary> Get the name of the column mapped by a property path, ignoring projection alias</summary>
+ /// <summary>Get the name of the column mapped by a property path, ignoring projection alias</summary>
string GetColumn(ICriteria criteria, string propertyPath);
- /// <summary> Get the names of the columns mapped by a property path, ignoring projection aliases</summary>
+ /// <summary>Get the names of the columns mapped by a property path, ignoring projection aliases</summary>
string[] GetColumns(ICriteria criteria, string propertyPath);
- /// <summary> Get the type of a property path, ignoring projection aliases</summary>
+ /// <summary>Get the type of a property path, ignoring projection aliases</summary>
IType GetType(ICriteria criteria, string propertyPath);
string[] GetColumnAliasesUsingProjection(ICriteria criteria, string propertyPath);
- /// <summary> Get the names of the columns mapped by a property path</summary>
+ /// <summary>Get the names of the columns mapped by a property path</summary>
string[] GetColumnsUsingProjection(ICriteria criteria, string propertyPath);
- /// <summary> Get the type of a property path</summary>
+ /// <summary>Get the type of a property path</summary>
IType GetTypeUsingProjection(ICriteria criteria, string propertyPath);
- /// <summary> Get the a typed value for the given property value.</summary>
+ /// <summary>Get the a typed value for the given property value.</summary>
TypedValue GetTypedValue(ICriteria criteria, string propertyPath, object value);
- /// <summary> Get the entity name of an entity</summary>
+ /// <summary>Get the entity name of an entity</summary>
string GetEntityName(ICriteria criteria);
/// <summary>
@@ -42,7 +42,7 @@
/// </summary>
string GetEntityName(ICriteria criteria, string propertyPath);
- /// <summary> Get the root table alias of an entity</summary>
+ /// <summary>Get the root table alias of an entity</summary>
string GetSQLAlias(ICriteria subcriteria);
/// <summary>
@@ -51,13 +51,13 @@
/// </summary>
string GetSQLAlias(ICriteria criteria, string propertyPath);
- /// <summary> Get the property name, given a possibly qualified property name</summary>
+ /// <summary>Get the property name, given a possibly qualified property name</summary>
string GetPropertyName(string propertyName);
- /// <summary> Get the identifier column names of this entity</summary>
+ /// <summary>Get the identifier column names of this entity</summary>
string[] GetIdentifierColumns(ICriteria subcriteria);
- /// <summary> Get the identifier type of this entity</summary>
+ /// <summary>Get the identifier type of this entity</summary>
IType GetIdentifierType(ICriteria subcriteria);
TypedValue GetTypedIdentifierValue(ICriteria subcriteria, object value);
@@ -67,12 +67,6 @@
int GetIndexForAlias();
/// <summary>
- /// When adding values to the query string it is imperative that they are reported via this function back to the query builder.
- /// Do not report the same item multiple times as it will be assumed to be a separate parameter.
- /// </summary>
- void AddUsedTypedValues(TypedValue [] values);
-
- /// <summary>
/// Creates a dummy parameter index for the supplied paged value.
/// Returns null if the Dialect does not support limit parameters
/// </summary>
Modified: trunk/nhibernate/src/NHibernate/Criterion/IdentifierEqExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/IdentifierEqExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/IdentifierEqExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -62,7 +62,6 @@
{
if (_projection == null)
{
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria,criteriaQuery));
result.AddParameter();
}
else
@@ -74,6 +73,9 @@
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
+ if (_projection != null)
+ return _projection.GetTypedValues(criteria, criteriaQuery);
+
return new TypedValue[] {criteriaQuery.GetTypedIdentifierValue(criteria, value)};
}
Modified: trunk/nhibernate/src/NHibernate/Criterion/InExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/InExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/InExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,15 +1,15 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using NHibernate.Engine;
using NHibernate.SqlCommand;
using NHibernate.Type;
using NHibernate.Util;
-using System.Collections.Generic;
namespace NHibernate.Criterion
{
/// <summary>
- /// An <see cref="ICriterion"/> that constrains the property
+ /// An <see cref="ICriterion"/> that constrains the property
/// to a specified list of values.
/// </summary>
/// <remarks>
@@ -27,17 +27,12 @@
/// </summary>
/// <param name="projection">The projection.</param>
/// <param name="_values">The _values.</param>
- public InExpression(IProjection projection, object[] _values)
+ public InExpression(IProjection projection, object[] values)
{
_projection = projection;
- this._values = _values;
+ _values = values;
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="propertyName"></param>
- /// <param name="values"></param>
public InExpression(string propertyName, object[] values)
{
_propertyName = propertyName;
@@ -46,15 +41,14 @@
public override IProjection[] GetProjections()
{
- if(_projection != null)
+ if (_projection != null)
{
return new IProjection[] { _projection };
}
return null;
}
- public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
if (_projection == null)
{
@@ -75,7 +69,6 @@
// Generate SqlString of the form:
// columnName1 in (values) and columnName2 in (values) and ...
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
for (int columnIndex = 0; columnIndex < columnNames.Length; columnIndex++)
{
SqlString columnName = columnNames[columnIndex];
@@ -124,7 +117,7 @@
else
{
IType[] types = _projection.GetTypes(criteria, criteriaQuery);
- if(types.Length!=1)
+ if (types.Length != 1)
{
throw new QueryException("Cannot use projections that return more than a single column with InExpression");
}
@@ -142,10 +135,8 @@
for (int j = 0; j < _values.Length; j++)
{
object subval = _values[j] == null
- ?
- null
- :
- actype.GetPropertyValues(_values[j], EntityMode.Poco)[i];
+ ? null
+ : actype.GetPropertyValues(_values[j], EntityMode.Poco)[i];
list.Add(new TypedValue(types[i], subval, EntityMode.Poco));
}
}
@@ -167,7 +158,6 @@
protected set { _values = value; }
}
- /// <summary></summary>
public override string ToString()
{
return (_projection ?? (object)_propertyName) + " in (" + StringHelper.ToString(_values) + ')';
Modified: trunk/nhibernate/src/NHibernate/Criterion/InsensitiveLikeExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/InsensitiveLikeExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/InsensitiveLikeExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,11 +1,11 @@
+using System;
+using System.Collections.Generic;
+using NHibernate.Dialect;
+using NHibernate.Engine;
+using NHibernate.SqlCommand;
+
namespace NHibernate.Criterion
{
- using System;
- using System.Collections.Generic;
- using Dialect;
- using Engine;
- using SqlCommand;
-
/// <summary>
/// An <see cref="ICriterion"/> that represents an "like" constraint
/// that is <b>not</b> case sensitive.
@@ -58,15 +58,13 @@
{
}
- public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
//TODO: add default capacity
SqlStringBuilder sqlBuilder = new SqlStringBuilder();
SqlString[] columnNames =
CriterionUtil.GetColumnNames(propertyName, projection, criteriaQuery, criteria, enabledFilters);
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria,criteriaQuery));
if (columnNames.Length != 1)
{
throw new HibernateException("insensitive like may only be used with single-column properties");
@@ -93,23 +91,31 @@
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
- return CriterionUtil.GetTypedValues(criteriaQuery, criteria, projection, propertyName, value.ToString().ToLower());
+ List<TypedValue> typedValues = new List<TypedValue>();
+
+ if (projection != null)
+ {
+ typedValues.AddRange(projection.GetTypedValues(criteria, criteriaQuery));
+ typedValues.AddRange(CriterionUtil.GetTypedValues(criteriaQuery, criteria, projection, null, value.ToString().ToLower()));
+ }
+ else
+ typedValues.Add(criteriaQuery.GetTypedValue(criteria, propertyName, value.ToString().ToLower()));
+
+ return typedValues.ToArray();
}
public override IProjection[] GetProjections()
{
- if(projection != null)
+ if (projection != null)
{
return new IProjection[] { projection };
}
return null;
}
- /// <summary></summary>
public override string ToString()
{
return (projection ?? (object)propertyName) + " ilike " + value;
}
-
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/LikeExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,7 +1,7 @@
using System;
+using System.Collections.Generic;
using NHibernate.Engine;
using NHibernate.SqlCommand;
-using System.Collections.Generic;
using NHibernate.Util;
namespace NHibernate.Criterion
@@ -10,7 +10,7 @@
/// An <see cref="ICriterion"/> that represents an "like" constraint.
/// </summary>
/// <remarks>
- /// The case sensitivity depends on the database settings for string
+ /// The case sensitivity depends on the database settings for string
/// comparisons. Use <see cref="InsensitiveLikeExpression"/> if the
/// string comparison should not be case sensitive.
/// </remarks>
@@ -73,8 +73,6 @@
else
lhs.Add(columns[0]);
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
-
if (ignoreCase)
{
Dialect.Dialect dialect = criteriaQuery.Factory.Dialect;
@@ -89,14 +87,13 @@
if (escapeChar.HasValue)
lhs.Add(" escape '" + escapeChar + "'");
+
return lhs.ToSqlString();
}
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
- return new TypedValue[] {
- new TypedValue(NHibernateUtil.String, value, EntityMode.Poco),
- };
+ return new TypedValue[] { new TypedValue(NHibernateUtil.String, value, EntityMode.Poco) };
}
public override IProjection[] GetProjections()
Modified: trunk/nhibernate/src/NHibernate/Criterion/Order.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/Order.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.Text;
+using NHibernate.Criterion;
using NHibernate.Engine;
-using NHibernate.Criterion;
using NHibernate.SqlCommand;
namespace NHibernate.Criterion
@@ -11,43 +11,36 @@
/// Represents an order imposed upon a <see cref="ICriteria"/>
/// result set.
/// </summary>
+ /// <remarks>
+ /// Should Order implement ICriteriaQuery?
+ /// </remarks>
[Serializable]
public class Order
{
protected bool ascending;
protected string propertyName;
protected IProjection projection;
- /// <summary>
- /// Constructor for Order.
- /// </summary>
- /// <param name="projection"></param>
- /// <param name="ascending"></param>
+
public Order(IProjection projection, bool ascending)
{
this.projection = projection;
this.ascending = ascending;
}
- /// <summary>
- /// Constructor for Order.
- /// </summary>
- /// <param name="propertyName"></param>
- /// <param name="ascending"></param>
public Order(string propertyName, bool ascending)
{
this.propertyName = propertyName;
this.ascending = ascending;
}
-
/// <summary>
/// Render the SQL fragment
/// </summary>
public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
- if(projection!=null)
+ if (projection!=null)
{
- SqlString sb=new SqlString();
+ SqlString sb = new SqlString();
SqlString produced = this.projection.ToSqlString(criteria, 0, criteriaQuery, new Dictionary<string, IFilter>());
SqlString truncated = NHibernate.Util.StringHelper.RemoveAsAliasesFromSql(produced);
sb = sb.Append(truncated);
@@ -131,5 +124,13 @@
{
return new Order(propertyName, false);
}
+
+ public TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
+ {
+ if (projection != null)
+ return projection.GetTypedValues(criteria, criteriaQuery);
+
+ return new TypedValue[0]; // not using parameters for ORDER BY columns
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate/Criterion/SQLCriterion.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/SQLCriterion.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/SQLCriterion.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -32,7 +32,6 @@
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
return _sql.Replace("{alias}", criteriaQuery.GetSQLAlias(criteria));
}
@@ -46,7 +45,6 @@
return null;
}
- /// <summary></summary>
public override string ToString()
{
return _sql.ToString();
Modified: trunk/nhibernate/src/NHibernate/Criterion/SimpleExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/SimpleExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/SimpleExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -77,10 +77,15 @@
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
SqlString[] columnNames =
- CriterionUtil.GetColumnNamesForSimpleExpression(propertyName, _projection, criteriaQuery, criteria, enabledFilters,
- this, value);
+ CriterionUtil.GetColumnNamesForSimpleExpression(
+ propertyName,
+ _projection,
+ criteriaQuery,
+ criteria,
+ enabledFilters,
+ this,
+ value);
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
if (ignoreCase)
{
if (columnNames.Length != 1)
@@ -120,20 +125,29 @@
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
+ List<TypedValue> typedValues = new List<TypedValue>();
object icvalue = ignoreCase ? value.ToString().ToLower() : value;
- return CriterionUtil.GetTypedValues(criteriaQuery, criteria, _projection,propertyName, icvalue);
+
+ if (_projection != null)
+ {
+ typedValues.AddRange(_projection.GetTypedValues(criteria, criteriaQuery));
+ typedValues.AddRange(CriterionUtil.GetTypedValues(criteriaQuery, criteria, _projection, null, icvalue));
+ }
+ else
+ typedValues.Add(criteriaQuery.GetTypedValue(criteria, propertyName, icvalue));
+
+ return typedValues.ToArray();
}
public override IProjection[] GetProjections()
{
- if(_projection != null)
+ if (_projection != null)
{
return new IProjection[] { _projection };
}
return null;
}
- /// <summary></summary>
public override string ToString()
{
return (_projection ?? (object)propertyName) + Op + value;
Modified: trunk/nhibernate/src/NHibernate/Criterion/SimpleSubqueryExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/SimpleSubqueryExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/SimpleSubqueryExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -14,12 +14,10 @@
internal SimpleSubqueryExpression(Object value, String op, String quantifier, DetachedCriteria dc)
: base(op, quantifier, dc)
-
{
this.value = value;
}
-
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
TypedValue[] superTv = base.GetTypedValues(criteria, criteriaQuery);
@@ -31,7 +29,6 @@
protected override SqlString ToLeftSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
return SqlString.Parameter;
}
}
Modified: trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -14,25 +14,24 @@
{
private readonly CriteriaImpl criteriaImpl;
private readonly String quantifier;
- private readonly bool prefixOp;
- private readonly String op;
+ private readonly bool prefixOp;
+ private readonly String op;
private QueryParameters parameters;
private IType[] types;
[NonSerialized] private CriteriaQueryTranslator innerQuery;
- protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc)
- :this(op, quantifier, dc, true)
- {
-
- }
+ protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc)
+ :this(op, quantifier, dc, true)
+ {
+ }
protected SubqueryExpression(String op, String quantifier, DetachedCriteria dc, bool prefixOp)
{
criteriaImpl = dc.GetCriteriaImpl();
this.quantifier = quantifier;
- this.prefixOp = prefixOp;
- this.op = op;
+ this.prefixOp = prefixOp;
+ this.op = op;
}
public IType[] GetTypes()
@@ -42,8 +41,7 @@
protected abstract SqlString ToLeftSqlString(ICriteria criteria, ICriteriaQuery outerQuery);
- public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
InitializeInnerQueryAndParameters(criteriaQuery);
@@ -80,27 +78,27 @@
buf.Add(" ").Add(op).Add(" ");
}
- if (quantifier != null && prefixOp)
+ if (quantifier != null && prefixOp)
{
buf.Add(quantifier).Add(" ");
}
-
- buf.Add("(").Add(sql).Add(")");
+
+ buf.Add("(").Add(sql).Add(")");
- if(quantifier!=null && prefixOp==false)
- {
- buf.Add(" ").Add(quantifier);
- }
+ if (quantifier != null && prefixOp == false)
+ {
+ buf.Add(" ").Add(quantifier);
+ }
- return buf.ToSqlString();
+ return buf.ToSqlString();
}
public override string ToString()
{
- if(prefixOp)
- return string.Format("{0} {1} ({2})", op, quantifier, criteriaImpl);
- return string.Format("{0} ({1}) {2}", op, criteriaImpl, quantifier);
-
+ if(prefixOp)
+ return string.Format("{0} {1} ({2})", op, quantifier, criteriaImpl);
+
+ return string.Format("{0} ({1}) {2}", op, criteriaImpl, quantifier);
}
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
@@ -123,19 +121,28 @@
public void InitializeInnerQueryAndParameters(ICriteriaQuery criteriaQuery)
{
- ISessionFactoryImplementor factory = criteriaQuery.Factory;
- innerQuery =
- new CriteriaQueryTranslator(factory, criteriaImpl, //implicit polymorphism not supported (would need a union)
- criteriaImpl.EntityOrClassName, criteriaQuery.GenerateSQLAlias(), criteriaQuery);
- if (innerQuery.HasProjection)
+ if (innerQuery == null)
{
- parameters = innerQuery.GetQueryParameters();
- types = innerQuery.ProjectedTypes;
+ ISessionFactoryImplementor factory = criteriaQuery.Factory;
+
+ innerQuery =
+ new CriteriaQueryTranslator(
+ factory,
+ criteriaImpl, //implicit polymorphism not supported (would need a union)
+ criteriaImpl.EntityOrClassName,
+ criteriaQuery.GenerateSQLAlias(),
+ criteriaQuery);
+
+ if (innerQuery.HasProjection)
+ {
+ parameters = innerQuery.GetQueryParameters();
+ types = innerQuery.ProjectedTypes;
+ }
+ else
+ {
+ types = null;
+ }
}
- else
- {
- types = null;
- }
}
public ICriteria Criteria
@@ -144,4 +151,4 @@
get { return criteriaImpl; }
}
}
-}
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Criterion/SubqueryProjection.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/SubqueryProjection.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Criterion/SubqueryProjection.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,12 +1,12 @@
using System;
+using System.Collections.Generic;
+using NHibernate.Engine;
using NHibernate.Impl;
using NHibernate.SqlCommand;
using NHibernate.Type;
namespace NHibernate.Criterion
{
- using System.Collections.Generic;
-
/// <summary>
/// A property value, or grouped property value
/// </summary>
@@ -19,6 +19,7 @@
{
_subQuery = subquery;
}
+
public override string ToString()
{
return _subQuery.ToString();
@@ -43,17 +44,17 @@
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
SqlString sqlStringSubquery = _subQuery.ToSqlString(criteria, criteriaQuery, enabledFilters);
- return sqlStringSubquery.Append(new SqlString(new object[]
- {
- " as y",
- loc.ToString(),
- "_"
- }));
+ return sqlStringSubquery.Append(new SqlString(new object[] { " as y", loc.ToString(), "_" } ));
}
public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
throw new InvalidOperationException("not a grouping projection");
}
+
+ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
+ {
+ return _subQuery.GetTypedValues(criteria, criteriaQuery);
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Loader/AbstractEntityJoinWalker.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,10 +1,10 @@
using System.Collections.Generic;
using NHibernate.Engine;
+using NHibernate.Loader.Criteria;
using NHibernate.Persister.Entity;
using NHibernate.SqlCommand;
using NHibernate.Type;
using NHibernate.Util;
-using NHibernate.Loader.Criteria;
namespace NHibernate.Loader
{
@@ -13,16 +13,14 @@
private readonly IOuterJoinLoadable persister;
private readonly string alias;
- public AbstractEntityJoinWalker(IOuterJoinLoadable persister, ISessionFactoryImplementor factory,
- IDictionary<string, IFilter> enabledFilters)
+ public AbstractEntityJoinWalker(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, IDictionary<string, IFilter> enabledFilters)
: base(factory, enabledFilters)
{
this.persister = persister;
alias = GenerateRootAlias(persister.EntityName);
}
- public AbstractEntityJoinWalker(string rootSqlAlias, IOuterJoinLoadable persister, ISessionFactoryImplementor factory,
- IDictionary<string, IFilter> enabledFilters)
+ public AbstractEntityJoinWalker(string rootSqlAlias, IOuterJoinLoadable persister, ISessionFactoryImplementor factory, IDictionary<string, IFilter> enabledFilters)
: base(factory, enabledFilters)
{
this.persister = persister;
@@ -35,26 +33,17 @@
IList<OuterJoinableAssociation> allAssociations = new List<OuterJoinableAssociation>(associations);
allAssociations.Add(
new OuterJoinableAssociation(persister.EntityType, null, null, alias, JoinType.LeftOuterJoin, null, Factory,
- new CollectionHelper.EmptyMapClass<string, IFilter>()));
+ new CollectionHelper.EmptyMapClass<string, IFilter>()));
InitPersisters(allAssociations, lockMode);
InitStatementString(whereString, orderByString, lockMode);
}
- protected void InitProjection(CriteriaQueryTranslator translator,
- IDictionary<string, IFilter> enabledFilters, LockMode lockMode)
+ protected void InitProjection(SqlString projectionString, SqlString whereString, SqlString orderByString, SqlString groupByString, SqlString havingString, IDictionary<string, IFilter> enabledFilters, LockMode lockMode)
{
- // the order of the calls here is important, as the join clauses can contain parameter bindings
- SqlString projectionString = translator.GetSelect(enabledFilters);
WalkEntityTree(persister, Alias);
- SqlString whereString = translator.GetWhereCondition(enabledFilters);
- SqlString orderByString = translator.GetOrderBy();
- SqlString groupByString = translator.GetGroupBy();
- SqlString havingString = translator.GetHavingCondition(enabledFilters);
-
Persisters = new ILoadable[0];
- InitStatementString(projectionString, whereString, orderByString, groupByString.ToString(),
- havingString, lockMode);
+ InitStatementString(projectionString, whereString, orderByString, groupByString.ToString(), havingString, lockMode);
}
private void InitStatementString(SqlString condition, SqlString orderBy, LockMode lockMode)
@@ -62,16 +51,14 @@
InitStatementString(null, condition, orderBy, string.Empty, null, lockMode);
}
- private void InitStatementString(SqlString projection,SqlString condition,
- SqlString orderBy,string groupBy, SqlString having, LockMode lockMode)
+ private void InitStatementString(SqlString projection,SqlString condition, SqlString orderBy, string groupBy, SqlString having, LockMode lockMode)
{
int joins = CountEntityPersisters(associations);
Suffixes = BasicLoader.GenerateSuffixes(joins + 1);
JoinFragment ojf = MergeOuterJoins(associations);
- SqlString selectClause = projection
- ??
- new SqlString(persister.SelectFragment(alias, Suffixes[joins]) + SelectString(associations));
+ SqlString selectClause =
+ projection ?? new SqlString(persister.SelectFragment(alias, Suffixes[joins]) + SelectString(associations));
SqlSelectBuilder select = new SqlSelectBuilder(Factory)
.SetLockMode(lockMode)
@@ -92,8 +79,7 @@
/// <summary>
/// The superclass deliberately excludes collections
/// </summary>
- protected override bool IsJoinedFetchEnabled(IAssociationType type, FetchMode config,
- CascadeStyle cascadeStyle)
+ protected override bool IsJoinedFetchEnabled(IAssociationType type, FetchMode config, CascadeStyle cascadeStyle)
{
return IsJoinedFetchEnabledInMapping(config, type);
}
Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -42,7 +42,14 @@
{
resultTypes = translator.ProjectedTypes;
- InitProjection(translator, enabledFilters, LockMode.None);
+ InitProjection(
+ translator.GetSelect(enabledFilters),
+ translator.GetWhereCondition(enabledFilters),
+ translator.GetOrderBy(),
+ translator.GetGroupBy(),
+ translator.GetHavingCondition(enabledFilters),
+ enabledFilters,
+ LockMode.None);
}
else
{
Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using System.Text;
using Iesi.Collections.Generic;
using NHibernate.Criterion;
@@ -8,7 +9,7 @@
using NHibernate.Hql.Util;
using NHibernate.Impl;
using NHibernate.Persister.Collection;
-using NHibernate.Persister.Entity;
+using NHibernate_Persister_Entity = NHibernate.Persister.Entity;
using NHibernate.SqlCommand;
using NHibernate.Type;
using NHibernate.Util;
@@ -106,18 +107,6 @@
public QueryParameters GetQueryParameters()
{
- ArrayList values = new ArrayList(usedTypedValues.Count);
- List<IType> types = new List<IType>(usedTypedValues.Count);
-
- foreach (TypedValue value in usedTypedValues)
- {
- values.Add(value.Value);
- types.Add(value.Type);
- }
-
- object[] valueArray = values.ToArray();
- IType[] typeArray = types.ToArray();
-
RowSelection selection = new RowSelection();
selection.FirstRow = rootCriteria.FirstResult;
selection.MaxRows = rootCriteria.MaxResults;
@@ -130,6 +119,14 @@
ICriteria subcriteria = GetAliasedCriteria(me.Key);
lockModes[GetSQLAlias(subcriteria)] = me.Value;
}
+
+ List<TypedValue> typedValues = new List<TypedValue>();
+
+ // NH-specific: Get parameters for projections first
+ if (this.HasProjection)
+ {
+ typedValues.AddRange(rootCriteria.Projection.GetTypedValues(rootCriteria, this));
+ }
foreach (CriteriaImpl.Subcriteria subcriteria in rootCriteria.IterateSubcriteria())
{
@@ -138,13 +135,69 @@
{
lockModes[GetSQLAlias(subcriteria)] = lm;
}
+ // Get parameters that may be used in JOINs
+ if (subcriteria.WithClause != null)
+ {
+ typedValues.AddRange(subcriteria.WithClause.GetTypedValues(subcriteria, this));
+ }
}
+
+ List<TypedValue> groupedTypedValues = new List<TypedValue>();
+
+ // Type and value gathering for the WHERE clause needs to come AFTER lock mode gathering,
+ // because the lock mode gathering loop now contains join clauses which can contain
+ // parameter bindings (as in the HQL WITH clause).
+ foreach(CriteriaImpl.CriterionEntry ce in rootCriteria.IterateExpressionEntries())
+ {
+ bool criteriaContainsGroupedProjections = false;
+ IProjection[] projections = ce.Criterion.GetProjections();
+ if (projections != null)
+ {
+ foreach (IProjection projection in projections)
+ {
+ if (projection.IsGrouped)
+ {
+ criteriaContainsGroupedProjections = true;
+ break;
+ }
+ }
+ }
+
+ if (criteriaContainsGroupedProjections)
+ // GROUP BY/HAVING parameters need to be added after WHERE parameters - so don't add them
+ // to typedValues yet
+ groupedTypedValues.AddRange(ce.Criterion.GetTypedValues(ce.Criteria, this));
+ else
+ typedValues.AddRange(ce.Criterion.GetTypedValues(ce.Criteria, this));
+ }
+
+ // NH-specific: GROUP BY/HAVING parameters need to appear after WHERE parameters
+ if (groupedTypedValues.Count > 0)
+ {
+ typedValues.AddRange(groupedTypedValues);
+ }
+
+ // NH-specific: To support expressions/projections used in ORDER BY
+ foreach(CriteriaImpl.OrderEntry oe in rootCriteria.IterateOrderings())
+ {
+ typedValues.AddRange(oe.Order.GetTypedValues(oe.Criteria, this));
+ }
+
return
- new QueryParameters(typeArray, valueArray, lockModes, selection, rootCriteria.Cacheable, rootCriteria.CacheRegion,
- rootCriteria.Comment, rootCriteria.LookupByNaturalKey, rootCriteria.ResultTransformer, _tempPagingParameterIndexes);
+ new QueryParameters(
+ typedValues.Select(tv => tv.Type).ToArray(),
+ typedValues.Select(tv => tv.Value).ToArray(),
+ lockModes,
+ selection,
+ rootCriteria.Cacheable,
+ rootCriteria.CacheRegion,
+ rootCriteria.Comment,
+ rootCriteria.LookupByNaturalKey,
+ rootCriteria.ResultTransformer,
+ _tempPagingParameterIndexes);
}
-
+
public SqlString GetGroupBy()
{
if (rootCriteria.Projection.IsGrouped)
@@ -366,7 +419,7 @@
private void CreateCriteriaEntityNameMap()
{
// initialize the rootProvider first
- ICriteriaInfoProvider rootProvider = new EntityCriteriaInfoProvider((IQueryable)sessionFactory.GetEntityPersister(rootEntityName));
+ ICriteriaInfoProvider rootProvider = new EntityCriteriaInfoProvider((NHibernate_Persister_Entity.IQueryable)sessionFactory.GetEntityPersister(rootEntityName));
criteriaInfoMap.Add(rootCriteria, rootProvider);
nameCriteriaInfoMap.Add(rootProvider.Name, rootProvider);
@@ -384,7 +437,7 @@
{
foreach (KeyValuePair<string, ICriteria> me in associationPathCriteriaMap)
{
- IJoinable joinable = GetPathJoinable(me.Key);
+ NHibernate_Persister_Entity.IJoinable joinable = GetPathJoinable(me.Key);
if (joinable != null && joinable.IsCollection)
{
criteriaCollectionPersisters.Add((ICollectionPersister)joinable);
@@ -392,10 +445,10 @@
}
}
- private IJoinable GetPathJoinable(string path)
+ private Persister.Entity.IJoinable GetPathJoinable(string path)
{
- IJoinable last = (IJoinable)Factory.GetEntityPersister(rootEntityName);
- IPropertyMapping lastEntity = (IPropertyMapping)last;
+ NHibernate_Persister_Entity.IJoinable last = (NHibernate_Persister_Entity.IJoinable)Factory.GetEntityPersister(rootEntityName);
+ NHibernate_Persister_Entity.IPropertyMapping lastEntity = (NHibernate_Persister_Entity.IPropertyMapping)last;
string componentPath = "";
@@ -417,7 +470,7 @@
IAssociationType atype = (IAssociationType)type;
last = atype.GetAssociatedJoinable(Factory);
- lastEntity = (IPropertyMapping)Factory.GetEntityPersister(atype.GetAssociatedEntityName(Factory));
+ lastEntity = (NHibernate_Persister_Entity.IPropertyMapping)Factory.GetEntityPersister(atype.GetAssociatedEntityName(Factory));
componentPath = "";
}
else if (type.IsComponentType)
@@ -466,7 +519,7 @@
}
else
{
- provider = new EntityCriteriaInfoProvider((IQueryable)sessionFactory.GetEntityPersister(
+ provider = new EntityCriteriaInfoProvider((NHibernate_Persister_Entity.IQueryable)sessionFactory.GetEntityPersister(
atype.GetAssociatedEntityName(
sessionFactory)
));
@@ -564,18 +617,18 @@
public string[] GetIdentifierColumns(ICriteria subcriteria)
{
- string[] idcols = ((ILoadable)GetPropertyMapping(GetEntityName(subcriteria))).IdentifierColumnNames;
+ string[] idcols = ((NHibernate_Persister_Entity.ILoadable)GetPropertyMapping(GetEntityName(subcriteria))).IdentifierColumnNames;
return StringHelper.Qualify(GetSQLAlias(subcriteria), idcols);
}
public IType GetIdentifierType(ICriteria subcriteria)
{
- return ((ILoadable)GetPropertyMapping(GetEntityName(subcriteria))).IdentifierType;
+ return ((NHibernate_Persister_Entity.ILoadable)GetPropertyMapping(GetEntityName(subcriteria))).IdentifierType;
}
public TypedValue GetTypedIdentifierValue(ICriteria subcriteria, object value)
{
- ILoadable loadable = (ILoadable)GetPropertyMapping(GetEntityName(subcriteria));
+ NHibernate_Persister_Entity.ILoadable loadable = (NHibernate_Persister_Entity.ILoadable)GetPropertyMapping(GetEntityName(subcriteria));
return new TypedValue(loadable.IdentifierType, value, EntityMode.Poco);
}
@@ -641,7 +694,7 @@
var entityClass = value as System.Type;
if (entityClass != null)
{
- IQueryable q = helper.FindQueryableUsingImports(entityClass.FullName);
+ NHibernate_Persister_Entity.IQueryable q = helper.FindQueryableUsingImports(entityClass.FullName);
if (q != null && q.DiscriminatorValue != null)
{
@@ -653,7 +706,7 @@
return new TypedValue(GetTypeUsingProjection(subcriteria, propertyName), value, EntityMode.Poco);
}
- private IPropertyMapping GetPropertyMapping(string entityName)
+ private Persister.Entity.IPropertyMapping GetPropertyMapping(string entityName)
{
ICriteriaInfoProvider info ;
if (nameCriteriaInfoMap.TryGetValue(entityName, out info)==false)
@@ -720,21 +773,6 @@
return indexForAlias++;
}
- public void AddUsedTypedValues(TypedValue[] values)
- {
- if (values != null)
- {
- if (outerQueryTranslator != null)
- {
- outerQueryTranslator.AddUsedTypedValues(values);
- }
- else
- {
- usedTypedValues.AddRange(values);
- }
- }
- }
-
public int? CreatePagingParameter(int value)
{
if (!Factory.Dialect.SupportsVariableLimit)
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/AddNumberProjection.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/AddNumberProjection.cs 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/AddNumberProjection.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -1,13 +1,12 @@
using System;
+using System.Collections.Generic;
+using NHibernate.Engine;
+using NHibernate.Criterion;
+using NHibernate.SqlCommand;
+using NHibernate.Type;
namespace NHibernate.Test.Criteria
{
- using System.Collections.Generic;
- using Engine;
- using Criterion;
- using SqlCommand;
- using Type;
-
public class AddNumberProjection : SimpleProjection
{
private readonly string propertyName;
@@ -27,7 +26,7 @@
public override SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
string[] projection = criteriaQuery.GetColumnsUsingProjection(criteria, propertyName);
- criteriaQuery.AddUsedTypedValues(GetTypedValues(criteria, criteriaQuery));
+
return new SqlStringBuilder()
.Add("(")
.Add(projection[0])
@@ -54,8 +53,7 @@
get { return false; }
}
- public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery,
- IDictionary<string, IFilter> enabledFilters)
+ public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
{
throw new InvalidOperationException("not a grouping projection");
}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Contest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Contest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Contest.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.NH2409
+{
+ public class Contest
+ {
+ public virtual int Id { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,60 @@
+using System;
+using System.Linq;
+using NHibernate.Criterion;
+using NHibernate.SqlCommand;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2409
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ [Test]
+ public void Bug()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var contest1 = new Contest {Id = 1};
+ var contest2 = new Contest {Id = 2};
+ var user = new User();
+
+ var message = new Message {Contest = contest2 };
+
+ session.Save(contest1);
+ session.Save(contest2);
+ session.Save(user);
+
+ session.Save(message);
+ tx.Commit();
+ }
+
+ using (var session = OpenSession())
+ {
+ var contest2 = session.CreateCriteria<Contest>().Add(Restrictions.IdEq(2)).UniqueResult<Contest>();
+ var user = session.CreateCriteria<User>().List<User>().Single();
+
+ var msgs = session.CreateCriteria<Message>()
+ .Add(Restrictions.Eq("Contest", contest2))
+ .CreateAlias("Readings", "mr", JoinType.LeftOuterJoin, Restrictions.Eq("mr.User", user))
+ .List<Message>();
+
+ Assert.AreEqual(1, msgs.Count, "We should be able to find our message despite any left outer joins");
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ session.Delete("from Contest");
+ session.Delete("from User");
+ session.Delete("from Message");
+ session.Delete("from MessageReading");
+ tx.Commit();
+ }
+ base.OnTearDown();
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Mappings.hbm.xml 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,38 @@
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ namespace="NHibernate.Test.NHSpecificTest.NH2409"
+ assembly="NHibernate.Test">
+ <class name="Contest" lazy="true">
+ <id name="Id">
+ <generator class="assigned" />
+ </id>
+ </class>
+
+ <class name="Message" lazy="true">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+
+ <many-to-one name="Contest" class="Contest" column="ContestId"/>
+
+ <bag name="Readings" cascade="all" inverse="true">
+ <key column="MessageReadingId"/>
+ <one-to-many class="MessageReading"/>
+ </bag>
+ </class>
+
+ <class name="MessageReading" lazy="true">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+
+ <many-to-one name="User"
+ class="User" column="UserId"/>
+ </class>
+
+ <class name="User" lazy="true" table="`User`">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Message.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Message.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/Message.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.NH2409
+{
+ public class Message
+ {
+ public virtual int Id { get; set; }
+
+ public virtual Contest Contest { get; set; }
+
+ public virtual IList<MessageReading> Readings { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/MessageReading.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/MessageReading.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/MessageReading.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,9 @@
+namespace NHibernate.Test.NHSpecificTest.NH2409
+{
+ public class MessageReading
+ {
+ public virtual int Id { get; set; }
+
+ public virtual User User { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/User.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/User.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2409/User.cs 2010-11-21 17:14:48 UTC (rev 5267)
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.NH2409
+{
+ public class User
+ {
+ public virtual int Id { get; set; }
+ }
+}
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-20 13:12:25 UTC (rev 5266)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-11-21 17:14:48 UTC (rev 5267)
@@ -30,7 +30,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
- <NoWarn>3001%3b3002%3b3003%3b3004%3b3005</NoWarn>
+ <NoWarn>3001%3b3002%3b3003%3b3004%3b3005</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@@ -42,7 +42,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
- <NoWarn>3001%3b3002%3b3003%3b3004%3b3005</NoWarn>
+ <NoWarn>3001%3b3002%3b3003%3b3004%3b3005</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="Antlr3.Runtime, Version=3.1.0.39271, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7, processorArchitecture=MSIL">
@@ -542,6 +542,11 @@
<Compile Include="NHSpecificTest\NH2392\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2392\PhoneNumber.cs" />
<Compile Include="NHSpecificTest\NH2392\PhoneNumberUserType.cs" />
+ <Compile Include="NHSpecificTest\NH2409\Contest.cs" />
+ <Compile Include="NHSpecificTest\NH2409\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2409\Message.cs" />
+ <Compile Include="NHSpecificTest\NH2409\MessageReading.cs" />
+ <Compile Include="NHSpecificTest\NH2409\User.cs" />
<Compile Include="PolymorphicGetAndLoad\Domain.cs" />
<Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" />
<Compile Include="TypesTest\CharClass.cs" />
@@ -1834,6 +1839,7 @@
<EmbeddedResource Include="NHSpecificTest\NH2202\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1869\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2392\Mappings.hbm.xml" />
+ <EmbeddedResource Include="NHSpecificTest\NH2409\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj">
@@ -2699,6 +2705,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="NHSpecificTest\NH2392" />
+ <Folder Include="NHSpecificTest\NH2409" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|