Skip to content

Commit

Permalink
bigger better primary key
Browse files Browse the repository at this point in the history
  • Loading branch information
marklauter committed Jun 15, 2024
1 parent 6a16c0a commit 1182ad0
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 29 deletions.
34 changes: 28 additions & 6 deletions Squeal.Tests/CreateTableParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,12 @@ public void ColumnsTest(string ddl)
}

[Theory]
[InlineData("primary key", "", ColumnConstraints.PrimaryKeyAsc)]
[InlineData("CONSTRAINT cname primary key", "cname", ColumnConstraints.PrimaryKeyAsc)]
[InlineData("primary key asc", "", ColumnConstraints.PrimaryKeyAsc)]
[InlineData("CONSTRAINT cname primary key asc", "cname", ColumnConstraints.PrimaryKeyAsc)]
[InlineData("primary key desc", "", ColumnConstraints.PrimaryKeyDesc)]
[InlineData("CONSTRAINT cname primary key desc", "cname", ColumnConstraints.PrimaryKeyDesc)]
//[InlineData("primary key", "", ColumnConstraints.PrimaryKeyAsc)]
//[InlineData("CONSTRAINT cname primary key", "cname", ColumnConstraints.PrimaryKeyAsc)]
//[InlineData("primary key asc", "", ColumnConstraints.PrimaryKeyAsc)]
//[InlineData("CONSTRAINT cname primary key asc", "cname", ColumnConstraints.PrimaryKeyAsc)]
//[InlineData("primary key desc", "", ColumnConstraints.PrimaryKeyDesc)]
//[InlineData("CONSTRAINT cname primary key desc", "cname", ColumnConstraints.PrimaryKeyDesc)]
[InlineData("not null", "", ColumnConstraints.NotNull)]
[InlineData("CONSTRAINT cname not null", "cname", ColumnConstraints.NotNull)]
[InlineData("unique", "", ColumnConstraints.Unique)]
Expand All @@ -179,4 +179,26 @@ public void ColumnConstraintKindTest(string ddl, string expectedName, ColumnCons
Assert.Equal(expectedName, constraint.Name);
Assert.Equal(expectedType, constraint.Type);
}

