From b2addd97c2c7da4ded55d5038b4c6676efd1568e Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 28 Aug 2017 01:18:06 +0800 Subject: [PATCH] Update Oracle --- .../SqlBuilderProvider/QueryBuilder.cs | 2 +- .../Oracle/SqlBuilder/OracleBuilder.cs | 7 ++ .../Oracle/SqlBuilder/OracleQueryBuilder.cs | 66 ++++++++++++++++++- .../SqlSugar/Utilities/UtilConstants.cs | 5 +- 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 23531b663..0b61128fe 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -140,7 +140,7 @@ namespace SqlSugar { get { - return "ORDER BY GETDATE() "; + return "ORDER BY "+this.Builder.SqlDateNow+" "; } } public virtual string OrderByTemplate diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs index 1c63cb761..d2d062335 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs @@ -16,6 +16,13 @@ namespace SqlSugar return ":"; } } + public override string SqlDateNow + { + get + { + return "sysdate"; + } + } public override string SqlTranslationLeft { get { return "\""; } } public override string SqlTranslationRight { get { return "\""; } } public override string GetTranslationTableName(string name) diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs index dc4726cf4..d7bb7f5b3 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs @@ -2,18 +2,82 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SqlSugar { public class OracleQueryBuilder : QueryBuilder { + public override bool IsComplexModel(string sql) + { + return Regex.IsMatch(sql, @"AS ""\w+\.\w+"""); + } public override string SqlTemplate { get { - return "SELECT {0}{{$:OrderByString:$}} FROM {1}{2}{3}{4}"; + return "SELECT {0}{"+UtilConstants.OrderReplace+"} FROM {1}{2}{3}{4}"; } } + public override string ToSqlString() + { + string oldOrderBy = this.OrderByValue; + string externalOrderBy = oldOrderBy; + AppendFilter(); + sql = new StringBuilder(); + if (this.OrderByValue == null && (Skip != null || Take != null)) this.OrderByValue = " ORDER BY "+this.Builder.SqlDateNow+" "; + if (this.PartitionByValue.IsValuable()) + { + this.OrderByValue = this.PartitionByValue + this.OrderByValue; + } + var isRowNumber = Skip != null || Take != null; + var rowNumberString = string.Format(",ROW_NUMBER() OVER({0}) AS RowIndex ", GetOrderByString); + string groupByValue = GetGroupByString + HavingInfos; + string orderByValue = (!isRowNumber && this.OrderByValue.IsValuable()) ? GetOrderByString : null; + if (this.IsCount) { orderByValue = null; } + sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, groupByValue, orderByValue); + sql.Replace(UtilConstants.OrderReplace, isRowNumber ? (this.IsCount ? null : rowNumberString) : null); + if (this.IsCount) { return sql.ToString(); } + var result = ToPageSql(sql.ToString(), this.Take, this.Skip); + if (ExternalPageIndex > 0) + { + if (externalOrderBy.IsNullOrEmpty()) + { + externalOrderBy = " ORDER BY "+this.Builder.SqlDateNow+" "; + } + result = string.Format("SELECT *,ROW_NUMBER() OVER({0}) AS RowIndex2 FROM ({1}) ExternalTable ", GetExternalOrderBy(externalOrderBy), result); + result = ToPageSql2(result, ExternalPageIndex, ExternalPageSize, true); + } + this.OrderByValue = oldOrderBy; + return result; + } + public override string ToPageSql(string sql, int? take, int? skip, bool isExternal = false) + { + string temp = isExternal ? ExternalPageTempalte : PageTempalte; + if (skip != null && take == null) + { + return string.Format(temp, sql.ToString(), skip.ObjToInt() + 1, long.MaxValue); + } + else if (skip == null && take != null) + { + return string.Format(temp, sql.ToString(), 1, take.ObjToInt()); + } + else if (skip != null && take != null) + { + return string.Format(temp, sql.ToString(), skip.ObjToInt() + 1, skip.ObjToInt() + take.ObjToInt()); + } + else + { + return sql.ToString(); + } + } + + public override string ToPageSql2(string sql, int? pageIndex, int? pageSize, bool isExternal = false) + { + string temp = isExternal ? ExternalPageTempalte : PageTempalte; + return string.Format(temp, sql.ToString(), (pageIndex - 1) * pageSize + 1, pageIndex * pageSize); + } + } } diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilConstants.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilConstants.cs index b4e0397c8..23cd164d5 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilConstants.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilConstants.cs @@ -6,8 +6,11 @@ namespace SqlSugar { internal static class UtilConstants { - internal const string AssemblyName = "SqlSugar"; + internal const string Space = " "; + internal const string AssemblyName = "SqlSugar"; + internal const string OrderReplace = "{$:OrderByString:$}"; + internal static Type StringType = typeof(string); internal static Type ShortType = typeof(short); internal static Type IntType = typeof(int);