Browse Source

- [Vitorm.SqlServer] fix bool type was not supported in database issue (especially in select sentence)
- [Vitorm.ClickHouse] fix String.Add null value and cast issue : ifNull( cast( (userFatherId) as Nullable(String) ) , '' )
- [Vitorm.Sqlite] fix String.Add null value and cast issue

Lith 10 months ago
parent
commit
b31aeafbf9

+ 2 - 0
doc/ReleaseLog.md

@@ -11,6 +11,8 @@
 - support bool and bool? column mapping
 - [Vitorm.SqlServer] fix bool type was not supported in database issue (especially in select sentence)
 - [Vitorm.ClickHouse] fix String.Add null value and cast issue : ifNull(  cast( (userFatherId) as Nullable(String) ) , ''  )
+- [Vitorm.Sqlite] fix String.Add null value and cast issue
+
 -----------------------
 # 1.1.0
 

+ 0 - 5
doc/TODO.md

@@ -1,11 +1,6 @@
 # Vitorm TODO
 
 
-# SqlServer  Select 
- select  IIF([t0].[FatherId] is not null,true,false) as c13, [t0].[FatherId] is not null as c14, [t0].[Name] as c15
- from [dbo].[User] as t0
-
-
 
 # group then orderBy aggregate column
 > [QueryTranslator] not suported MethodCall: Sum

+ 15 - 1
src/Vitorm.MySql/SqlTranslateService.cs

@@ -129,7 +129,21 @@ namespace Vitorm.MySql
                         // ##1 String Add
                         if (data.valueType?.ToType() == typeof(string))
                         {
-                            return $"CONCAT({EvalExpression(arg, binary.left)} ,{EvalExpression(arg, binary.right)})";
+                            //  select ifNull( cast( (userFatherId) as char ) , '' )  from `User`
+
+                            return $"CONCAT( {BuildSqlSentence(binary.left)} , {BuildSqlSentence(binary.right)} )";
+
+                            string BuildSqlSentence(ExpressionNode node)
+                            {
+                                if (node.nodeType == NodeType.Constant)
+                                {
+                                    ExpressionNode_Constant constant = node;
+                                    if (constant.value == null) return "''";
+                                    else return $"cast( ({EvalExpression(arg, node)}) as char )";
+                                }
+                                else
+                                    return $"ifNull( cast( ({EvalExpression(arg, node)}) as char ) , '')";
+                            }
                         }
 
                         // ##2 Numberic Add

+ 16 - 2
src/Vitorm.Sqlite/SqlTranslateService.cs

@@ -110,7 +110,21 @@ namespace Vitorm.Sqlite
                         // ##1 String Add
                         if (data.valueType?.ToType() == typeof(string))
                         {
-                            return $"{EvalExpression(arg, binary.left)} || {EvalExpression(arg, binary.right)}";
+                            // select ifNull( cast( (userFatherId) as text ) , '' )  from `User`
+
+                            return $"{BuildSqlSentence(binary.left)} || {BuildSqlSentence(binary.right)}";
+
+                            string BuildSqlSentence(ExpressionNode node)
+                            {
+                                if (node.nodeType == NodeType.Constant)
+                                {
+                                    ExpressionNode_Constant constant = node;
+                                    if (constant.value == null) return "''";
+                                    else return $"cast( ({EvalExpression(arg, node)}) as text )";
+                                }
+                                else
+                                    return $"ifNull( cast( ({EvalExpression(arg, node)}) as text ) , '')";
+                            }
                         }
 
                         // ##2 Numberic Add
@@ -123,7 +137,7 @@ namespace Vitorm.Sqlite
                     }
                 case nameof(ExpressionType.Conditional):
                     {
-                        // IIF(`t0`.`fatherId` is not null,true, false)
+                        // IIF(`t0`.`fatherId` is not null, true, false)
                         ExpressionNode_Conditional conditional = data;
                         return $"IIF({EvalExpression(arg, conditional.Conditional_GetTest())},{EvalExpression(arg, conditional.Conditional_GetIfTrue())},{EvalExpression(arg, conditional.Conditional_GetIfFalse())})";
                     }

