diff options
4 files changed, 36 insertions, 3 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs index b76e1ae..c3d118c 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs @@ -16,7 +16,7 @@ public class ColumnInfo } // A column with no property. - public ColumnInfo(Type entityType, string sqlColumnName, bool isPrimaryKey, bool isAutoIncrement, IColumnTypeInfo typeInfo, ColumnTypeInfoRegistry? typeRegistry = null) + public ColumnInfo(Type entityType, string sqlColumnName, bool isPrimaryKey, bool isAutoIncrement, IColumnTypeInfo typeInfo, ColumnIndexType indexType = ColumnIndexType.None, ColumnTypeInfoRegistry? typeRegistry = null) { if (typeRegistry is null) { @@ -33,6 +33,7 @@ public class ColumnInfo IsPrimaryKey = isPrimaryKey; IsAutoIncrement = isAutoIncrement; TypeRegistry = typeRegistry; + IndexType = indexType; } public ColumnInfo(Type entityType, string entityPropertyName, ColumnTypeInfoRegistry? typeRegistry = null) @@ -58,11 +59,13 @@ public class ColumnInfo { SqlColumnName = PropertyName; Nullable = true; + IndexType = ColumnIndexType.None; } else { SqlColumnName = columnAttribute.DatabaseName ?? PropertyName; Nullable = !columnAttribute.NonNullable; + IndexType = columnAttribute.IndexType; } ColumnTypeInfo = typeRegistry.GetRequiredByDataType(PropertyRealType); @@ -80,6 +83,7 @@ public class ColumnInfo public bool Nullable { get; } public bool IsPrimaryKey { get; } public bool IsAutoIncrement { get; } + public ColumnIndexType IndexType { get; } public string SqlType => TypeRegistry.GetSqlType(ColumnTypeInfo); diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs index cbf38f7..6f46cd5 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs @@ -5,6 +5,13 @@ public interface IColumnMetadata } +public enum ColumnIndexType +{ + None, + Unique, + NonUnique +} + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class ColumnAttribute : Attribute, IColumnMetadata { @@ -17,5 +24,8 @@ public class ColumnAttribute : Attribute, IColumnMetadata // default false public bool IsPrimaryKey { get; set; } + // default false public bool IsAutoIncrement { get; set; } + + public ColumnIndexType IndexType { get; set; } = ColumnIndexType.None; } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index 63a247b..acb05f8 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -1,4 +1,3 @@ -using System.Data; using Dapper; using Microsoft.Data.Sqlite; using Microsoft.Extensions.Options; diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 660cd4d..38daa3f 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -1,3 +1,4 @@ +using System.Text; using Dapper; using Microsoft.Data.Sqlite; @@ -78,7 +79,21 @@ public class TableInfo } } - public string GenerateCreateTableSql() + public string GenerateCreateIndexSql() + { + var sb = new StringBuilder(); + + foreach (var column in ColumnInfos) + { + if (column.IndexType == ColumnIndexType.None) continue; + + sb.Append($"CREATE {(column.IndexType == ColumnIndexType.Unique ? "UNIQUE" : "")} INDEX {TableName}_{column.SqlColumnName}_index ON {TableName} ({column.SqlColumnName});\n"); + } + + return sb.ToString(); + } + + public string GenerateCreateTableSql(bool createIndex = true) { var tableName = TableName; var columnSql = string.Join(",\n", ColumnInfos.Select(c => c.GenerateCreateTableColumnString())); @@ -89,6 +104,11 @@ CREATE TABLE {tableName}( ); "; + if (createIndex) + { + sql += GenerateCreateIndexSql(); + } + return sql; } |