Skip to content

Commit ece204e

Browse files
authored
Merge branch 'master' into multiTenancy
2 parents 933462a + 111f755 commit ece204e

File tree

69 files changed

+1718
-431
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1718
-431
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ before_install:
3131
if [[ "$DB" == "Firebird" ]]
3232
then
3333
sudo apt-get install -y libicu-dev libtommath-dev curl
34-
curl -L -O https://github.com/FirebirdSQL/firebird/releases/download/R3_0_3/Firebird-3.0.3.32900-0.amd64.tar.gz
35-
tar xzvf Firebird-3.0.3.32900-0.amd64.tar.gz
36-
pushd Firebird-3.0.3.32900-0.amd64
34+
curl -L -O https://github.com/FirebirdSQL/firebird/releases/download/R3_0_5/Firebird-3.0.5.33220-0.amd64.tar.gz
35+
tar xzvf Firebird-3.0.5.33220-0.amd64.tar.gz
36+
pushd Firebird-3.0.5.33220-0.amd64
3737
sudo ./install.sh -silent
3838
popd
3939
export $(sudo cat /opt/firebird/SYSDBA.password | grep -v ^# | xargs)

ReleaseProcedure.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ These are the tasks typically needed to create an official NHibernate release.
88
(change x.x.x by its current version in tools).
99
By example:
1010

11-
Tools\gitreleasemanager\0.7.0\tools\GitReleaseManager.exe create -o nhibernate -r nhibernate-core -m 5.1 -u username -p password
11+
Tools\gitreleasemanager\0.11.0\tools\GitReleaseManager.exe create -o nhibernate -r nhibernate-core -m 5.3 --token yourGitHubTokenWithRepoScope
1212

1313
(Adjust the -m milestone parameter above, and add "-c branchname" if
1414
releasing another branch than master)

Tools/packages.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PackageReference Include="CSharpAsyncGenerator.CommandLine" Version="0.18.2" />
1515
<PackageReference Include="vswhere" Version="2.1.4" />
1616
<PackageReference Include="NUnit.Console" Version="3.10.0" />
17-
<PackageReference Include="GitReleaseManager" Version="0.7.0" />
17+
<PackageReference Include="GitReleaseManager" Version="0.11.0" />
1818
</ItemGroup>
1919

2020
</Project>

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ before_test:
2525
# Install Firebird
2626
New-Item -ItemType Directory -Force $FireBirdPath > $null
2727
Push-Location $FireBirdPath
28-
Invoke-WebRequest 'https://github.com/FirebirdSQL/firebird/releases/download/R3_0_3/Firebird-3.0.3.32900-0_x64.zip' -OutFile firebird.zip
28+
Invoke-WebRequest 'https://github.com/FirebirdSQL/firebird/releases/download/R3_0_5/Firebird-3.0.5.33220-0_x64.zip' -OutFile firebird.zip
2929
Unblock-File firebird.zip
3030
7z x firebird.zip
3131
New-Item -ItemType Directory -Force Data

doc/reference/modules/configuration.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ var session = sessions.OpenSession(conn);
829829
is closed explicitly.
830830
<para>
831831
<emphasis role="strong">eg.</emphasis>
832-
<literal>create</literal> | <literal>create-drop</literal>
832+
<literal>create</literal> | <literal>create-drop</literal> | <literal>update</literal> | <literal>validate</literal>
833833
</para>
834834
</entry>
835835
</row>
@@ -858,6 +858,20 @@ var session = sessions.OpenSession(conn);
858858
</para>
859859
</entry>
860860
</row>
861+
<row>
862+
<entry>
863+
<literal>hbm2ddl.throw_on_update</literal>
864+
</entry>
865+
<entry>
866+
When <literal>hbm2ddl.auto</literal> is <literal>update</literal>, whether to throw or not on schema auto-update failures.
867+
<!-- 6.0 TODO: should become true by default. -->
868+
Disabled by default.
869+
<para>
870+
<emphasis role="strong">eg.</emphasis>
871+
<literal>true</literal> | <literal>false</literal>
872+
</para>
873+
</entry>
874+
</row>
861875
<row>
862876
<entry>
863877
<literal>use_proxy_validator</literal>

src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Collections.Generic;
1414
using NHibernate.Dialect;
1515
using NHibernate.Criterion;
16+
using NHibernate.Linq;
1617
using NHibernate.SqlCommand;
1718
using NHibernate.Transform;
1819
using NHibernate.Type;
@@ -922,6 +923,176 @@ public async Task ProjectionsTestAsync()
922923
s.Close();
923924
}
924925