+ 1 - 0
test/Vitorm.Sqlite.MsTest/CommonTest/Query_Group_Test.cs

@@ -121,6 +121,7 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query =
                     userQuery
+                    .Where(user => user.id < 7)
                     .GroupBy(user => new { user.fatherId, user.motherId })
                     .OrderByDescending(group => group.Count())
                     .Select(userGroup => new

+ 0 - 8
test/Vitorm.Sqlite.MsTest/CommonTest/Query_LinqMethods_Test.cs

@@ -104,14 +104,6 @@ namespace Vitorm.MsTest.CommonTest
                 Assert.AreEqual(3.0, userList.First());
             }
 
-
-
-            {
-                userQuery.Where(user => user.id == 3).Select(u => new { u.id, u.fatherId }).ToList();
-
-            }
-
-
             {
                 var query =
                     from user in userQuery

+ 84 - 116
test/Vitorm.Sqlite.MsTest/CommonTest/Query_Select_Test.cs

@@ -7,16 +7,6 @@ namespace Vitorm.MsTest.CommonTest
     [TestClass]
     public class Query_Select_Test
     {
-        class User2 : User
-        {
-            public User2() { }
-
-            public User2(int nid) { id = nid; }
-            public User2(string name) { this.name = name; }
-
-            public User father;
-        }
-
 
         [TestMethod]
         public void Test_Select()
@@ -24,181 +14,159 @@ namespace Vitorm.MsTest.CommonTest
             using var dbContext = DataSource.CreateDbContext();
             var userQuery = dbContext.Query<User>();
 
+            // 
             {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                    where user.id > 1
-                    orderby user.id
-                    select new User2(user.id)
-                    ;
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(5, userList.Count);
-
+                var userList = userQuery.ToList();
             }
 
+            // userQuery.Select(user => user)
             {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                    where user.id > 1
-                    orderby user.id
-                    select new User2(user.name)
-                    ;
+                var rows = userQuery.Select(user => user).ToList();
+                Assert.AreEqual(6, rows.Count);
+            }
 
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(5, userList.Count);
+            // userQuery.Select(user => user.id);
+            {
+                var rows = userQuery.Select(user => user.id).ToList();
             }
+            {
+                var rows = userQuery.Select(user => user.id + 100).ToList();
+            }
+            {
+                var rows = userQuery.Select(user => 1000 + user.id + 100).ToList();
+            }
+            {
+                var rows = userQuery.Select(user => (double)user.id).ToList();
+            }
+            {
+                var rows = userQuery.Select(user => (double)user.id + 0.1).ToList();
+            }
+            {
+                var rows = userQuery.Select(user => user.id + 0.1).ToList();
+            }
+
             {
                 var query =
                     from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
                     where user.id > 1
                     orderby user.id
-                    select new User2(user.name)
+                    select new
                     {
-                        id = user.id + 100,
-                        fatherId = father.id,
-                        father = father,
-                    }
-                    ;
+                        id = user.id,
+                        user = user,
+                        ext = new
+                        {
+                            father = user,
+                            fid = user.fatherId
+                        },
+                        trueValue = true,
+                    };
 
                 var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(5, userList.Count);
-
+                var rows = query.ToList();
             }
 
+
+            // String.Format(format: "{0}_{1}_{2}", "0", "1", "2")
             {
                 var query =
                     from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                    where user.id > 1
                     orderby user.id
-                    select new User2
+                    select new
                     {
-                        id = user.id,
-                        fatherId = father.id,
+                        uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
+                        uniqueId2 = $"{user.id}_{user.fatherId}_{user.motherId}"
                     };
-
                 var sql = query.ToExecuteString();
                 var userList = query.ToList();
-                Assert.AreEqual(5, userList.Count);
-
+                Assert.AreEqual(6, userList.Count);
+                Assert.AreEqual("1_4_6", userList[0].uniqueId1);
+                Assert.AreEqual("1_4_6", userList[0].uniqueId2);
+                Assert.AreEqual("4__", userList[3].uniqueId1);
+                Assert.AreEqual("4__", userList[3].uniqueId2);
             }
 
 
-            {
-                var query =
-                        userQuery
-                        .Where(u => u.id > 1)
-                        .GroupBy(user => new { user.fatherId, user.motherId })
-                        .Where(userGroup => userGroup.Key.motherId != null)
-                        .OrderByDescending(userGroup => userGroup.Key.fatherId)
-                        .Select(userGroup => new
-                        {
-                            userGroup.Key.fatherId,
-                            userGroup.Key.motherId,
-                            rowCount = userGroup.Count(),
-                            maxId = userGroup.Max(m => m.id)
-                        })
-                        .Skip(1)
-                        .Take(1)
-                        ;
+        }
 
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
 
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(4, userList[0].fatherId);
-                Assert.AreEqual(6, userList[0].motherId);
-                Assert.AreEqual(1, userList[0].rowCount);
-                Assert.AreEqual(2, userList[0].maxId);
 
-            }
+
+        [TestMethod]
+        public void Test_Select_ExistClass()
+        {
+            using var dbContext = DataSource.CreateDbContext();
+            var userQuery = dbContext.Query<User>();
+
             {
                 var query =
                     from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
                     where user.id > 1
                     orderby user.id
-                    select new
-                    {
-                        id = user.id,
-                        user = user,
-                        ext = new
-                        {
-                            father = father,
-                            fid = father.id
-                        }
-                    };
-
-                query = query.Skip(1).Take(2);
+                    select new User2(user.id)
+                    ;
 
                 var sql = query.ToExecuteString();
                 var userList = query.ToList();
-                Assert.AreEqual(2, userList.Count);
+                Assert.AreEqual(5, userList.Count);
+
             }
 
             {
                 var query =
                     from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                    where user.id == 1
+                    where user.id > 1
                     orderby user.id
-                    select user.id;
+                    select new User2(user.name)
+                    ;
 
                 var sql = query.ToExecuteString();
                 var userList = query.ToList();
-                Assert.AreEqual(1, userList.Count);
+                Assert.AreEqual(5, userList.Count);
             }
-
             {
                 var query =
                     from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
                     where user.id > 1
                     orderby user.id
-                    select user;
-
-                query = query.Skip(1).Take(2);
+                    select new User2(user.name)
+                    {
+                        id = user.id + 100,
+                        fatherId = user.fatherId,
+                        father = user,
+                    }
+                    ;
 
                 var sql = query.ToExecuteString();
                 var userList = query.ToList();
-                Assert.AreEqual(2, userList.Count);
-            }
+                Assert.AreEqual(5, userList.Count);
 
+            }
 
