Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit d4658f0

Browse files
author
KevinHoward
committed
Renamed converter to SqlServerJsonStringConverter & cleaned unit tests
1 parent 66f0c60 commit d4658f0

File tree

3 files changed

+100
-155
lines changed

3 files changed

+100
-155
lines changed

src/ServiceStack.OrmLite.SqlServer/Converters/SqlServerJsonStringConverters.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,28 @@
77

88
namespace ServiceStack.OrmLite.SqlServer.Converters
99
{
10-
public class SqlServerJsonToObjectConverter : SqlServerStringConverter
10+
public class SqlServerJsonStringConverter : SqlServerStringConverter
1111
{
12+
// json string to object
1213
public override object FromDbValue(Type fieldType, object value)
1314
{
14-
var deflt = fieldType.GetDefaultValue();
15-
if (value == null || value == deflt)
16-
return deflt;
15+
if (value is string raw && fieldType.HasAttribute<SqlJsonAttribute>())
16+
return JsonSerializer.DeserializeFromString(raw, fieldType);
1717

18-
var json = value.ToString();
19-
return JsonSerializer.DeserializeFromString(json, fieldType);
18+
return base.FromDbValue(fieldType, value);
2019
}
2120

21+
// object to json string
2222
public override object ToDbValue(Type fieldType, object value)
2323
{
24-
if (value != null && value.GetType().HasInterface(typeof(ISqlJson)))
25-
{
26-
return value.ToJson();
27-
}
24+
if (value.GetType().HasAttribute<SqlJsonAttribute>())
25+
return JsonSerializer.SerializeToString(value, value.GetType());
2826

2927
return base.ToDbValue(fieldType, value);
3028
}
3129
}
3230

33-
public interface ISqlJson
31+
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
32+
public class SqlJsonAttribute : Attribute
3433
{ }
3534
}

src/ServiceStack.OrmLite.SqlServer/SqlServer2016OrmLiteDialectProvider.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
using ServiceStack.OrmLite.SqlServer.Converters;
1+
using System;
2+
3+
using ServiceStack.OrmLite.SqlServer.Converters;
24

