-
Notifications
You must be signed in to change notification settings - Fork 649
/
SqlServer2008Generator.cs
136 lines (115 loc) · 4.7 KB
/
SqlServer2008Generator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#region License
//
// Copyright (c) 2010, Nathan Brown
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#endregion
using System.Collections.Generic;
using System.Linq;
using FluentMigrator.Expressions;
using FluentMigrator.Infrastructure;
using FluentMigrator.Infrastructure.Extensions;
using FluentMigrator.Model;
using FluentMigrator.SqlServer;
using JetBrains.Annotations;
using Microsoft.Extensions.Options;
namespace FluentMigrator.Runner.Generators.SqlServer
{
public class SqlServer2008Generator : SqlServer2005Generator
{
private static readonly HashSet<string> _supportedAdditionalFeatures = new HashSet<string>
{
SqlServerExtensions.IndexColumnNullsDistinct,
};
public SqlServer2008Generator()
: this(new SqlServer2008Quoter())
{
}
public SqlServer2008Generator(
[NotNull] SqlServer2008Quoter quoter)
: this(quoter, new OptionsWrapper<GeneratorOptions>(new GeneratorOptions()))
{
}
public SqlServer2008Generator(
[NotNull] SqlServer2008Quoter quoter,
[NotNull] IOptions<GeneratorOptions> generatorOptions)
: this(
new SqlServer2008Column(new SqlServer2008TypeMap(), quoter),
quoter,
new SqlServer2005DescriptionGenerator(),
generatorOptions)
{
}
protected SqlServer2008Generator(
[NotNull] IColumn column,
[NotNull] IQuoter quoter,
[NotNull] IDescriptionGenerator descriptionGenerator,
[NotNull] IOptions<GeneratorOptions> generatorOptions)
: base(column, quoter, descriptionGenerator, generatorOptions)
{
}
public override bool IsAdditionalFeatureSupported(string feature)
{
return _supportedAdditionalFeatures.Contains(feature)
|| base.IsAdditionalFeatureSupported(feature);
}
public virtual string GetWithNullsDistinctString(IndexDefinition index)
{
bool? GetNullsDistinct(IndexColumnDefinition column)
{
return column.GetAdditionalFeature(SqlServerExtensions.IndexColumnNullsDistinct, (bool?)null);
}
var indexNullsDistinct = index.GetAdditionalFeature(SqlServerExtensions.IndexColumnNullsDistinct, (bool?)null);
var nullDistinctColumns = index.Columns.Where(c => indexNullsDistinct != null || GetNullsDistinct(c) != null).ToList();
if (nullDistinctColumns.Count != 0 && !index.IsUnique)
{
// Should never occur
CompatibilityMode.HandleCompatibilty("With nulls distinct can only be used for unique indexes");
return string.Empty;
}
// The "Nulls (not) distinct" value of the column
// takes higher precedence than the value of the index
// itself.
var conditions = nullDistinctColumns
.Where(x => (GetNullsDistinct(x) ?? indexNullsDistinct ?? true) == false)
.Select(c => $"{Quoter.QuoteColumnName(c.Name)} IS NOT NULL");
var condition = string.Join(" AND ", conditions);
if (condition.Length == 0)
return string.Empty;
return $" WHERE {condition}";
}
public override string Generate(CreateIndexExpression expression)
{
var sql = base.Generate(expression);
sql += GetWithNullsDistinctString(expression.Index);
return sql;
}
/// <inheritdoc />
public override string GetWithOptions(ISupportAdditionalFeatures expression)
{
var items = new List<string>();
var options = base.GetWithOptions(expression);
if (!string.IsNullOrEmpty(options))
{
items.Add(options);
}
var dataCompressionType = expression.GetAdditionalFeature(SqlServerExtensions.DataCompression, (DataCompressionType)null);
if (dataCompressionType != null)
{
items.Add($"DATA_COMPRESSION = {dataCompressionType}");
}
return string.Join(", ", items);
}
}
}