Skip to content

Commit 47eab77

Browse files
committed
SqlExtract changes
- Dedicated SqlXxxParts for time and date - SqlExtract node stores the widest enum - SqlDateTimeOffsetPart, other enums share the same values of parts so it is fast-convertible from storable enum and to it, to track actual types of argument (date, time, datetime, datetimeoffset, interval) there is a marker, added some calculated properties which could improve code on translation - SqlDml has overloads with SqlTimePart/SqlDatePart, which is more reliable and error-proof than using SqlDateTimePart, SqlDateTimePart can't even be validated to prevent bad sql
1 parent 197ce00 commit 47eab77

9 files changed

Lines changed: 588 additions & 73 deletions

File tree

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
// Copyright (C) 2023 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Reflection;
9+
using NUnit.Framework;
10+
using Xtensive.Sql.Dml;
11+
12+
namespace Xtensive.Orm.Sql.Tests
13+
{
14+
[TestFixture]
15+
public class SqlDateTimePartsTest
16+
{
17+
// Year = 0,
18+
// Month = 1,
19+
// Day = 2,
20+
// Hour = 3,
21+
// Minute = 4,
22+
// Second = 5,
23+
// Millisecond = 6,
24+
// Nanosecond = 7,
25+
// TimeZoneHour = 8,
26+
// TimeZoneMinute = 9,
27+
// DayOfYear = 10,
28+
// DayOfWeek = 11,
29+
// Date = 12,
30+
// DateTime = 13,
31+
// LocalDateTime = 14,
32+
// UtcDateTime = 15,
33+
// Offset = 16,
34+
// Nothing = 25,
35+
36+
[Test]
37+
public void MainTest()
38+
{
39+
var validNames = new HashSet<string>() {
40+
"Year", "Month", "Day", "Hour",
41+
"Minute", "Second", "Millisecond", "Nanosecond",
42+
"TimeZoneHour", "TimeZoneMinute",
43+
"DayOfYear", "DayOfWeek",
44+
"Date", "DateTime",
45+
"LocalDateTime","UtcDateTime", "Offset",
46+
"Nothing",
47+
};
48+
49+
var enums = typeof(SqlDateTimeOffsetPart).Assembly.GetTypes()
50+
.Where(t => t.Namespace == "Xtensive.Sql.Dml" && t.IsEnum && (t.Name.StartsWith("Sql") && t.Name.EndsWith("Part")))
51+
.ToList();
52+
foreach (var @enum in enums) {
53+
foreach(var name in Enum.GetNames(@enum)) {
54+
Assert.That(validNames.Contains(name), $"Does the enum {@enum.Name} have new item?");
55+
}
56+
}
57+
}
58+
59+
[Test]
60+
public void DateTimeOffsetPartsValueTest()
61+
{
62+
Assert.That((int) SqlDateTimeOffsetPart.Year, Is.EqualTo(0));
63+
Assert.That((int) SqlDateTimeOffsetPart.Month, Is.EqualTo(1));
64+
Assert.That((int) SqlDateTimeOffsetPart.Day, Is.EqualTo(2));
65+
Assert.That((int) SqlDateTimeOffsetPart.Hour, Is.EqualTo(3));
66+
Assert.That((int) SqlDateTimeOffsetPart.Minute, Is.EqualTo(4));
67+
Assert.That((int) SqlDateTimeOffsetPart.Second, Is.EqualTo(5));
68+
Assert.That((int) SqlDateTimeOffsetPart.Millisecond, Is.EqualTo(6));
69+
Assert.That((int) SqlDateTimeOffsetPart.Nanosecond, Is.EqualTo(7));
70+
Assert.That((int) SqlDateTimeOffsetPart.TimeZoneHour, Is.EqualTo(8));
71+
Assert.That((int) SqlDateTimeOffsetPart.TimeZoneMinute, Is.EqualTo(9));
72+
Assert.That((int) SqlDateTimeOffsetPart.DayOfYear, Is.EqualTo(10));
73+
Assert.That((int) SqlDateTimeOffsetPart.DayOfWeek, Is.EqualTo(11));
74+
Assert.That((int) SqlDateTimeOffsetPart.Date, Is.EqualTo(12));
75+
Assert.That((int) SqlDateTimeOffsetPart.DateTime, Is.EqualTo(13));
76+
Assert.That((int) SqlDateTimeOffsetPart.LocalDateTime, Is.EqualTo(14));
77+
Assert.That((int) SqlDateTimeOffsetPart.UtcDateTime, Is.EqualTo(15));
78+
Assert.That((int) SqlDateTimeOffsetPart.Offset, Is.EqualTo(16));
79+
Assert.That((int) SqlDateTimeOffsetPart.Nothing, Is.EqualTo(25));
80+
}
81+
82+
[Test]
83+
public void DateTimePartsValueTest()
84+
{
85+
Assert.That((int) SqlDateTimePart.Year, Is.EqualTo(0));
86+
Assert.That((int) SqlDateTimePart.Month, Is.EqualTo(1));
87+
Assert.That((int) SqlDateTimePart.Day, Is.EqualTo(2));
88+
Assert.That((int) SqlDateTimePart.Hour, Is.EqualTo(3));
89+
Assert.That((int) SqlDateTimePart.Minute, Is.EqualTo(4));
90+
Assert.That((int) SqlDateTimePart.Second, Is.EqualTo(5));
91+
Assert.That((int) SqlDateTimePart.Millisecond, Is.EqualTo(6));
92+
Assert.That((int) SqlDateTimePart.Nanosecond, Is.EqualTo(7));
93+
Assert.That((int) SqlDateTimePart.TimeZoneHour, Is.EqualTo(8));
94+
Assert.That((int) SqlDateTimePart.TimeZoneMinute, Is.EqualTo(9));
95+
Assert.That((int) SqlDateTimePart.DayOfYear, Is.EqualTo(10));
96+
Assert.That((int) SqlDateTimePart.DayOfWeek, Is.EqualTo(11));
97+
Assert.That((int) SqlDateTimePart.Nothing, Is.EqualTo(25));
98+
}
99+
100+
#if NET6_0_OR_GREATER
101+
[Test]
102+
public void DatePartsValueTest()
103+
{
104+
Assert.That((int) SqlDatePart.Year, Is.EqualTo(0));
105+
Assert.That((int) SqlDatePart.Month, Is.EqualTo(1));
106+
Assert.That((int) SqlDatePart.Day, Is.EqualTo(2));
107+
Assert.That((int) SqlDatePart.DayOfYear, Is.EqualTo(10));
108+
Assert.That((int) SqlDatePart.DayOfWeek, Is.EqualTo(11));
109+
Assert.That((int) SqlDatePart.Nothing, Is.EqualTo(25));
110+
}
111+
112+
[Test]
113+
public void TimePartsValueTest()
114+
{
115+
Assert.That((int) SqlTimePart.Hour, Is.EqualTo(3));
116+
Assert.That((int) SqlTimePart.Minute, Is.EqualTo(4));
117+
Assert.That((int) SqlTimePart.Second, Is.EqualTo(5));
118+
Assert.That((int) SqlTimePart.Millisecond, Is.EqualTo(6));
119+
Assert.That((int) SqlTimePart.Nanosecond, Is.EqualTo(7));
120+
Assert.That((int) SqlTimePart.Nothing, Is.EqualTo(25));
121+
}
122+
#endif
123+
124+
[Test]
125+
public void IntervalPartsValueTest()
126+
{
127+
Assert.That((int) SqlIntervalPart.Day, Is.EqualTo(2));
128+
Assert.That((int) SqlIntervalPart.Hour, Is.EqualTo(3));
129+
Assert.That((int) SqlIntervalPart.Minute, Is.EqualTo(4));
130+
Assert.That((int) SqlIntervalPart.Second, Is.EqualTo(5));
131+
Assert.That((int) SqlIntervalPart.Millisecond, Is.EqualTo(6));
132+
Assert.That((int) SqlIntervalPart.Nanosecond, Is.EqualTo(7));
133+
134+
Assert.That((int) SqlIntervalPart.Nothing, Is.EqualTo(25));
135+
}
136+
137+
[Test]
138+
public void DateTimePartConversionTest()
139+
{
140+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Year, Is.EqualTo(SqlDateTimePart.Year));
141+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Month, Is.EqualTo(SqlDateTimePart.Month));
142+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Day, Is.EqualTo(SqlDateTimePart.Day));
143+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Hour, Is.EqualTo(SqlDateTimePart.Hour));
144+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Minute, Is.EqualTo(SqlDateTimePart.Minute));
145+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Second, Is.EqualTo(SqlDateTimePart.Second));
146+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Millisecond, Is.EqualTo(SqlDateTimePart.Millisecond));
147+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Nanosecond, Is.EqualTo(SqlDateTimePart.Nanosecond));
148+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.TimeZoneHour, Is.EqualTo(SqlDateTimePart.TimeZoneHour));
149+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.TimeZoneMinute, Is.EqualTo(SqlDateTimePart.TimeZoneMinute));
150+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.DayOfYear, Is.EqualTo(SqlDateTimePart.DayOfYear));
151+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.DayOfWeek, Is.EqualTo(SqlDateTimePart.DayOfWeek));
152+
Assert.That((SqlDateTimePart) (int) SqlDateTimeOffsetPart.Nothing, Is.EqualTo(SqlDateTimePart.Nothing));
153+
154+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Year, Is.EqualTo(SqlDateTimeOffsetPart.Year));
155+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Month, Is.EqualTo(SqlDateTimeOffsetPart.Month));
156+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Day, Is.EqualTo(SqlDateTimeOffsetPart.Day));
157+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Hour, Is.EqualTo(SqlDateTimeOffsetPart.Hour));
158+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Minute, Is.EqualTo(SqlDateTimeOffsetPart.Minute));
159+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Second, Is.EqualTo(SqlDateTimeOffsetPart.Second));
160+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Millisecond, Is.EqualTo(SqlDateTimeOffsetPart.Millisecond));
161+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Nanosecond, Is.EqualTo(SqlDateTimeOffsetPart.Nanosecond));
162+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.TimeZoneHour, Is.EqualTo(SqlDateTimeOffsetPart.TimeZoneHour));
163+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.TimeZoneMinute, Is.EqualTo(SqlDateTimeOffsetPart.TimeZoneMinute));
164+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.DayOfYear, Is.EqualTo(SqlDateTimeOffsetPart.DayOfYear));
165+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.DayOfWeek, Is.EqualTo(SqlDateTimeOffsetPart.DayOfWeek));
166+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDateTimePart.Nothing, Is.EqualTo(SqlDateTimeOffsetPart.Nothing));
167+
}
168+
#if NET6_0_OR_GREATER
169+
170+
[Test]
171+
public void DatePartConversionTest()
172+
{
173+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.Year, Is.EqualTo(SqlDatePart.Year));
174+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.Month, Is.EqualTo(SqlDatePart.Month));
175+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.Day, Is.EqualTo(SqlDatePart.Day));
176+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.DayOfYear, Is.EqualTo(SqlDatePart.DayOfYear));
177+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.DayOfWeek, Is.EqualTo(SqlDatePart.DayOfWeek));
178+
Assert.That((SqlDatePart) (int) SqlDateTimeOffsetPart.Nothing, Is.EqualTo(SqlDatePart.Nothing));
179+
180+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.Year, Is.EqualTo(SqlDateTimeOffsetPart.Year));
181+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.Month, Is.EqualTo(SqlDateTimeOffsetPart.Month));
182+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.Day, Is.EqualTo(SqlDateTimeOffsetPart.Day));
183+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.DayOfYear, Is.EqualTo(SqlDateTimeOffsetPart.DayOfYear));
184+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.DayOfWeek, Is.EqualTo(SqlDateTimeOffsetPart.DayOfWeek));
185+
Assert.That((SqlDateTimeOffsetPart) (int) SqlDatePart.Nothing, Is.EqualTo(SqlDateTimeOffsetPart.Nothing));
186+
}
187+
188+
[Test]
189+
public void TimePartConversionTest()
190+
{
191+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Hour, Is.EqualTo(SqlTimePart.Hour));
192+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Minute, Is.EqualTo(SqlTimePart.Minute));
193+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Second, Is.EqualTo(SqlTimePart.Second));
194+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Millisecond, Is.EqualTo(SqlTimePart.Millisecond));
195+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Nanosecond, Is.EqualTo(SqlTimePart.Nanosecond));
196+
Assert.That((SqlTimePart) (int) SqlDateTimeOffsetPart.Nothing, Is.EqualTo(SqlTimePart.Nothing));
197+
198+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Hour, Is.EqualTo(SqlDateTimeOffsetPart.Hour));
199+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Minute, Is.EqualTo(SqlDateTimeOffsetPart.Minute));
200+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Second, Is.EqualTo(SqlDateTimeOffsetPart.Second));
201+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Millisecond, Is.EqualTo(SqlDateTimeOffsetPart.Millisecond));
202+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Nanosecond, Is.EqualTo(SqlDateTimeOffsetPart.Nanosecond));
203+
Assert.That((SqlDateTimeOffsetPart) (int) SqlTimePart.Nothing, Is.EqualTo(SqlDateTimeOffsetPart.Nothing));
204+
}
205+
#endif
206+
207+
[Test]
208+
public void IntervalPartConversionTest()
209+
{
210+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Day, Is.EqualTo(SqlIntervalPart.Day));
211+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Hour, Is.EqualTo(SqlIntervalPart.Hour));
212+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Minute, Is.EqualTo(SqlIntervalPart.Minute));
213+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Second, Is.EqualTo(SqlIntervalPart.Second));
214+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Millisecond, Is.EqualTo(SqlIntervalPart.Millisecond));
215+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Nanosecond, Is.EqualTo(SqlIntervalPart.Nanosecond));
216+
Assert.That((SqlIntervalPart) (int) SqlDateTimeOffsetPart.Nothing, Is.EqualTo(SqlIntervalPart.Nothing));
217+
218+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Day, Is.EqualTo(SqlDateTimeOffsetPart.Day));
219+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Hour, Is.EqualTo(SqlDateTimeOffsetPart.Hour));
220+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Minute, Is.EqualTo(SqlDateTimeOffsetPart.Minute));
221+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Second, Is.EqualTo(SqlDateTimeOffsetPart.Second));
222+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Millisecond, Is.EqualTo(SqlDateTimeOffsetPart.Millisecond));
223+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Nanosecond, Is.EqualTo(SqlDateTimeOffsetPart.Nanosecond));
224+
Assert.That((SqlDateTimeOffsetPart) (int) SqlIntervalPart.Nothing, Is.EqualTo(SqlDateTimeOffsetPart.Nothing));
225+
}
226+
}
227+
}

0 commit comments

Comments
 (0)