926+
[Test]
927+
public async Task TestSQLProjectionWithAliasesAsync()
928+
{
929+
using(ISession s = OpenSession())
930+
using(ITransaction t = s.BeginTransaction())
931+
{
932+
Course course = new Course();
933+
course.CourseCode = "HIB";
934+
course.Description = "Hibernate Training";
935+
await (s.SaveAsync(course));
936+
937+
Student gavin = new Student();
938+
gavin.Name = "Gavin King";
939+
gavin.StudentNumber = 667;
940+
await (s.SaveAsync(gavin));
941+
942+
Student xam = new Student();
943+
xam.Name = "Max Rydahl Andersen";
944+
xam.StudentNumber = 101;
945+
await (s.SaveAsync(xam));
946+
947+
Enrolment enrolment = new Enrolment();
948+
enrolment.Course = course;
949+
enrolment.CourseCode = course.CourseCode;
950+
enrolment.Semester = 1;
951+
enrolment.Year = 1999;
952+
enrolment.Student = xam;
953+
enrolment.StudentNumber = xam.StudentNumber;
954+
xam.Enrolments.Add(enrolment);
955+
await (s.SaveAsync(enrolment));
956+
957+
enrolment = new Enrolment();
958+
enrolment.Course = course;
959+
enrolment.CourseCode = course.CourseCode;
960+
enrolment.Semester = 3;
961+
enrolment.Year = 1998;
962+
enrolment.Student = gavin;
963+
enrolment.StudentNumber = gavin.StudentNumber;
964+
gavin.Enrolments.Add(enrolment);
965+
await (s.SaveAsync(enrolment));
966+
await (t.CommitAsync());
967+
}
968+
969+
using (var s = OpenSession())
970+
{
971+
Student studentSubquery = null;
972+
var subquery = QueryOver.Of(() => studentSubquery)
973+
.And(
974+
Expression.Sql("{e}.studentId = 667 and {studentSubquery}.studentId = 667")).Select(Projections.Id());
975+
976+
var uniqueResult = await (s.CreateCriteria(typeof(Student))
977+
.Add(Subqueries.Exists(subquery.DetachedCriteria))
978+
.AddOrder(Order.Asc("Name"))
979+
.CreateCriteria("Enrolments", "e")
980+
.AddOrder(Order.Desc("Year"))
981+
.AddOrder(Order.Desc("Semester"))
982+
.CreateCriteria("Course", "c")
983+
.AddOrder(Order.Asc("Description"))
984+
.SetProjection(
985+
Projections.SqlProjection(
986+
"{alias}.studentId as studentNumber, {e}.Semester as semester,"
987+
+ " {c}.CourseCode as courseCode, {c}.Description as descr",
988+
new string[] {"studentNumber", "semester", "courseCode", "descr"},
989+
new[]
990+
{
991+
TypeFactory.HeuristicType(typeof(long)),
992+
TypeFactory.HeuristicType(typeof(short)),
993+
TypeFactory.HeuristicType(typeof(string)),
994+
TypeFactory.HeuristicType(typeof(string)),
995+
}))
996+
.UniqueResultAsync());
997+
998+
Assert.That(uniqueResult, Is.Not.Null);
999+
}
1000+
1001+
using (var s = OpenSession())
1002+
using (s.BeginTransaction())
1003+
{
1004+
await (s.Query<Enrolment>().DeleteAsync());
1005+
await (s.Query<Student>().DeleteAsync());
1006+
await (s.Query<Course>().DeleteAsync());
1007+
await (s.GetCurrentTransaction().CommitAsync());
1008+
}
1009+
}
1010+
1011+
[Test]
1012+
public async Task TestSQLProjectionWithDuplicateAliasesAsync()
1013+
{
1014+
using(ISession s = OpenSession())
1015+
using(ITransaction t = s.BeginTransaction())
1016+
{
1017+
Course course = new Course();
1018+
course.CourseCode = "HIB";
1019+
course.Description = "Hibernate Training";
1020+
await (s.SaveAsync(course));
1021+
1022+
Student gavin = new Student();
1023+
gavin.Name = "Gavin King";
1024+
gavin.StudentNumber = 667;
1025+
await (s.SaveAsync(gavin));
1026+
1027+
Student xam = new Student();
1028+
xam.Name = "Max Rydahl Andersen";
1029+
xam.StudentNumber = 101;
1030+
await (s.SaveAsync(xam));
1031+
1032+
Enrolment enrolment = new Enrolment();
1033+
enrolment.Course = course;
1034+
enrolment.CourseCode = course.CourseCode;
1035+
enrolment.Semester = 1;
1036+
enrolment.Year = 1999;
1037+
enrolment.Student = xam;
1038+
enrolment.StudentNumber = xam.StudentNumber;
1039+
xam.Enrolments.Add(enrolment);
1040+
await (s.SaveAsync(enrolment));
1041+
1042+
enrolment = new Enrolment();
1043+
enrolment.Course = course;
1044+
enrolment.CourseCode = course.CourseCode;
1045+
enrolment.Semester = 3;
1046+
enrolment.Year = 1998;
1047+
enrolment.Student = gavin;
1048+
enrolment.StudentNumber = gavin.StudentNumber;
1049+
gavin.Enrolments.Add(enrolment);
1050+
await (s.SaveAsync(enrolment));
1051+
await (t.CommitAsync());
1052+
}
1053+
1054+
using (var s = OpenSession())
1055+
{
1056+
Student student = null;
1057+
var subquery = QueryOver.Of(() => student)
1058+
.And(
1059+
Expression.Sql("{e}.studentId = 667 and {student}.studentId = 667")).Select(Projections.Id());
1060+
1061+
var uniqueResult = await (s.CreateCriteria(typeof(Student), "student")
1062+
.Add(Subqueries.Exists(subquery.DetachedCriteria))
1063+
.AddOrder(Order.Asc("Name"))
1064+
.CreateCriteria("Enrolments", "e")
1065+
.AddOrder(Order.Desc("Year"))
1066+
.AddOrder(Order.Desc("Semester"))
1067+
.CreateCriteria("Course", "c")
1068+
.AddOrder(Order.Asc("Description"))
1069+
.SetProjection(
1070+
Projections.SqlProjection(
1071+
"{alias}.studentId as studentNumber, {e}.Semester as semester,"
1072+
+ " {c}.CourseCode as courseCode, {c}.Description as descr",
1073+
new string[] {"studentNumber", "semester", "courseCode", "descr"},
1074+
new[]
1075+
{
1076+
TypeFactory.HeuristicType(typeof(long)),
1077+
TypeFactory.HeuristicType(typeof(short)),
1078+
TypeFactory.HeuristicType(typeof(string)),
1079+
TypeFactory.HeuristicType(typeof(string)),
1080+
}))
1081+
.UniqueResultAsync());
1082+
1083+
Assert.That(uniqueResult, Is.Not.Null);
1084+
}
1085+
1086+
using (var s = OpenSession())
1087+
using (s.BeginTransaction())
1088+
{
1089+
await (s.Query<Enrolment>().DeleteAsync());
1090+
await (s.Query<Student>().DeleteAsync());
1091+
await (s.Query<Course>().DeleteAsync());
1092+
await (s.GetCurrentTransaction().CommitAsync());
1093+
}
1094+
}
1095+
9251096
[Test]
9261097
public async Task CloningProjectionsTestAsync()
9271098
{

src/NHibernate.Test/Async/GenericTest/BagGeneric/BagGenericFixture.cs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
//------------------------------------------------------------------------------
99

1010

11-
using System;
1211
using System.Collections.Generic;
13-
using System.Text;
12+
using System.Linq;
13+
using NHibernate.Collection;
14+
using NHibernate.Util;
1415
using NUnit.Framework;
1516

1617
namespace NHibernate.Test.GenericTest.BagGeneric
1718
{
1819
using System.Threading.Tasks;
20+
using System.Threading;
1921
[TestFixture]
2022
public class BagGenericFixtureAsync : TestCase
2123
{
@@ -74,6 +76,51 @@ public async Task SimpleAsync()
7476
s.Close();
7577
}
7678

79+
[Test]
80+
public async Task EqualsSnapshotAsync()
81+
{
82+
var a = new A {Name = "first generic type"};
83+
var i0 = new B {Name = "1"};
84+
var i4 = new B {Name = "4"};
85+
a.Items = new List<B>
86+
{
87+
i0,
88+
i0,
89+
new B {Name = "2"},
90+
new B {Name = "3"},
91+
i4,
92+
i4,
93+
};
94+
var lastIdx = a.Items.Count - 1;
95+
using (var s = OpenSession())
96+
{
97+
await (s.SaveAsync(a));
98+
await (s.FlushAsync());
99+
var collection = (IPersistentCollection) a.Items;
100+
var collectionPersister = Sfi.GetCollectionPersister(collection.Role);
101+
102+
a.Items[0] = i4;
103+
Assert.Multiple(
104+
async () =>
105+
{
106+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.False, "modify first collection element");
107+
108+
a.Items[lastIdx] = i0;
109+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.True, "swap elements in collection");
110+
111+
a.Items[0] = i0;
112+
a.Items[lastIdx] = i0;
113+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.False, "modify last collection element");
114+
115+
a.Items[lastIdx] = i4;
116+
var reversed = a.Items.Reverse().ToArray();
117+
a.Items.Clear();
118+
ArrayHelper.AddAll(a.Items, reversed);
119+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.True, "reverse collection elements");
120+
});
121+
}
122+
}
123+
77124
[Test]
78125
public async Task CopyAsync()
79126
{

src/NHibernate.Test/Async/Hql/HQLFunctions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,6 @@ public async Task SubStringAsync()
310310
[Test]
311311
public async Task LocateAsync()
312312
{
313-
AssumeFunctionSupported("locate");
314313
using (ISession s = OpenSession())
315314
{
316315
Animal a1 = new Animal("abcdef", 20);

src/NHibernate.Test/Async/Linq/ByMethod/AverageTests.cs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,6 @@ public class AverageTestsAsync : LinqTestCase
2222
[Test]
2323
public async Task CanGetAverageOfIntegersAsDoubleAsync()
2424
{
25-
// TODO 6.0: Enable test for Oracle once nhibernate.oracle.use_binary_floating_point_types is set to true
26-
if (Dialect is Oracle8iDialect)
27-
{
28-
// The point of this test is to verify that LINQ's Average over an
29-
// integer columns yields a non-integer result, even on databases
30-
// where the corresponding avg() will yield a return type equal to
31-
// the input type. This means the LINQ provider must generate HQL
32-
// that cast the input to double inside the call to avg(). This works
33-
// fine on most databases, but Oracle causes trouble.
34-
//
35-
// The dialect maps double to "DOUBLE PRECISION" on Oracle, which
36-
// on Oracle has larger precision than C#'s double. When such
37-
// values are returned, ODP.NET will convert it to .Net decimal, which
38-
// has lower precision and thus causes an overflow exception.
39-
//
40-
// Some argue that this is a flaw in ODP.NET, others have created
41-
// local dialects that use e.g. BINARY_DOUBLE instead, which more
42-
// closely matches C#'s IEEE 745 double, see e.g. HHH-1961 and
43-
// serveral blogs.
44-
45-
Assert.Ignore("Not supported on Oracle due to casting/overflow issues.");
46-
}
47-
4825
//NH-2429
4926
var average = await (db.Products.AverageAsync(x => x.UnitsOnOrder));
5027

0 commit comments

Comments
 (0)