35
namespace ServiceStack.OrmLite.SqlServer
46
{
57
public class SqlServer2016OrmLiteDialectProvider : SqlServer2014OrmLiteDialectProvider
68
{
79
public SqlServer2016OrmLiteDialectProvider() : base()
810
{
9-
base.RegisterConverter<string>(new SqlServerJsonToObjectConverter());
11+
base.RegisterConverter<String>(new SqlServerJsonStringConverter());
1012
}
1113

1214
public new static SqlServer2016OrmLiteDialectProvider Instance = new SqlServer2016OrmLiteDialectProvider();

src/ServiceStack.OrmLite.SqlServerTests/Expressions/JsonExpressionsTest.cs

Lines changed: 86 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -12,199 +12,143 @@ namespace ServiceStack.OrmLite.SqlServerTests.Expressions
1212
{
1313
public class JsonExpressionsTest : OrmLiteTestBase
1414
{
15-
[OneTimeSetUp]
15+
public static Address Addr { get; set; }
16+
= new Address
17+
{
18+
Line1 = "1234 Main Street",
19+
Line2 = "Apt. 404",
20+
City = "Las Vegas",
21+
State = "NV"
22+
};
23+
24+
[OneTimeSetUp]
1625
public override void TestFixtureSetUp()
1726
{
1827
LogManager.LogFactory = new ConsoleLogFactory();
1928

2029
OrmLiteConfig.DialectProvider = SqlServer2016Dialect.Provider;
21-
OrmLiteConfig.DialectProvider.RegisterConverter<Address>(new SqlServerJsonToObjectConverter());
30+
OrmLiteConfig.DialectProvider.RegisterConverter<string>(new SqlServerJsonStringConverter());
31+
OrmLiteConfig.DialectProvider.RegisterConverter<Address>(new SqlServerJsonStringConverter());
2232

2333
ConnectionString = ConfigurationManager.ConnectionStrings["testDb"].ConnectionString;
24-
}
2534

35+
Db = OpenDbConnection();
2636

27-
[Test]
28-
public void Can_test_if_string_field_contains_json()
37+
// Load test data
38+
Db.DropAndCreateTable<TestType>();
39+
Db.Insert(new TestType { Id = 1, StringColumn = "not json" });
40+
Db.Insert(new TestType { Id = 2, StringColumn = Addr.ToJson() });
41+
}
42+
43+
[OneTimeTearDown]
44+
public void TextFixtureTearDown()
2945
{
30-
using (var db = OpenDbConnection())
46+
if (Db != null)
3147
{
32-
db.DropAndCreateTable<TestType>();
48+
if (Db.State == System.Data.ConnectionState.Open)
49+
Db.Close();
3350

34-
// test if string field is not JSON with Sql.IsJson
35-
db.Insert(new TestType { Id = 1, StringColumn = "not json" });
36-
37-
var j = db.From<TestType>()
38-
.Select(x => Sql.IsJson(x.StringColumn))
39-
.Where(x => x.Id == 1);
40-
var isJson = db.Scalar<bool>(j);
51+
Db.Dispose();
52+
}
53+
}
4154

42-
Assert.IsFalse(isJson);
4355

44-
// test if string field is JSON with Sql.IsJson
45-
var expected = new Address
46-
{
47-
Line1 = "1234 Main Street",
48-
Line2 = "Apt. 404",
49-
City = "Las Vegas",
50-
State = "NV"
51-
};
52-
var obj = new { Address = expected };
53-
54-
//{ "Address": { "Line1": "1234 Main Street", "Line2": "Apt. 404", "City": "Las Vegas", "State": "NV" } }
55-
var stringValue = obj.ToJson();
56+
[Test]
57+
public void Can_test_if_string_field_contains_json()
58+
{
59+
// test if string field is not JSON with Sql.IsJson
60+
var j = Db.From<TestType>()
61+
.Select(x => Sql.IsJson(x.StringColumn))
62+
.Where(x => x.Id == 1);
63+
var isJson = Db.Scalar<bool>(j);
5664

57-
db.Insert(new TestType { Id = 2, StringColumn = stringValue });
65+
Assert.IsFalse(isJson);
5866

59-
j = db.From<TestType>()
60-
.Select(x => Sql.IsJson(x.StringColumn))
61-
.Where(x => x.Id == 2);
62-
isJson = db.Scalar<bool>(j);
67+
// test if string field is JSON with Sql.IsJson
68+
j = Db.From<TestType>()
69+
.Select(x => Sql.IsJson(x.StringColumn))
70+
.Where(x => x.Id == 2);
71+
isJson = Db.Scalar<bool>(j);
6372

64-
Assert.IsTrue(isJson);
65-
}
73+
Assert.IsTrue(isJson);
6674
}
6775

6876
[Test]
6977
public void Can_select_using_a_json_scalar_filter()
7078
{
71-
using (var db = OpenDbConnection())
72-
{
73-
db.DropAndCreateTable<TestType>();
74-
75-
var obj = new
76-
{
77-
Address = new Address
78-
{
79-
Line1 = "1234 Main Street",
80-
Line2 = "Apt. 404",
81-
City = "Las Vegas",
82-
State = "NV"
83-
}
84-
};
85-
86-
//{ "Address": { "Line1": "1234 Main Street", "Line2": "Apt. 404", "City": "Las Vegas", "State": "NV" } }
87-
var stringValue = obj.ToJson();
88-
89-
db.Insert(new TestType { StringColumn = stringValue });
90-
91-
// retrieve records where City in Address is NV (1 record)
92-
var actual = db.Select<TestType>(q =>
93-
Sql.JsonValue(q.StringColumn, "$.Address.State") == "NV");
79+
// retrieve records where City in Address is NV (1 record)
80+
var actual = Db.Select<TestType>(q =>
81+
Sql.JsonValue(q.StringColumn, "$.State") == "NV"
82+
&& q.Id == 2
83+
);
9484

95-
Assert.IsNotEmpty(actual);
85+
Assert.IsNotEmpty(actual);
9686

97-
// retrieve records where City in Address is FL (0 records)
98-
actual = db.Select<TestType>(q =>
99-
Sql.JsonValue(q.StringColumn, "$.Address.State") == "FL");
87+
// retrieve records where City in Address is FL (0 records)
88+
actual = Db.Select<TestType>(q =>
89+
Sql.JsonValue(q.StringColumn, "$.State") == "FL"
90+
&& q.Id == 2
91+
);
10092

101-
Assert.IsEmpty(actual);
102-
}
93+
Assert.IsEmpty(actual);
10394
}
10495

10596
[Test]
10697
public void Can_select_a_json_scalar_value()
10798
{
108-
using (var db = OpenDbConnection())
109-
{
110-
db.DropAndCreateTable<TestType>();
111-
112-
var obj = new
113-
{
114-
Address = new Address
115-
{
116-
Line1 = "1234 Main Street",
117-
Line2 = "Apt. 404",
118-
City = "Las Vegas",
119-
State = "NV"
120-
}
121-
};
122-
123-
//{ "Address": { "Line1": "1234 Main Street", "Line2": "Apt. 404", "City": "Las Vegas", "State": "NV" } }
124-
var stringValue = obj.ToJson();
125-
126-
db.Insert(new TestType { StringColumn = stringValue });
127-
128-
// retrieve only the State in a field that contains a JSON Address
129-
var state = db.Scalar<string>(
130-
db.From<TestType>().Select(q =>
131-
Sql.As(Sql.JsonValue(q.StringColumn, "$.Address.State"), "State")
99+
// retrieve only the State in a field that contains a JSON Address
100+
var state = Db.Scalar<string>(
101+
Db.From<TestType>()
102+
.Where(q => q.Id == 2)
103+
.Select(q =>
104+
Sql.JsonValue(q.StringColumn, "$.State")
132105
)
133-
);
106+
);
134107

135-
Assert.AreEqual(state, obj.Address.State);
136-
}
108+
Assert.AreEqual(state, Addr.State);
137109
}
138110

139111
[Test]
140112
public void Can_select_a_json_object_value()
141113
{
142-
using (var db = OpenDbConnection())
143-
{
144-
db.DropAndCreateTable<TestType>();
145-
146-
var expected = new Address
147-
{
148-
Line1 = "1234 Main Street",
149-
Line2 = "Apt. 404",
150-
City = "Las Vegas",
151-
State = "NV"
152-
};
153-
154-
//{ "Line1": "1234 Main Street", "Line2": "Apt. 404", "City": "Las Vegas", "State": "NV" }
155-
var stringValue = expected.ToJson();
156-
157-
db.Insert(new TestType { StringColumn = stringValue });
158-
159-
// demo how to retrieve inserted JSON string directly to an object
160-
var address = db.Scalar<Address>(
161-
db.From<TestType>().Select(q => q.StringColumn)
114+
// demo how to retrieve inserted JSON string directly to an object
115+
var address = Db.Scalar<Address>(
116+
Db.From<TestType>()
117+
.Where(q => q.Id == 2)
118+
.Select(q => q.StringColumn)
162119
);
163120

164-
var sql = db.GetLastSql();
165-
166-
Assert.That(expected.Line1, Is.EqualTo(address.Line1));
167-
Assert.That(expected.Line2, Is.EqualTo(address.Line2));
168-
Assert.That(expected.City, Is.EqualTo(address.City));
169-
Assert.That(expected.State, Is.EqualTo(address.State));
170-
}
121+
Assert.That(Addr.Line1, Is.EqualTo(address.Line1));
122+
Assert.That(Addr.Line2, Is.EqualTo(address.Line2));
123+
Assert.That(Addr.City, Is.EqualTo(address.City));
124+
Assert.That(Addr.State, Is.EqualTo(address.State));
171125
}
172126

173127
[Ignore("Not functioning properly, issue with converter")]
174128
[Test]
175129
public void Can_insert_an_object_directly_to_json()
176130
{
177-
using (var db = OpenDbConnection())
178-
{
179-
db.DropAndCreateTable<TestType>();
131+
var tableName = Db.GetDialectProvider().GetQuotedTableName(ModelDefinition<TestType>.Definition);
132+
var sql = $"INSERT {tableName} (StringColumn) VALUES (@Address);";
180133

181-
var expected = new Address
182-
{
183-
Line1 = "1234 Main Street",
184-
Line2 = "Apt. 404",
185-
City = "Las Vegas",
186-
State = "NV"
187-
};
134+
// breaks here with an invalid conversion error from Address to string
135+
Db.ExecuteSql(sql, new { Id = 3, Address = Addr });
188136

189-
var tableName = db.GetDialectProvider().GetQuotedTableName(ModelDefinition<TestType>.Definition);
190-
191-
var sql = $"INSERT {tableName} (StringColumn) VALUES (@StringColumn);";
192-
db.ExecuteSql(sql, new { StringColumn = expected });
193-
194-
// demo how to retrieve inserted JSON string directly to an object
195-
var address = db.Scalar<Address>(
196-
db.From<TestType>().Select(q => q.StringColumn)
137+
// demo how to retrieve inserted JSON string directly to an object
138+
var address = Db.Single<Address>(
139+
Db.From<TestType>()
140+
.Where(q => q.Id == 3)
141+
.Select(q => q.StringColumn)
197142
);
198143

199-
Assert.That(expected.Line1, Is.EqualTo(address.Line1));
200-
Assert.That(expected.Line2, Is.EqualTo(address.Line2));
201-
Assert.That(expected.City, Is.EqualTo(address.City));
202-
Assert.That(expected.State, Is.EqualTo(address.State));
203-
}
204-
144+
Assert.That(Addr.Line1, Is.EqualTo(address.Line1));
145+
Assert.That(Addr.Line2, Is.EqualTo(address.Line2));
146+
Assert.That(Addr.City, Is.EqualTo(address.City));
147+
Assert.That(Addr.State, Is.EqualTo(address.State));
205148
}
206149

207-
public class Address : ISqlJson
150+
[SqlJson]
151+
public class Address
208152
{
209153
public string Line1 { get; set; }
210154
public string Line2 { get; set; }

0 commit comments

Comments
 (0)