-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
FKs is not fully functional. Blocked by #15
- Loading branch information
Showing
5 changed files
with
89 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace DbSeeder.Schema; | ||
|
||
public record ForeignKey( | ||
Table Table, | ||
Column Column, | ||
Table RefTable, | ||
Column RefColumn); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
namespace DbSeeder.Schema; | ||
|
||
public record PrimaryKey( | ||
Table Table, | ||
Column Column); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,74 @@ | ||
namespace DbSeeder.Schema; | ||
|
||
public class Table(string name) | ||
public class Table(string name, SqlSchema schema) | ||
{ | ||
private readonly List<Column> _columns = []; | ||
private readonly List<ForeignKey> _foreignKeys = []; | ||
|
||
// There are some rules how to deal if PK is not defined | ||
// ex: find the first attribute with NOT NULL & UNIQUE constraints | ||
public PrimaryKey? PrimaryKey { get; private set; } | ||
public string Name { get; } = name; | ||
public List<Column> Columns { get; } = []; | ||
public IReadOnlyList<Column> Columns => _columns; | ||
public IReadOnlyList<ForeignKey> ForeignKeys => _foreignKeys; | ||
|
||
public void AddColumns(IEnumerable<Column> columns) | ||
{ | ||
foreach (var column in columns) | ||
{ | ||
AddColumn(column); | ||
} | ||
} | ||
|
||
private void AddColumn(Column column) | ||
{ | ||
ArgumentNullException.ThrowIfNull(column); | ||
_columns.Add(column); | ||
|
||
if (column.IsPrimaryKey) | ||
{ | ||
SetTablePrimaryKey(column); | ||
} | ||
else if (column.IsForeignKey) | ||
{ | ||
SetTableForeignKey(column); | ||
} | ||
} | ||
|
||
private void SetTablePrimaryKey(Column column) | ||
{ | ||
if (PrimaryKey != null) | ||
{ | ||
throw new ArgumentException("Table can not contains more that one PRIMARY KEY"); | ||
} | ||
|
||
PrimaryKey = new PrimaryKey(this, column); | ||
} | ||
|
||
private void SetTableForeignKey(Column column) | ||
{ | ||
ArgumentNullException.ThrowIfNull(column.ForeignKeyRef); | ||
|
||
var refTable = schema.GetTableByName(column.ForeignKeyRef.TableName); | ||
if (refTable is null) | ||
{ | ||
throw new InvalidOperationException($"Referenced table {column.ForeignKeyRef.TableName} is not exists " + | ||
$"in current schema. Validate the order of the create statements, " + | ||
$"it's matter"); | ||
} | ||
|
||
var refColumn = refTable.GetColumnByName(column.ForeignKeyRef.ColumnName); | ||
if (refColumn is null) | ||
{ | ||
throw new InvalidOperationException($"Referenced table {column.ForeignKeyRef.TableName} is not exists " + | ||
$"in current schema. Validate the order of the create statements, " + | ||
$"it's matter"); | ||
} | ||
|
||
var fk = new ForeignKey(this, column, refTable, refColumn); | ||
_foreignKeys.Add(fk); | ||
} | ||
|
||
private Column? GetColumnByName(string columnName) | ||
=> Columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.Ordinal)); | ||
} |