Skip to content

Commit 65b5d03

Browse files
committed
Port of TypedValue (one more step to support EntityMode)
SVN: trunk@3340
1 parent 283758a commit 65b5d03

18 files changed

+131
-98
lines changed

src/NHibernate.Test/Criteria/AddNumberProjection.cs

+2-5
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,9 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer
3636
return new IType[] {projection};
3737
}
3838

39-
public override NHibernate.Engine.TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
39+
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
4040
{
41-
return new TypedValue[]
42-
{
43-
new TypedValue(NHibernateUtil.Int32, numberToAdd),
44-
};
41+
return new TypedValue[] {new TypedValue(NHibernateUtil.Int32, numberToAdd, EntityMode.Poco)};
4542
}
4643
}
4744
}

src/NHibernate.Test/EngineTest/TypedValueFixture.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections;
32
using NHibernate.Engine;
43
using NUnit.Framework;
@@ -17,16 +16,16 @@ public void EqualsCollection()
1716

1817
ArrayList value2 = (ArrayList) value1.Clone();
1918

20-
TypedValue t1 = new TypedValue(NHibernateUtil.Int32, value1);
21-
TypedValue t2 = new TypedValue(NHibernateUtil.Int32, value2);
19+
TypedValue t1 = new TypedValue(NHibernateUtil.Int32, value1, EntityMode.Poco);
20+
TypedValue t2 = new TypedValue(NHibernateUtil.Int32, value2, EntityMode.Poco);
2221

2322
Assert.IsTrue(t1.Equals(t2));
2423
}
2524

2625
[Test]
2726
public void ToStringWithNullValue()
2827
{
29-
Assert.AreEqual("null", new TypedValue(NHibernateUtil.Int32, null).ToString());
28+
Assert.AreEqual("null", new TypedValue(NHibernateUtil.Int32, null, EntityMode.Poco).ToString());
3029
}
3130
}
3231
}

src/NHibernate.Test/ExpressionTest/JunctionFixture.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using NHibernate.DomainModel;
32
using NHibernate.Engine;
43
using NHibernate.Expressions;
@@ -55,8 +54,8 @@ public void GetTypedValues()
5554
}
5655

5756
TypedValue[] expectedTV = new TypedValue[2];
58-
expectedTV[0] = new TypedValue(NHibernateUtil.Int32, 5);
59-
expectedTV[1] = new TypedValue(NHibernateUtil.Int32, 10);
57+
expectedTV[0] = new TypedValue(NHibernateUtil.Int32, 5, EntityMode.Poco);
58+
expectedTV[1] = new TypedValue(NHibernateUtil.Int32, 10, EntityMode.Poco);
6059

6160
Assert.AreEqual(2, typedValues.Length);
6261

src/NHibernate/Cache/FilterKey.cs

+4-8
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ public class FilterKey
1414
private readonly string filterName;
1515
private readonly Dictionary<string, TypedValue> filterParameters = new Dictionary<string, TypedValue>();
1616

17-
public FilterKey(string name, IDictionary<string, object> @params, IDictionary<string, IType> types)
17+
public FilterKey(string name, IDictionary<string, object> @params, IDictionary<string, IType> types, EntityMode entityMode)
1818
{
1919
filterName = name;
2020
foreach (KeyValuePair<string, object> me in @params)
2121
{
2222
IType type = types[me.Key];
23-
filterParameters[me.Key] = new TypedValue(type, me.Value);
23+
filterParameters[me.Key] = new TypedValue(type, me.Value, entityMode);
2424
}
2525
}
2626

@@ -49,18 +49,14 @@ public override string ToString()
4949
return "FilterKey[" + filterName + filterParameters + ']';
5050
}
5151

