protected virtual string GetFileName(DiffTable t) { string name = t.Name.ToString().Replace('.', '\\'); name = Regex.Replace(name, "[" + Regex.Escape(new string(Path.GetInvalidPathChars())) + "]", ""); return name + ".cs"; }
protected virtual string GetFileName(DiffTable t) { var mli = this.GetMListInfo(t); if (mli != null) return this.GetFileName(this.Tables.GetOrThrow(mli.BackReferenceColumn.ForeignKey.TargetTable)); string name = t.Name.ToString().Replace('.', '\\'); name = Regex.Replace(name, "[" + Regex.Escape(new string(Path.GetInvalidPathChars())) + "]", ""); return name + ".cs"; }
protected virtual string WriteToString(DiffTable table) { var toStringColumn = GetToStringColumn(table); if (toStringColumn == null) { return(null); } StringBuilder sb = new StringBuilder(); sb.AppendLine("static Expression<Func<{0}, string>> ToStringExpression = e => e.{1}{2};".FormatWith(GetEntityName(table.Name), toStringColumn.PrimaryKey ? "Id" : GetFieldName(table, toStringColumn).FirstUpper(), toStringColumn.PrimaryKey || GetFieldType(table, toStringColumn, GetRelatedEntity(table, toStringColumn)) != "string" ? " + \"\"" : "")); sb.AppendLine("[ExpressionField]"); sb.AppendLine("public override string ToString()"); sb.AppendLine("{"); sb.AppendLine(" return ToStringExpression.Evaluate(this);"); sb.AppendLine("}"); return(sb.ToString()); }
protected virtual string GetFieldType(DiffTable table, DiffColumn col, string?relatedEntity) { if (relatedEntity != null) { if (IsEnum(Tables.GetOrThrow(col.ForeignKey !.TargetTable))) { return(col.Nullable ? relatedEntity + "?" : relatedEntity); } return(IsLite(table, col) ? "Lite<" + relatedEntity + ">" : relatedEntity); } var valueType = GetValueType(col); if (col.Nullable) { return(valueType.Nullify().TypeName()); } return(valueType.TypeName()); }
protected virtual string GetPrimaryKeyAttribute(DiffTable table) { DiffColumn primaryKey = GetPrimaryKeyColumn(table); if (primaryKey == null) { return(null); } var def = CurrentSchema.Settings.DefaultPrimaryKeyAttribute; Type type = GetValueType(primaryKey); List <string> parts = new List <string>(); if (primaryKey.Name != def.Name) { parts.Add("Name = \"" + primaryKey.Name + "\""); } if (primaryKey.Identity != def.Identity) { parts.Add("Identity = " + primaryKey.Identity.ToString().ToLower()); parts.Add("IdentityBehaviour = " + primaryKey.Identity.ToString().ToLower()); } parts.AddRange(GetSqlDbTypeParts(primaryKey, type)); if (type != def.Type || parts.Any()) { parts.Insert(0, "typeof(" + type.TypeName() + ")"); } if (parts.Any()) { return("PrimaryKey(" + parts.ToString(", ") + ")"); } return(null); }
protected virtual string?GetStringLengthValidator(DiffTable table, DiffColumn col, string?relatedEntity) { if (GetValueType(col) != typeof(string)) { return(null); } var parts = new List <string>(); var min = GetMinStringLength(col); if (min != null) { parts.Add("Min = " + min); } if (col.Length != -1) { parts.Add("Max = " + col.Length); } return("StringLengthValidator(" + parts.ToString(", ") + ")"); }
protected virtual IEnumerable<string> GetFieldAttributes(DiffTable table, DiffColumn col, string relatedEntity) { List<string> attributes = new List<string>(); if (HasNotNullableAttribute(col, relatedEntity)) attributes.Add("NotNullable"); if (col.ForeignKey == null) { string sqlDbType = GetSqlTypeAttribute(table, col); if (sqlDbType != null) attributes.Add(sqlDbType); } if (GetEmbeddedField(table, col) != null || col.Name != DefaultColumnName(table, col)) attributes.Add("ColumnName(\"" + col.Name + "\")"); if (HasUniqueIndex(table, col)) attributes.Add("UniqueIndex"); return attributes; }
protected virtual MListInfo GetMListInfo(DiffTable table) { if (this.InverseGraph.RelatedTo(table).Any()) { return(null); } var parentColumn = GetMListParentColumn(table); if (parentColumn == null) { return(null); } var orderColumn = GetMListOrderColumn(table); var trivialColumn = GetMListTrivialElementColumn(table, parentColumn, orderColumn); return(new MListInfo(parentColumn) { TrivialElementColumn = trivialColumn, PreserveOrderColumn = orderColumn, }); }
protected virtual string GetEnumDescription(DiffTable table, DataRow item) { throw new NotImplementedException("Override GetEnumDescription"); }
protected virtual string WriteOperations(DiffTable table) { var kind = GetEntityKind(table); if (!(kind == EntityKind.Main || kind == EntityKind.Shared || kind == EntityKind.String)) return null; StringBuilder sb = new StringBuilder(); sb.AppendLine("[AutoInit]"); sb.AppendLine("public static class {0}".FormatWith(GetOperationName(table.Name))); sb.AppendLine("{"); sb.AppendLine(" public static readonly ExecuteSymbol<{0}> Save;".FormatWith(GetEntityName(table.Name))); sb.AppendLine("}"); return sb.ToString(); }
protected virtual DiffColumn GetMListOrderColumn(DiffTable table) { return(table.Columns.TryGetC("Order") ?? table.Columns.TryGetC("Row") ?? table.Columns.TryGetC("Index")); }
protected virtual bool IsEnum(DiffTable objectName) { return(false); }
protected virtual string GetEmbeddedField(DiffTable table, DiffColumn col) { return(null); }
protected virtual EntityData GetEntityData(DiffTable table) { return EntityData.Transactional; }
protected virtual DiffColumn GetPrimaryKeyColumn(DiffTable table) { return table.Columns.Values.SingleOrDefaultEx(a => a.PrimaryKey); }
protected virtual string GetPrimaryKeyAttribute(DiffTable table) { DiffColumn primaryKey = GetPrimaryKeyColumn(table); if (primaryKey == null) return null; var def = CurrentSchema.Settings.DefaultPrimaryKeyAttribute; Type type = GetValueType(primaryKey); List<string> parts = new List<string>(); if (primaryKey.Name != def.Name) parts.Add("Name = \"" + primaryKey.Name + "\""); if (primaryKey.Identity != def.Identity) { parts.Add("Identity = " + primaryKey.Identity.ToString().ToLower()); parts.Add("IdentityBehaviour = " + primaryKey.Identity.ToString().ToLower()); } parts.AddRange(GetSqlDbTypeParts(primaryKey, type)); if (type != def.Type || parts.Any()) parts.Insert(0, "typeof(" + type.TypeName() + ")"); if(parts.Any()) return "PrimaryKey(" + parts.ToString(", ") + ")"; return null; }
protected virtual string GetTicksColumnAttribute(DiffTable table) { return "TicksColumn(Default = \"0\")"; }
protected virtual IEnumerable<string> GetEntityAttributes(DiffTable table) { List<string> atts = new List<string> { "Serializable" }; atts.Add("EntityKind(EntityKind." + GetEntityKind(table) + ", EntityData." + GetEntityData(table) + ")"); string tableNameAttribute = GetTableNameAttribute(table.Name, null); if (tableNameAttribute != null) atts.Add(tableNameAttribute); string primaryKeyAttribute = GetPrimaryKeyAttribute(table); if (primaryKeyAttribute != null) atts.Add(primaryKeyAttribute); string ticksColumnAttribute = GetTicksColumnAttribute(table); if (ticksColumnAttribute != null) atts.Add(ticksColumnAttribute); return atts; }
protected virtual MListInfo GetMListInfo(DiffTable table) { return null; }
protected virtual string GetFieldMListName(DiffTable table, DiffTable relatedTable, MListInfo mListInfo) { ObjectName name = mListInfo.TrivialElementColumn?.ForeignKey.TargetTable ?? relatedTable.Name; return NaturalLanguageTools.Pluralize(GetEntityName(name).RemoveSuffix("Entity")).FirstLower(); }
protected virtual DiffColumn GetToStringColumn(DiffTable table) { return(table.Columns.TryGetC("Name") ?? table.Columns.Values.FirstOrDefault(a => a.PrimaryKey)); }
protected virtual EntityKind GetEntityKind(DiffTable table) { return EntityKind.Main; }
protected virtual int GetEnumId(DiffTable table, DataRow row) { throw new NotImplementedException("Override GetEnumId"); }
protected virtual string WriteField(string fileName, DiffTable table, DiffColumn col) { string relatedEntity = GetRelatedEntity(table, col); string type = GetFieldType(table, col, relatedEntity); string fieldName = GetFieldName(table, col); StringBuilder sb = new StringBuilder(); WriteAttributeTag(sb, GetFieldAttributes(table, col, relatedEntity)); WriteAttributeTag(sb, GetPropertyAttributes(table, col, relatedEntity)); sb.AppendLine("public {0} {1} { get; {2}set; }".FormatWith(type, fieldName.FirstUpper(), IsReadonly(table, col) ? "private" : null)); return sb.ToString(); }
protected virtual string GetRelatedEntity(DiffTable table, DiffColumn col) { if (col.ForeignKey == null) return null; return GetEntityName(col.ForeignKey.TargetTable); }
protected virtual bool IsReadonly(DiffTable table, DiffColumn col) { return false; }
protected virtual string GetTicksColumnAttribute(DiffTable table) { return("TicksColumn(Default = \"0\")"); }
protected virtual IEnumerable<string> GetPropertyAttributes(DiffTable table, DiffColumn col, string relatedEntity) { List<string> attributes = new List<string>(); if (HasNotNullableAttribute(col, relatedEntity) && GetValueType(col) != typeof(string)) attributes.Add("NotNullValidator"); string stringLengthValidator = GetStringLengthValidator(table, col, relatedEntity); if(stringLengthValidator != null) attributes.Add(stringLengthValidator); return attributes; }
protected virtual string GetStringLengthValidator(DiffTable table, DiffColumn col, string relatedEntity) { if (GetValueType(col) != typeof(string)) return null; var parts = new List<string>(); parts.Add("AllowNulls = " + col.Nullable.ToString().ToLower()); var min = GetMinStringLength(col); if (min != null) parts.Add("Min = " + min); if (col.Length != -1) parts.Add("Max = " + col.Length / DiffColumn.BytesPerChar(col.SqlDbType)); return "StringLengthValidator(" + parts.ToString(", ") + ")"; }
protected virtual DiffColumn GetToStringColumn(DiffTable table) { return table.Columns.TryGetC("Name") ?? table.Columns.Values.FirstOrDefault(a => a.PrimaryKey); }
protected virtual string GetFieldName(DiffTable table, DiffColumn col) { string name = col.Name.Contains(' ') ? col.Name.ToPascal(false) : col.Name; if (this.GetRelatedEntity(table, col) != null) { if (name.Length > 2 && name.EndsWith("Id", StringComparison.InvariantCultureIgnoreCase)) name = name.RemoveEnd("Id".Length); if (name.Length > 2 && name.StartsWith("Id", StringComparison.InvariantCultureIgnoreCase)) name = name.RemoveStart("Id".Length); } return name.FirstLower(); }
protected virtual bool HasUniqueIndex(DiffTable table, DiffColumn col) { return table.Indices.Values.Any(a => a.FilterDefinition == null && a.Columns.Only() == col.Name && a.IsUnique && a.Type == DiffIndexType.NonClustered); }
protected virtual string GetFieldMListName(DiffTable table, DiffTable relatedTable, MListInfo mListInfo) { return(NaturalLanguageTools.Pluralize(relatedTable.Name.Name.RemovePrefix(table.Name.Name))); }
protected virtual string DefaultColumnName(DiffTable table, DiffColumn col) { string fieldName = GetFieldName(table, col).FirstUpper(); if (col.ForeignKey == null) return fieldName; return fieldName + "ID"; }
protected virtual string WriteEntity(string fileName, DiffTable table) { var name = GetEntityName(table); StringBuilder sb = new StringBuilder(); WriteAttributeTag(sb, GetEntityAttributes(table)); sb.AppendLine("public class {0} : {1}".FormatWith(name, GetEntityBaseClass(table.Name))); sb.AppendLine("{"); string multiColumnIndexComment = WriteMultiColumnIndexComment(table, name); if (multiColumnIndexComment != null) { sb.Append(multiColumnIndexComment.Indent(4)); sb.AppendLine(); } var primaryKey = GetPrimaryKeyColumn(table); var columnGroups = (from col in table.Columns.Values where col != primaryKey group col by GetEmbeddedField(table, col) into g select g).ToList(); foreach (var col in columnGroups.SingleOrDefaultEx(g => g.Key == null).EmptyIfNull()) { string field = WriteField(fileName, table, col); if (field != null) { sb.Append(field.Indent(4)); sb.AppendLine(); } } foreach (var gr in columnGroups.Where(g => g.Key != null)) { string embeddedField = WriteEmbeddedField(table, gr.Key); if (embeddedField != null) { sb.AppendLine(embeddedField.Indent(4)); sb.AppendLine(); } } foreach (KeyValuePair <DiffTable, MListInfo> kvp in GetMListFields(table)) { string field = WriteFieldMList(fileName, table, kvp.Value, kvp.Key); if (field != null) { sb.AppendLine(field.Indent(4)); sb.AppendLine(); } } string toString = WriteToString(table); if (toString != null) { sb.Append(toString.Indent(4)); sb.AppendLine(); } sb.AppendLine("}"); sb.AppendLine(); foreach (var gr in columnGroups.Where(g => g.Key != null)) { string embeddedEntity = WriteEmbeddedEntity(fileName, table, GetEmbeddedTypeName(gr.Key), gr.ToList()); if (embeddedEntity != null) { sb.AppendLine(embeddedEntity); sb.AppendLine(); } } string operations = WriteOperations(table); if (operations != null) { sb.Append(operations); } return(sb.ToString()); }
protected virtual string GetSqlTypeAttribute(DiffTable table, DiffColumn col) { Type type = GetValueType(col); List<string> parts = GetSqlDbTypeParts(col, type); if (parts.Any()) return "SqlDbType(" + parts.ToString(", ") + ")"; return null; }
protected virtual IEnumerable <KeyValuePair <DiffTable, MListInfo> > GetMListFields(DiffTable table) { return(from relatedTable in InverseGraph.RelatedTo(table) let mListInfo2 = GetMListInfo(relatedTable) where mListInfo2 != null && mListInfo2.BackReferenceColumn.ForeignKey.TargetTable.Equals(table.Name) select KVP.Create(relatedTable, mListInfo2)); }
protected virtual string GetFieldType(DiffTable table, DiffColumn col, string relatedEntity) { if (relatedEntity != null) { if (IsEnum(col.ForeignKey.TargetTable)) return col.Nullable ? relatedEntity + "?" : relatedEntity; return IsLite(table, col) ? "Lite<" + relatedEntity + ">" : relatedEntity; } var valueType = GetValueType(col); if (col.Nullable) return valueType.Nullify().TypeName(); return valueType.TypeName(); }
protected virtual bool IsLite(DiffTable table, DiffColumn col) { return true; }
protected virtual string GetOperationName(DiffTable objectName) { return(GetEntityName(objectName).RemoveSuffix("Entity") + "Operation"); }
protected virtual string WriteEmbeddedField(DiffTable table, string fieldName) { StringBuilder sb = new StringBuilder(); fieldName = fieldName.FirstLower(); string propertyName = fieldName.FirstUpper(); string typeName = GetEmbeddedTypeName(fieldName); sb.AppendLine("[NotNullable]"); sb.AppendLine("[NotNullValidator]"); sb.AppendLine("public {0} {1} { get; set; }".FormatWith(typeName, fieldName.FirstUpper())); return sb.ToString(); }
protected virtual DiffColumn GetMListTrivialElementColumn(DiffTable table, DiffColumn parentColumn, DiffColumn orderColumn) { return(table.Columns.Values.Where(c => c != parentColumn && c != orderColumn && !c.PrimaryKey).Only()); }
protected virtual DiffColumn GetPrimaryKeyColumn(DiffTable table) { return(table.Columns.Values.SingleOrDefaultEx(a => a.PrimaryKey)); }
protected virtual DiffColumn GetMListParentColumn(DiffTable table) { return(table.Columns.Values.Where(c => c.ForeignKey != null && c.Nullable == false && table.Name.Name.StartsWith(c.ForeignKey.TargetTable.Name)).OrderByDescending(a => a.ForeignKey.TargetTable.Name.Length).FirstOrDefault()); }
protected virtual EntityKind GetEntityKind(DiffTable table) { return(EntityKind.Main); }
protected virtual string WriteFieldMList(string fileName, DiffTable table, MListInfo mListInfo, DiffTable relatedTable) { string type; List<string> fieldAttributes; if(mListInfo.TrivialElementColumn == null ) { type = GetEntityName(relatedTable.Name); fieldAttributes = new List<string> { "NotNullable" }; } else { string relatedEntity = GetRelatedEntity(relatedTable, mListInfo.TrivialElementColumn); type = GetFieldType(relatedTable, mListInfo.TrivialElementColumn, relatedEntity); fieldAttributes = GetFieldAttributes(relatedTable, mListInfo.TrivialElementColumn, relatedEntity).ToList(); } var preserveOrder = GetPreserveOrderAttribute(mListInfo); if (preserveOrder != null) fieldAttributes.Add(preserveOrder); string primaryKey = GetPrimaryKeyAttribute(relatedTable); if (primaryKey != null) fieldAttributes.Add(primaryKey); string tableName = GetTableNameAttribute(relatedTable.Name, mListInfo); if (tableName != null) fieldAttributes.Add(tableName); string backColumn = GetBackColumnNameAttribute(mListInfo.BackReferenceColumn); if (backColumn != null) fieldAttributes.AddRange(backColumn); StringBuilder sb = new StringBuilder(); string fieldName = GetFieldMListName(table, relatedTable, mListInfo); WriteAttributeTag(sb, fieldAttributes); sb.AppendLine("[NotNullValidator, NoRepeatValidator]"); sb.AppendLine("public MList<{0}> {1} { get; set; } = new MList<{0}>();".FormatWith(type, fieldName.FirstUpper())); return sb.ToString(); }
protected virtual string WriteMultiColumnIndexComment(DiffTable table, string name, IEnumerable<DiffColumn> columns) { var columnNames = columns.Select(c=>c.Name).ToHashSet(); StringBuilder sb = new StringBuilder(); foreach (var ix in table.Indices.Values.Where(a => a.Columns.Count > 1 || a.FilterDefinition.HasText()) .Where(ix => ix.Columns.Intersect(columnNames).Any())) { sb.AppendLine("//Add to Logic class"); sb.AppendLine("//sb.AddUniqueIndex<{0}>(e => new {{ {1} }}{2});".FormatWith(name, ix.Columns.ToString(c => "e." + GetFieldName(table, table.Columns.GetOrThrow(c)).FirstUpper(), ", "), ix.FilterDefinition == null ? null : ", " + ix.FilterDefinition)); } return sb.ToString().DefaultText(null); }
protected virtual EntityData GetEntityData(DiffTable table) { return(EntityData.Transactional); }
protected virtual bool NotNullAttributeNecessary(DiffTable table, DiffColumn col, bool isMList) { return(false); //NotNullValidator is enought }
protected virtual bool IsReadonly(DiffTable table, DiffColumn col) { return(false); }
protected virtual bool IsLite(DiffTable table, DiffColumn col) { return(true); }
protected virtual bool RequiresColumnName(DiffTable table, DiffColumn col) { return(GetEmbeddedField(table, col) != null || col.Name != DefaultColumnName(table, col)); }
protected virtual string WriteFieldMList(string fileName, DiffTable table, MListInfo mListInfo, DiffTable relatedTable) { string type; List <string> fieldAttributes; if (mListInfo.TrivialElementColumn == null) { type = GetEntityName(relatedTable); fieldAttributes = new List <string> { "NotNullable" }; } else { string relatedEntity = GetRelatedEntity(relatedTable, mListInfo.TrivialElementColumn); type = GetFieldType(relatedTable, mListInfo.TrivialElementColumn, relatedEntity); fieldAttributes = GetFieldAttributes(relatedTable, mListInfo.TrivialElementColumn, relatedEntity, isMList: true).ToList(); } var preserveOrder = GetPreserveOrderAttribute(mListInfo); if (preserveOrder != null) { fieldAttributes.Add(preserveOrder); } string primaryKey = GetPrimaryKeyAttribute(relatedTable); if (primaryKey != null) { fieldAttributes.Add(primaryKey); } string tableName = GetTableNameAttribute(relatedTable.Name, mListInfo); if (tableName != null) { fieldAttributes.Add(tableName); } string backColumn = GetBackColumnNameAttribute(mListInfo.BackReferenceColumn); if (backColumn != null) { fieldAttributes.AddRange(backColumn); } StringBuilder sb = new StringBuilder(); string fieldName = GetFieldMListName(table, relatedTable, mListInfo); WriteAttributeTag(sb, fieldAttributes); sb.AppendLine("[NotNullValidator, NoRepeatValidator]"); sb.AppendLine("public MList<{0}> {1} {{ get; set; }} = new MList<{0}>();".FormatWith(type, fieldName.FirstUpper())); return(sb.ToString()); }
protected virtual string WriteToString(DiffTable table) { var toStringColumn = GetToStringColumn(table); if (toStringColumn == null) return null; StringBuilder sb = new StringBuilder(); sb.AppendLine("static Expression<Func<{0}, string>> ToStringExpression = e => e.{1}{2};".FormatWith(GetEntityName(table.Name), toStringColumn.PrimaryKey ? "Id" : GetFieldName(table, toStringColumn).FirstUpper(), toStringColumn.PrimaryKey || GetFieldType(table, toStringColumn, GetRelatedEntity(table, toStringColumn)) != "string" ? "?.ToString()" : "")); sb.AppendLine("[ExpressionField]"); sb.AppendLine("public override string ToString()"); sb.AppendLine("{"); sb.AppendLine(" return ToStringExpression.Evaluate(this);"); sb.AppendLine("}"); return sb.ToString(); }