- Domain-Specific Language Implementation for Conceptual Modelling of Relational Databases
+ Domain-Specific Language (DSL) Implementation for Conceptual Modelling of Relational Databases
-
+
+
+
+
+
+
+
- 
+---
+
+
+
---
@@ -18,65 +27,60 @@
-## Requirements (for development and/or use) ##
-
-+ Openjdk version "11.0.7" 2020-04-14
-
-+ OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-3ubuntu1)
+---
-+ OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-3ubuntu1, mixed mode, sharing)
-+ Eclipse IDE 2020-03 or newer.
+### Recommended Requirements (for development and/or use) ##
-+ Xtext 2.17.0 or newer.
++ Openjdk "11.0.7" version or newer;
++ Eclipse IDE 2020-03 version or newer;
++ Xtext 2.17.0 version or newer.
---
-## Project Building
+### Project Building
1. You can fork the repository, creating your local copy. Forking a repository allows you to freely experiment changes without affecting the original project.
-2. Alternatively, you can clone this project directly with a simple command:
+1. Alternatively, you can clone this project directly with a simple command:
- ```bash
+ ```zsh
$ git clone https://github.com/ProjetoDSL/ERDSL.git
```
-3. To build the project, you need to start the Eclipse IDE and open the directory containing the project.
-
-4. There will be 5 more subprojects, the majority of the implementation manually made being contained in the subdirectories.
+1. To build the project, you need to start the Eclipse IDE and open the directory containing the project.
- > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl
+1. This project is composed of 5 related subprojects. Most of the DSL implementation is in the **org.xtext.unipampa.erdsl** project. This one contains the implementation of grammar, generators and scoping/validations.
- > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator
- > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/scoping
+1. The other subprojects are related to testing, UI and IDE modifications.
- > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/validation
-5. If you want to change some aspect of the grammar of the language, go to:
+1. If you want to change any aspect of the language's grammar, go to:
> /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/ErDsl.xtext
- 5.1.After changes or additions, rigth click *ErDsl.xtext* file.
+ 5.1.After changes, rigth click *ErDsl.xtext* file.
5.2. In the context menu select *Run As* **>>** *Generate Xtext Artifacts*.
-6. If you want to change any aspect of the generator responsible for the transformation between the models, go to:
+1. If you want to change any aspect of the generators responsible for the transformation between the models, go to:
- > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/ErDslGenerator.xtend
+ > /org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/
+
+1. There are currently 5 implemented generators: A main generator that dispatches the described models to subgenerators. These subgenerators are responsible for creating the supported files (conceptual diagram, textual logical model and SQL for PostgreSQL and MySQL DBMS).
-7. To generate the language plugin go to the top bar menu:
+1. To generate the language plugin go to the top bar menu:
- 7.1. Click in *File* **>>** *Export* .
+ 1. Click in *File* **>>** *Export* .
- 7.2. Type "plugin" in the wizard.
+ 1. Type "plugin" in the wizard.
- 7.3. Select *Deployable plugins and fragments*.
+ 1. Select *Deployable plugins and fragments*.
- 7.4. For the options that appear, generate at least the plug-in for:
+ 1. For the options that appear, generate at least the plug-in for:
> org.xtext.unipampa.erdsl
@@ -87,15 +91,16 @@
---
-## Using the Generated Plugin
+
+### Using the Tool
1. Move the set of generated plugins in your Eclipse's plugin folder (/eclipse/plugins).
2. Open the Eclipse IDE with a new workspace.
-3. Start a empty java project.
+3. Start a ERtext project.
-4. Create a file with the .erdsl extension in *src* directory
+4. You can create more than one file with the .erdsl extension in the *src* directory. Anyway, the project wizard automatically creates an empty template file.
5. If asked by IDE if you want to change the view mode to the xtext context, accept.
@@ -103,7 +108,7 @@
7. When you finish your model, see if the IDE validates it and then save.
-8. Look at the *src-gen* directory and see the generated .html file, the result of transforming the conceptual model into a logical model.
+8. Look in the * src-gen * directory to see the generated files: it is possible to generate a .png diagram representing the conceptual model made (and a .puml file with the description using PlantUML's DSL), a .html file as a logical description , and two SQL files for different DBMSs
---
diff --git a/ToolOverview.png b/ToolOverview.png
new file mode 100644
index 0000000..f393c2a
Binary files /dev/null and b/ToolOverview.png differ
diff --git a/org.xtext.unipampa.erdsl.ide/.project b/org.xtext.unipampa.erdsl.ide/.project
index 9bcd9d1..78d07e0 100644
--- a/org.xtext.unipampa.erdsl.ide/.project
+++ b/org.xtext.unipampa.erdsl.ide/.project
@@ -31,4 +31,15 @@
org.eclipse.jdt.core.javanatureorg.eclipse.pde.PluginNature
+
+
+ 1636089992886
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin
index 23fabf8..5ee5794 100644
Binary files a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin and b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin
index c536360..679b046 100644
Binary files a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin and b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeModule.xtend b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeModule.xtend
new file mode 100644
index 0000000..a18bb9c
--- /dev/null
+++ b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeModule.xtend
@@ -0,0 +1,11 @@
+/*
+ * generated by Xtext 2.25.0
+ */
+package org.xtext.unipampa.erdsl.ide
+
+
+/**
+ * Use this class to register ide components.
+ */
+class ErDslIdeModule extends AbstractErDslIdeModule {
+}
diff --git a/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeSetup.xtend b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeSetup.xtend
new file mode 100644
index 0000000..88cfa76
--- /dev/null
+++ b/org.xtext.unipampa.erdsl.ide/bin/org/xtext/unipampa/erdsl/ide/ErDslIdeSetup.xtend
@@ -0,0 +1,20 @@
+/*
+ * generated by Xtext 2.25.0
+ */
+package org.xtext.unipampa.erdsl.ide
+
+import com.google.inject.Guice
+import org.eclipse.xtext.util.Modules2
+import org.xtext.unipampa.erdsl.ErDslRuntimeModule
+import org.xtext.unipampa.erdsl.ErDslStandaloneSetup
+
+/**
+ * Initialization support for running Xtext languages as language servers.
+ */
+class ErDslIdeSetup extends ErDslStandaloneSetup {
+
+ override createInjector() {
+ Guice.createInjector(Modules2.mixin(new ErDslRuntimeModule, new ErDslIdeModule))
+ }
+
+}
diff --git a/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin b/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin
index 23fabf8..5ee5794 100644
Binary files a/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin and b/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeModule.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin b/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin
index c536360..679b046 100644
Binary files a/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin and b/org.xtext.unipampa.erdsl.ide/xtend-gen/org/xtext/unipampa/erdsl/ide/.ErDslIdeSetup.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.tests/.project b/org.xtext.unipampa.erdsl.tests/.project
index cbb1726..999b2e1 100644
--- a/org.xtext.unipampa.erdsl.tests/.project
+++ b/org.xtext.unipampa.erdsl.tests/.project
@@ -31,4 +31,15 @@
org.eclipse.jdt.core.javanatureorg.eclipse.pde.PluginNature
+
+
+ 1636089992892
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/org.xtext.unipampa.erdsl.tests/test-bin/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin b/org.xtext.unipampa.erdsl.tests/test-bin/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin
index 2293f93..eafce86 100644
Binary files a/org.xtext.unipampa.erdsl.tests/test-bin/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin and b/org.xtext.unipampa.erdsl.tests/test-bin/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.tests/xtend-gen/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin b/org.xtext.unipampa.erdsl.tests/xtend-gen/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin
index 2293f93..eafce86 100644
Binary files a/org.xtext.unipampa.erdsl.tests/xtend-gen/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin and b/org.xtext.unipampa.erdsl.tests/xtend-gen/org/xtext/unipampa/erdsl/tests/.ErDslParsingTest.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui.tests/.project b/org.xtext.unipampa.erdsl.ui.tests/.project
index 66c7766..5b0ed84 100644
--- a/org.xtext.unipampa.erdsl.ui.tests/.project
+++ b/org.xtext.unipampa.erdsl.ui.tests/.project
@@ -31,4 +31,15 @@
org.eclipse.jdt.core.javanatureorg.eclipse.pde.PluginNature
+
+
+ 1636089992903
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/org.xtext.unipampa.erdsl.ui.tests/test-bin/org/xtext/unipampa/erdsl/ui/tests/ErDslUiInjectorProvider.class b/org.xtext.unipampa.erdsl.ui.tests/test-bin/org/xtext/unipampa/erdsl/ui/tests/ErDslUiInjectorProvider.class
deleted file mode 100644
index a8d191c..0000000
Binary files a/org.xtext.unipampa.erdsl.ui.tests/test-bin/org/xtext/unipampa/erdsl/ui/tests/ErDslUiInjectorProvider.class and /dev/null differ
diff --git a/org.xtext.unipampa.erdsl.ui/.project b/org.xtext.unipampa.erdsl.ui/.project
index 0cde272..f77232a 100644
--- a/org.xtext.unipampa.erdsl.ui/.project
+++ b/org.xtext.unipampa.erdsl.ui/.project
@@ -31,4 +31,15 @@
org.eclipse.jdt.core.javanatureorg.eclipse.pde.PluginNature
+
+
+ 1636089992898
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/org.xtext.unipampa.erdsl.ui/META-INF/MANIFEST.MF b/org.xtext.unipampa.erdsl.ui/META-INF/MANIFEST.MF
index 2ea0103..930cda2 100644
--- a/org.xtext.unipampa.erdsl.ui/META-INF/MANIFEST.MF
+++ b/org.xtext.unipampa.erdsl.ui/META-INF/MANIFEST.MF
@@ -23,7 +23,8 @@ Require-Bundle: org.xtext.unipampa.erdsl,
org.eclipse.core.resources,
org.eclipse.pde.core,
org.eclipse.ui.forms
-Import-Package: org.apache.log4j
+Import-Package: org.apache.log4j,
+ org.eclipse.xtext.ui.codemining;resolution:=optional
Bundle-RequiredExecutionEnvironment: JavaSE-11
Export-Package: org.xtext.unipampa.erdsl.ui.contentassist,
org.xtext.unipampa.erdsl.ui.internal,
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/.ErDslUiModule.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/.ErDslUiModule.xtendbin
index 8a560f3..95ef221 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/.ErDslUiModule.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/.ErDslUiModule.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.java._trace b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.java._trace
new file mode 100644
index 0000000..6add2ba
Binary files /dev/null and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.java._trace differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.xtendbin
new file mode 100644
index 0000000..0baa2a8
Binary files /dev/null and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/.ErDslCodeMiningProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.class b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.class
new file mode 100644
index 0000000..dc7f7fb
Binary files /dev/null and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.class differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend
new file mode 100644
index 0000000..0947911
--- /dev/null
+++ b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend
@@ -0,0 +1,38 @@
+package org.xtext.unipampa.erdsl.ui.codemining
+
+import org.eclipse.jface.text.BadLocationException
+import org.eclipse.jface.text.IDocument
+import org.eclipse.jface.text.codemining.ICodeMining
+import org.eclipse.xtext.resource.XtextResource
+import org.eclipse.xtext.ui.codemining.AbstractXtextCodeMiningProvider
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.util.IAcceptor
+import org.xtext.unipampa.erdsl.erDsl.Entity
+import org.xtext.unipampa.erdsl.erDsl.ERModel
+
+class ErDslCodeMiningProvider extends AbstractXtextCodeMiningProvider {
+ override void createCodeMinings(IDocument document, XtextResource resource, CancelIndicator indicator,
+ IAcceptor super ICodeMining> acceptor) throws BadLocationException {
+
+ // TODO: implement me
+ // use acceptor.accept(super.createNewLineHeaderCodeMining(...)) to add a new code mining to the final list
+
+
+// val modeloER = resource.contents.get(0) as ERModel
+// var ent = 0
+// var rel = 0
+//
+// for (e : modeloER.entities) {
+// ent = ent + 1
+// }
+//
+// for (e : modeloER.relations) {
+// rel = rel + 1
+// }
+//
+// acceptor.accept(createNewLineHeaderCodeMining(0, document, " There are ["+ ent.toString +"] modeled entity(ies) and ["+ rel.toString +"] relationship(s) "))
+//
+// ent = 0
+// rel = 0
+ }
+}
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/contentassist/.ErDslProposalProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/contentassist/.ErDslProposalProvider.xtendbin
index db28ca6..2e86137 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/contentassist/.ErDslProposalProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/contentassist/.ErDslProposalProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslDescriptionLabelProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslDescriptionLabelProvider.xtendbin
index 9d24f9c..199066b 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslDescriptionLabelProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslDescriptionLabelProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslLabelProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslLabelProvider.xtendbin
index 6741e20..041cc9c 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslLabelProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/labeling/.ErDslLabelProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/outline/.ErDslOutlineTreeProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/outline/.ErDslOutlineTreeProvider.xtendbin
index bcf4708..cebe365 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/outline/.ErDslOutlineTreeProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/outline/.ErDslOutlineTreeProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/quickfix/.ErDslQuickfixProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/quickfix/.ErDslQuickfixProvider.xtendbin
index 8543f56..c1d8215 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/quickfix/.ErDslQuickfixProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/quickfix/.ErDslQuickfixProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextFile.java._trace b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextFile.java._trace
index 3fd4bc4..0fc6725 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextFile.java._trace and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextFile.java._trace differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextProject.java._trace b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextProject.java._trace
index 9d0fab0..05aa063 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextProject.java._trace and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ERtextProject.java._trace differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslFileTemplateProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslFileTemplateProvider.xtendbin
index c5c9c84..1e2d641 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslFileTemplateProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslFileTemplateProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslProjectTemplateProvider.xtendbin b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslProjectTemplateProvider.xtendbin
index 33d1e09..68a6d26 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslProjectTemplateProvider.xtendbin and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/.ErDslProjectTemplateProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextFile.class b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextFile.class
index e3f24fe..241befa 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextFile.class and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextFile.class differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextProject.class b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextProject.class
index 1cd85a0..0563164 100644
Binary files a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextProject.class and b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ERtextProject.class differ
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
index e61a7b2..e69039b 100644
--- a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
+++ b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
@@ -24,143 +24,40 @@ class ErDslFileTemplateProvider implements IFileTemplateProvider {
// val helloName = combo("Hello Name:", #["Xtext", "World", "Foo", "Bar"], "The name to say 'Hello' to")
@FileTemplate(label="ERDSL Template", icon="file_template.png", description="Create a template file for ERDSl.")
final class ERtextFile {
- val modelName = combo("Template:", #["Hospital_Veterinario", "Empresa_Generica"], "The logical example model")
+ val modelName = combo("Template:", #["Empty Model"], "The empty model")
override generateFiles(IFileGenerator generator) {
generator.generate('''«folder»/«name».erdsl''', '''
- «IF modelName.toString.equalsIgnoreCase("Hospital_Veterinario")»
+ «IF modelName.toString.equalsIgnoreCase("Empty Model")»
/*
- * This is an example model
- */
-
- Generate All;
-
- Domain Hospital_Veterinario;
-
- Entities {
-
- Pessoa {
- idPessoa int isIdentifier,
- telefoneS int,
- nome string
- }
-
- Veterinario is total/disjoint Pessoa {
- nrVet int,
- dtAdmissao datetime,
- salario money
- }
-
- Cliente is total/disjoint Pessoa {
- cpf int,
- email string
- }
-
- Animal {
- idAnimal int isIdentifier,
- idade int,
- porte string,
- nome string
- }
-
- Enfermidade {
- idEnfermidade int isIdentifier,
- nome string,
- descricao string
- }
-
- Tratamento {
- idTratamento int isIdentifier,
- dtInicio datetime,
- dtFim datetime
- }
-
- Receita {
- idReceita int isIdentifier,
- remedio string
- }
-
- };
-
- Relationships {
- Assistente [Veterinario (0:1) relates (0:N) Veterinario]
- Dono [Cliente (1:1) relates (1:N) Animal]
- Reponsavel [Veterinario (1:N) relates (0:N) Tratamento]
- Possui [Tratamento (1:1) relates (1:1) Receita]
- AnimalDoente [Animal (0:N) relates (1:N) Enfermidade]
- TratAnimal [AnimalDoente (1:N) relates (1:1) Tratamento]
-
- };
-
- «ELSEIF modelName.toString.equalsIgnoreCase("Empresa_Generica")»
- /*
- * This is an example model
+ * The template to demonstrate an overview of the grammar.
+ * This does not necessarily displays a semantically correct model regarding to the real world.
*/
Generate All;
- Domain Empresa_Generica;
+ Domain Name;
Entities {
-
- Empregado {
- idEmpregado int isIdentifier,
- salario money
- }
-
- Contador is total/disjoint Empregado {
- crc int
- }
-
- Motorista is total/disjoint Empregado {
- cnh int,
- veiculo string
- }
-
- Engenheiro is total/disjoint Empregado {
- crea int,
- areaAtuacao string
+ Entity1 {
+ attribute1 int isIdentifier,
+ attribute2 file
+ }
+
+ /* The generalization type can be:
+ * [1] total/disjoint, [2] total/overlapped, [3] partial/disjoint OR [4] partial/overlapped
+ *
+ * An entity that specializes another should NOT HAVE an IDENTIFIER attribute, as it inherits from the generalized entity.
+ */
+ Entity2 is total/disjoint Entity1 {
+ attribute3 string,
+ attribute4 datetime
}
-
- Departamento {
- idDept int isIdentifier,
- sigla string
- }
-
- Tipo {
- idTipo int isIdentifier,
- descricao string
- }
-
- Projeto {
- idProjeto int isIdentifier,
- descricao string
- }
-
- Materiais {
- idMaterial int isIdentifier,
- descricao string,
- validade string
- }
-
- Fornecedor {
- idFornecedor int isIdentifier,
- cnpj int,
- nomeFantasia string,
- telefone int
- }
-
};
Relationships {
- Supervisiona [Empregado (0:1) relates (1:N) Empregado]
- Desenvolve [Empregado (1:N) relates (0:N) Projeto]
- Lotado [Empregado (1:N) relates (0:1) Departamento]
- Tem [Departamento (1:1) relates (1:1) Tipo]
- Controla [Departamento (1:N) relates (0:N) Projeto]
- Fornecimento [Materiais (0:N) relates (1:N) Fornecedor]
- ProjFornec [Projeto (1:N) relates (1:N) Fornecimento]
+ Relationship1 [Entity1 (1:N) relates (1:N) Entity2] {attribute5 int}
+ Relationship2 [Entity2 (1:N) relates (1:N) Entity1]
};
-
«ENDIF»
''')
}
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
index b207547..1ea9cb0 100644
--- a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
+++ b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
@@ -25,13 +25,13 @@ class ErDslProjectTemplateProvider implements IProjectTemplateProvider {
}
}
-@ProjectTemplate(label="org.project.ertext.template", icon="project_template.png", description="
ERtext TEMPLATE
-
This is a parameterized template for ERtext. You can set a parameter to modify the content in the generated file and a parameter
+@ProjectTemplate(label="org.project.ertext.template", icon="project_template.png", description="
ERtext Project Template
+
This is a parameterized project template for ERtext. You can set a parameter to modify the content in the generated file and a parameter
to set the package the file is created in.
")
final class ERtextProject {
val advanced = check("Advanced:", false)
val advancedGroup = group("Properties")
- val name = combo("Name:", #["Xtext", "World", "Foo", "Bar"], "The name to say 'Hello' to", advancedGroup)
+ val name = combo("Name:", #["Xtext"], "Xtext:", advancedGroup)
val path = text("Package:", "ERtext", "The package path to place the files in", advancedGroup)
override protected updateVariables() {
@@ -58,67 +58,36 @@ final class ERtextProject {
projectNatures += #[XtextProjectHelper.NATURE_ID]
builderIds += #[JavaCore.BUILDER_ID, XtextProjectHelper.BUILDER_ID]
folders += "src"
- addFile('''src/Blank_Model.erdsl''', '''
+ addFile('''src/TemplateModel.erdsl''', '''
/*
- * Hello new user!
- *
- * This is an example model
- */
-
+ * The template to demonstrate an overview of the grammar.
+ * This does not necessarily displays a semantically correct model regarding to the real world.
+ */
+
Generate All;
- Domain The_Employees_Sample_Schema;
+ Domain Name;
Entities {
-
- Person {
- person_no int isIdentifier,
- gender boolean
- }
-
- Employee is total/overlapped Person {
- emp_no int isIdentifier,
- birth_dt datetime,
- first_name string,
- last_name string,
- hire_dt datetime
- }
-
- Dependent is total/overlapped Person {
- dependent_no int isIdentifier,
- first_name string,
- last_name string
- }
-
- Salary {
- salary_no int isIdentifier,
- salary money,
- from_dt datetime,
- to_dt datetime
- }
-
- Departament {
- dept_no int isIdentifier,
- name string,
- goals_description string
+ Entity1 {
+ attribute1 int isIdentifier,
+ attribute2 file
}
-
- Title {
- title_no int isIdentifier,
- name string,
- description string,
- from_dt datetime,
- to_dt datetime
+
+ /* The generalization type can be:
+ * [1] total/disjoint, [2] total/overlapped, [3] partial/disjoint OR [4] partial/overlapped
+ *
+ * An entity that specializes another should NOT HAVE an IDENTIFIER attribute, as it inherits from the generalized entity.
+ */
+ Entity2 is total/disjoint Entity1 {
+ attribute3 string,
+ attribute4 datetime
}
-
};
Relationships {
- Dept_manager [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}
- Dept_emp [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}
- Payment [Salary (1:N) relates (1:1) Employee]
- JobTitle [Title (1:N) relates (1:1) Employee]
- Dependency [Employee (1:1) relates (1:N) Dependent]
+ Relationship1 [Entity1 (1:N) relates (1:N) Entity2] {attribute5 int}
+ Relationship2 [Entity2 (1:N) relates (1:N) Entity1]
};
''')
])
diff --git a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/messages.properties b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
index 5916d6a..869a50d 100644
--- a/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
+++ b/org.xtext.unipampa.erdsl.ui/bin/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
@@ -1,4 +1,4 @@
ERtextFile_Label=ERDSL Template
ERtextFile_Description=Create a template file for ERDSl.
ERtextProject_Label=org.project.ertext.template
-ERtextProject_Description=
ERtext TEMPLATE
This is a parameterized template for ERtext. You can set a parameter to modify the content in the generated file and a parameter to set the package the file is created in.
+ERtextProject_Description=
ERtext Project Template
This is a parameterized project template for ERtext. You can set a parameter to modify the content in the generated file and a parameter to set the package the file is created in.
diff --git a/org.xtext.unipampa.erdsl.ui/plugin.xml b/org.xtext.unipampa.erdsl.ui/plugin.xml
index 3500fc4..76ac1bc 100644
--- a/org.xtext.unipampa.erdsl.ui/plugin.xml
+++ b/org.xtext.unipampa.erdsl.ui/plugin.xml
@@ -532,4 +532,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend
new file mode 100644
index 0000000..0947911
--- /dev/null
+++ b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/codemining/ErDslCodeMiningProvider.xtend
@@ -0,0 +1,38 @@
+package org.xtext.unipampa.erdsl.ui.codemining
+
+import org.eclipse.jface.text.BadLocationException
+import org.eclipse.jface.text.IDocument
+import org.eclipse.jface.text.codemining.ICodeMining
+import org.eclipse.xtext.resource.XtextResource
+import org.eclipse.xtext.ui.codemining.AbstractXtextCodeMiningProvider
+import org.eclipse.xtext.util.CancelIndicator
+import org.eclipse.xtext.util.IAcceptor
+import org.xtext.unipampa.erdsl.erDsl.Entity
+import org.xtext.unipampa.erdsl.erDsl.ERModel
+
+class ErDslCodeMiningProvider extends AbstractXtextCodeMiningProvider {
+ override void createCodeMinings(IDocument document, XtextResource resource, CancelIndicator indicator,
+ IAcceptor super ICodeMining> acceptor) throws BadLocationException {
+
+ // TODO: implement me
+ // use acceptor.accept(super.createNewLineHeaderCodeMining(...)) to add a new code mining to the final list
+
+
+// val modeloER = resource.contents.get(0) as ERModel
+// var ent = 0
+// var rel = 0
+//
+// for (e : modeloER.entities) {
+// ent = ent + 1
+// }
+//
+// for (e : modeloER.relations) {
+// rel = rel + 1
+// }
+//
+// acceptor.accept(createNewLineHeaderCodeMining(0, document, " There are ["+ ent.toString +"] modeled entity(ies) and ["+ rel.toString +"] relationship(s) "))
+//
+// ent = 0
+// rel = 0
+ }
+}
diff --git a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
index e61a7b2..e69039b 100644
--- a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
+++ b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslFileTemplateProvider.xtend
@@ -24,143 +24,40 @@ class ErDslFileTemplateProvider implements IFileTemplateProvider {
// val helloName = combo("Hello Name:", #["Xtext", "World", "Foo", "Bar"], "The name to say 'Hello' to")
@FileTemplate(label="ERDSL Template", icon="file_template.png", description="Create a template file for ERDSl.")
final class ERtextFile {
- val modelName = combo("Template:", #["Hospital_Veterinario", "Empresa_Generica"], "The logical example model")
+ val modelName = combo("Template:", #["Empty Model"], "The empty model")
override generateFiles(IFileGenerator generator) {
generator.generate('''«folder»/«name».erdsl''', '''
- «IF modelName.toString.equalsIgnoreCase("Hospital_Veterinario")»
+ «IF modelName.toString.equalsIgnoreCase("Empty Model")»
/*
- * This is an example model
- */
-
- Generate All;
-
- Domain Hospital_Veterinario;
-
- Entities {
-
- Pessoa {
- idPessoa int isIdentifier,
- telefoneS int,
- nome string
- }
-
- Veterinario is total/disjoint Pessoa {
- nrVet int,
- dtAdmissao datetime,
- salario money
- }
-
- Cliente is total/disjoint Pessoa {
- cpf int,
- email string
- }
-
- Animal {
- idAnimal int isIdentifier,
- idade int,
- porte string,
- nome string
- }
-
- Enfermidade {
- idEnfermidade int isIdentifier,
- nome string,
- descricao string
- }
-
- Tratamento {
- idTratamento int isIdentifier,
- dtInicio datetime,
- dtFim datetime
- }
-
- Receita {
- idReceita int isIdentifier,
- remedio string
- }
-
- };
-
- Relationships {
- Assistente [Veterinario (0:1) relates (0:N) Veterinario]
- Dono [Cliente (1:1) relates (1:N) Animal]
- Reponsavel [Veterinario (1:N) relates (0:N) Tratamento]
- Possui [Tratamento (1:1) relates (1:1) Receita]
- AnimalDoente [Animal (0:N) relates (1:N) Enfermidade]
- TratAnimal [AnimalDoente (1:N) relates (1:1) Tratamento]
-
- };
-
- «ELSEIF modelName.toString.equalsIgnoreCase("Empresa_Generica")»
- /*
- * This is an example model
+ * The template to demonstrate an overview of the grammar.
+ * This does not necessarily displays a semantically correct model regarding to the real world.
*/
Generate All;
- Domain Empresa_Generica;
+ Domain Name;
Entities {
-
- Empregado {
- idEmpregado int isIdentifier,
- salario money
- }
-
- Contador is total/disjoint Empregado {
- crc int
- }
-
- Motorista is total/disjoint Empregado {
- cnh int,
- veiculo string
- }
-
- Engenheiro is total/disjoint Empregado {
- crea int,
- areaAtuacao string
+ Entity1 {
+ attribute1 int isIdentifier,
+ attribute2 file
+ }
+
+ /* The generalization type can be:
+ * [1] total/disjoint, [2] total/overlapped, [3] partial/disjoint OR [4] partial/overlapped
+ *
+ * An entity that specializes another should NOT HAVE an IDENTIFIER attribute, as it inherits from the generalized entity.
+ */
+ Entity2 is total/disjoint Entity1 {
+ attribute3 string,
+ attribute4 datetime
}
-
- Departamento {
- idDept int isIdentifier,
- sigla string
- }
-
- Tipo {
- idTipo int isIdentifier,
- descricao string
- }
-
- Projeto {
- idProjeto int isIdentifier,
- descricao string
- }
-
- Materiais {
- idMaterial int isIdentifier,
- descricao string,
- validade string
- }
-
- Fornecedor {
- idFornecedor int isIdentifier,
- cnpj int,
- nomeFantasia string,
- telefone int
- }
-
};
Relationships {
- Supervisiona [Empregado (0:1) relates (1:N) Empregado]
- Desenvolve [Empregado (1:N) relates (0:N) Projeto]
- Lotado [Empregado (1:N) relates (0:1) Departamento]
- Tem [Departamento (1:1) relates (1:1) Tipo]
- Controla [Departamento (1:N) relates (0:N) Projeto]
- Fornecimento [Materiais (0:N) relates (1:N) Fornecedor]
- ProjFornec [Projeto (1:N) relates (1:N) Fornecimento]
+ Relationship1 [Entity1 (1:N) relates (1:N) Entity2] {attribute5 int}
+ Relationship2 [Entity2 (1:N) relates (1:N) Entity1]
};
-
«ENDIF»
''')
}
diff --git a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
index b207547..1ea9cb0 100644
--- a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
+++ b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/ErDslProjectTemplateProvider.xtend
@@ -25,13 +25,13 @@ class ErDslProjectTemplateProvider implements IProjectTemplateProvider {
}
}
-@ProjectTemplate(label="org.project.ertext.template", icon="project_template.png", description="
ERtext TEMPLATE
-
This is a parameterized template for ERtext. You can set a parameter to modify the content in the generated file and a parameter
+@ProjectTemplate(label="org.project.ertext.template", icon="project_template.png", description="
ERtext Project Template
+
This is a parameterized project template for ERtext. You can set a parameter to modify the content in the generated file and a parameter
to set the package the file is created in.
")
final class ERtextProject {
val advanced = check("Advanced:", false)
val advancedGroup = group("Properties")
- val name = combo("Name:", #["Xtext", "World", "Foo", "Bar"], "The name to say 'Hello' to", advancedGroup)
+ val name = combo("Name:", #["Xtext"], "Xtext:", advancedGroup)
val path = text("Package:", "ERtext", "The package path to place the files in", advancedGroup)
override protected updateVariables() {
@@ -58,67 +58,36 @@ final class ERtextProject {
projectNatures += #[XtextProjectHelper.NATURE_ID]
builderIds += #[JavaCore.BUILDER_ID, XtextProjectHelper.BUILDER_ID]
folders += "src"
- addFile('''src/Blank_Model.erdsl''', '''
+ addFile('''src/TemplateModel.erdsl''', '''
/*
- * Hello new user!
- *
- * This is an example model
- */
-
+ * The template to demonstrate an overview of the grammar.
+ * This does not necessarily displays a semantically correct model regarding to the real world.
+ */
+
Generate All;
- Domain The_Employees_Sample_Schema;
+ Domain Name;
Entities {
-
- Person {
- person_no int isIdentifier,
- gender boolean
- }
-
- Employee is total/overlapped Person {
- emp_no int isIdentifier,
- birth_dt datetime,
- first_name string,
- last_name string,
- hire_dt datetime
- }
-
- Dependent is total/overlapped Person {
- dependent_no int isIdentifier,
- first_name string,
- last_name string
- }
-
- Salary {
- salary_no int isIdentifier,
- salary money,
- from_dt datetime,
- to_dt datetime
- }
-
- Departament {
- dept_no int isIdentifier,
- name string,
- goals_description string
+ Entity1 {
+ attribute1 int isIdentifier,
+ attribute2 file
}
-
- Title {
- title_no int isIdentifier,
- name string,
- description string,
- from_dt datetime,
- to_dt datetime
+
+ /* The generalization type can be:
+ * [1] total/disjoint, [2] total/overlapped, [3] partial/disjoint OR [4] partial/overlapped
+ *
+ * An entity that specializes another should NOT HAVE an IDENTIFIER attribute, as it inherits from the generalized entity.
+ */
+ Entity2 is total/disjoint Entity1 {
+ attribute3 string,
+ attribute4 datetime
}
-
};
Relationships {
- Dept_manager [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}
- Dept_emp [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}
- Payment [Salary (1:N) relates (1:1) Employee]
- JobTitle [Title (1:N) relates (1:1) Employee]
- Dependency [Employee (1:1) relates (1:N) Dependent]
+ Relationship1 [Entity1 (1:N) relates (1:N) Entity2] {attribute5 int}
+ Relationship2 [Entity2 (1:N) relates (1:N) Entity1]
};
''')
])
diff --git a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/messages.properties b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
index 5916d6a..869a50d 100644
--- a/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
+++ b/org.xtext.unipampa.erdsl.ui/src/org/xtext/unipampa/erdsl/ui/wizard/messages.properties
@@ -1,4 +1,4 @@
ERtextFile_Label=ERDSL Template
ERtextFile_Description=Create a template file for ERDSl.
ERtextProject_Label=org.project.ertext.template
-ERtextProject_Description=
ERtext TEMPLATE
This is a parameterized template for ERtext. You can set a parameter to modify the content in the generated file and a parameter to set the package the file is created in.
+ERtextProject_Description=
ERtext Project Template
This is a parameterized project template for ERtext. You can set a parameter to modify the content in the generated file and a parameter to set the package the file is created in.
This is a parameterized template for ERtext. You can set a parameter to modify the content in the generated file and a parameter \nto set the package the file is created in.
This is a parameterized project template for ERtext. You can set a parameter to modify the content in the generated file and a parameter \nto set the package the file is created in.
")
@SuppressWarnings("all")
public final class ERtextProject extends AbstractProjectTemplate {
private final BooleanTemplateVariable advanced = this.check("Advanced:", false);
private final GroupTemplateVariable advancedGroup = this.group("Properties");
- private final StringSelectionTemplateVariable name = this.combo("Name:", new String[] { "Xtext", "World", "Foo", "Bar" }, "The name to say \'Hello\' to", this.advancedGroup);
+ private final StringSelectionTemplateVariable name = this.combo("Name:", new String[] { "Xtext" }, "Xtext:", this.advancedGroup);
private final StringTemplateVariable path = this.text("Package:", "ERtext", "The package path to place the files in", this.advancedGroup);
@@ -71,166 +71,76 @@ public void generateProjects(final IProjectGenerator generator) {
List _folders = it.getFolders();
_folders.add("src");
StringConcatenation _builder = new StringConcatenation();
- _builder.append("src/Blank_Model.erdsl");
+ _builder.append("src/TemplateModel.erdsl");
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("/*");
_builder_1.newLine();
- _builder_1.append(" ");
- _builder_1.append("* Hello new user!");
+ _builder_1.append("* The template to demonstrate an overview of the grammar. ");
_builder_1.newLine();
- _builder_1.append(" ");
- _builder_1.append("*");
+ _builder_1.append("* This does not necessarily displays a semantically correct model regarding to the real world.");
_builder_1.newLine();
- _builder_1.append(" ");
- _builder_1.append("* This is an example model");
- _builder_1.newLine();
- _builder_1.append(" ");
_builder_1.append("*/");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("Generate All;");
_builder_1.newLine();
_builder_1.newLine();
- _builder_1.append("Domain The_Employees_Sample_Schema;");
+ _builder_1.append("Domain Name;");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("Entities {");
_builder_1.newLine();
_builder_1.append("\t");
+ _builder_1.append("Entity1 {");
_builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Person {");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("person_no int isIdentifier,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("gender boolean");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("}");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Employee is total/overlapped Person {");
- _builder_1.newLine();
- _builder_1.append("\t ");
- _builder_1.append("emp_no int isIdentifier,");
- _builder_1.newLine();
- _builder_1.append("\t ");
- _builder_1.append("birth_dt datetime,");
- _builder_1.newLine();
- _builder_1.append("\t ");
- _builder_1.append("first_name string,");
- _builder_1.newLine();
- _builder_1.append("\t ");
- _builder_1.append("last_name string,");
- _builder_1.newLine();
- _builder_1.append("\t ");
- _builder_1.append("hire_dt datetime\t");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("}");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Dependent is total/overlapped Person {");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("dependent_no int isIdentifier,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("first_name string,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("last_name string");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("}");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Salary {");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("salary_no int isIdentifier,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("salary money,");
+ _builder_1.append(" \t");
+ _builder_1.append("attribute1 int isIdentifier,");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("from_dt datetime,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("to_dt datetime");
+ _builder_1.append(" ");
+ _builder_1.append("attribute2 file");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("}");
_builder_1.newLine();
- _builder_1.append("\t");
+ _builder_1.append(" ");
_builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Departament {");
+ _builder_1.append(" ");
+ _builder_1.append("/* The generalization type can be:");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("dept_no int isIdentifier,");
+ _builder_1.append(" ");
+ _builder_1.append("* [1] total/disjoint, [2] total/overlapped, [3] partial/disjoint OR [4] partial/overlapped");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("name string, ");
+ _builder_1.append(" ");
+ _builder_1.append("* ");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("goals_description string");
+ _builder_1.append(" ");
+ _builder_1.append("* \tAn entity that specializes another should NOT HAVE an IDENTIFIER attribute, as it inherits from the generalized entity.");
_builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("}");
- _builder_1.newLine();
- _builder_1.append("\t");
+ _builder_1.append(" ");
+ _builder_1.append("*/");
_builder_1.newLine();
_builder_1.append("\t");
- _builder_1.append("Title\t {");
+ _builder_1.append("Entity2 is total/disjoint Entity1 {");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("title_no int isIdentifier,");
+ _builder_1.append(" \t");
+ _builder_1.append("attribute3 string,");
_builder_1.newLine();
_builder_1.append("\t\t");
- _builder_1.append("name string,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("description string,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("from_dt datetime,");
- _builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.append("to_dt datetime\t\t");
+ _builder_1.append("attribute4 datetime");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("}");
_builder_1.newLine();
- _builder_1.append("\t\t");
- _builder_1.newLine();
_builder_1.append("};");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("Relationships {");
_builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Dept_manager [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Dept_emp\t [Employee (1:N) relates (1:N) Departament] {from_dt datetime, to_dt datetime}");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Payment \t [Salary (1:N) relates (1:1) Employee]");
- _builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("JobTitle\t [Title (1:N) relates (1:1) Employee]");
+ _builder_1.append("\t\t");
+ _builder_1.append("Relationship1 [Entity1 (1:N) relates (1:N) Entity2] {attribute5 int}");
_builder_1.newLine();
- _builder_1.append("\t");
- _builder_1.append("Dependency\t [Employee (1:1) relates (1:N) Dependent]");
+ _builder_1.append("\t\t");
+ _builder_1.append("Relationship2 [Entity2 (1:N) relates (1:N) Entity1]\t");
_builder_1.newLine();
_builder_1.append("};");
_builder_1.newLine();
diff --git a/org.xtext.unipampa.erdsl/.project b/org.xtext.unipampa.erdsl/.project
index 4c6ee4b..a92bd7e 100644
--- a/org.xtext.unipampa.erdsl/.project
+++ b/org.xtext.unipampa.erdsl/.project
@@ -31,4 +31,15 @@
org.eclipse.jdt.core.javanatureorg.eclipse.pde.PluginNature
+
+
+ 1636089992882
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin
index f438000..ac2a19d 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin
index c4349e2..816d075 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2 b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
index b5f09fb..03aebed 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
@@ -60,6 +60,7 @@ Workflow {
junitSupport = {
junitVersion = "5"
}
+// fragment = org.eclipse.xtext.xtext.generator.ui.codemining.CodeMiningFragment {}
}
}
}
\ No newline at end of file
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.class
index c76bd7b..90448d0 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.class
index 84b3539..384d915 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin
index f7316fc..e8cc5a5 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace
index 5da63db..36a3872 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin
index 92f0abb..c46326d 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace
index 1458a24..27791b7 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin
index 368eb40..8190493 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace
index edcf40e..93b464f 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin
index d26d56c..e6be5e0 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace
index 7b1ad0c..de4cb1d 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin
index 58c48f5..9a323f2 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.class
index 71014a5..3c70c9d 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
index e97d656..4616f14 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
@@ -17,7 +17,7 @@ class HtmlFileGenerator extends AbstractGenerator {
try {
- fsa.generateFile('Logical_Textual_Scheme.html', CreateLogical(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_Logical.html', CreateLogical(modeloER))
} catch (Exception e) {
@@ -249,7 +249,7 @@ class HtmlFileGenerator extends AbstractGenerator {
«IF aux.is === null»
«IF !relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
«html_ListPKtoFK(aux)»
- «ELSE»
+ «ELSEIF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
«html_ListPKtoFK_SelfRelationship(aux, relation.name.toLowerCase)»
«ENDIF»
«ELSEIF aux.is !== null»
@@ -317,9 +317,16 @@ class HtmlFileGenerator extends AbstractGenerator {
«FOR entity : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(entity.name) && !(relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isIsKey] SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isIsKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isIsKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk
+ «ENDFOR»
+ «ENDIF»
+
«ENDIF»
«ENDFOR»
@@ -338,15 +345,27 @@ class HtmlFileGenerator extends AbstractGenerator {
*
*/»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(entity.name) && (relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isKey] SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk_1
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_1
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_1
+ «ENDFOR»
+ «ENDIF»
«ENDIF»
«IF relation.rightEnding.target.toString.equalsIgnoreCase(entity.name) && (relation.rightEnding.target.toString.equalsIgnoreCase(relation.leftEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk_2
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_2
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_2
+ «ENDFOR»
+ «ENDIF»
«ENDIF»
«ENDFOR»
@@ -439,21 +458,65 @@ class HtmlFileGenerator extends AbstractGenerator {
'''
def private html_ListPKtoFK_Alt (Entity e) '''
- «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
- «att.name.toLowerCase»_fk
- «ENDFOR»
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ENDIF»
+ '''
+
+ def private html_ListPKtoFK_Alt (Entity e, String r) '''
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ENDIF»
'''
def private html_ListPKtoFK_SelfRelationship (Entity e, String r) '''
- «FOR att : e.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
- «att.name.toLowerCase+"_"+r»_fk
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «att.name.toLowerCase+"_"+r»_fk
«ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ENDIF»
+
+
'''
def private html_ListPKtoFK_SelfRelationship_Alt (Entity e, String r) '''
- «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
- «att.name.toLowerCase+"_"+r»_fk
- «ENDFOR»
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ENDIF»
+ '''
+
+ def private html_ListPKtoFK_SelfRelationship_Alt (Entity e, int i) '''
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk_«i»
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk_«i»
+ «ENDFOR»
+ «ENDIF»
'''
def private html_RelationshipsMapping(ERModel m) '''
@@ -502,7 +565,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:1)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:1)')))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -539,7 +602,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:N)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:N)'))))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -566,7 +629,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:1)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:1)'))))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.rightEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -604,17 +667,25 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:N)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:N)')))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
- «html_ListPKtoFK_Alt(relation.leftEnding.target as Entity)»
+ «IF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
+ «html_ListPKtoFK_SelfRelationship_Alt(relation.leftEnding.target as Entity, 1)»
+ «ELSE»
+ «html_ListPKtoFK_Alt(relation.leftEnding.target as Entity)»
+ «ENDIF»
) in «html_EntityNameTag(relation.name)» references «html_EntityNameTag(relation.leftEnding.target.toString)»
Attribute (
- «html_ListPKtoFK_Alt(relation.rightEnding.target as Entity)»
+ «IF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
+ «html_ListPKtoFK_SelfRelationship_Alt(relation.rightEnding.target as Entity, 2)»
+ «ELSE»
+ «html_ListPKtoFK_Alt(relation.rightEnding.target as Entity)»
+ «ENDIF»
) in «html_EntityNameTag(relation.name)» references «html_EntityNameTag(relation.rightEnding.target.toString)»
@@ -631,7 +702,7 @@ class HtmlFileGenerator extends AbstractGenerator {
«IF relation.name.nullOrEmpty» _Unnamed_ «ELSEIF !relation.name.nullOrEmpty»«relation.name.toUpperCase»«ENDIF»
«relation.leftEnding.target.toString.toUpperCase+" "+relation.leftEnding.cardinality.toString.toUpperCase» relates «relation.rightEnding.cardinality.toUpperCase+" "+ relation.rightEnding.target.toString.toUpperCase»
-
+
«html_Ternary_Relationships_Attributes(m, relation)»
«ENDFOR»
'''
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.class
index 2c3ff0c..8c1ceac 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
index b391f00..63124f5 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
@@ -9,7 +9,7 @@ import org.xtext.unipampa.erdsl.erDsl.Entity
import org.xtext.unipampa.erdsl.erDsl.Relation
import org.xtext.unipampa.erdsl.erDsl.Attribute
import java.util.ArrayList
-
+import java.util.HashMap
/**
*
@@ -27,29 +27,28 @@ class MysqlFileGenerator extends AbstractGenerator {
var primaryKeys = new ArrayList()
var inheritedPrimaryKeys = new ArrayList()
var primaryKeys_NtoN = new ArrayList
+ var primaryKeys_Ternary = new ArrayList
+ var mapTernary = new HashMap();
+
var StringBuilder sc_AlterTbl_1to1 = new StringBuilder
var StringBuilder sc_AlterTbl_1toN = new StringBuilder
var StringBuilder sc_AlterTbl_NtoN = new StringBuilder
- var StringBuilder sc_AlterTbl_Ternary = new StringBuilder
+ var StringBuilder sc_AlterTbl_Ternary = new StringBuilder
override doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) {
val modeloER = input.contents.get(0) as ERModel
try {
- fsa.generateFile('MySQL_DDL.sql', mysql_CreateModel(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_My.sql', mysql_CreateModel(modeloER))
} catch (Exception e) {
println(e.stackTrace.toString)
}
}
def private mysql_CreateModel(ERModel modeloER) '''
- -- ####################################################
- -- # MySQL Template #
- -- ####################################################
- -- # Generated by ERtext #
- -- ####################################################
+ -- MySQL Template generated by ERtext
«mysql_DomainMapper(modeloER)»
@@ -71,13 +70,14 @@ class MysqlFileGenerator extends AbstractGenerator {
'''
def private mysql_DomainMapper (ERModel m) '''
- -- Database: «m.domain.name.toString.toUpperCase»
+ -- Database: «m.domain.name.toString.toUpperCase»;
+ -- CREATE DATABASE «m.domain.name.toString.toUpperCase»;
+ -- USE «m.domain.name.toString.toUpperCase»;
-- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- -- CREATE DATABASE IF NOT EXISTS «m.domain.name.toString.toUpperCase»»
- --DROP TABLE IF EXISTS
- -- «FOR e : m.entities SEPARATOR ", "»public."«e.name.toLowerCase»"«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»public."«r.name.toLowerCase»"«ENDFOR»
- -- CASCADE;
+««« -- DROP TABLE IF EXISTS
+««« -- «FOR e : m.entities SEPARATOR ", "»«e.name.toLowerCase»«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»«r.name.toLowerCase»«ENDFOR»
+««« -- CASCADE;
'''
def private mysql_SimpleEntitiesMapper(ERModel m) '''
@@ -144,7 +144,7 @@ class MysqlFileGenerator extends AbstractGenerator {
«ELSEIF a.type.toString.equalsIgnoreCase("money")»«a.name.toLowerCase» NUMERIC NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("double")»«a.name.toLowerCase» FLOAT NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("boolean")»«a.name.toLowerCase» BIT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("file")»«a.name.toLowerCase» BLOB NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("file")»«a.name.toLowerCase» BINARY NOT NULL,
«ENDIF»
'''
@@ -154,8 +154,8 @@ class MysqlFileGenerator extends AbstractGenerator {
«ELSEIF a.type.toString.equalsIgnoreCase("datetime")» DATE NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("money")» NUMERIC NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("double")» FLOAT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("boolean")» BIT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("file")» BLOB NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("boolean")» BOOLEAN NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("file")» BINARY NOT NULL,
«ENDIF»
'''
@@ -392,56 +392,141 @@ class MysqlFileGenerator extends AbstractGenerator {
'''
def private mysql_TernaryEntitiesMapper(ERModel model) '''
- -- #######################################################
- -- #TODO: auto-generated method stub for Ternary Entities#
- -- #######################################################
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Relation && i.rightEnding.target instanceof Entity]»
+ «var auxRel = r.leftEnding.target as Relation»
+ «var auxEnt = r.rightEnding.target as Entity»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 1
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é relação: «auxRel.name.toUpperCase»
+««« -- Direita é entidade: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «mysql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(mysql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+
+ «ENDFOR»
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Entity && i.rightEnding.target instanceof Relation]»
+ «var auxEnt = r.leftEnding.target as Entity»
+ «var auxRel = r.rightEnding.target as Relation»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «mysql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(mysql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+ «ENDFOR»
'''
def private mysql_GeneralizationRefMapper(ERModel m) '''
-
«FOR e : m.entities.filter[is !== null]»
-- GENERALIZATION
- ALTER TABLE ONLY public.«e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES public.«e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
-
+ ALTER TABLE «e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES «e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
«ENDFOR»
'''
def private mysql_AlterTable_1to1_1toN_RefMapper(Entity alterTbl, Entity refTbl, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«alterTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «alterTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relNoGen»
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
def private mysql_AlterTable_NtoN_RefMapper(Entity leftEnt, Entity rightEnt, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES «rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES «rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relNoGen»
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
-}
\ No newline at end of file
+ def private mysql_AlterTable_Ternary_RefMapper(String tabelaTernaria, String tabelaEntidade, String nomeRelacaoNN, String leftNN, String rightNN, HashMap keysMap) '''
+««« MAPA DO «tabelaEntidade.toUpperCase»: «FOR e : mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «leftNN.toUpperCase»: «FOR e : mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «rightNN.toUpperCase»: «FOR e : mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+ -- [Ternary Relationship]
+ ALTER TABLE «tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+tabelaEntidade.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«tabelaEntidade.toString.toLowerCase+"_"+e.toString»«ENDFOR») REFERENCES «tabelaEntidade» («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ ALTER TABLE «tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+nomeRelacaoNN.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR») REFERENCES «nomeRelacaoNN» («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ '''
+}
+
+
+
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.class
index d510432..c2037c3 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
index 4e57294..1a8c84c 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
@@ -28,15 +28,15 @@ class PlantUmlFileGenerator extends AbstractGenerator {
new SourceStringReader(plantUML).generateImage(out)
- (fsa as IFileSystemAccessExtension3).generateFile("Diagram_(Conceptual_Model).png",
+ (fsa as IFileSystemAccessExtension3).generateFile(modeloER.domain.name.toLowerCase+"_Diagram.png",
new ByteArrayInputStream(out.toByteArray))
- fsa.generateFile("Diagram_DescriptorGenerated.puml", plantUML)
+ fsa.generateFile(modeloER.domain.name.toLowerCase+"_DiagramDesc_Gen.puml", plantUML)
} else {
- fsa.generateFile("Diagram_ParcialDescriptorGenerated.puml", plantUML)
+ fsa.generateFile(modeloER.domain.name.toLowerCase+"_DiagramDesc_PartialGen.puml", plantUML)
}
}
@@ -109,11 +109,11 @@ class PlantUmlFileGenerator extends AbstractGenerator {
«IF !(leftEnding.target instanceof Entity) || !(rightEnding.target instanceof Entity)»
«IF leftEnding.target instanceof Relation»
«leftEnding.target.toString.toLowerCase»_dmd --«defineRightCardinalitySymbolUML(rightEnding.cardinality.toString)» «rightEnding.target.toString.toLowerCase»
- note "Ternary\n Entity" as N_«leftEnding.target.toString.toLowerCase»_dmd
+ note "Ternary\n Relationship" as N_«leftEnding.target.toString.toLowerCase»_dmd
N_«leftEnding.target.toString.toLowerCase»_dmd .. «leftEnding.target.toString.toLowerCase»_dmd
«ELSEIF rightEnding.target instanceof Relation»
«leftEnding.target.toString.toLowerCase» «defineLeftCardinalitySymbolUML(leftEnding.cardinality.toString)»-- «rightEnding.target.toString.toLowerCase»_dmd
- note "Ternary\n Entity" as N_«rightEnding.target.toString.toLowerCase»_dmd
+ note "Ternary\n Relationship" as N_«rightEnding.target.toString.toLowerCase»_dmd
N_«rightEnding.target.toString.toLowerCase»_dmd .. «rightEnding.target.toString.toLowerCase»_dmd
«ENDIF»
«ENDIF»
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.class
index f1e5cfd..301b89c 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
index 1183ae1..77c7350 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
@@ -9,7 +9,7 @@ import org.xtext.unipampa.erdsl.erDsl.Entity
import org.xtext.unipampa.erdsl.erDsl.Relation
import org.xtext.unipampa.erdsl.erDsl.Attribute
import java.util.ArrayList
-
+import java.util.HashMap
/**
*
@@ -27,6 +27,9 @@ class PostgresqlFileGenerator extends AbstractGenerator {
var primaryKeys = new ArrayList()
var inheritedPrimaryKeys = new ArrayList()
var primaryKeys_NtoN = new ArrayList
+ var primaryKeys_Ternary = new ArrayList
+ var mapTernary = new HashMap();
+
var StringBuilder sc_AlterTbl_1to1 = new StringBuilder
var StringBuilder sc_AlterTbl_1toN = new StringBuilder
@@ -38,7 +41,7 @@ class PostgresqlFileGenerator extends AbstractGenerator {
val modeloER = input.contents.get(0) as ERModel
try {
- fsa.generateFile('PgSQL_DDL.sql', pgsql_CreateModel(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_Postgre.sql', pgsql_CreateModel(modeloER))
} catch (Exception e) {
println(e.stackTrace.toString)
}
@@ -46,11 +49,7 @@ class PostgresqlFileGenerator extends AbstractGenerator {
def private pgsql_CreateModel(ERModel modeloER) '''
- -- ####################################################
- -- # PostGreSQL Template #
- -- ####################################################
- -- # Generated by ERtext #
- -- ####################################################
+ -- PostGreSQL Template generated by ERtext
«pgsql_DomainMapper(modeloER)»
@@ -72,15 +71,15 @@ class PostgresqlFileGenerator extends AbstractGenerator {
'''
def private pgsql_DomainMapper (ERModel m) '''
- -- Database: «m.domain.name.toString.toUpperCase»
- -- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- -- CREATE DATABASE «m.domain.name.toString.toUpperCase»»
+ -- Database: «m.domain.name.toString.toUpperCase»;
+ -- CREATE DATABASE «m.domain.name.toString.toUpperCase»;
-- WITH OWNER = postgres
-- ENCODING = 'UTF8'
-- TABLESPACE = pg_default
-- CONNECTION LIMIT = -1;
+ -- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- --DROP TABLE IF EXISTS
+ -- DROP TABLE IF EXISTS
-- «FOR e : m.entities SEPARATOR ", "»public."«e.name.toLowerCase»"«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»public."«r.name.toLowerCase»"«ENDFOR»
-- CASCADE;
'''
@@ -397,17 +396,105 @@ class PostgresqlFileGenerator extends AbstractGenerator {
'''
def private pgsql_TernaryEntitiesMapper(ERModel model) '''
- -- #######################################################
- -- #TODO: auto-generated method stub for Ternary Entities#
- -- #######################################################
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Relation && i.rightEnding.target instanceof Entity]»
+ «var auxRel = r.leftEnding.target as Relation»
+ «var auxEnt = r.rightEnding.target as Entity»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 1
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é relação: «auxRel.name.toUpperCase»
+««« -- Direita é entidade: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «pgsql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« -- MAPA DO «auxEnt.name.toUpperCase»: «FOR element : mapTernary.get(auxEnt.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxLeftEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxLeftEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxRightEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxRightEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(pgsql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+
+ «ENDFOR»
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Entity && i.rightEnding.target instanceof Relation]»
+ «var auxEnt = r.leftEnding.target as Entity»
+ «var auxRel = r.rightEnding.target as Relation»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 2
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é entidade: «auxRel.name.toUpperCase»
+««« -- Direita é relação: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «pgsql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« -- MAPA DO «auxEnt.name.toUpperCase»: «FOR element : mapTernary.get(auxEnt.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxLeftEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxLeftEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxRightEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxRightEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(pgsql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+ «ENDFOR»
'''
def private pgsql_GeneralizationRefMapper(ERModel m) '''
-
«FOR e : m.entities.filter[is !== null]»
-- GENERALIZATION
ALTER TABLE ONLY public.«e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES public.«e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
-
«ENDFOR»
'''
@@ -425,19 +512,16 @@ class PostgresqlFileGenerator extends AbstractGenerator {
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
def private pgsql_AlterTable_NtoN_RefMapper(Entity leftEnt, Entity rightEnt, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
@@ -446,9 +530,16 @@ class PostgresqlFileGenerator extends AbstractGenerator {
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
+ def private pgsql_AlterTable_Ternary_RefMapper(String tabelaTernaria, String tabelaEntidade, String nomeRelacaoNN, String leftNN, String rightNN, HashMap keysMap) '''
+««« MAPA DO «tabelaEntidade.toUpperCase»: «FOR e : mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «leftNN.toUpperCase»: «FOR e : mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «rightNN.toUpperCase»: «FOR e : mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+ -- [Ternary Relationship]
+ ALTER TABLE ONLY public.«tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+tabelaEntidade.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«tabelaEntidade.toString.toLowerCase+"_"+e.toString»«ENDFOR») REFERENCES public.«tabelaEntidade» («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ ALTER TABLE ONLY public.«tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+nomeRelacaoNN.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR») REFERENCES public.«nomeRelacaoNN» («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ '''
}
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.java._trace b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.java._trace
index 178299a..127c18d 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.java._trace and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.xtendbin
index d99f9a1..440641e 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/.ErDslScopeProvider.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.class b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.class
index d7d8878..b7dc64e 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.class and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.class differ
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
index 5c5b231..fc4a8b0 100644
--- a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
+++ b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
@@ -20,25 +20,31 @@ import org.xtext.unipampa.erdsl.erDsl.Relation
class ErDslScopeProvider extends AbstractErDslScopeProvider {
- override IScope getScope(EObject context, EReference reference) {
- if (context instanceof Entity) {
- if (true) {
+// override IScope getScope(EObject context, EReference reference) {
+// if (context instanceof Entity) {
+// if (true) {
// println("ENTIDADE\n CONTEXTO = " + context.name.toString)
// println(" REFERENCIA = " + reference.name.toString)
- }
- return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
- } else if (context instanceof Relation) {
- if (true) {
+// }
+// return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
+// } else if (context instanceof Relation) {
+// if (true) {
// println("RELAÇÃO\n CONTEXTO = " + context.name.toString)
// println(" REFERENCIA = " + reference.name.toString)
- }
+// }
// println("ENTIDADES: "+Scopes.scopeFor((context.eContainer as ERModel).entities));
// println("RELAÇÕES: "+Scopes.scopeFor((context.eContainer as ERModel).relations));
// return Scopes.scopeFor((context.eContainer as ERModel).relations.filter[x|x != context])
+// }
+// return super.getScope(context, reference)
+// }
+
+ override IScope getScope(EObject context, EReference reference) {
+ if (context instanceof Entity) {
+ return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
}
- return super.getScope(context, reference)
+ return super.getScope(context, reference)
}
-
}
diff --git a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/validation/.ErDslValidator.xtendbin b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/validation/.ErDslValidator.xtendbin
index 5f8c65c..128aecd 100644
Binary files a/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/validation/.ErDslValidator.xtendbin and b/org.xtext.unipampa.erdsl/bin/org/xtext/unipampa/erdsl/validation/.ErDslValidator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.java b/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.java
index 430b3da..842ec49 100644
--- a/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.java
+++ b/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/EntityImpl.java
@@ -364,6 +364,7 @@ public String toString()
// result.append(generalization);
// result.append(')');
// return result.toString();
+
return name;
}
diff --git a/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.java b/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.java
index 7debfc6..1080792 100644
--- a/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.java
+++ b/org.xtext.unipampa.erdsl/src-gen/org/xtext/unipampa/erdsl/erDsl/impl/RelationImpl.java
@@ -387,6 +387,7 @@ public String toString()
// result.append(name);
// result.append(')');
// return result.toString();
+
return name;
}
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2 b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
index b5f09fb..03aebed 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/GenerateErDsl.mwe2
@@ -60,6 +60,7 @@ Workflow {
junitSupport = {
junitVersion = "5"
}
+// fragment = org.eclipse.xtext.xtext.generator.ui.codemining.CodeMiningFragment {}
}
}
}
\ No newline at end of file
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
index e97d656..4616f14 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.xtend
@@ -17,7 +17,7 @@ class HtmlFileGenerator extends AbstractGenerator {
try {
- fsa.generateFile('Logical_Textual_Scheme.html', CreateLogical(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_Logical.html', CreateLogical(modeloER))
} catch (Exception e) {
@@ -249,7 +249,7 @@ class HtmlFileGenerator extends AbstractGenerator {
«IF aux.is === null»
«IF !relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
«html_ListPKtoFK(aux)»
- «ELSE»
+ «ELSEIF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
«html_ListPKtoFK_SelfRelationship(aux, relation.name.toLowerCase)»
«ENDIF»
«ELSEIF aux.is !== null»
@@ -317,9 +317,16 @@ class HtmlFileGenerator extends AbstractGenerator {
«FOR entity : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(entity.name) && !(relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isIsKey] SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isIsKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isIsKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk
+ «ENDFOR»
+ «ENDIF»
+
«ENDIF»
«ENDFOR»
@@ -338,15 +345,27 @@ class HtmlFileGenerator extends AbstractGenerator {
*
*/»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(entity.name) && (relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isKey] SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk_1
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_1
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isKey] SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_1
+ «ENDFOR»
+ «ENDIF»
«ENDIF»
«IF relation.rightEnding.target.toString.equalsIgnoreCase(entity.name) && (relation.rightEnding.target.toString.equalsIgnoreCase(relation.leftEnding.target.toString))»
- «FOR attribute : entity.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
- «html_AttributeStyleForInheritedPK(attribute)»_fk_2
- «ENDFOR»
+ «IF entity.is !== null»
+ «FOR attribute : entity.is.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_2
+ «ENDFOR»
+ «ELSE»
+ «FOR attribute : entity.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «html_AttributeStyleForInheritedPK(attribute)»_fk_2
+ «ENDFOR»
+ «ENDIF»
«ENDIF»
«ENDFOR»
@@ -439,21 +458,65 @@ class HtmlFileGenerator extends AbstractGenerator {
'''
def private html_ListPKtoFK_Alt (Entity e) '''
- «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
- «att.name.toLowerCase»_fk
- «ENDFOR»
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ENDIF»
+ '''
+
+ def private html_ListPKtoFK_Alt (Entity e, String r) '''
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk
+ «ENDFOR»
+ «ENDIF»
'''
def private html_ListPKtoFK_SelfRelationship (Entity e, String r) '''
- «FOR att : e.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
- «att.name.toLowerCase+"_"+r»_fk
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «att.name.toLowerCase+"_"+r»_fk
«ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] BEFORE " | " SEPARATOR " | "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ENDIF»
+
+
'''
def private html_ListPKtoFK_SelfRelationship_Alt (Entity e, String r) '''
- «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
- «att.name.toLowerCase+"_"+r»_fk
- «ENDFOR»
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase+"_"+r»_fk
+ «ENDFOR»
+ «ENDIF»
+ '''
+
+ def private html_ListPKtoFK_SelfRelationship_Alt (Entity e, int i) '''
+ «IF e.is !== null»
+ «FOR att : e.is.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk_«i»
+ «ENDFOR»
+ «ELSE»
+ «FOR att : e.attributes.filter[isIsKey] SEPARATOR " , "»
+ «att.name.toLowerCase»_fk_«i»
+ «ENDFOR»
+ «ENDIF»
'''
def private html_RelationshipsMapping(ERModel m) '''
@@ -502,7 +565,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:1)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:1)')))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -539,7 +602,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:N)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:N)'))))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.leftEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -566,7 +629,7 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:1)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:1)'))))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
«FOR aux : m.entities»
«IF relation.rightEnding.target.toString.equalsIgnoreCase(aux.name)»
@@ -604,17 +667,25 @@ class HtmlFileGenerator extends AbstractGenerator {
(relation.rightEnding.cardinality.equalsIgnoreCase('(0:N)') || relation.rightEnding.cardinality.equalsIgnoreCase('(1:N)')))»
«html_BinaryRelationshipNameStyle(relation.name, relation.leftEnding.target.toString, relation.rightEnding.target.toString, relation.leftEnding.cardinality, relation.rightEnding.cardinality)»
-
+
Attribute (
- «html_ListPKtoFK_Alt(relation.leftEnding.target as Entity)»
+ «IF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
+ «html_ListPKtoFK_SelfRelationship_Alt(relation.leftEnding.target as Entity, 1)»
+ «ELSE»
+ «html_ListPKtoFK_Alt(relation.leftEnding.target as Entity)»
+ «ENDIF»
) in «html_EntityNameTag(relation.name)» references «html_EntityNameTag(relation.leftEnding.target.toString)»
Attribute (
- «html_ListPKtoFK_Alt(relation.rightEnding.target as Entity)»
+ «IF relation.leftEnding.target.toString.equalsIgnoreCase(relation.rightEnding.target.toString)»
+ «html_ListPKtoFK_SelfRelationship_Alt(relation.rightEnding.target as Entity, 2)»
+ «ELSE»
+ «html_ListPKtoFK_Alt(relation.rightEnding.target as Entity)»
+ «ENDIF»
) in «html_EntityNameTag(relation.name)» references «html_EntityNameTag(relation.rightEnding.target.toString)»
@@ -631,7 +702,7 @@ class HtmlFileGenerator extends AbstractGenerator {
«IF relation.name.nullOrEmpty» _Unnamed_ «ELSEIF !relation.name.nullOrEmpty»«relation.name.toUpperCase»«ENDIF»
«relation.leftEnding.target.toString.toUpperCase+" "+relation.leftEnding.cardinality.toString.toUpperCase» relates «relation.rightEnding.cardinality.toUpperCase+" "+ relation.rightEnding.target.toString.toUpperCase»
-
+
«html_Ternary_Relationships_Attributes(m, relation)»
«ENDFOR»
'''
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
index b391f00..63124f5 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.xtend
@@ -9,7 +9,7 @@ import org.xtext.unipampa.erdsl.erDsl.Entity
import org.xtext.unipampa.erdsl.erDsl.Relation
import org.xtext.unipampa.erdsl.erDsl.Attribute
import java.util.ArrayList
-
+import java.util.HashMap
/**
*
@@ -27,29 +27,28 @@ class MysqlFileGenerator extends AbstractGenerator {
var primaryKeys = new ArrayList()
var inheritedPrimaryKeys = new ArrayList()
var primaryKeys_NtoN = new ArrayList
+ var primaryKeys_Ternary = new ArrayList
+ var mapTernary = new HashMap();
+
var StringBuilder sc_AlterTbl_1to1 = new StringBuilder
var StringBuilder sc_AlterTbl_1toN = new StringBuilder
var StringBuilder sc_AlterTbl_NtoN = new StringBuilder
- var StringBuilder sc_AlterTbl_Ternary = new StringBuilder
+ var StringBuilder sc_AlterTbl_Ternary = new StringBuilder
override doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) {
val modeloER = input.contents.get(0) as ERModel
try {
- fsa.generateFile('MySQL_DDL.sql', mysql_CreateModel(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_My.sql', mysql_CreateModel(modeloER))
} catch (Exception e) {
println(e.stackTrace.toString)
}
}
def private mysql_CreateModel(ERModel modeloER) '''
- -- ####################################################
- -- # MySQL Template #
- -- ####################################################
- -- # Generated by ERtext #
- -- ####################################################
+ -- MySQL Template generated by ERtext
«mysql_DomainMapper(modeloER)»
@@ -71,13 +70,14 @@ class MysqlFileGenerator extends AbstractGenerator {
'''
def private mysql_DomainMapper (ERModel m) '''
- -- Database: «m.domain.name.toString.toUpperCase»
+ -- Database: «m.domain.name.toString.toUpperCase»;
+ -- CREATE DATABASE «m.domain.name.toString.toUpperCase»;
+ -- USE «m.domain.name.toString.toUpperCase»;
-- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- -- CREATE DATABASE IF NOT EXISTS «m.domain.name.toString.toUpperCase»»
- --DROP TABLE IF EXISTS
- -- «FOR e : m.entities SEPARATOR ", "»public."«e.name.toLowerCase»"«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»public."«r.name.toLowerCase»"«ENDFOR»
- -- CASCADE;
+««« -- DROP TABLE IF EXISTS
+««« -- «FOR e : m.entities SEPARATOR ", "»«e.name.toLowerCase»«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»«r.name.toLowerCase»«ENDFOR»
+««« -- CASCADE;
'''
def private mysql_SimpleEntitiesMapper(ERModel m) '''
@@ -144,7 +144,7 @@ class MysqlFileGenerator extends AbstractGenerator {
«ELSEIF a.type.toString.equalsIgnoreCase("money")»«a.name.toLowerCase» NUMERIC NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("double")»«a.name.toLowerCase» FLOAT NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("boolean")»«a.name.toLowerCase» BIT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("file")»«a.name.toLowerCase» BLOB NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("file")»«a.name.toLowerCase» BINARY NOT NULL,
«ENDIF»
'''
@@ -154,8 +154,8 @@ class MysqlFileGenerator extends AbstractGenerator {
«ELSEIF a.type.toString.equalsIgnoreCase("datetime")» DATE NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("money")» NUMERIC NOT NULL,
«ELSEIF a.type.toString.equalsIgnoreCase("double")» FLOAT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("boolean")» BIT NOT NULL,
- «ELSEIF a.type.toString.equalsIgnoreCase("file")» BLOB NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("boolean")» BOOLEAN NOT NULL,
+ «ELSEIF a.type.toString.equalsIgnoreCase("file")» BINARY NOT NULL,
«ENDIF»
'''
@@ -392,56 +392,141 @@ class MysqlFileGenerator extends AbstractGenerator {
'''
def private mysql_TernaryEntitiesMapper(ERModel model) '''
- -- #######################################################
- -- #TODO: auto-generated method stub for Ternary Entities#
- -- #######################################################
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Relation && i.rightEnding.target instanceof Entity]»
+ «var auxRel = r.leftEnding.target as Relation»
+ «var auxEnt = r.rightEnding.target as Entity»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 1
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é relação: «auxRel.name.toUpperCase»
+««« -- Direita é entidade: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «mysql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(mysql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+
+ «ENDFOR»
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Entity && i.rightEnding.target instanceof Relation]»
+ «var auxEnt = r.leftEnding.target as Entity»
+ «var auxRel = r.rightEnding.target as Relation»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+mysql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «mysql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(mysql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+ «ENDFOR»
'''
def private mysql_GeneralizationRefMapper(ERModel m) '''
-
«FOR e : m.entities.filter[is !== null]»
-- GENERALIZATION
- ALTER TABLE ONLY public.«e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES public.«e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
-
+ ALTER TABLE «e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES «e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
«ENDFOR»
'''
def private mysql_AlterTable_1to1_1toN_RefMapper(Entity alterTbl, Entity refTbl, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«alterTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «alterTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : alterTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : refTbl.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relNoGen»
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
- ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
def private mysql_AlterTable_NtoN_RefMapper(Entity leftEnt, Entity rightEnt, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES «rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES «rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relNoGen»
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
- ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
+ ALTER TABLE «r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES «leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
-}
\ No newline at end of file
+ def private mysql_AlterTable_Ternary_RefMapper(String tabelaTernaria, String tabelaEntidade, String nomeRelacaoNN, String leftNN, String rightNN, HashMap keysMap) '''
+««« MAPA DO «tabelaEntidade.toUpperCase»: «FOR e : mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «leftNN.toUpperCase»: «FOR e : mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «rightNN.toUpperCase»: «FOR e : mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+ -- [Ternary Relationship]
+ ALTER TABLE «tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+tabelaEntidade.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«tabelaEntidade.toString.toLowerCase+"_"+e.toString»«ENDFOR») REFERENCES «tabelaEntidade» («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ ALTER TABLE «tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+nomeRelacaoNN.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR») REFERENCES «nomeRelacaoNN» («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ '''
+}
+
+
+
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
index 4e57294..1a8c84c 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PlantUmlFileGenerator.xtend
@@ -28,15 +28,15 @@ class PlantUmlFileGenerator extends AbstractGenerator {
new SourceStringReader(plantUML).generateImage(out)
- (fsa as IFileSystemAccessExtension3).generateFile("Diagram_(Conceptual_Model).png",
+ (fsa as IFileSystemAccessExtension3).generateFile(modeloER.domain.name.toLowerCase+"_Diagram.png",
new ByteArrayInputStream(out.toByteArray))
- fsa.generateFile("Diagram_DescriptorGenerated.puml", plantUML)
+ fsa.generateFile(modeloER.domain.name.toLowerCase+"_DiagramDesc_Gen.puml", plantUML)
} else {
- fsa.generateFile("Diagram_ParcialDescriptorGenerated.puml", plantUML)
+ fsa.generateFile(modeloER.domain.name.toLowerCase+"_DiagramDesc_PartialGen.puml", plantUML)
}
}
@@ -109,11 +109,11 @@ class PlantUmlFileGenerator extends AbstractGenerator {
«IF !(leftEnding.target instanceof Entity) || !(rightEnding.target instanceof Entity)»
«IF leftEnding.target instanceof Relation»
«leftEnding.target.toString.toLowerCase»_dmd --«defineRightCardinalitySymbolUML(rightEnding.cardinality.toString)» «rightEnding.target.toString.toLowerCase»
- note "Ternary\n Entity" as N_«leftEnding.target.toString.toLowerCase»_dmd
+ note "Ternary\n Relationship" as N_«leftEnding.target.toString.toLowerCase»_dmd
N_«leftEnding.target.toString.toLowerCase»_dmd .. «leftEnding.target.toString.toLowerCase»_dmd
«ELSEIF rightEnding.target instanceof Relation»
«leftEnding.target.toString.toLowerCase» «defineLeftCardinalitySymbolUML(leftEnding.cardinality.toString)»-- «rightEnding.target.toString.toLowerCase»_dmd
- note "Ternary\n Entity" as N_«rightEnding.target.toString.toLowerCase»_dmd
+ note "Ternary\n Relationship" as N_«rightEnding.target.toString.toLowerCase»_dmd
N_«rightEnding.target.toString.toLowerCase»_dmd .. «rightEnding.target.toString.toLowerCase»_dmd
«ENDIF»
«ENDIF»
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
index 1183ae1..77c7350 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/generator/PostgresqlFileGenerator.xtend
@@ -9,7 +9,7 @@ import org.xtext.unipampa.erdsl.erDsl.Entity
import org.xtext.unipampa.erdsl.erDsl.Relation
import org.xtext.unipampa.erdsl.erDsl.Attribute
import java.util.ArrayList
-
+import java.util.HashMap
/**
*
@@ -27,6 +27,9 @@ class PostgresqlFileGenerator extends AbstractGenerator {
var primaryKeys = new ArrayList()
var inheritedPrimaryKeys = new ArrayList()
var primaryKeys_NtoN = new ArrayList
+ var primaryKeys_Ternary = new ArrayList
+ var mapTernary = new HashMap();
+
var StringBuilder sc_AlterTbl_1to1 = new StringBuilder
var StringBuilder sc_AlterTbl_1toN = new StringBuilder
@@ -38,7 +41,7 @@ class PostgresqlFileGenerator extends AbstractGenerator {
val modeloER = input.contents.get(0) as ERModel
try {
- fsa.generateFile('PgSQL_DDL.sql', pgsql_CreateModel(modeloER))
+ fsa.generateFile(modeloER.domain.name.toLowerCase+'_Postgre.sql', pgsql_CreateModel(modeloER))
} catch (Exception e) {
println(e.stackTrace.toString)
}
@@ -46,11 +49,7 @@ class PostgresqlFileGenerator extends AbstractGenerator {
def private pgsql_CreateModel(ERModel modeloER) '''
- -- ####################################################
- -- # PostGreSQL Template #
- -- ####################################################
- -- # Generated by ERtext #
- -- ####################################################
+ -- PostGreSQL Template generated by ERtext
«pgsql_DomainMapper(modeloER)»
@@ -72,15 +71,15 @@ class PostgresqlFileGenerator extends AbstractGenerator {
'''
def private pgsql_DomainMapper (ERModel m) '''
- -- Database: «m.domain.name.toString.toUpperCase»
- -- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- -- CREATE DATABASE «m.domain.name.toString.toUpperCase»»
+ -- Database: «m.domain.name.toString.toUpperCase»;
+ -- CREATE DATABASE «m.domain.name.toString.toUpperCase»;
-- WITH OWNER = postgres
-- ENCODING = 'UTF8'
-- TABLESPACE = pg_default
-- CONNECTION LIMIT = -1;
+ -- DROP DATABASE «m.domain.name.toString.toUpperCase»;
- --DROP TABLE IF EXISTS
+ -- DROP TABLE IF EXISTS
-- «FOR e : m.entities SEPARATOR ", "»public."«e.name.toLowerCase»"«ENDFOR»«FOR r : m.relations.filter[((leftEnding.cardinality.equalsIgnoreCase('(0:N)') || leftEnding.cardinality.equalsIgnoreCase('(1:N)')) && (rightEnding.cardinality.equalsIgnoreCase('(0:N)') || rightEnding.cardinality.equalsIgnoreCase('(1:N)')))] BEFORE ", " SEPARATOR ", "»public."«r.name.toLowerCase»"«ENDFOR»
-- CASCADE;
'''
@@ -397,17 +396,105 @@ class PostgresqlFileGenerator extends AbstractGenerator {
'''
def private pgsql_TernaryEntitiesMapper(ERModel model) '''
- -- #######################################################
- -- #TODO: auto-generated method stub for Ternary Entities#
- -- #######################################################
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Relation && i.rightEnding.target instanceof Entity]»
+ «var auxRel = r.leftEnding.target as Relation»
+ «var auxEnt = r.rightEnding.target as Entity»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 1
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é relação: «auxRel.name.toUpperCase»
+««« -- Direita é entidade: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «pgsql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« -- MAPA DO «auxEnt.name.toUpperCase»: «FOR element : mapTernary.get(auxEnt.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxLeftEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxLeftEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxRightEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxRightEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(pgsql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+
+ «ENDFOR»
+ «FOR r : model.relations.filter[i|i.leftEnding.target instanceof Entity && i.rightEnding.target instanceof Relation]»
+ «var auxEnt = r.leftEnding.target as Entity»
+ «var auxRel = r.rightEnding.target as Relation»
+ «var auxLeftEntity = auxRel.leftEnding.target as Entity»
+ «var auxRightEntity = auxRel.rightEnding.target as Entity»
+««« -- CASO 2
+««« -- Relação: «r.name.toString.toUpperCase»
+««« -- Esquerda é entidade: «auxRel.name.toUpperCase»
+««« -- Direita é relação: «auxEnt.name.toUpperCase»
+ -- Table: «r.name.toUpperCase»
+ -- DROP TABLE «r.name.toUpperCase»;
+ CREATE TABLE IF NOT EXISTS «r.name.toLowerCase» (
+««« Pega os atributos PK da entidade
+ «FOR att : auxEnt.attributes.filter[isIsKey]» «auxEnt.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]» «auxLeftEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]» «auxRightEntity.name.toLowerCase+"_"+pgsql_AttTypeChecker(att)»
+ «ENDFOR»
+««« lista os atributos do relacionamento caso existam, se tiver alguma pk então adiciona no array de pks
+ «IF r.attributes !== null»
+ «FOR att : r.attributes» «pgsql_AttTypeChecker(att)»«IF att.isIsKey»«{this.primaryKeys_Ternary.add(att.name.toLowerCase); null}»«ENDIF»
+ «ENDFOR»
+ «ENDIF»
+««« adiciona as PKS da entidade na lista de CONSTRAINT PK do Ternário
+ «{this.mapTernary.put(auxEnt.name, new ArrayList); null}»
+ «FOR att : auxEnt.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxEnt.name.toLowerCase+"_"+att.name.toString); null}»
+ «{this.mapTernary.get(auxEnt.name).add(att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado ESQUERDO da relação N para N
+ «{this.mapTernary.put(auxLeftEntity.name, new ArrayList); null}»
+ «FOR att : auxLeftEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxLeftEntity.name).add(auxLeftEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« Lado DIREITO da relação N para N
+ «{this.mapTernary.put(auxRightEntity.name, new ArrayList); null}»
+ «FOR att : auxRightEntity.attributes.filter[isIsKey]»«{this.primaryKeys_Ternary.add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «{this.mapTernary.get(auxRightEntity.name).add(auxRightEntity.name.toLowerCase+"_"+att.name.toString.toLowerCase); null}»
+ «ENDFOR»
+««« -- MAPA DO «auxEnt.name.toUpperCase»: «FOR element : mapTernary.get(auxEnt.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxLeftEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxLeftEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+««« -- MAPA DO «auxRightEntity.name.toUpperCase»: «FOR element : mapTernary.get(auxRightEntity.name) SEPARATOR ", "»«element.toString»«ENDFOR»
+ CONSTRAINT pk_«r.name.toLowerCase» PRIMARY KEY («FOR pk : primaryKeys_Ternary SEPARATOR ", "»«pk.toString»«ENDFOR») «{this.primaryKeys_Ternary.clear; null}»
+ «{this.sc_AlterTbl_1toN.append(pgsql_AlterTable_Ternary_RefMapper(r.name, auxEnt.name, auxRel.name, auxLeftEntity.name, auxRightEntity.name, mapTernary)); null}»«{this.mapTernary.clear; null}»
+ );
+ «ENDFOR»
'''
def private pgsql_GeneralizationRefMapper(ERModel m) '''
-
«FOR e : m.entities.filter[is !== null]»
-- GENERALIZATION
ALTER TABLE ONLY public.«e.name.toLowerCase» ADD CONSTRAINT fk_gen_«e.name.toLowerCase+"_"+e.is.toString.toLowerCase» FOREIGN KEY («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR») REFERENCES public.«e.is.toString.toLowerCase» («FOR a : e.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toString»«ENDFOR»);
-
«ENDFOR»
'''
@@ -425,19 +512,16 @@ class PostgresqlFileGenerator extends AbstractGenerator {
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
ALTER TABLE ONLY public.«alterTbl.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase» FOREIGN KEY («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«r.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«refTbl.name.toLowerCase» («FOR a : refTbl.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
def private pgsql_AlterTable_NtoN_RefMapper(Entity leftEnt, Entity rightEnt, Relation r, Boolean selfRelWithGen, Boolean selfRelNoGen, Boolean relWithOneGen, Boolean relNoGen, String cardinalityRel) '''
«IF selfRelWithGen»
-- «cardinalityRel»: Self-relation WITH generalization
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.is.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF selfRelNoGen»
-- «cardinalityRel»: Self-relation WITHOUT generalization
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase»_1 FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_1"»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
-
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+rightEnt.name.toLowerCase»_2 FOREIGN KEY («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«rightEnt.name.toLowerCase+"_"+a.name.toLowerCase+"_2"»«ENDFOR») REFERENCES public.«rightEnt.name.toLowerCase» («FOR a : rightEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ELSEIF relWithOneGen»
-- «cardinalityRel»: Relationship with ONE ENTITY that HAS GENERALIZATION
@@ -446,9 +530,16 @@ class PostgresqlFileGenerator extends AbstractGenerator {
-- «cardinalityRel»: Relationship in which BOTH ENTITIES have NO GENERALIZATION
ALTER TABLE ONLY public.«r.name.toLowerCase» ADD CONSTRAINT fk_«r.name.toLowerCase+"_"+leftEnt.name.toLowerCase» FOREIGN KEY («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«leftEnt.name.toLowerCase+"_"+a.name.toLowerCase»«ENDFOR») REFERENCES public.«leftEnt.name.toLowerCase» («FOR a : leftEnt.attributes.filter[isIsKey] SEPARATOR ", "»«a.name.toLowerCase»«ENDFOR»);
«ENDIF»
-
'''
+ def private pgsql_AlterTable_Ternary_RefMapper(String tabelaTernaria, String tabelaEntidade, String nomeRelacaoNN, String leftNN, String rightNN, HashMap keysMap) '''
+««« MAPA DO «tabelaEntidade.toUpperCase»: «FOR e : mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «leftNN.toUpperCase»: «FOR e : mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+««« MAPA DO «rightNN.toUpperCase»: «FOR e : mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»
+ -- [Ternary Relationship]
+ ALTER TABLE ONLY public.«tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+tabelaEntidade.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«tabelaEntidade.toString.toLowerCase+"_"+e.toString»«ENDFOR») REFERENCES public.«tabelaEntidade» («FOR e : this.mapTernary.get(tabelaEntidade) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ ALTER TABLE ONLY public.«tabelaTernaria» ADD CONSTRAINT fk_«tabelaTernaria+"_"+nomeRelacaoNN.toLowerCase» FOREIGN KEY («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR») REFERENCES public.«nomeRelacaoNN» («FOR e : this.mapTernary.get(leftNN) SEPARATOR ", "»«e.toString»«ENDFOR», «FOR e : this.mapTernary.get(rightNN) SEPARATOR ", "»«e.toString»«ENDFOR»);
+ '''
}
diff --git a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
index 5c5b231..fc4a8b0 100644
--- a/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
+++ b/org.xtext.unipampa.erdsl/src/org/xtext/unipampa/erdsl/scoping/ErDslScopeProvider.xtend
@@ -20,25 +20,31 @@ import org.xtext.unipampa.erdsl.erDsl.Relation
class ErDslScopeProvider extends AbstractErDslScopeProvider {
- override IScope getScope(EObject context, EReference reference) {
- if (context instanceof Entity) {
- if (true) {
+// override IScope getScope(EObject context, EReference reference) {
+// if (context instanceof Entity) {
+// if (true) {
// println("ENTIDADE\n CONTEXTO = " + context.name.toString)
// println(" REFERENCIA = " + reference.name.toString)
- }
- return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
- } else if (context instanceof Relation) {
- if (true) {
+// }
+// return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
+// } else if (context instanceof Relation) {
+// if (true) {
// println("RELAÇÃO\n CONTEXTO = " + context.name.toString)
// println(" REFERENCIA = " + reference.name.toString)
- }
+// }
// println("ENTIDADES: "+Scopes.scopeFor((context.eContainer as ERModel).entities));
// println("RELAÇÕES: "+Scopes.scopeFor((context.eContainer as ERModel).relations));
// return Scopes.scopeFor((context.eContainer as ERModel).relations.filter[x|x != context])
+// }
+// return super.getScope(context, reference)
+// }
+
+ override IScope getScope(EObject context, EReference reference) {
+ if (context instanceof Entity) {
+ return Scopes.scopeFor((context.eContainer as ERModel).entities.filter[x|x != context])
}
- return super.getScope(context, reference)
+ return super.getScope(context, reference)
}
-
}
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin
index f438000..ac2a19d 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslRuntimeModule.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin
index c4349e2..816d075 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/.ErDslStandaloneSetup.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin
index f7316fc..e8cc5a5 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.ErDslGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace
index 5da63db..36a3872 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin
index 92f0abb..c46326d 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.HtmlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace
index 1458a24..27791b7 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin
index 368eb40..8190493 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.MysqlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace
index edcf40e..93b464f 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin
index d26d56c..e6be5e0 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PlantUmlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace
index 7b1ad0c..de4cb1d 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.java._trace differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin
index 58c48f5..9a323f2 100644
Binary files a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin and b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/.PostgresqlFileGenerator.xtendbin differ
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.java b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.java
index de3a67c..647dd9f 100644
--- a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.java
+++ b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/HtmlFileGenerator.java
@@ -26,7 +26,9 @@ public void doGenerate(final Resource input, final IFileSystemAccess2 fsa, final
EObject _get = input.getContents().get(0);
final ERModel modeloER = ((ERModel) _get);
try {
- fsa.generateFile("Logical_Textual_Scheme.html", this.CreateLogical(modeloER));
+ String _lowerCase = modeloER.getDomain().getName().toLowerCase();
+ String _plus = (_lowerCase + "_Logical.html");
+ fsa.generateFile(_plus, this.CreateLogical(modeloER));
} catch (final Throwable _t) {
if (_t instanceof Exception) {
final Exception e = (Exception)_t;
@@ -645,9 +647,12 @@ private CharSequence html_1ToN_RefCheck(final ERModel m, final Entity e) {
_builder.append(_html_ListPKtoFK);
_builder.newLineIfNotEmpty();
} else {
- CharSequence _html_ListPKtoFK_SelfRelationship = this.html_ListPKtoFK_SelfRelationship(aux, relation.getName().toLowerCase());
- _builder.append(_html_ListPKtoFK_SelfRelationship);
- _builder.newLineIfNotEmpty();
+ boolean _equalsIgnoreCase_3 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ if (_equalsIgnoreCase_3) {
+ CharSequence _html_ListPKtoFK_SelfRelationship = this.html_ListPKtoFK_SelfRelationship(aux, relation.getName().toLowerCase());
+ _builder.append(_html_ListPKtoFK_SelfRelationship);
+ _builder.newLineIfNotEmpty();
+ }
}
}
} else {
@@ -655,14 +660,14 @@ private CharSequence html_1ToN_RefCheck(final ERModel m, final Entity e) {
boolean _tripleNotEquals = (_is_1 != null);
if (_tripleNotEquals) {
{
- boolean _equalsIgnoreCase_3 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
- if (_equalsIgnoreCase_3) {
+ boolean _equalsIgnoreCase_4 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ if (_equalsIgnoreCase_4) {
CharSequence _html_ListPKtoFK_SelfRelationship_1 = this.html_ListPKtoFK_SelfRelationship(aux, relation.getName().toLowerCase());
_builder.append(_html_ListPKtoFK_SelfRelationship_1);
_builder.newLineIfNotEmpty();
} else {
- boolean _equalsIgnoreCase_4 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
- boolean _not_1 = (!_equalsIgnoreCase_4);
+ boolean _equalsIgnoreCase_5 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ boolean _not_1 = (!_equalsIgnoreCase_5);
if (_not_1) {
Object _xblockexpression = null;
{
@@ -691,21 +696,21 @@ private CharSequence html_1ToN_RefCheck(final ERModel m, final Entity e) {
if (((relation.getLeftEnding().getCardinality().equalsIgnoreCase("(0:N)") || relation.getLeftEnding().getCardinality().equalsIgnoreCase("(1:N)")) && (relation.getRightEnding().getCardinality().equalsIgnoreCase("(0:1)") || relation.getRightEnding().getCardinality().equalsIgnoreCase("(1:1)")))) {
_builder.newLine();
{
- boolean _equalsIgnoreCase_5 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(e.getName());
- if (_equalsIgnoreCase_5) {
+ boolean _equalsIgnoreCase_6 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(e.getName());
+ if (_equalsIgnoreCase_6) {
{
EList _entities_1 = m.getEntities();
for(final Entity aux_1 : _entities_1) {
{
- boolean _equalsIgnoreCase_6 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(aux_1.getName());
- if (_equalsIgnoreCase_6) {
+ boolean _equalsIgnoreCase_7 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(aux_1.getName());
+ if (_equalsIgnoreCase_7) {
{
Entity _is_2 = aux_1.getIs();
boolean _tripleEquals_1 = (_is_2 == null);
if (_tripleEquals_1) {
{
- boolean _equalsIgnoreCase_7 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
- boolean _not_2 = (!_equalsIgnoreCase_7);
+ boolean _equalsIgnoreCase_8 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ boolean _not_2 = (!_equalsIgnoreCase_8);
if (_not_2) {
CharSequence _html_ListPKtoFK_2 = this.html_ListPKtoFK(aux_1);
_builder.append(_html_ListPKtoFK_2);
@@ -721,8 +726,8 @@ private CharSequence html_1ToN_RefCheck(final ERModel m, final Entity e) {
boolean _tripleNotEquals_1 = (_is_3 != null);
if (_tripleNotEquals_1) {
{
- boolean _equalsIgnoreCase_8 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(relation.getLeftEnding().getTarget().toString());
- if (_equalsIgnoreCase_8) {
+ boolean _equalsIgnoreCase_9 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(relation.getLeftEnding().getTarget().toString());
+ if (_equalsIgnoreCase_9) {
_builder.newLine();
_builder.newLine();
_builder.newLine();
@@ -730,8 +735,8 @@ private CharSequence html_1ToN_RefCheck(final ERModel m, final Entity e) {
_builder.append(_html_ListPKtoFK_SelfRelationship_3);
_builder.newLineIfNotEmpty();
} else {
- boolean _equalsIgnoreCase_9 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(relation.getLeftEnding().getTarget().toString());
- boolean _not_3 = (!_equalsIgnoreCase_9);
+ boolean _equalsIgnoreCase_10 = relation.getRightEnding().getTarget().toString().equalsIgnoreCase(relation.getLeftEnding().getTarget().toString());
+ boolean _not_3 = (!_equalsIgnoreCase_10);
if (_not_3) {
Object _xblockexpression_1 = null;
{
@@ -812,23 +817,49 @@ private CharSequence html_NtoN_EntityCreation(final ERModel m) {
{
if ((relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(entity.getName()) && (!relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString())))) {
{
- final Function1 _function = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter = IterableExtensions.filter(entity.getAttributes(), _function);
- boolean _hasElements = false;
- for(final Attribute attribute : _filter) {
- if (!_hasElements) {
- _hasElements = true;
- } else {
- _builder.appendImmediate(" | ", "");
+ Entity _is = entity.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(entity.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute attribute : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK = this.html_AttributeStyleForInheritedPK(attribute);
+ _builder.append(_html_AttributeStyleForInheritedPK);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(entity.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute attribute_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK_1 = this.html_AttributeStyleForInheritedPK(attribute_1);
+ _builder.append(_html_AttributeStyleForInheritedPK_1);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
}
- CharSequence _html_AttributeStyleForInheritedPK = this.html_AttributeStyleForInheritedPK(attribute);
- _builder.append(_html_AttributeStyleForInheritedPK);
- _builder.append("_fk");
- _builder.newLineIfNotEmpty();
}
}
+ _builder.newLine();
}
}
}
@@ -840,20 +871,20 @@ private CharSequence html_NtoN_EntityCreation(final ERModel m) {
{
if ((relation.getRightEnding().getTarget().toString().equalsIgnoreCase(entity_1.getName()) && (!relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString())))) {
{
- final Function1 _function_1 = (Attribute it) -> {
+ final Function1 _function_2 = (Attribute it) -> {
return Boolean.valueOf(it.isIsKey());
};
- Iterable _filter_1 = IterableExtensions.filter(entity_1.getAttributes(), _function_1);
- boolean _hasElements_1 = false;
- for(final Attribute attribute_1 : _filter_1) {
- if (!_hasElements_1) {
- _hasElements_1 = true;
+ Iterable _filter_2 = IterableExtensions.filter(entity_1.getAttributes(), _function_2);
+ boolean _hasElements_2 = false;
+ for(final Attribute attribute_2 : _filter_2) {
+ if (!_hasElements_2) {
+ _hasElements_2 = true;
_builder.append(" | ");
} else {
_builder.appendImmediate(" | ", "");
}
- CharSequence _html_AttributeStyleForInheritedPK_1 = this.html_AttributeStyleForInheritedPK(attribute_1);
- _builder.append(_html_AttributeStyleForInheritedPK_1);
+ CharSequence _html_AttributeStyleForInheritedPK_2 = this.html_AttributeStyleForInheritedPK(attribute_2);
+ _builder.append(_html_AttributeStyleForInheritedPK_2);
_builder.append("_fk");
_builder.newLineIfNotEmpty();
}
@@ -871,21 +902,46 @@ private CharSequence html_NtoN_EntityCreation(final ERModel m) {
{
if ((relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(entity_2.getName()) && relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString()))) {
{
- final Function1 _function_2 = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter_2 = IterableExtensions.filter(entity_2.getAttributes(), _function_2);
- boolean _hasElements_2 = false;
- for(final Attribute attribute_2 : _filter_2) {
- if (!_hasElements_2) {
- _hasElements_2 = true;
- } else {
- _builder.appendImmediate(" | ", "");
+ Entity _is_1 = entity_2.getIs();
+ boolean _tripleNotEquals_1 = (_is_1 != null);
+ if (_tripleNotEquals_1) {
+ {
+ final Function1 _function_3 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_3 = IterableExtensions.filter(entity_2.getIs().getAttributes(), _function_3);
+ boolean _hasElements_3 = false;
+ for(final Attribute attribute_3 : _filter_3) {
+ if (!_hasElements_3) {
+ _hasElements_3 = true;
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK_3 = this.html_AttributeStyleForInheritedPK(attribute_3);
+ _builder.append(_html_AttributeStyleForInheritedPK_3);
+ _builder.append("_fk_1 ");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_4 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_4 = IterableExtensions.filter(entity_2.getAttributes(), _function_4);
+ boolean _hasElements_4 = false;
+ for(final Attribute attribute_4 : _filter_4) {
+ if (!_hasElements_4) {
+ _hasElements_4 = true;
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK_4 = this.html_AttributeStyleForInheritedPK(attribute_4);
+ _builder.append(_html_AttributeStyleForInheritedPK_4);
+ _builder.append("_fk_1 ");
+ _builder.newLineIfNotEmpty();
+ }
}
- CharSequence _html_AttributeStyleForInheritedPK_2 = this.html_AttributeStyleForInheritedPK(attribute_2);
- _builder.append(_html_AttributeStyleForInheritedPK_2);
- _builder.append("_fk_1 ");
- _builder.newLineIfNotEmpty();
}
}
}
@@ -894,22 +950,48 @@ private CharSequence html_NtoN_EntityCreation(final ERModel m) {
{
if ((relation.getRightEnding().getTarget().toString().equalsIgnoreCase(entity_2.getName()) && relation.getRightEnding().getTarget().toString().equalsIgnoreCase(relation.getLeftEnding().getTarget().toString()))) {
{
- final Function1 _function_3 = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter_3 = IterableExtensions.filter(entity_2.getAttributes(), _function_3);
- boolean _hasElements_3 = false;
- for(final Attribute attribute_3 : _filter_3) {
- if (!_hasElements_3) {
- _hasElements_3 = true;
- _builder.append(" | ");
- } else {
- _builder.appendImmediate(" | ", "");
+ Entity _is_2 = entity_2.getIs();
+ boolean _tripleNotEquals_2 = (_is_2 != null);
+ if (_tripleNotEquals_2) {
+ {
+ final Function1 _function_5 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_5 = IterableExtensions.filter(entity_2.getIs().getAttributes(), _function_5);
+ boolean _hasElements_5 = false;
+ for(final Attribute attribute_5 : _filter_5) {
+ if (!_hasElements_5) {
+ _hasElements_5 = true;
+ _builder.append(" | ");
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK_5 = this.html_AttributeStyleForInheritedPK(attribute_5);
+ _builder.append(_html_AttributeStyleForInheritedPK_5);
+ _builder.append("_fk_2");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_6 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_6 = IterableExtensions.filter(entity_2.getAttributes(), _function_6);
+ boolean _hasElements_6 = false;
+ for(final Attribute attribute_6 : _filter_6) {
+ if (!_hasElements_6) {
+ _hasElements_6 = true;
+ _builder.append(" | ");
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ CharSequence _html_AttributeStyleForInheritedPK_6 = this.html_AttributeStyleForInheritedPK(attribute_6);
+ _builder.append(_html_AttributeStyleForInheritedPK_6);
+ _builder.append("_fk_2");
+ _builder.newLineIfNotEmpty();
+ }
}
- CharSequence _html_AttributeStyleForInheritedPK_3 = this.html_AttributeStyleForInheritedPK(attribute_3);
- _builder.append(_html_AttributeStyleForInheritedPK_3);
- _builder.append("_fk_2");
- _builder.newLineIfNotEmpty();
}
}
}
@@ -920,37 +1002,37 @@ private CharSequence html_NtoN_EntityCreation(final ERModel m) {
_builder.append("\t\t\t");
_builder.newLine();
{
- final Function1 _function_4 = (Attribute i) -> {
+ final Function1 _function_7 = (Attribute i) -> {
return Boolean.valueOf(((!StringExtensions.isNullOrEmpty(i.getName())) && i.isIsKey()));
};
- Iterable _filter_4 = IterableExtensions.filter(relation.getAttributes(), _function_4);
- boolean _hasElements_4 = false;
- for(final Attribute attribute_4 : _filter_4) {
- if (!_hasElements_4) {
- _hasElements_4 = true;
+ Iterable _filter_7 = IterableExtensions.filter(relation.getAttributes(), _function_7);
+ boolean _hasElements_7 = false;
+ for(final Attribute attribute_7 : _filter_7) {
+ if (!_hasElements_7) {
+ _hasElements_7 = true;
_builder.append(" | ");
} else {
_builder.appendImmediate(" | ", "");
}
- CharSequence _html_AttributeStyleForPK = this.html_AttributeStyleForPK(attribute_4);
+ CharSequence _html_AttributeStyleForPK = this.html_AttributeStyleForPK(attribute_7);
_builder.append(_html_AttributeStyleForPK);
_builder.newLineIfNotEmpty();
}
}
{
- final Function1 _function_5 = (Attribute i) -> {
+ final Function1 _function_8 = (Attribute i) -> {
return Boolean.valueOf(((!StringExtensions.isNullOrEmpty(i.getName())) && (!i.isIsKey())));
};
- Iterable _filter_5 = IterableExtensions.filter(relation.getAttributes(), _function_5);
- boolean _hasElements_5 = false;
- for(final Attribute attribute_5 : _filter_5) {
- if (!_hasElements_5) {
- _hasElements_5 = true;
+ Iterable _filter_8 = IterableExtensions.filter(relation.getAttributes(), _function_8);
+ boolean _hasElements_8 = false;
+ for(final Attribute attribute_8 : _filter_8) {
+ if (!_hasElements_8) {
+ _hasElements_8 = true;
_builder.append(" | ");
} else {
_builder.appendImmediate(" | ", "");
}
- String _lowerCase = attribute_5.getName().toLowerCase();
+ String _lowerCase = attribute_8.getName().toLowerCase();
_builder.append(_lowerCase);
_builder.newLineIfNotEmpty();
}
@@ -1188,22 +1270,98 @@ private CharSequence html_ListPKtoFK(final Entity e) {
private CharSequence html_ListPKtoFK_Alt(final Entity e) {
StringConcatenation _builder = new StringConcatenation();
{
- final Function1 _function = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter = IterableExtensions.filter(e.getAttributes(), _function);
- boolean _hasElements = false;
- for(final Attribute att : _filter) {
- if (!_hasElements) {
- _hasElements = true;
- } else {
- _builder.appendImmediate(" , ", "");
+ Entity _is = e.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(e.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute att : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase = att.getName().toLowerCase();
+ _builder.append(_lowerCase);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(e.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute att_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase_1 = att_1.getName().toLowerCase();
+ _builder.append(_lowerCase_1);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ }
+ }
+ return _builder;
+ }
+
+ private CharSequence html_ListPKtoFK_Alt(final Entity e, final String r) {
+ StringConcatenation _builder = new StringConcatenation();
+ {
+ Entity _is = e.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(e.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute att : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase = att.getName().toLowerCase();
+ _builder.append(_lowerCase);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(e.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute att_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase_1 = att_1.getName().toLowerCase();
+ _builder.append(_lowerCase_1);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
}
- _builder.append("");
- String _lowerCase = att.getName().toLowerCase();
- _builder.append(_lowerCase);
- _builder.append("_fk");
- _builder.newLineIfNotEmpty();
}
}
return _builder;
@@ -1212,51 +1370,164 @@ private CharSequence html_ListPKtoFK_Alt(final Entity e) {
private CharSequence html_ListPKtoFK_SelfRelationship(final Entity e, final String r) {
StringConcatenation _builder = new StringConcatenation();
{
- final Function1 _function = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter = IterableExtensions.filter(e.getAttributes(), _function);
- boolean _hasElements = false;
- for(final Attribute att : _filter) {
- if (!_hasElements) {
- _hasElements = true;
- _builder.append(" | ");
- } else {
- _builder.appendImmediate(" | ", "");
+ Entity _is = e.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(e.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute att : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ _builder.append(" | ");
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ _builder.append(" ");
+ String _lowerCase = att.getName().toLowerCase();
+ String _plus = (_lowerCase + "_");
+ String _plus_1 = (_plus + r);
+ _builder.append(_plus_1);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(e.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute att_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ _builder.append(" | ");
+ } else {
+ _builder.appendImmediate(" | ", "");
+ }
+ _builder.append(" ");
+ String _lowerCase_1 = att_1.getName().toLowerCase();
+ String _plus_2 = (_lowerCase_1 + "_");
+ String _plus_3 = (_plus_2 + r);
+ _builder.append(_plus_3);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
}
- _builder.append(" ");
- String _lowerCase = att.getName().toLowerCase();
- String _plus = (_lowerCase + "_");
- String _plus_1 = (_plus + r);
- _builder.append(_plus_1);
- _builder.append("_fk");
- _builder.newLineIfNotEmpty();
}
}
+ _builder.newLine();
+ _builder.newLine();
return _builder;
}
private CharSequence html_ListPKtoFK_SelfRelationship_Alt(final Entity e, final String r) {
StringConcatenation _builder = new StringConcatenation();
{
- final Function1 _function = (Attribute it) -> {
- return Boolean.valueOf(it.isIsKey());
- };
- Iterable _filter = IterableExtensions.filter(e.getAttributes(), _function);
- boolean _hasElements = false;
- for(final Attribute att : _filter) {
- if (!_hasElements) {
- _hasElements = true;
- } else {
- _builder.appendImmediate(" , ", "");
+ Entity _is = e.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(e.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute att : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase = att.getName().toLowerCase();
+ String _plus = (_lowerCase + "_");
+ String _plus_1 = (_plus + r);
+ _builder.append(_plus_1);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(e.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute att_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase_1 = att_1.getName().toLowerCase();
+ String _plus_2 = (_lowerCase_1 + "_");
+ String _plus_3 = (_plus_2 + r);
+ _builder.append(_plus_3);
+ _builder.append("_fk");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ }
+ }
+ return _builder;
+ }
+
+ private CharSequence html_ListPKtoFK_SelfRelationship_Alt(final Entity e, final int i) {
+ StringConcatenation _builder = new StringConcatenation();
+ {
+ Entity _is = e.getIs();
+ boolean _tripleNotEquals = (_is != null);
+ if (_tripleNotEquals) {
+ {
+ final Function1 _function = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter = IterableExtensions.filter(e.getIs().getAttributes(), _function);
+ boolean _hasElements = false;
+ for(final Attribute att : _filter) {
+ if (!_hasElements) {
+ _hasElements = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase = att.getName().toLowerCase();
+ _builder.append(_lowerCase);
+ _builder.append("_fk_");
+ _builder.append(i);
+ _builder.append("");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ } else {
+ {
+ final Function1 _function_1 = (Attribute it) -> {
+ return Boolean.valueOf(it.isIsKey());
+ };
+ Iterable _filter_1 = IterableExtensions.filter(e.getAttributes(), _function_1);
+ boolean _hasElements_1 = false;
+ for(final Attribute att_1 : _filter_1) {
+ if (!_hasElements_1) {
+ _hasElements_1 = true;
+ } else {
+ _builder.appendImmediate(" , ", "");
+ }
+ _builder.append("");
+ String _lowerCase_1 = att_1.getName().toLowerCase();
+ _builder.append(_lowerCase_1);
+ _builder.append("_fk_");
+ _builder.append(i);
+ _builder.append("");
+ _builder.newLineIfNotEmpty();
+ }
}
- _builder.append("");
- String _lowerCase = att.getName().toLowerCase();
- String _plus = (_lowerCase + "_");
- String _plus_1 = (_plus + r);
- _builder.append(_plus_1);
- _builder.append("_fk");
- _builder.newLineIfNotEmpty();
}
}
return _builder;
@@ -1401,6 +1672,8 @@ private CharSequence html_1To1_Relationships(final ERModel m) {
CharSequence _html_BinaryRelationshipNameStyle = this.html_BinaryRelationshipNameStyle(relation.getName(), relation.getLeftEnding().getTarget().toString(), relation.getRightEnding().getTarget().toString(), relation.getLeftEnding().getCardinality(), relation.getRightEnding().getCardinality());
_builder.append(_html_BinaryRelationshipNameStyle, "\t");
_builder.newLineIfNotEmpty();
+ _builder.append("\t");
+ _builder.append("");
_builder.newLine();
_builder.append("\t");
_builder.append("Attribute ( ");
@@ -1517,7 +1790,7 @@ private CharSequence html_1ToN_Relationships(final ERModel m) {
CharSequence _html_BinaryRelationshipNameStyle = this.html_BinaryRelationshipNameStyle(relation.getName(), relation.getLeftEnding().getTarget().toString(), relation.getRightEnding().getTarget().toString(), relation.getLeftEnding().getCardinality(), relation.getRightEnding().getCardinality());
_builder.append(_html_BinaryRelationshipNameStyle);
_builder.newLineIfNotEmpty();
- _builder.append("\t");
+ _builder.append("");
_builder.newLine();
_builder.append("Attribute ( ");
_builder.newLine();
@@ -1602,6 +1875,7 @@ private CharSequence html_1ToN_Relationships(final ERModel m) {
CharSequence _html_BinaryRelationshipNameStyle_1 = this.html_BinaryRelationshipNameStyle(relation.getName(), relation.getLeftEnding().getTarget().toString(), relation.getRightEnding().getTarget().toString(), relation.getLeftEnding().getCardinality(), relation.getRightEnding().getCardinality());
_builder.append(_html_BinaryRelationshipNameStyle_1);
_builder.newLineIfNotEmpty();
+ _builder.append("");
_builder.newLine();
_builder.append("Attribute (");
_builder.newLine();
@@ -1710,14 +1984,25 @@ private CharSequence html_NToN_Relationships(final ERModel m) {
CharSequence _html_BinaryRelationshipNameStyle = this.html_BinaryRelationshipNameStyle(relation.getName(), relation.getLeftEnding().getTarget().toString(), relation.getRightEnding().getTarget().toString(), relation.getLeftEnding().getCardinality(), relation.getRightEnding().getCardinality());
_builder.append(_html_BinaryRelationshipNameStyle);
_builder.newLineIfNotEmpty();
+ _builder.append("");
_builder.newLine();
_builder.append("Attribute ( ");
_builder.newLine();
_builder.newLine();
- EObject _target = relation.getLeftEnding().getTarget();
- CharSequence _html_ListPKtoFK_Alt = this.html_ListPKtoFK_Alt(((Entity) _target));
- _builder.append(_html_ListPKtoFK_Alt);
- _builder.newLineIfNotEmpty();
+ {
+ boolean _equalsIgnoreCase = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ if (_equalsIgnoreCase) {
+ EObject _target = relation.getLeftEnding().getTarget();
+ CharSequence _html_ListPKtoFK_SelfRelationship_Alt = this.html_ListPKtoFK_SelfRelationship_Alt(((Entity) _target), 1);
+ _builder.append(_html_ListPKtoFK_SelfRelationship_Alt);
+ _builder.newLineIfNotEmpty();
+ } else {
+ EObject _target_1 = relation.getLeftEnding().getTarget();
+ CharSequence _html_ListPKtoFK_Alt = this.html_ListPKtoFK_Alt(((Entity) _target_1));
+ _builder.append(_html_ListPKtoFK_Alt);
+ _builder.newLineIfNotEmpty();
+ }
+ }
_builder.newLine();
_builder.append(") in ");
CharSequence _html_EntityNameTag = this.html_EntityNameTag(relation.getName());
@@ -1732,11 +2017,20 @@ private CharSequence html_NToN_Relationships(final ERModel m) {
_builder.append("Attribute ( ");
_builder.newLine();
_builder.newLine();
- EObject _target_1 = relation.getRightEnding().getTarget();
- CharSequence _html_ListPKtoFK_Alt_1 = this.html_ListPKtoFK_Alt(((Entity) _target_1));
- _builder.append(_html_ListPKtoFK_Alt_1);
- _builder.append("\t\t\t");
- _builder.newLineIfNotEmpty();
+ {
+ boolean _equalsIgnoreCase_1 = relation.getLeftEnding().getTarget().toString().equalsIgnoreCase(relation.getRightEnding().getTarget().toString());
+ if (_equalsIgnoreCase_1) {
+ EObject _target_2 = relation.getRightEnding().getTarget();
+ CharSequence _html_ListPKtoFK_SelfRelationship_Alt_1 = this.html_ListPKtoFK_SelfRelationship_Alt(((Entity) _target_2), 2);
+ _builder.append(_html_ListPKtoFK_SelfRelationship_Alt_1);
+ _builder.newLineIfNotEmpty();
+ } else {
+ EObject _target_3 = relation.getRightEnding().getTarget();
+ CharSequence _html_ListPKtoFK_Alt_1 = this.html_ListPKtoFK_Alt(((Entity) _target_3));
+ _builder.append(_html_ListPKtoFK_Alt_1);
+ _builder.newLineIfNotEmpty();
+ }
+ }
_builder.append("\t\t\t");
_builder.newLine();
_builder.append(") in ");
@@ -1802,7 +2096,7 @@ private CharSequence html_Ternary_Relationships(final ERModel m) {
String _plus_3 = (_plus_2 + _upperCase_4);
_builder.append(_plus_3);
_builder.newLineIfNotEmpty();
- _builder.append(" \t");
+ _builder.append(" ");
_builder.newLine();
CharSequence _html_Ternary_Relationships_Attributes = this.html_Ternary_Relationships_Attributes(m, relation);
_builder.append(_html_Ternary_Relationships_Attributes);
diff --git a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.java b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.java
index 174ed82..9801e4c 100644
--- a/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.java
+++ b/org.xtext.unipampa.erdsl/xtend-gen/org/xtext/unipampa/erdsl/generator/MysqlFileGenerator.java
@@ -1,6 +1,7 @@
package org.xtext.unipampa.erdsl.generator;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
@@ -39,6 +40,10 @@ public class MysqlFileGenerator extends AbstractGenerator {
private ArrayList