From f60a6780b6646cf6f82a6ce829c439e195c2ebad Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 13 Aug 2022 18:56:48 +0800 Subject: [PATCH] Update ClickHouse Demo --- Src/Asp.NetCore2/ClickHouseTest/Config.cs | 2 +- .../ClickHouseTest/Demo/Demo1_Queryable.cs | 36 ++-- .../ClickHouseTest/Demo/Demo2_Updateable.cs | 10 +- .../ClickHouse/ClickHouseProvider.cs | 44 +++++ .../SqlBuilder/ClickHouseUpdateBuilder.cs | 182 ++++++++---------- 5 files changed, 153 insertions(+), 121 deletions(-) diff --git a/Src/Asp.NetCore2/ClickHouseTest/Config.cs b/Src/Asp.NetCore2/ClickHouseTest/Config.cs index 0b6f1ab4b..98a426bb2 100644 --- a/Src/Asp.NetCore2/ClickHouseTest/Config.cs +++ b/Src/Asp.NetCore2/ClickHouseTest/Config.cs @@ -16,7 +16,7 @@ namespace OrmTest /// Account have permission to create database /// 用有建库权限的数据库账号 /// - public static string ConnectionString = "Database=default;Username=default;Password=;Host=localhost;Port=8123;Compression=False;UseSession=False;Timeout=120"; + public static string ConnectionString = "Database=default;Username=default;Password=;Host=localhost;Port=8123;Compression=False;UseSession=False;Timeout=120;allowMultiQueries=true"; /// /// Account have permission to create database /// 用有建库权限的数据库账号 diff --git a/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo1_Queryable.cs b/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo1_Queryable.cs index b58875c5c..513c459d7 100644 --- a/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo1_Queryable.cs +++ b/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo1_Queryable.cs @@ -107,13 +107,13 @@ namespace OrmTest Console.WriteLine("#### Subquery Start ####"); var db = GetInstance(); - var list = db.Queryable().Take(10).Select(it => new - { - customName=SqlFunc.Subqueryable().Where("it.CustomId=id").Select(s=>s.Name), - customName2 = SqlFunc.Subqueryable().Where("it.CustomId = id").Where(s => true).Select(s => s.Name) - }).ToList(); + //var list = db.Queryable().Take(10).Select(it => new + //{ + // customName=SqlFunc.Subqueryable().Where("it.CustomId=Id").Select(s=>s.Name), + // customName2 = SqlFunc.Subqueryable().Where("it.CustomId = Id").Where(s => true).Select(s => s.Name) + //}).ToList(); - var list2 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(i => i.OrderId == it.Id).Any()).ToList(); + //var list2 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(i => i.OrderId == it.Id).Any()).ToList(); Console.WriteLine("#### Subquery End ####"); } @@ -166,10 +166,10 @@ namespace OrmTest db.Insertable(new B() { Name = "B" }).ExecuteCommand(); db.Insertable(new ABMapping() { AId = 1, BId = 1 }).ExecuteCommand(); - var list4 = db.Queryable() - .Mapper(it => it.A, it => it.AId) - .Mapper(it => it.B, it => it.BId) - .Where(it=>it.A.Id==1).ToList(); + //var list4 = db.Queryable() + // .Mapper(it => it.A, it => it.AId) + // .Mapper(it => it.B, it => it.BId) + // .Where(it=>it.A.Id==1).ToList(); //Manual mode var result = db.Queryable().Take(10).Select().Mapper((itemModel, cache) => @@ -190,9 +190,9 @@ namespace OrmTest Console.WriteLine("#### No Entity Start ####"); var db = GetInstance(); - var list = db.Queryable().AS("order").Where("id=id", new { id = 1 }).ToList(); + var list = db.Queryable().AS("Order").Where("Id=Id", new { id = 1 }).ToList(); - var list2 = db.Queryable("o").AS("order").AddJoinInfo("OrderDetail", "i", "o.id=i.OrderId").Where("id=id", new { id = 1 }).Select("o.*").ToList(); + var list2 = db.Queryable("o").AS("Order").AddJoinInfo("OrderDetail", "i", "o.Id=i.OrderId").Where("Id=Id", new { id = 1 }).Select("o.*").ToList(); Console.WriteLine("#### No Entity End ####"); } @@ -251,9 +251,9 @@ namespace OrmTest /*** By sql***/ //id=@id - var list4 = db.Queryable().Where("id=@id", new { id = 1 }).ToList(); + var list4 = db.Queryable().Where("Id=@id", new { id = 1 }).ToList(); //id=@id or name like '%'+@name+'%' - var list5 = db.Queryable().Where("id=@id or name like @name ", new { id = 1, name = "%jack%" }).ToList(); + var list5 = db.Queryable().Where("Id=@id or Name like @name ", new { id = 1, name = "%jack%" }).ToList(); @@ -261,12 +261,12 @@ namespace OrmTest //id=1 var conModels = new List(); - conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" , FieldValueConvertFunc=it=>Convert.ToInt32(it) });//id=1 + conModels.Add(new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "1" , FieldValueConvertFunc=it=>Convert.ToInt32(it) });//id=1 var student = db.Queryable().Where(conModels).ToList(); //Complex use case List Order = new List(); - conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });//id=1 + conModels.Add(new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });//id=1 //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1", FieldValueConvertFunc = it => Convert.ToInt32(it) });// id like '%1%' //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.IsNullOrEmpty }); //conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.In, FieldValue = "1,2,3" }); @@ -279,8 +279,8 @@ namespace OrmTest ConditionalList = new List>()// (id=1 or id=2 and id=1) { //new KeyValuePair( WhereType.And ,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }), - new KeyValuePair (WhereType.Or,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" , FieldValueConvertFunc = it => Convert.ToInt32(it) }), - new KeyValuePair ( WhereType.And,new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" ,FieldValueConvertFunc = it => Convert.ToInt32(it)}) + new KeyValuePair (WhereType.Or,new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "2" , FieldValueConvertFunc = it => Convert.ToInt32(it) }), + new KeyValuePair ( WhereType.And,new ConditionalModel() { FieldName = "Id", ConditionalType = ConditionalType.Equal, FieldValue = "2" ,FieldValueConvertFunc = it => Convert.ToInt32(it)}) } }); var list6 = db.Queryable().Where(conModels).ToList(); diff --git a/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo2_Updateable.cs b/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo2_Updateable.cs index 13f43a0b8..6fc248cb7 100644 --- a/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo2_Updateable.cs +++ b/Src/Asp.NetCore2/ClickHouseTest/Demo/Demo2_Updateable.cs @@ -72,14 +72,14 @@ namespace OrmTest /*** 3.by Dictionary ***/ var dt = new Dictionary(); - dt.Add("id", 1); - dt.Add("name", "abc"); - dt.Add("createTime", DateTime.Now); + dt.Add("Id", 1); + dt.Add("Name", "abc"); + dt.Add("CreateTime", DateTime.Now); var dtList = new List>(); dtList.Add(dt); - var t66 = db.Updateable(dt).AS("order").WhereColumns("id").ExecuteCommand(); - var t666 = db.Updateable(dtList).AS("order").WhereColumns("id").ExecuteCommand(); + var t66 = db.Updateable(dt).AS("Order").WhereColumns("Id").ExecuteCommand(); + var t666 = db.Updateable(dtList).AS("Order").WhereColumns("Id").ExecuteCommand(); diff --git a/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/ClickHouseProvider.cs b/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/ClickHouseProvider.cs index 26879b658..5c98b2cc2 100644 --- a/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/ClickHouseProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/ClickHouseProvider.cs @@ -6,6 +6,7 @@ using System.Data; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -37,6 +38,49 @@ namespace SqlSugar.ClickHouse base._DbConnection = value; } } + public string SplitCommandTag => UtilConstants.ReplaceCommaKey; + public override int ExecuteCommand(string sql, params SugarParameter[] parameters) + { + if (sql == null) throw new Exception("sql is null"); + if (sql.IndexOf(this.SplitCommandTag)>0) + { + var sqlParts=Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList(); + var result = 0; + foreach (var item in sqlParts) + { + if (item.TrimStart('\r').TrimStart('\n') != "") + { + result += base.ExecuteCommand(item, parameters); + } + } + return result; + } + else + { + return base.ExecuteCommand(sql, parameters); + } + } + public override async Task ExecuteCommandAsync(string sql, params SugarParameter[] parameters) + { + if (sql == null) throw new Exception("sql is null"); + if (sql.IndexOf(this.SplitCommandTag) > 0) + { + var sqlParts = Regex.Split(sql, this.SplitCommandTag).Where(it => !string.IsNullOrEmpty(it)).ToList(); + var result = 0; + foreach (var item in sqlParts) + { + if (item.TrimStart('\r').TrimStart('\n') != "") + { + result +=await base.ExecuteCommandAsync(item, parameters); + } + } + return result; + } + else + { + return await base.ExecuteCommandAsync(sql, parameters); + } + } public override void BeginTran() { //No Support diff --git a/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/SqlBuilder/ClickHouseUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/SqlBuilder/ClickHouseUpdateBuilder.cs index 63222c81c..82ed8faaf 100644 --- a/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/SqlBuilder/ClickHouseUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.ClickHouseCore/ClickHouse/SqlBuilder/ClickHouseUpdateBuilder.cs @@ -92,107 +92,95 @@ namespace SqlSugar.ClickHouse protected override string TomultipleSqlString(List> groupList) { - Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List need Primary key"); - int pageSize = 200; - int pageIndex = 1; - int totalRecord = groupList.Count; - int pageCount = (totalRecord + pageSize - 1) / pageSize; - StringBuilder batchUpdateSql = new StringBuilder(); - while (pageCount >= pageIndex) + StringBuilder sb = new StringBuilder(); + int i = 0; + sb.AppendLine(string.Join(UtilConstants.ReplaceCommaKey, groupList.Select(t => { - StringBuilder updateTable = new StringBuilder(); - string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it => + var updateTable = string.Format("ALTER TABLE {0} UPDATE ", base.GetTableNameStringNoWith); + var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Select(m => GetOracleUpdateColums(i, m, false)).ToArray()); + var pkList = t.Where(s => s.IsPrimarykey).ToList(); + List whereList = new List(); + foreach (var item in pkList) { - if (SetValues.IsValuable()) - { - var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); - if (setValue != null && setValue.Any()) - { - return setValue.First().Value; - } - } - var result = string.Format("{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName)); - return result; - })); - string tempColumnValue = string.Join(",", groupList.First().Select(it => - { - if (SetValues.IsValuable()) - { - var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); - if (setValue != null && setValue.Any()) - { - return setValue.First().Value; - } - } - var result = Builder.GetTranslationColumnName(it.DbColumnName); - return result; - })); - batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString); - int i = 0; - var tableColumnList = this.Context.DbMaintenance.GetColumnInfosByTableName(GetTableNameStringNoWith); - - foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList()) - { - var isFirst = i == 0; - if (!isFirst) - { - updateTable.Append(SqlTemplateBatchUnion); - } - updateTable.Append("\r\n (" + string.Join(",", columns.Select(it => - { - var columnInfo = tableColumnList.FirstOrDefault(x => x.DbColumnName.Equals(it.DbColumnName, StringComparison.OrdinalIgnoreCase)); - var dbType = columnInfo?.DataType; - if (dbType == null) { - var typeName = it.PropertyType.Name.ToLower(); - if (typeName == "int32") - typeName = "int"; - if (typeName == "int64") - typeName = "long"; - if (typeName == "int16") - typeName = "short"; - if (typeName == "boolean") - typeName = "bool"; - - var isAnyType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).Any(); - if (isAnyType) - { - dbType = PostgreSQLDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).FirstOrDefault().Key; - } - else { - dbType = "varchar"; - } - } - return string.Format("CAST({0} AS {1})", FormatValue(it.Value,it.DbColumnName,i,it), dbType); - - })) + ")"); - ++i; + var isFirst = pkList.First() == item; + var whereString = ""; + whereString += GetOracleUpdateColums(i, item, true); + whereList.Add(whereString); + } + i++; + return string.Format("{0} {1} WHERE {2} ", updateTable, setValues, string.Join(" AND", whereList)); + }).ToArray())); + return sb.ToString(); + } + private string GetOracleUpdateColums(int i, DbColumnInfo m, bool iswhere) + { + return string.Format("\"{0}\"={1}", m.DbColumnName, FormatValue(i, m.DbColumnName, m.Value, iswhere)); + } + public object FormatValue(int i, string name, object value, bool iswhere) + { + if (value == null) + { + return "NULL"; + } + else + { + var type = UtilMethods.GetUnderType(value.GetType()); + if (type == UtilConstants.DateType && iswhere == false) + { + var date = value.ObjToDate(); + if (date < UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig)) + { + date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig); + } + if (this.Context.CurrentConnectionConfig?.MoreSettings?.DisableMillisecond == true) + { + return "'" + date.ToString("yyyy-MM-dd HH:mm:ss") + "'"; + } + else + { + return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; + } + } + else if (type == UtilConstants.DateType && iswhere) + { + var parameterName = this.Builder.SqlParameterKeyWord + name + i; + this.Parameters.Add(new SugarParameter(parameterName, value)); + return parameterName; + } + else if (type.IsEnum()) + { + if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true) + { + return value.ToSqlValue(); + } + else + { + return Convert.ToInt64(value); + } + } + else if (type == UtilConstants.ByteArrayType) + { + var parameterName = this.Builder.SqlParameterKeyWord + name + i; + this.Parameters.Add(new SugarParameter(parameterName, value)); + return parameterName; + } + else if (value is int || value is long || value is short || value is short || value is byte) + { + return value; + } + else if (value is bool) + { + return value.ObjToString().ToLower(); + } + else if (type == UtilConstants.StringType || type == UtilConstants.ObjType) + { + return "'" + value.ToString().ToSqlFilter() + "'"; + } + else + { + return "'" + value.ToString() + "'"; } - pageIndex++; - updateTable.Append("\r\n"); - string whereString = null; - if (this.WhereValues.HasValue()) - { - foreach (var item in WhereValues) - { - var isFirst = whereString == null; - whereString += (isFirst ? null : " AND "); - whereString += item; - } - } - else if (PrimaryKeys.HasValue()) - { - foreach (var item in PrimaryKeys) - { - var isFirst = whereString == null; - whereString += (isFirst ? null : " AND "); - whereString += string.Format("{0}.{1}=T.{1}", GetTableNameStringNoWith, Builder.GetTranslationColumnName(item)); - } - } - var format = string.Format(SqlTemplateJoin, updateTable, whereString, tempColumnValue); - batchUpdateSql.Replace("${0}", format); - batchUpdateSql.Append(";"); } - return batchUpdateSql.ToString(); } } }