Author: kostat
Date: 2007-12-24 07:59:33 -0500 (Mon, 24 Dec 2007)
New Revision: 91856

Modified:
   trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
   trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
   trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
   trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
   
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
Log:
add support for string concat (+)

Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog      
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog      
2007-12-24 12:59:33 UTC (rev 91856)
@@ -1,3 +1,7 @@
+2007-12-24 Konstantin Triger <[EMAIL PROTECTED]>
+
+       * Parser.jay, StringFunctions.cs, Like.cs: add support for string 
concat.
+
 2007-07-26  Nagappan A  <[EMAIL PROTECTED]>
 
        * Comparison.cs (Compare): Should always parse the object of type

Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs        
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs        
2007-12-24 12:59:33 UTC (rev 91856)
@@ -36,26 +36,11 @@
 
 namespace Mono.Data.SqlExpressions {
        internal class Like : UnaryExpression {
-               string pattern;
-               bool openStart, openEnd;
+               readonly IExpression _pattern;
                
-               public Like (IExpression e, string pattern) : base (e)
+               public Like (IExpression e, IExpression pattern) : base (e)
                {
-                       string original = pattern;
-                       int len = pattern.Length;
-                       openStart = (pattern[0] == '*' || pattern[0] == '%');
-                       openEnd = (pattern[len - 1] == '*' || pattern[len - 1] 
== '%');
-                       
-                       pattern = pattern.Trim ('*', '%');
-                       pattern = pattern.Replace ("[*]", "[[0]]");
-                       pattern = pattern.Replace ("[%]", "[[1]]");
-                       if (pattern.IndexOf('*') != -1 || pattern.IndexOf('%') 
!= -1)
-                               throw new EvaluateException (String.Format 
("Pattern '{0}' is invalid.", original));
-                       pattern = pattern.Replace ("[[0]]", "*");
-                       pattern = pattern.Replace ("[[1]]", "%");
-                       pattern = pattern.Replace ("[[]", "[");
-                       pattern = pattern.Replace ("[]]", "]");
-                       this.pattern = pattern;
+                       _pattern = pattern;
                }
 
                public override bool Equals(object obj)
@@ -67,15 +52,12 @@
                                return false;
 
                        Like other = (Like) obj;
-                       if (other.pattern != pattern)
-                               return false;
-
-                       return true;
+                       return _pattern.Equals (other._pattern);
                }
 
                public override int GetHashCode()
                {
-                       return pattern.GetHashCode () ^ base.GetHashCode ();
+                       return _pattern.GetHashCode () ^ base.GetHashCode ();
                }
 
                override public object Eval (DataRow row)
@@ -84,7 +66,23 @@
                        if (o == DBNull.Value)
                                return o;
                        string str = (string)o;
-                       string pattern = this.pattern;
+                       bool openStart, openEnd;
+                       string pattern = (string) _pattern.Eval (row);
+                       string original = pattern;
+                       int len = pattern.Length;
+                       openStart = (pattern [0] == '*' || pattern [0] == '%');
+                       openEnd = (pattern [len - 1] == '*' || pattern [len - 
1] == '%');
+
+                       pattern = pattern.Trim ('*', '%');
+                       pattern = pattern.Replace ("[*]", "[[0]]");
+                       pattern = pattern.Replace ("[%]", "[[1]]");
+                       if (pattern.IndexOf ('*') != -1 || pattern.IndexOf 
('%') != -1)
+                               throw new EvaluateException (String.Format 
("Pattern '{0}' is invalid.", original));
+                       pattern = pattern.Replace ("[[0]]", "*");
+                       pattern = pattern.Replace ("[[1]]", "%");
+                       pattern = pattern.Replace ("[[]", "[");
+                       pattern = pattern.Replace ("[]]", "]");
+
                        if (!row.Table.CaseSensitive) {
                                str = str.ToLower();
                                pattern = pattern.ToLower();

Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay     
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay     
2007-12-24 12:59:33 UTC (rev 91856)
@@ -271,8 +271,12 @@
        ;
 
 StringExpr
-       : SingleColumnValue
-       | StringLiteral
+       : PAROPEN StringExpr PARCLOSE
+       {
+               $$ = (IExpression)$2;
+       }
+       | SingleColumnValue
+       | StringLiteral { $$ = new Literal ($1); }
        | StringFunction
        ;
 
@@ -285,6 +289,10 @@
        {
                $$ = new SubstringFunction ((IExpression)$3, (IExpression)$5, 
(IExpression)$7);
        }
+       | StringExpr PLUS StringExpr
+       {
+               $$ = new ConcatFunction ((IExpression)$1, (IExpression)$3);
+       }
        ;
 
 CalcFunction
@@ -312,33 +320,33 @@
        ;
 
 IsPredicate
-       : SingleColumnValue IS NULL
+       : ArithExpr IS NULL
        {
                $$ = new Comparison (Operation.EQ, (IExpression)$1, new Literal 
(null));
        }
-       | SingleColumnValue IS NOT NULL
+       | ArithExpr IS NOT NULL
        {
                $$ = new Comparison (Operation.NE, (IExpression)$1, new Literal 
(null));
        }
        ;
 
 LikePredicate
-       : ArithExpr LIKE StringLiteral
+       : StringExpr LIKE StringExpr
        {
-               $$ = new Like ((IExpression)$1, (string)$3);
+               $$ = new Like ((IExpression)$1, (IExpression)$3);
        }
-       | ArithExpr NOT LIKE StringLiteral
+       | StringExpr NOT LIKE StringExpr
        {
-               $$ = new Negation (new Like ((IExpression)$1, (string)$4));
+               $$ = new Negation (new Like ((IExpression)$1, (IExpression)$4));
        }
        ;
 
 InPredicate
-       : SingleColumnValue IN InPredicateValue
+       : ArithExpr IN InPredicateValue
        {
                $$ = new In ((IExpression)$1, (IList)$3);
        }
-       | SingleColumnValue NOT IN InPredicateValue
+       | ArithExpr NOT IN InPredicateValue
        {
                $$ = new Negation (new In ((IExpression)$1, (IList)$4));
        }

Modified: 
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs     
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs     
2007-12-24 12:59:33 UTC (rev 91856)
@@ -54,6 +54,42 @@
                        return val;
                }
        }
