Skip to content

Commit b72552f

Browse files
committed
Add triple
1 parent 312e872 commit b72552f

12 files changed

Lines changed: 729 additions & 16 deletions

crates/vespertide-exporter/src/seaorm/mod.rs

Lines changed: 305 additions & 9 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
source: crates/vespertide-exporter/src/seaorm/mod.rs
3+
expression: rendered
4+
---
5+
use sea_orm::entity::prelude::*;
6+
7+
#[sea_orm::model]
8+
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
9+
#[sea_orm(table_name = "dual")]
10+
pub struct Model {
11+
#[sea_orm(primary_key)]
12+
pub username: String,
13+
#[sea_orm(has_many, relation_enum = "DualRel", via_rel = "Username")]
14+
pub username_dual_rels: HasMany<super::dual_rel::Entity>,
15+
#[sea_orm(has_many, relation_enum = "CheckerUsername", via_rel = "CheckerUsername")]
16+
pub checker_username_dual_rels: HasMany<super::dual_rel::Entity>,
17+
}
18+
19+
vespera::schema_type!(Schema from Model, name = "DualSchema");
20+
impl ActiveModelBehavior for ActiveModel {}
21+
22+
pub struct UsernameToCheckerUsernameViaDualRel;
23+
impl Linked for UsernameToCheckerUsernameViaDualRel {
24+
type FromEntity = Entity;
25+
type ToEntity = Entity;
26+
27+
fn link(&self) -> Vec<RelationDef> {
28+
vec![
29+
super::dual_rel::Relation::Username.def().rev(),
30+
super::dual_rel::Relation::CheckerUsername.def(),
31+
]
32+
}
33+
}
34+
35+
pub struct CheckerUsernameToUsernameViaDualRel;
36+
impl Linked for CheckerUsernameToUsernameViaDualRel {
37+
type FromEntity = Entity;
38+
type ToEntity = Entity;
39+
40+
fn link(&self) -> Vec<RelationDef> {
41+
vec![
42+
super::dual_rel::Relation::CheckerUsername.def().rev(),
43+
super::dual_rel::Relation::Username.def(),
44+
]
45+
}
46+
}
47+
48+
impl Model {
49+
pub fn find_checker_usernames_via_dual_rel_from_username(&self) -> Select<Entity> {
50+
self.find_linked(UsernameToCheckerUsernameViaDualRel)
51+
}
52+
53+
pub fn find_usernames_via_dual_rel_from_checker_username(&self) -> Select<Entity> {
54+
self.find_linked(CheckerUsernameToUsernameViaDualRel)
55+
}
56+
}

crates/vespertide-exporter/src/seaorm/snapshots/vespertide_exporter__seaorm__tests__render_entity_with_schema_snapshots@schema_multiple_has_one_relations.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use sea_orm::entity::prelude::*;
1010
pub struct Model {
1111
#[sea_orm(primary_key)]
1212
pub id: Uuid,
13-
#[sea_orm(has_one, relation_enum = "Settings", via = "settings")]
13+
#[sea_orm(has_one, relation_enum = "Settings", via_rel = "CreatedByUser")]
1414
pub created_by_user: HasOne<super::settings::Entity>,
15-
#[sea_orm(has_one, relation_enum = "UpdatedByUser", via = "settings")]
15+
#[sea_orm(has_one, relation_enum = "UpdatedByUser", via_rel = "UpdatedByUser")]
1616
pub updated_by_user: HasOne<super::settings::Entity>,
1717
}
1818