[Theory]
[InlineData("primary key", Order.Asc, ConflictResolutions.Undefined, false)]
[InlineData("primary key asc", Order.Asc, ConflictResolutions.Undefined, false)]
[InlineData("primary key desc", Order.Desc, ConflictResolutions.Undefined, false)]
[InlineData("primary key AUTOINCREMENT", Order.Asc, ConflictResolutions.Undefined, true)]
[InlineData("primary key asc AUTOINCREMENT", Order.Asc, ConflictResolutions.Undefined, true)]
[InlineData("primary key desc AUTOINCREMENT", Order.Desc, ConflictResolutions.Undefined, true)]
public void PrimaryKeyTest(
string ddl,
Order expectedOrder,
ConflictResolutions expectedResolution,
bool expectedAutoInc)
{
var tokens = Sql.Tokenizer.Tokenize(ddl);
var result = Ddl.PrimaryKey.TryParse(tokens);
Assert.True(result.HasValue, result.ToString());
var primaryKey = result.Value;
Assert.Equal(expectedOrder, primaryKey.Order);
Assert.Equal(expectedResolution, primaryKey.Resolution);
Assert.Equal(expectedAutoInc, primaryKey.AutoIncrement);
}
}
2 changes: 0 additions & 2 deletions Squeal/CreateStatement/ColumnConstraints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
public enum ColumnConstraints
{
Undefined,
PrimaryKeyAsc,
PrimaryKeyDesc,
NotNull,
Unique,
Check,
Expand Down
7 changes: 7 additions & 0 deletions Squeal/CreateStatement/Order.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Squeal.CreateStatement;

public enum Order
{
Asc,
Desc
}
3 changes: 3 additions & 0 deletions Squeal/CreateStatement/PrimaryKey.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Squeal.CreateStatement;

public sealed record PrimaryKey(Order Order, ConflictResolutions Resolution, bool AutoIncrement);
48 changes: 27 additions & 21 deletions Squeal/Ddl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,32 @@ public static class Ddl
Token.EqualTo(SqlToken.Generated)
.IgnoreThen(Token.EqualTo(SqlToken.Always).Value(ColumnConstraints.Generated));

internal static readonly TokenListParser<SqlToken, ColumnConstraints> PrimaryKey =
internal static readonly TokenListParser<SqlToken, bool> Autoincrement =
Token.EqualTo(SqlToken.Autoincrement).Value(true).OptionalOrDefault(false);

internal static readonly TokenListParser<SqlToken, ConflictResolutions> ConcflictClause =
Token.EqualTo(SqlToken.On)
.IgnoreThen(Token.EqualTo(SqlToken.Conflict))
.IgnoreThen(
Token.EqualTo(SqlToken.Rollback).Value(ConflictResolutions.Rollback)
.Or(Token.EqualTo(SqlToken.Abort).Value(ConflictResolutions.Abort))
.Or(Token.EqualTo(SqlToken.Fail).Value(ConflictResolutions.Fail))
.Or(Token.EqualTo(SqlToken.Ignore).Value(ConflictResolutions.Ignore))
.Or(Token.EqualTo(SqlToken.Replace).Value(ConflictResolutions.Replace)))
.OptionalOrDefault(ConflictResolutions.Undefined);

internal static readonly TokenListParser<SqlToken, PrimaryKey> PrimaryKey =
Token.EqualTo(SqlToken.Primary)
.IgnoreThen(Token.EqualTo(SqlToken.Key))
.IgnoreThen(
Token.EqualTo(SqlToken.Asc).Value(ColumnConstraints.PrimaryKeyAsc)
.Or(Token.EqualTo(SqlToken.Desc).Value(ColumnConstraints.PrimaryKeyDesc))
.OptionalOrDefault(ColumnConstraints.PrimaryKeyAsc));
.IgnoreThen(Token.EqualTo(SqlToken.Asc).Value(Order.Asc)
.Or(Token.EqualTo(SqlToken.Desc).Value(Order.Desc))
.OptionalOrDefault(Order.Asc))
.Then(order => ConcflictClause
.Then(resolution => Autoincrement
.Select(autoIncrement => new PrimaryKey(
order,
resolution,
autoIncrement))));

internal static readonly TokenListParser<SqlToken, ColumnConstraints> Unique =
Token.EqualTo(SqlToken.Unique).Value(ColumnConstraints.Unique);
Expand All @@ -103,8 +122,9 @@ public static class Ddl
// todo: need to add foreign key constraint
internal static readonly TokenListParser<SqlToken, ColumnConstraintKind> ConstraintKind =
ColumnConstraintName.Then(constraintName =>
PrimaryKey
.Or(NotNull)
//PrimaryKey
//.Or(NotNull)
NotNull
.Or(Unique)
.Or(Check)
.Or(Default)
Expand All @@ -114,20 +134,6 @@ public static class Ddl
.Select(type => new ColumnConstraintKind(constraintName, type)))
.OptionalOrDefault(ColumnConstraintKind.Default);

internal static readonly TokenListParser<SqlToken, bool> Autoincrement =
Token.EqualTo(SqlToken.Autoincrement).Value(true).OptionalOrDefault(false);

internal static readonly TokenListParser<SqlToken, ConflictResolutions> ConcflictClause =
Token.EqualTo(SqlToken.On)
.IgnoreThen(Token.EqualTo(SqlToken.Conflict))
.IgnoreThen(
Token.EqualTo(SqlToken.Rollback).Value(ConflictResolutions.Rollback)
.Or(Token.EqualTo(SqlToken.Abort).Value(ConflictResolutions.Abort))
.Or(Token.EqualTo(SqlToken.Fail).Value(ConflictResolutions.Fail))
.Or(Token.EqualTo(SqlToken.Ignore).Value(ConflictResolutions.Ignore))
.Or(Token.EqualTo(SqlToken.Replace).Value(ConflictResolutions.Replace)))
.OptionalOrDefault(ConflictResolutions.Undefined);

internal static readonly TokenListParser<SqlToken, ColumnDef> Column =
Identifier.Apply(AsString)
.Then(name => TypeName
Expand Down

0 comments on commit 1182ad0

Please sign in to comment.