-
Notifications
You must be signed in to change notification settings - Fork 520
Expand file tree
/
Copy pathMySqlDialect.cs
More file actions
131 lines (107 loc) · 3.64 KB
/
MySqlDialect.cs
File metadata and controls
131 lines (107 loc) · 3.64 KB
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
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.EntityFrameworkCore;
using MySqlConnector;
using Squidex.Infrastructure.Queries;
namespace Squidex.Providers.MySql;
public sealed class MySqlDialect : SqlDialect
{
public static readonly SqlDialect Instance = new MySqlDialect();
private MySqlDialect()
{
}
public override Task InitializeAsync(DbContext dbContext,
CancellationToken ct)
{
return JsonFunction.InitializeAsync(dbContext, ct);
}
public override bool IsDuplicateIndexException(Exception exception, string name)
{
return exception is MySqlException ex && ex.Number == 1061;
}
public override string? JsonColumnType()
{
return "json";
}
public override string GeoIndex(string name, string table, string field)
{
return $"CREATE SPATIAL INDEX {name} ON {FormatTable(table)} ({FormatField(field, false)});";
}
public override string TextIndex(string name, string table, string field)
{
return $"CREATE FULLTEXT INDEX {name} ON {FormatTable(table)} ({FormatField(field, false)});";
}
public override string FormatLimitOffset(long limit, long offset, bool hasOrder)
{
var hasLimit = limit > 0 && limit < long.MaxValue;
if (offset > 0)
{
return $"LIMIT {limit} OFFSET {offset}";
}
if (offset > 0)
{
return $"LIMIT 18446744073709551615 OFFSET {offset}";
}
if (hasLimit)
{
return $"LIMIT {limit}";
}
return string.Empty;
}
protected override string FormatTable(string tableName)
{
return $"`{tableName}`";
}
protected override object FormatRawValue(object value, CompareOperator op)
{
switch (value)
{
case true:
return 1;
case false:
return 0;
default:
return base.FormatRawValue(value, op);
}
}
public override string OrderBy(PropertyPath path, SortOrder order, bool isJson)
{
if (isJson)
{
var sqlOrder = FormatOrder(order);
var sqlPath = path.JsonPath();
return $"""
IF (JSON_TYPE(JSON_EXTRACT({sqlPath})) IN ('INTEGER', 'DOUBLE', 'DECIMAL'),
CAST(JSON_VALUE({sqlPath}) AS DOUBLE),
NULL
) {sqlOrder},
JSON_VALUE({sqlPath}) {sqlOrder}
""";
}
return base.OrderBy(path, order, isJson);
}
public override string WhereMatch(PropertyPath path, string query, SqlParams queryParameters)
{
return $"MATCH({FormatField(path, false)}) AGAINST({queryParameters.AddPositional(query)})";
}
public override string Where(PropertyPath path, CompareOperator op, ClrValue value, SqlParams queryParameters, bool isJson)
{
if (isJson)
{
return JsonFunction.Create(path, op, value, FormatValues(op, value, queryParameters, true));
}
return base.Where(path, op, value, queryParameters, isJson);
}
protected override string FormatField(PropertyPath path, bool isJson)
{
if (isJson && path.Count > 1)
{
return $"JSON_VALUE({path.JsonPath()})";
}
return $"`{path[0]}`";
}
}