crates/vespertide-exporter/src/seaorm/snapshots/vespertide_exporter__seaorm__tests__render_entity_with_schema_snapshots@schema_multiple_reverse_relations.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use sea_orm::entity::prelude::*;
1010
pub struct Model {
1111
#[sea_orm(primary_key)]
1212
pub id: Uuid,
13-
#[sea_orm(has_many, relation_enum = "Profile", via = "profile")]
13+
#[sea_orm(has_many, relation_enum = "Profile", via_rel = "PreferredUser")]
1414
pub preferred_user_profiles: HasMany<super::profile::Entity>,
15-
#[sea_orm(has_many, relation_enum = "BackupUser", via = "profile")]
15+
#[sea_orm(has_many, relation_enum = "BackupUser", via_rel = "BackupUser")]
1616
pub backup_user_profiles: HasMany<super::profile::Entity>,
1717
}
1818

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
---
2+
source: crates/vespertide-exporter/src/seaorm/mod.rs
3+
expression: rendered
4+
---
5+
use sea_orm::entity::prelude::*;
6+
7+
#[sea_orm::model]
8+
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
9+
#[sea_orm(table_name = "dual")]
10+
pub struct Model {
11+
#[sea_orm(primary_key)]
12+
pub username: String,
13+
#[sea_orm(has_many, relation_enum = "TripleRel", via_rel = "Username")]
14+
pub username_triple_rels: HasMany<super::triple_rel::Entity>,
15+
#[sea_orm(has_many, relation_enum = "CheckerUsername", via_rel = "CheckerUsername")]
16+
pub checker_username_triple_rels: HasMany<super::triple_rel::Entity>,
17+
#[sea_orm(has_many, relation_enum = "OtherUsername", via_rel = "OtherUsername")]
18+
pub other_username_triple_rels: HasMany<super::triple_rel::Entity>,
19+
}
20+
21+
vespera::schema_type!(Schema from Model, name = "DualSchema");
22+
impl ActiveModelBehavior for ActiveModel {}
23+
24+
pub struct UsernameToCheckerUsernameViaTripleRel;
25+
impl Linked for UsernameToCheckerUsernameViaTripleRel {
26+
type FromEntity = Entity;
27+
type ToEntity = Entity;
28+
29+
fn link(&self) -> Vec<RelationDef> {
30+
vec![
31+
super::triple_rel::Relation::Username.def().rev(),
32+
super::triple_rel::Relation::CheckerUsername.def(),
33+
]
34+
}
35+
}
36+
37+
pub struct UsernameToOtherUsernameViaTripleRel;
38+
impl Linked for UsernameToOtherUsernameViaTripleRel {
39+
type FromEntity = Entity;
40+
type ToEntity = Entity;
41+
42+
fn link(&self) -> Vec<RelationDef> {
43+
vec![
44+
super::triple_rel::Relation::Username.def().rev(),
45+
super::triple_rel::Relation::OtherUsername.def(),
46+
]
47+
}
48+
}
49+
50+
pub struct CheckerUsernameToUsernameViaTripleRel;
51+
impl Linked for CheckerUsernameToUsernameViaTripleRel {
52+
type FromEntity = Entity;
53+
type ToEntity = Entity;
54+
55+
fn link(&self) -> Vec<RelationDef> {
56+
vec![
57+
super::triple_rel::Relation::CheckerUsername.def().rev(),
58+
super::triple_rel::Relation::Username.def(),
59+
]
60+
}
61+
}
62+
63+
pub struct CheckerUsernameToOtherUsernameViaTripleRel;
64+
impl Linked for CheckerUsernameToOtherUsernameViaTripleRel {
65+
type FromEntity = Entity;
66+
type ToEntity = Entity;
67+
68+
fn link(&self) -> Vec<RelationDef> {
69+
vec![
70+
super::triple_rel::Relation::CheckerUsername.def().rev(),
71+
super::triple_rel::Relation::OtherUsername.def(),
72+
]
73+
}
74+
}
75+
76+
pub struct OtherUsernameToUsernameViaTripleRel;
77+
impl Linked for OtherUsernameToUsernameViaTripleRel {
78+
type FromEntity = Entity;
79+
type ToEntity = Entity;
80+
81+
fn link(&self) -> Vec<RelationDef> {
82+
vec![
83+
super::triple_rel::Relation::OtherUsername.def().rev(),
84+
super::triple_rel::Relation::Username.def(),
85+
]
86+
}
87+
}
88+
89+
pub struct OtherUsernameToCheckerUsernameViaTripleRel;
90+
impl Linked for OtherUsernameToCheckerUsernameViaTripleRel {
91+
type FromEntity = Entity;
92+
type ToEntity = Entity;
93+
94+
fn link(&self) -> Vec<RelationDef> {
95+
vec![
96+
super::triple_rel::Relation::OtherUsername.def().rev(),
97+
super::triple_rel::Relation::CheckerUsername.def(),
98+
]
99+
}
100+
}
101+
102+
impl Model {
103+
pub fn find_checker_usernames_via_triple_rel_from_username(&self) -> Select<Entity> {
104+
self.find_linked(UsernameToCheckerUsernameViaTripleRel)
105+
}
106+
107+
pub fn find_other_usernames_via_triple_rel_from_username(&self) -> Select<Entity> {
108+
self.find_linked(UsernameToOtherUsernameViaTripleRel)
109+
}
110+
111+
pub fn find_usernames_via_triple_rel_from_checker_username(&self) -> Select<Entity> {
112+
self.find_linked(CheckerUsernameToUsernameViaTripleRel)
113+
}
114+
115+
pub fn find_other_usernames_via_triple_rel_from_checker_username(&self) -> Select<Entity> {
116+
self.find_linked(CheckerUsernameToOtherUsernameViaTripleRel)
117+
}
118+
119+
pub fn find_usernames_via_triple_rel_from_other_username(&self) -> Select<Entity> {
120+
self.find_linked(OtherUsernameToUsernameViaTripleRel)
121+
}
122+
123+
pub fn find_checker_usernames_via_triple_rel_from_other_username(&self) -> Select<Entity> {
124+
self.find_linked(OtherUsernameToCheckerUsernameViaTripleRel)
125+
}
126+
}

