From b224118133a9a6b6590b443c7ef695f30934235f Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 26 Dec 2022 22:28:06 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20ClickHouse=20=E8=81=94?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2=20GLOBAL=20left=20join=E3=80=81Ado.?= =?UTF-8?q?Query=20*=20=E9=97=AE=E9=A2=98=EF=BC=9B#1383?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommonProvider/AdoProvider/AdoProvider.cs | 15 ++++++++++++ .../AdoProvider/AdoProviderAsync.cs | 15 ++++++++++++ FreeSql/Internal/ObjectPool/ObjectPool.cs | 23 +++++++++++++++++++ .../Curd/ClickHouseSelect.cs | 8 +++---- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 4b415627..b6ed248c 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -151,6 +151,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -194,6 +195,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -211,6 +213,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -262,6 +265,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -279,6 +283,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -296,6 +301,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -353,6 +359,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -370,6 +377,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -387,6 +395,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -404,6 +413,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -467,6 +477,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -484,6 +495,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -501,6 +513,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -518,6 +531,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -535,6 +549,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index c5e51165..2a476453 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -67,6 +67,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -111,6 +112,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -128,6 +130,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -180,6 +183,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -197,6 +201,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -214,6 +219,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -272,6 +278,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -289,6 +296,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -306,6 +314,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -323,6 +332,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -387,6 +397,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -404,6 +415,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -421,6 +433,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -438,6 +451,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); @@ -455,6 +469,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < fetch.Object.FieldCount; a++) { var name = fetch.Object.GetName(a); + if (DataType == DataType.ClickHouse && name.Contains(".")) name = name.Substring(name.IndexOf('.') + 1); if (dic.ContainsKey(name)) continue; sbflag.Append(name).Append(":").Append(a).Append(","); dic.Add(name, a); diff --git a/FreeSql/Internal/ObjectPool/ObjectPool.cs b/FreeSql/Internal/ObjectPool/ObjectPool.cs index 2f63fdb2..6466eaca 100644 --- a/FreeSql/Internal/ObjectPool/ObjectPool.cs +++ b/FreeSql/Internal/ObjectPool/ObjectPool.cs @@ -250,6 +250,29 @@ namespace FreeSql.Internal.ObjectPool catch { } } + public void AutoFree() + { + if (running == false) return; + if (UnavailableException != null) return; + + var list = new List>(); + while (_freeObjects.TryPop(out var obj)) + list.Add(obj); + foreach (var obj in list) + { + if (obj != null && obj.Value == null || + obj != null && Policy.IdleTimeout > TimeSpan.Zero && DateTime.Now.Subtract(obj.LastReturnTime) > Policy.IdleTimeout) + { + if (obj.Value != null) + { + Return(obj, true); + continue; + } + } + Return(obj); + } + } + /// /// 获取可用资源,或创建资源 /// diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs index 795a93d1..e0988d57 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseSelect.cs @@ -46,7 +46,7 @@ namespace FreeSql.ClickHouse.Curd //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 for (var b = 1; b < tbsfrom.Length; b++) { - sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); + sb.Append(" \r\nGLOBAL LEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); else @@ -80,13 +80,13 @@ namespace FreeSql.ClickHouse.Curd case SelectTableInfoType.RawJoin: continue; case SelectTableInfoType.LeftJoin: - sb.Append(" \r\nLEFT JOIN "); + sb.Append(" \r\nGLOBAL LEFT JOIN "); break; case SelectTableInfoType.InnerJoin: - sb.Append(" \r\nINNER JOIN "); + sb.Append(" \r\nGLOBAL INNER JOIN "); break; case SelectTableInfoType.RightJoin: - sb.Append(" \r\nRIGHT JOIN "); + sb.Append(" \r\nGLOBAL RIGHT JOIN "); break; } sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);