using Elsa.Common.Entities; using Elsa.Dapper.Contracts; namespace Elsa.Dapper.Abstractions; /// /// Provides a base implementation of , where the dialect defaults to SQLite. /// public abstract class SqlDialectBase : ISqlDialect { /// public virtual string From(string table) => From(table, "*"); /// public virtual string From(string table, params string[] fields) { var fieldList = string.Join(", ", fields); return $"select {fieldList} from {table} where 1=1"; } /// public string Delete(string table) => $"delete from {table} where 1=1"; /// public string Count(string table) => Count("*", table); /// public string Count(string fieldExpression, string table) => $"select COUNT({fieldExpression}) from {table} where 1=1"; /// public virtual string And(string field) => $"and {field} = @{field}"; /// public virtual string AndNot(string field) => $"and not {field} = @{field}"; /// public virtual string And(string field, string[] fieldParamNames) { return $"and {field} in ({string.Join(", ", fieldParamNames)})"; } /// public virtual string AndNot(string field, string[] fieldParamNames) { return $"and {field} not in ({string.Join(", ", fieldParamNames)})"; } /// public virtual string OrderBy(string field, OrderDirection direction) { var directionString = direction == OrderDirection.Ascending ? "asc" : "desc"; return $"order by {field} {directionString}"; } /// public virtual string Skip(int count) => $"OFFSET {count}"; /// public virtual string Take(int count) => $"LIMIT {count}"; /// public string Insert(string table, string[] fields) { var fieldList = string.Join(", ", fields); var fieldParamNames = fields.Select(x => $"@{x}"); var fieldParamList = string.Join(", ", fieldParamNames); return $"INSERT INTO {table} ({fieldList}) VALUES ({fieldParamList});"; } /// public virtual string Upsert(string table, string primaryKeyField, string[] fields) { var fieldList = string.Join(", ", fields); var fieldParamNames = fields.Select(x => $"@{x}"); var fieldParamList = string.Join(", ", fieldParamNames); //var updateList = string.Join(", ", fields.Select(x => $"{x} = @{x}")); //return $"insert into {table} ({fieldList}) values ({fieldParamList}) on conflict(id) do update set {updateList}"; return $"INSERT OR REPLACE INTO {table} ({primaryKeyField}, {fieldList}) VALUES (@{primaryKeyField}, {fieldParamList});"; } }