+
+       internal class ConcatFunction : StringFunction
+       {
+               readonly IExpression _add;
+               public ConcatFunction (IExpression e, IExpression add)
+                       : base (e)
+               {
+                       _add = add;
+               }
+
+               public override bool Equals(object obj)
+               {
+                       if (!base.Equals (obj))
+                               return false;
+
+                       if (!(obj is ConcatFunction))
+                               return false;
+
+                       ConcatFunction other = (ConcatFunction) obj;
+                       return _add.Equals (other._add);
+               }
+
+               public override int GetHashCode()
+               {
+                       int hashCode = base.GetHashCode ();
+                       hashCode ^= _add.GetHashCode ();
+                       return hashCode;
+               }
+
+               override public object Eval (DataRow row) {
+                       string str = (string) base.Eval (row);
+                       string x = (string) _add.Eval (row);
+
+                       return str + x;
+               }
+       }
        
        internal class SubstringFunction : StringFunction {
                IExpression start;

Modified: 
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
===================================================================
--- 
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
       2007-12-24 12:16:09 UTC (rev 91855)
+++ 
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
       2007-12-24 12:59:33 UTC (rev 91856)
@@ -72,14 +72,37 @@
                {
                        DataTable table = new DataTable ();
                        table.Columns.Add ("Col_0", Type.GetType 
("System.String"));
-                       table.Columns.Add ("Result", Type.GetType 
("System.String"), "SUBSTRING(Col_0, 2+2, 2)");
+                       table.Columns.Add ("Result", Type.GetType 
("System.String"), "SUBSTRING(Col_0+'K?', 2+2, 2)");
 
                        DataRow row = table.NewRow ();
-                       row ["Col_0"] = "Is OK?";
+                       row ["Col_0"] = "Is O";
 
                        table.Rows.Add (row);
                        Assert.AreEqual ("OK", (string)table.Rows[0][1], "#1");
                }
+               [Test]
+               public void TestConcat ()
+               {
+                       DataTable table = new DataTable ();
+                       table.Columns.Add ("Result", Type.GetType 
("System.Int32"), "'3' + '2'");
+
+                       DataRow row = table.NewRow ();
+
+                       table.Rows.Add (row);
+                       Assert.AreEqual (32, table.Rows[0][0], "#1");
+               }
+               
+               [Test]
+               public void TestIsNull ()
+               {
+                       DataTable table = new DataTable ();
+                       table.Columns.Add ("Result", typeof(bool), "('3') IS 
NULL");
+
+                       DataRow row = table.NewRow ();
+
+                       table.Rows.Add (row);
+                       Assert.AreEqual (false, table.Rows[0][0], "#1");
+               }
        }
        [TestFixture]
        public class DataColumnCharTest

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to