-            // String.Format(format: "{0}_{1}_{2}", "0", "1", "2")
             {
                 var query =
                     from user in userQuery
+                    where user.id > 1
                     orderby user.id
-                    select new
+                    select new User2
                     {
-                        uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
-                        uniqueId2 = $"{user.id}_{user.fatherId}_{user.motherId}"
+                        id = user.id,
+                        fatherId = 12,
                     };
+
                 var sql = query.ToExecuteString();
                 var userList = query.ToList();
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual("1_4_6", userList[0].uniqueId1);
+                Assert.AreEqual(5, userList.Count);
             }
-
-
         }
 
-
+        class User2 : User
+        {
+            public User2() { }
+            public User2(int nid) { id = nid; }
+            public User2(string name) { this.name = name; }
+            public User father;
+        }
 
 
     }

+ 1 - 1
test/Vitorm.Sqlite.MsTest/CustomTest/DbFunction_Test.cs

@@ -15,7 +15,7 @@ namespace Vitorm.MsTest.CustomTest
             var userQuery = dbContext.Query<User>();
 
 
-            // select * from `User` as t0  where IIF(`t0`.`fatherId` is not null,true, false)
+            // select * from `User` as t0  where IIF(`t0`.`fatherId` is not null, true, false )
             {
                 var query = userQuery.Where(u => DbFunction.Call<bool>("IIF", u.fatherId != null, true, false));
                 var sql = query.ToExecuteString();