Skip to content

Commit 8924144

Browse files
committed
Add Postgres specific sample class for JSON queries
- Introduced PostgresSpecificSample.cs file. - Implemented a sample class using ITestOutputHelper. - Added ToJsonQuery method to generate and test SQL queries.
1 parent cdad4b6 commit 8924144

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Carbunqlex;
2+
using Xunit.Abstractions;
3+
4+
namespace Sample;
5+
6+
/// <summary>
7+
/// Sample for Postgres specific features.
8+
/// </summary>
9+
/// <param name="output"></param>
10+
public class PostgresSpecificSample(ITestOutputHelper output)
11+
{
12+
private readonly ITestOutputHelper output = output;
13+
14+
/// <summary>
15+
/// Sample to generate a query that returns JSON
16+
/// </summary>
17+
[Fact]
18+
public void ToJsonQuery()
19+
{
20+
var query = QueryAstParser.Parse("""
21+
select
22+
posts.post_id
23+
, posts.title
24+
, posts.content
25+
, posts.created_at
26+
, users.user_id
27+
, users.name as user_name
28+
, blogs.blog_id
29+
, blogs.name as blog_name
30+
, organizations.organization_id
31+
, organizations.name as organization_name
32+
from
33+
posts
34+
inner join users on posts.user_id = users.user_id
35+
inner join blogs on posts.blog_id = blogs.blog_id
36+
inner join organizations on blogs.organization_id = organizations.organization_id
37+
where
38+
posts.post_id = :post_id
39+
""");
40+
41+
query.NormalizeSelectClause()
42+
.Serialize("organizations", objectName: "organization")
43+
.Serialize("users", objectName: "user")
44+
.Serialize("blogs", objectName: "blog", include: ["organization"])
45+
.Serialize("posts", objectName: "post", include: ["user", "blog"])
46+
.ToJson();
47+
48+
var actual = query.ToSql();
49+
50+
output.WriteLine(actual);
51+
52+
var expected = "select row_to_json(d) from (select json_build_object('post_id', posts.post_id, 'title', posts.title, 'content', posts.content, 'created_at', posts.created_at, 'user', json_build_object('user_id', users.user_id, 'user_name', users.name), 'blog', json_build_object('blog_id', blogs.blog_id, 'blog_name', blogs.name, 'organization', json_build_object('organization_id', organizations.organization_id, 'organization_name', organizations.name))) as post from posts inner join users on posts.user_id = users.user_id inner join blogs on posts.blog_id = blogs.blog_id inner join organizations on blogs.organization_id = organizations.organization_id where posts.post_id = :post_id) as d limit 1";
53+
Assert.Equal(expected, actual);
54+
}
55+
}

0 commit comments

Comments
 (0)