diff --git a/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs b/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs new file mode 100644 index 00000000..f899e283 --- /dev/null +++ b/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs @@ -0,0 +1,58 @@ +using System; + +using NUnit.Framework; + +namespace Deveel.Data.Sql.Expressions { + [TestFixture] + public static class SqlConditionalExpressionTests { + [Test] + public static void SimpleCase() { + var first = SqlExpression.Constant(34); + var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(24)); + var condition = SqlExpression.Equal(first, second); + var returnExpression = SqlExpression.Constant("It was equal"); + var conditional = SqlExpression.Conditional(condition, returnExpression); + + var result = conditional.EvaluateToConstant(null, null); + + Assert.IsNotNull(result); + Assert.IsFalse(Field.IsNullField(result)); + Assert.AreEqual("It was equal", result.Value.ToString()); + } + + [Test] + public static void SimpleCaseWithFalse() { + var first = SqlExpression.Constant(34); + var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(34)); + var condition = SqlExpression.Equal(first, second); + var ifTrue = SqlExpression.Constant("It was equal"); + var ifFalse = SqlExpression.Constant("It was not equal"); + + var conditional = SqlExpression.Conditional(condition, ifTrue, ifFalse); + + var result = conditional.EvaluateToConstant(null, null); + + Assert.IsNotNull(result); + Assert.IsFalse(Field.IsNullField(result)); + Assert.AreEqual("It was not equal", result.Value.ToString()); + } + + [Test] + public static void CaseNestedFalse() { + var first = SqlExpression.Constant(34); + var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(34)); + var condition = SqlExpression.Equal(first, second); + var ifTrue = SqlExpression.Constant("It was equal"); + var ifFalseReturn = SqlExpression.Constant("It was not equal"); + var ifFalse = SqlExpression.Conditional(SqlExpression.Constant(true), ifFalseReturn); + + var conditional = SqlExpression.Conditional(condition, ifTrue, ifFalse); + + var result = conditional.EvaluateToConstant(null, null); + + Assert.IsNotNull(result); + Assert.IsFalse(Field.IsNullField(result)); + Assert.AreEqual("It was not equal", result.Value.ToString()); + } + } +} diff --git a/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs b/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs new file mode 100644 index 00000000..5c981b1a --- /dev/null +++ b/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs @@ -0,0 +1,40 @@ +using System; + +using Deveel.Data.Sql; +using Deveel.Data.Sql.Expressions; +using Deveel.Data.Sql.Statements; +using Deveel.Data.Sql.Types; +using Deveel.Data.Sql.Variables; + +using NUnit.Framework; + +namespace Deveel.Data { + [TestFixture] + public sealed class ConditionalTests : ContextBasedTest { + protected override void OnAfterSetup(string testName) { + Query.Access().CreateObject(new VariableInfo("a", PrimitiveTypes.Integer(), false) { + DefaultExpression = SqlExpression.Constant(34) + }); + + base.OnAfterSetup(testName); + } + + protected override void OnBeforeTearDown(string testName) { + Query.Access().DropObject(DbObjectType.Variable, new ObjectName("a")); + base.OnBeforeTearDown(testName); + } + + [Test] + public void SimpleConditional() { + var condition = SqlExpression.Equal(SqlExpression.VariableReference("a"), SqlExpression.Constant(34)); + var ifTrue = new SqlStatement[] { + new DeclareVariableStatement("b", PrimitiveTypes.String()), + new AssignVariableStatement(SqlExpression.VariableReference("b"), SqlExpression.Constant(21)), + }; + + var result = Query.If(condition, ifTrue); + + Assert.IsNotNull(result); + } + } +} diff --git a/src/deveeldb-nunit/deveeldb-nunit.csproj b/src/deveeldb-nunit/deveeldb-nunit.csproj index 8f7705f2..dd934da1 100644 --- a/src/deveeldb-nunit/deveeldb-nunit.csproj +++ b/src/deveeldb-nunit/deveeldb-nunit.csproj @@ -135,6 +135,7 @@ + @@ -149,6 +150,7 @@ + diff --git a/src/deveeldb/Deveel.Data/RequestExtensions.cs b/src/deveeldb/Deveel.Data/RequestExtensions.cs index 61360cfa..a45e98b9 100644 --- a/src/deveeldb/Deveel.Data/RequestExtensions.cs +++ b/src/deveeldb/Deveel.Data/RequestExtensions.cs @@ -521,6 +521,26 @@ public static class RequestExtensions { #endregion + #region If + + public static ITable If(this IRequest request, SqlExpression condition, SqlStatement[] ifTrue) { + return If(request, condition, ifTrue, new SqlStatement[0]); + } + + public static ITable If(this IRequest request, SqlExpression condition, SqlStatement[] ifTrue, SqlStatement[] ifFalse) { + var result = request.ExecuteStatement(new ConditionStatement(condition, ifTrue, ifFalse)); + + if (result.Type == StatementResultType.Exception) + throw result.Error; + + if (result.Type == StatementResultType.Result) + return result.Result; + + throw new NotSupportedException("Cursor-ref in condition not supported (yet)."); + } + + #endregion + #endregion } }