From: <ric...@us...> - 2009-11-10 18:07:33
|
Revision: 4827 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4827&view=rev Author: ricbrown Date: 2009-11-10 18:07:01 +0000 (Tue, 10 Nov 2009) Log Message: ----------- Added remaining (inline) QueryOver subquery overloads. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryBuilder.cs trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryPropertyBuilder.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/SubqueryFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryBuilder.cs 2009-11-10 14:19:09 UTC (rev 4826) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryBuilder.cs 2009-11-10 18:07:01 UTC (rev 4827) @@ -38,6 +38,24 @@ } /// <summary> + /// Add an Exists subquery criterion + /// </summary> + public R WhereExists<U>(QueryOver<U> detachedQuery) + { + root.And(Subqueries.Exists(detachedQuery.DetachedCriteria)); + return root; + } + + /// <summary> + /// Add a NotExists subquery criterion + /// </summary> + public R WhereNotExists<U>(QueryOver<U> detachedQuery) + { + root.And(Subqueries.NotExists(detachedQuery.DetachedCriteria)); + return root; + } + + /// <summary> /// Subquery expression in the format /// .Where(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) /// </summary> @@ -48,12 +66,73 @@ return root; } + /// <summary> + /// Subquery expression in the format + /// .Where(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + /// </summary> + public R Where(Expression<Func<bool>> expression) + { + AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.Exact, expression); + root.And(criterion); + return root; + } + + /// <summary> + /// Subquery expression in the format + /// .WhereAll(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + /// </summary> + public R WhereAll(Expression<Func<T, bool>> expression) + { + AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery<T>(LambdaSubqueryType.All, expression); + root.And(criterion); + return root; + } + + /// <summary> + /// Subquery expression in the format + /// .WhereAll(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + /// </summary> + public R WhereAll(Expression<Func<bool>> expression) + { + AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.All, expression); + root.And(criterion); + return root; + } + + /// <summary> + /// Subquery expression in the format + /// .WhereSome(t => t.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + /// </summary> + public R WhereSome(Expression<Func<T, bool>> expression) + { + AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery<T>(LambdaSubqueryType.Some, expression); + root.And(criterion); + return root; + } + + /// <summary> + /// Subquery expression in the format + /// .WhereSome(() => alias.Property [==, !=, >, etc.] detachedQueryOver.As<propertyType>()) + /// </summary> + public R WhereSome(Expression<Func<bool>> expression) + { + AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.Some, expression); + root.And(criterion); + return root; + } + public S WhereProperty(Expression<Func<T, object>> expression) { string property = ExpressionProcessor.FindMemberExpression(expression.Body); return (S)new S().Set(root, property, null); } + public S WhereProperty(Expression<Func<object>> expression) + { + string property = ExpressionProcessor.FindMemberExpression(expression.Body); + return (S)new S().Set(root, property, null); + } + public S WhereValue(object value) { return (S)new S().Set(root, null, value); Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryPropertyBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryPropertyBuilder.cs 2009-11-10 14:19:09 UTC (rev 4826) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverSubqueryPropertyBuilder.cs 2009-11-10 18:07:01 UTC (rev 4827) @@ -78,6 +78,16 @@ } /// <summary> + /// Add a property equal all subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R EqAll<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyEqAll, Subqueries.EqAll, detachedCriteria); + return root; + } + + /// <summary> /// Create a property greater than or equal subquery criterion /// </summary> /// <param name="detachedCriteria">detached subquery</param> @@ -88,6 +98,26 @@ } /// <summary> + /// Create a property greater than or equal all subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R GeAll<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyGeAll, Subqueries.GeAll, detachedCriteria); + return root; + } + + /// <summary> + /// Create a property greater than or equal some subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R GeSome<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyGeSome, Subqueries.GeSome, detachedCriteria); + return root; + } + + /// <summary> /// Create a property greater than subquery criterion /// </summary> /// <param name="detachedCriteria">detached subquery</param> @@ -98,6 +128,26 @@ } /// <summary> + /// Create a property greater than all subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R GtAll<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyGtAll, Subqueries.GtAll, detachedCriteria); + return root; + } + + /// <summary> + /// Create a property greater than some subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R GtSome<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyGtSome, Subqueries.GtSome, detachedCriteria); + return root; + } + + /// <summary> /// Create a property in subquery criterion /// </summary> /// <param name="detachedCriteria">detached subquery</param> @@ -118,6 +168,26 @@ } /// <summary> + /// Create a property less than or equal all subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R LeAll<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyLeAll, Subqueries.LeAll, detachedCriteria); + return root; + } + + /// <summary> + /// Create a property less than or equal some subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R LeSome<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyLeSome, Subqueries.LeSome, detachedCriteria); + return root; + } + + /// <summary> /// Create a property less than subquery criterion /// </summary> /// <param name="detachedCriteria">detached subquery</param> @@ -128,6 +198,26 @@ } /// <summary> + /// Create a property less than all subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R LtAll<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyLtAll, Subqueries.LtAll, detachedCriteria); + return root; + } + + /// <summary> + /// Create a property less than some subquery criterion + /// </summary> + /// <param name="detachedCriteria">detached subquery</param> + public R LtSome<U>(QueryOver<U> detachedCriteria) + { + AddSubquery(Subqueries.PropertyLtSome, Subqueries.LtSome, detachedCriteria); + return root; + } + + /// <summary> /// Create a property not equal subquery criterion /// </summary> /// <param name="detachedCriteria">detached subquery</param> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/SubqueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/SubqueryFixture.cs 2009-11-10 14:19:09 UTC (rev 4826) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/SubqueryFixture.cs 2009-11-10 18:07:01 UTC (rev 4827) @@ -103,6 +103,63 @@ } [Test] + public void PropertyAlias() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .Add(Subqueries.PropertyEq("personAlias.Name", DetachedCriteriaName)); + + Person personAlias = null; + var actual = + CreateTestQueryOver<Person>(() => personAlias) + .WithSubquery.WhereProperty(() => personAlias.Name).Eq(DetachedQueryOverName); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void PropertyAll() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.PropertyEqAll("Name", DetachedCriteriaName)) + .Add(Subqueries.PropertyGeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyGtAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLtAll("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereProperty(p => p.Name).EqAll(DetachedQueryOverName) + .WithSubquery.WhereProperty(p => p.Age).GeAll(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).GtAll(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).LeAll(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).LtAll(DetachedQueryOverAge); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void PropertySome() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.PropertyGeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyGtSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLtSome("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereProperty(p => p.Age).GeSome(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).GtSome(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).LeSome(DetachedQueryOverAge) + .WithSubquery.WhereProperty(p => p.Age).LtSome(DetachedQueryOverAge); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] public void PropertyAsSyntax() { ICriteria expected = @@ -127,6 +184,67 @@ } [Test] + public void PropertyAsSyntaxAlias() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .Add(Subqueries.PropertyEq("personAlias.Name", DetachedCriteriaName)) + .Add(Subqueries.PropertyGtSome("personAlias.Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLtAll("personAlias.Age", DetachedCriteriaAge)); + + Person personAlias = null; + var actual = + CreateTestQueryOver<Person>(() => personAlias) + .WithSubquery.Where(() => personAlias.Name == DetachedQueryOverName.As<string>()) + .WithSubquery.WhereSome(() => personAlias.Age > DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereAll(() => personAlias.Age < DetachedQueryOverAge.As<int>()); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void PropertyAsAllSyntax() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.PropertyEqAll("Name", DetachedCriteriaName)) + .Add(Subqueries.PropertyGeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyGtAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLtAll("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereAll(p => p.Name == DetachedQueryOverName.As<string>()) + .WithSubquery.WhereAll(p => p.Age >= DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereAll(p => p.Age > DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereAll(p => p.Age <= DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereAll(p => p.Age < DetachedQueryOverAge.As<int>()); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void PropertyAsSomeSyntax() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.PropertyGeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyGtSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.PropertyLtSome("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereSome(p => p.Age >= DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereSome(p => p.Age > DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereSome(p => p.Age <= DetachedQueryOverAge.As<int>()) + .WithSubquery.WhereSome(p => p.Age < DetachedQueryOverAge.As<int>()); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] public void Value() { ICriteria expected = @@ -154,6 +272,64 @@ AssertCriteriaAreEqual(expected, actual); } + [Test] + public void ValueAll() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.EqAll("Name", DetachedCriteriaName)) + .Add(Subqueries.GeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.GtAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.LeAll("Age", DetachedCriteriaAge)) + .Add(Subqueries.LtAll("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereValue("Name").EqAll(DetachedQueryOverName) + .WithSubquery.WhereValue("Age").GeAll(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").GtAll(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").LeAll(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").LtAll(DetachedQueryOverAge); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void ValueSome() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.GeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.GtSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.LeSome("Age", DetachedCriteriaAge)) + .Add(Subqueries.LtSome("Age", DetachedCriteriaAge)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereValue("Age").GeSome(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").GtSome(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").LeSome(DetachedQueryOverAge) + .WithSubquery.WhereValue("Age").LtSome(DetachedQueryOverAge); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void UntypedSubqueries() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Subqueries.Exists(DetachedCriteriaChild)) + .Add(Subqueries.NotExists(DetachedCriteriaChild)); + + var actual = + CreateTestQueryOver<Person>() + .WithSubquery.WhereExists(DetachedQueryOverChild) + .WithSubquery.WhereNotExists(DetachedQueryOverChild); + + AssertCriteriaAreEqual(expected, actual); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |