Skip to content

Commit 90a2ec9

Browse files
authored
Support conceptual diagrams (PlantUML only). Fix table view that doesn't have private keys (#55)
* Support conceptual diagrams. * Fix table view that doesn't have private keys #51
1 parent 0ac4b8e commit 90a2ec9

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

.circleci/config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ jobs:
6767
- run: curl --fail -X POST http://localhost:8080/png --data-binary @result.puml -o test.png
6868

6969
- run: ./target/release/sqlant $TEST_DATABASE_URL --legend -e --inline-puml-lib > result.puml
70+
- run: curl --fail -X POST http://localhost:8080/png --data-binary @result.puml -o test.png
71+
72+
- run: ./target/release/sqlant $TEST_DATABASE_URL --conceptual > result.puml
7073
- run: curl --fail -X POST http://localhost:8080/png --data-binary @result.puml -o test.png
7174

7275
# Mermaid

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub struct GeneratorConfigOptions {
1717
pub draw_enums: bool,
1818
pub draw_legend: bool,
1919
pub inline_puml_lib: bool,
20+
pub conceptual_diagram: bool,
2021
}
2122

2223
pub trait ViewGenerator {

src/main.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ async fn main() {
5858
.action(ArgAction::Set)
5959
.default_value("plantuml"),
6060
)
61+
.arg(
62+
Arg::new("conceptual")
63+
.long("conceptual")
64+
.help("Create conceptual ER diagram")
65+
.action(ArgAction::SetTrue)
66+
.default_value("false"),
67+
)
6168
.get_matches();
6269

6370
let mut s = lookup_parser(
@@ -79,6 +86,7 @@ async fn main() {
7986
draw_enums: args.get_flag("enums"),
8087
draw_legend: args.get_flag("legend"),
8188
inline_puml_lib: args.get_flag("inline-puml-lib"),
89+
conceptual_diagram: args.get_flag("conceptual"),
8290
},
8391
)
8492
.unwrap();

src/plantuml_generator.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ pub struct PlantUmlDefaultGenerator<'a> {
1111

1212
static PUML_TEMPLATE: &str = "@startuml\n\n\
1313
hide circle\n\
14+
hide empty members\n\
1415
skinparam linetype ortho\n\n\
1516
{puml_lib}\n\n\
1617
{{ for ent in entities}}{ent}\n{{ endfor }}\n\
1718
{{ for view in views}}{view}\n{{ endfor }}\n\
1819
{{ for fk in foreign_keys}}{fk}\n{{ endfor }}\n\
1920
{{ for e in enums}}{e}\n{{ endfor }}{legend}\n@enduml";
2021

21-
static ENTITY_TEMPLATE: &str = "table({name}) \\{\n{pks} ---\n{fks}{nns}{others}}\n";
22+
static ENTITY_TEMPLATE: &str =
23+
"table({name}) \\{\n{pks} {{ if pks }} ---\n{{ endif }}{fks}{nns}{others}}\n";
2224

2325
static VIEW_TEMPLATE: &str =
2426
"view({name}{{ if materialized}}, $materialized=true{{ endif }}) \\{\n{columns}}\n";
@@ -154,7 +156,7 @@ impl<'a> PlantUmlDefaultGenerator<'a> {
154156
others,
155157
}
156158
}
157-
fn entity_render(&self, tbl: &Table) -> Result<String, crate::SqlantError> {
159+
fn entity_render(&self, tbl: &Table, conceptual: bool) -> Result<String, crate::SqlantError> {
158160
let sorted_columns = Self::sort_columns(&tbl.columns);
159161

160162
let columns_render = |columns: Vec<Arc<TableColumn>>| -> Result<String, _> {
@@ -178,19 +180,28 @@ impl<'a> PlantUmlDefaultGenerator<'a> {
178180
},
179181
)?)
180182
};
183+
184+
let columns_render_if_not_conceptual =
185+
|columns: Vec<Arc<TableColumn>>| -> Result<String, _> {
186+
if !conceptual {
187+
return columns_render(columns);
188+
}
189+
Ok(String::default())
190+
};
191+
181192
Ok(self.str_templates.render(
182193
"ent",
183194
&SEntity {
184-
pks: columns_render(sorted_columns.pks)?,
185-
fks: columns_render(sorted_columns.fks)?,
186-
nns: columns_render(sorted_columns.nns)?,
187-
others: columns_render(sorted_columns.others)?,
195+
pks: columns_render_if_not_conceptual(sorted_columns.pks)?,
196+
fks: columns_render_if_not_conceptual(sorted_columns.fks)?,
197+
nns: columns_render_if_not_conceptual(sorted_columns.nns)?,
198+
others: columns_render_if_not_conceptual(sorted_columns.others)?,
188199
name: tbl.name.clone(),
189200
},
190201
)?)
191202
}
192203

193-
fn view_render(&self, view: &View) -> Result<String, crate::SqlantError> {
204+
fn view_render(&self, view: &View, conceptual: bool) -> Result<String, crate::SqlantError> {
194205
let columns_render = |columns: Vec<Arc<TableColumn>>| -> Result<String, _> {
195206
Ok::<std::string::String, crate::SqlantError>(columns.iter().try_fold(
196207
String::new(),
@@ -212,10 +223,18 @@ impl<'a> PlantUmlDefaultGenerator<'a> {
212223
},
213224
)?)
214225
};
226+
let columns_render_if_not_conceptual =
227+
|columns: Vec<Arc<TableColumn>>| -> Result<String, _> {
228+
if !conceptual {
229+
return columns_render(columns);
230+
}
231+
Ok(String::default())
232+
};
233+
215234
Ok(self.str_templates.render(
216235
"view",
217236
&SView {
218-
columns: columns_render(view.columns.clone())?,
237+
columns: columns_render_if_not_conceptual(view.columns.clone())?,
219238
name: view.name.clone(),
220239
materialized: view.materialized,
221240
},
@@ -232,12 +251,12 @@ impl ViewGenerator for PlantUmlDefaultGenerator<'_> {
232251
let entities: Vec<String> = sql_erd
233252
.tables
234253
.iter()
235-
.map(|tbl| self.entity_render(tbl))
254+
.map(|tbl| self.entity_render(tbl, opts.conceptual_diagram))
236255
.collect::<Result<Vec<String>, crate::SqlantError>>()?;
237256
let views: Vec<String> = sql_erd
238257
.views
239258
.iter()
240-
.map(|view| self.view_render(view))
259+
.map(|view| self.view_render(view, opts.conceptual_diagram))
241260
.collect::<Result<Vec<String>, crate::SqlantError>>()?;
242261

243262
let foreign_keys: Vec<String> = sql_erd

0 commit comments

Comments
 (0)