examples/app/models/triple.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json",
3+
"name": "triple",
4+
"columns": [
5+
{
6+
"name": "username",
7+
"type": { "kind": "varchar", "length": 32 },
8+
"nullable": false,
9+
"primary_key": true
10+
}
11+
]
12+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json",
3+
"name": "triple_rel",
4+
"columns": [
5+
{
6+
"name": "username",
7+
"type": { "kind": "varchar", "length": 32 },
8+
"nullable": false,
9+
"primary_key": true,
10+
"foreign_key": {
11+
"ref_table": "triple",
12+
"ref_columns": ["username"],
13+
"on_delete": "cascade"
14+
}
15+
},
16+
{
17+
"name": "checker_username",
18+
"type": { "kind": "varchar", "length": 32 },
19+
"nullable": false,
20+
"primary_key": true,
21+
"foreign_key": {
22+
"ref_table": "triple",
23+
"ref_columns": ["username"],
24+
"on_delete": "cascade"
25+
}
26+
},
27+
{
28+
"name": "other_username",
29+
"type": { "kind": "varchar", "length": 32 },
30+
"nullable": false,
31+
"primary_key": true,
32+
"foreign_key": {
33+
"ref_table": "triple",
34+
"ref_columns": ["username"],
35+
"on_delete": "cascade"
36+
}
37+
}
38+
]
39+
}

examples/app/src/models/dual.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,47 @@ use sea_orm::entity::prelude::*;
66
pub struct Model {
77
#[sea_orm(primary_key)]
88
pub username: String,
9-
#[sea_orm(has_many)]
10-
pub dual_rels: HasMany<super::dual_rel::Entity>,
9+
#[sea_orm(has_many, relation_enum = "DualRel", via_rel = "Username")]
10+
pub username_dual_rels: HasMany<super::dual_rel::Entity>,
11+
#[sea_orm(has_many, relation_enum = "CheckerUsername", via_rel = "CheckerUsername")]
12+
pub checker_username_dual_rels: HasMany<super::dual_rel::Entity>,
1113
}
1214

1315
vespera::schema_type!(Schema from Model, name = "DualSchema");
1416
impl ActiveModelBehavior for ActiveModel {}
17+
18+
pub struct UsernameToCheckerUsernameViaDualRel;
19+
impl Linked for UsernameToCheckerUsernameViaDualRel {
20+
type FromEntity = Entity;
21+
type ToEntity = Entity;
22+
23+
fn link(&self) -> Vec<RelationDef> {
24+
vec![
25+
super::dual_rel::Relation::Username.def().rev(),
26+
super::dual_rel::Relation::CheckerUsername.def(),
27+
]
28+
}
29+
}
30+
31+
pub struct CheckerUsernameToUsernameViaDualRel;
32+
impl Linked for CheckerUsernameToUsernameViaDualRel {
33+
type FromEntity = Entity;
34+
type ToEntity = Entity;
35+
36+
fn link(&self) -> Vec<RelationDef> {
37+
vec![
38+
super::dual_rel::Relation::CheckerUsername.def().rev(),
39+
super::dual_rel::Relation::Username.def(),
40+
]
41+
}
42+
}
43+
44+
impl Model {
45+
pub fn find_checker_usernames_via_dual_rel_from_username(&self) -> Select<Entity> {
46+
self.find_linked(UsernameToCheckerUsernameViaDualRel)
47+
}
48+
49+
pub fn find_usernames_via_dual_rel_from_checker_username(&self) -> Select<Entity> {
50+
self.find_linked(CheckerUsernameToUsernameViaDualRel)
51+
}
52+
}

examples/app/src/models/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ pub mod dual_rel;
55
pub mod media;
66
pub mod single;
77
pub mod single_rel;
8+
pub mod triple;
9+
pub mod triple_rel;
810
pub mod user;
911
pub mod user_media_role;

0 commit comments

Comments
 (0)