52-
public static ISet CreateFilterKeys(IDictionary<string, IFilter> enabledFilters)
52+
public static ISet CreateFilterKeys(IDictionary<string, IFilter> enabledFilters, EntityMode entityMode)
5353
{
5454
if (enabledFilters.Count == 0)
5555
return null;
5656
Set result = new HashedSet();
5757
foreach (FilterImpl filter in enabledFilters.Values)
5858
{
59-
FilterKey key = new FilterKey(
60-
filter.Name,
61-
filter.Parameters,
62-
filter.FilterDefinition.ParameterTypes
63-
);
59+
FilterKey key = new FilterKey(filter.Name, filter.Parameters, filter.FilterDefinition.ParameterTypes, entityMode);
6460
result.Add(key);
6561
}
6662
return result;

src/NHibernate/Engine/TypedValue.cs

+96-35
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,144 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Generic;
34
using NHibernate.Type;
4-
using NHibernate.Util;
55

66
namespace NHibernate.Engine
77
{
8-
/// <summary></summary>
8+
/// <summary> An ordered pair of a value and its Hibernate type. </summary>
99
[Serializable]
1010
public sealed class TypedValue
1111
{
12-
private IType type;
13-
private object value;
14-
15-
/// <summary>
16-
///
17-
/// </summary>
18-
/// <param name="type"></param>
19-
/// <param name="value"></param>
20-
public TypedValue(IType type, object value)
12+
// Because NH-875 we have a different implementation
13+
// The DefaultComparer is the comparrer used in H3.2.5
14+
// The ParameterListComparer is the comparer introduced in NH to fix NH-845
15+
16+
private readonly IType type;
17+
private readonly object value;
18+
private readonly IEqualityComparer<TypedValue> comparer;
19+
20+
public TypedValue(IType type, object value, EntityMode entityMode)
2121
{
2222
this.type = type;
2323
this.value = value;
24+
ICollection values = value as ICollection;
25+
if (!type.IsCollectionType && values != null)
26+
comparer = new ParameterListComparer(entityMode);
27+
else
28+
comparer = new DefaultComparer(entityMode);
2429
}
2530

26-
/// <summary></summary>
2731
public object Value
2832
{
2933
get { return value; }
30-
set { this.value = value; }
3134
}
3235

33-
/// <summary></summary>
3436
public IType Type
3537
{
3638
get { return type; }
37-
set { type = value; }
3839
}
3940

4041
public override int GetHashCode()
4142
{
42-
unchecked
43-
{
44-
int result = 17;
45-
result = 37 * result + type.GetHashCode();
46-
result = 37 * result + (value == null ? 0 : value.GetHashCode());
47-
return result;
48-
}
43+
return comparer.GetHashCode(this);
4944
}
5045

5146
public override bool Equals(object obj)
5247
{
53-
TypedValue that = obj as TypedValue;
54-
if (that == null)
48+
return comparer.Equals(this, obj as TypedValue);
49+
}
50+
51+
public override string ToString()
52+
{
53+
return value == null ? "null" : value.ToString();
54+
}
55+
56+
[Serializable]
57+
private class ParameterListComparer : IEqualityComparer<TypedValue>
58+
{
59+
private readonly EntityMode entityMode;
60+
61+
public ParameterListComparer(EntityMode entityMode)
5562
{
56-
return false;
63+
this.entityMode = entityMode;
5764
}
5865

59-
if (!that.type.Equals(type))
66+
public bool Equals(TypedValue x, TypedValue y)
6067
{
61-
return false;
68+
if (y == null) return false;
69+
if (!x.type.ReturnedClass.Equals(y.type.ReturnedClass))
70+
return false;
71+
return IsEquals(x.type, x.value as ICollection, y.value as ICollection);
6272
}
6373

64-
if (value is ICollection && that.value is ICollection)
74+
public int GetHashCode(TypedValue obj)
6575
{
66-
return CollectionHelper.CollectionEquals((ICollection) value, (ICollection) that.value);
76+
return GetHashCode(obj.type, obj.value as ICollection);
6777
}
68-
else
78+
79+
private int GetHashCode(IType type, ICollection values)
80+
{
81+
if (values == null)
82+
return 0;
83+
84+
unchecked
85+
{
86+
int result = 0;
87+
88+
foreach (object obj in values)
89+
result += obj == null ? 0 : type.GetHashCode(obj, entityMode);
90+
91+
return result;
92+
}
93+
}
94+
95+
private bool IsEquals(IType type, ICollection x, ICollection y)
6996
{
70-
return Equals(that.value, value);
97+
if (x == y)
98+
return true;
99+
100+
if (x == null || y == null)
101+
return false;
102+
103+
if (x.Count != y.Count)
104+
return false;
105+
106+
IEnumerator xe = x.GetEnumerator();
107+
IEnumerator ye = y.GetEnumerator();
108+
109+
while (xe.MoveNext())
110+
{
111+
ye.MoveNext();
112+
if (!type.IsEqual(xe.Current, ye.Current, entityMode))
113+
return false;
114+
}
115+
116+
return true;
71117
}
72118
}
73119

74-
public override string ToString()
120+
[Serializable]
121+
private class DefaultComparer : IEqualityComparer<TypedValue>
75122
{
76-
if (value == null)
123+
private readonly EntityMode entityMode;
124+
125+
public DefaultComparer(EntityMode entityMode)
126+
{
127+
this.entityMode = entityMode;
128+
}
129+
130+
public bool Equals(TypedValue x, TypedValue y)
131+
{
132+
if (y == null) return false;
133+
if (!x.type.ReturnedClass.Equals(y.type.ReturnedClass))
134+
return false;
135+
return x.type.IsEqual(y.value, x.value, entityMode);
136+
}
137+
138+
public int GetHashCode(TypedValue obj)
77139
{
78-
return "null";
140+
return obj.value == null ? 0 : obj.type.GetHashCode(obj.value, entityMode);
79141
}
80-
return value.ToString();
81142
}
82143
}
83144
}

src/NHibernate/Expressions/ConstantProjection.cs

+3-7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ namespace NHibernate.Expressions
77
using Type;
88

99
/// <summary>
10-
/// This is useful if we want to send a value
11-
/// to the database
10+
/// This is useful if we want to send a value to the database
1211
/// </summary>
1312
[Serializable]
1413
public class ConstantProjection : SimpleProjection
@@ -34,12 +33,9 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer
3433
return new IType[] {NHibernateUtil.GuessType(value)};
3534
}
3635

37-
public override NHibernate.Engine.TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
36+
public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery)
3837
{
39-
return new TypedValue[]
40-
{
41-
new TypedValue(NHibernateUtil.GuessType(value), value),
42-
};
38+
return new TypedValue[] {new TypedValue(NHibernateUtil.GuessType(value), value, EntityMode.Poco)};
4339
}
4440
}
4541
}

src/NHibernate/Expressions/CriterionUtil.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public static TypedValue[] GetTypedValues(ICriteriaQuery criteriaQuery, ICriteri
126126
}
127127
else
128128
{
129-
types.Add(new TypedValue(NHibernateUtil.GuessType((object)value), value));
129+
types.Add(new TypedValue(NHibernateUtil.GuessType((object)value), value, EntityMode.Poco));
130130
}
131131
}
132132

src/NHibernate/Expressions/Example.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ protected void AddPropertyTypedValue(object value, IType type, IList list)
382382
}
383383
value = stringValue;
384384
}
385-
list.Add(new TypedValue(type, value));
385+
list.Add(new TypedValue(type, value, EntityMode.Poco)); // TODO NH Different behavior: In H3.2 EntityMode is nullable
386386
}
387387
}
388388

src/NHibernate/Expressions/InExpression.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
134134
null
135135
:
136136
actype.GetPropertyValues(_values[j], EntityMode.Poco)[i];
137-
list.Add(new TypedValue(types[i], subval));
137+
list.Add(new TypedValue(types[i], subval, EntityMode.Poco));
138138
}
139139
}
140140
}
141141
else
142142
{
143143
for (int j = 0; j < _values.Length; j++)
144144
{
145-
list.Add(new TypedValue(type, _values[j]));
145+
list.Add(new TypedValue(type, _values[j], EntityMode.Poco));
146146
}
147147
}
148148

src/NHibernate/Expressions/SQLCriterion.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public SQLCriterion(SqlString sql, object[] values, IType[] types)
2626
_typedValues = new TypedValue[values.Length];
2727
for (int i = 0; i < _typedValues.Length; i++)
2828
{
29-
_typedValues[i] = new TypedValue(types[i], values[i]);
29+
_typedValues[i] = new TypedValue(types[i], values[i], EntityMode.Poco);
3030
}
3131
}
3232

src/NHibernate/Expressions/SimpleSubqueryExpression.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
2525
TypedValue[] superTv = base.GetTypedValues(criteria, criteriaQuery);
2626
TypedValue[] result = new TypedValue[superTv.Length + 1];
2727
superTv.CopyTo(result, 1);
28-
result[0] = new TypedValue(GetTypes()[0], value);
28+
result[0] = new TypedValue(GetTypes()[0], value, EntityMode.Poco);
2929
return result;
3030
}
3131

src/NHibernate/Expressions/SubqueryExpression.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery c
9393
TypedValue[] tv = new TypedValue[paramTypes.Length];
9494
for (int i = 0; i < paramTypes.Length; i++)
9595
{
96-
tv[i] = new TypedValue(paramTypes[i], values[i]);
96+
tv[i] = new TypedValue(paramTypes[i], values[i], EntityMode.Poco);
9797
}
9898
return tv;
9999
}

src/NHibernate/Impl/AbstractDetachedQuery.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,15 @@ public void SetLockMode(string alias, LockMode lockMode)
102102

103103
public IDetachedQuery SetParameter(int position, object val, Type.IType type)
104104
{
105-
posParams[position] = new TypedValue(type, val);
105+
posParams[position] = new TypedValue(type, val, EntityMode.Poco);
106106
return this;
107107
}
108108

109109
public IDetachedQuery SetParameter(string name, object val, Type.IType type)
110110
{
111111
if (string.IsNullOrEmpty(name))
112112
throw new ArgumentNullException("name", "Is null or empty.");
113-
namedParams[name] = new TypedValue(type, val);
113+
namedParams[name] = new TypedValue(type, val, EntityMode.Poco);
114114
return this;
115115
}
116116

@@ -132,7 +132,7 @@ public IDetachedQuery SetParameterList(string name, ICollection vals, Type.IType
132132
{
133133
if (string.IsNullOrEmpty(name))
134134
throw new ArgumentNullException("name", "Is null or empty.");
135-
namedListParams[name] = new TypedValue(type, vals);
135+
namedListParams[name] = new TypedValue(type, vals, EntityMode.Poco);
136136
return this;
137137
}
138138

0 commit comments

Comments
 (0)