22
33import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
44import net .sf .jsqlparser .statement .Statements ;
5+ import net .sf .jsqlparser .statement .alter .Alter ;
56import net .sf .jsqlparser .statement .create .table .CreateTable ;
67import net .sf .jsqlparser .statement .create .table .ForeignKeyIndex ;
78import net .sf .jsqlparser .statement .create .table .Index ;
2526import static org .ngbsn .generator .AssociationMappingsGenerator .generateMappings ;
2627
2728/**
28- * Ignoring these annotations as they are useful only in DDL generation:
29- * UNIQUE
29+ * This class will parse the SQL script and generate the Table models for each table in the script
30+ * It will also extract all the columns from the script and add to the Table model
3031 */
3132public class ModelGenerator {
3233 private static final Logger logger = LoggerFactory .getLogger (ModelGenerator .class );
@@ -35,73 +36,113 @@ public class ModelGenerator {
3536 public static List <Table > parse (final String sqlScript ) {
3637 try {
3738 Statements statements = CCJSqlParserUtil .parseStatements (sqlScript );
38- statements .getStatements ().forEach (statement -> {
39- //Iterating over all Tables
40- if (statement instanceof CreateTable parsedTable ) {
41- Table table = new Table ();
42- table .setTableName (parsedTable .getTable ().getName ().replaceAll ("[\" ']" , "" ));
43- tablesMap .put (table .getTableName (), table );
44- table .setClassName (Util .convertSnakeCaseToCamelCase (table .getTableName (), true ));
45-
46- Set <String > tableAnnotations = new HashSet <>();
47- table .setAnnotations (tableAnnotations );
48- //Adding @Entity
49- tableAnnotations .add (new EntityAnnotation ().toString ());
50- //Adding @Table
51- tableAnnotations .add (TableAnnotation .builder ().tableName (table .getTableName ()).build ().toString ());
52-
53- Set <Column > columns = new HashSet <>();
54- table .setColumns (columns );
55- extractColumns (parsedTable , columns );
56-
57- extractPrimaryKeys (parsedTable , table );
58-
59- extractForeignKeys (parsedTable , table );
60-
61- generateMappings (table );
62-
63- }
64- });
39+ processCreateTableStatements (statements );
40+ processAlterTableStatements (statements );
41+ generateMappings ();
6542 return tablesMap .values ().stream ().toList ();
6643 } catch (Exception e ) {
6744 logger .error ("Error occurred" , e );
6845 }
6946 return null ;
7047 }
7148
49+ /**
50+ * Iterate over all the Create Table statements and prepare the list of Table Model
51+ * @param statements set of statements
52+ */
53+ private static void processCreateTableStatements (Statements statements ) {
54+ statements .getStatements ().forEach (statement -> {
55+ //Iterating over all Tables
56+ if (statement instanceof CreateTable parsedTable ) {
57+ Table table = new Table ();
58+ table .setTableName (parsedTable .getTable ().getName ().replaceAll ("[\" ']" , "" ));
59+ tablesMap .put (table .getTableName (), table );
60+ table .setClassName (Util .convertSnakeCaseToCamelCase (table .getTableName (), true ));
61+
62+ Set <String > tableAnnotations = new HashSet <>();
63+ table .setAnnotations (tableAnnotations );
64+ //Adding @Entity
65+ tableAnnotations .add (new EntityAnnotation ().toString ());
66+ //Adding @Table
67+ tableAnnotations .add (TableAnnotation .builder ().tableName (table .getTableName ()).build ().toString ());
68+
69+ Set <Column > columns = new HashSet <>();
70+ table .setColumns (columns );
71+
72+ //extract columns
73+ extractColumns (parsedTable , columns );
74+
75+ //extract primary keys
76+ Optional <Index > optionalIndex = parsedTable .getIndexes ().stream ().filter (index -> index .getType ().equals ("PRIMARY KEY" )).findFirst ();
77+ extractPrimaryKeys (optionalIndex .orElse (null ), table );
78+
79+ //extract foreign keys
80+ List <Index > foreignKeyIndexes = parsedTable .getIndexes ().stream ().filter (index -> index instanceof ForeignKeyIndex ).toList ();
81+ extractForeignKeys (foreignKeyIndexes , table );
82+ }
83+ });
84+ }
85+
86+ /**
87+ * Iterate over all the Alter Table statements and prepare the list of Table Model
88+ * @param statements set of statements
89+ */
90+ private static void processAlterTableStatements (Statements statements ) {
91+ statements .getStatements ().forEach (statement -> {
92+ //Iterating over all Tables
93+ // Look for primary and foreign keys in ALTER TABLE constraints
94+ if (statement instanceof Alter alterTable ){
95+ Table table = tablesMap .get (alterTable .getTable ().getName ().replaceAll ("[\" ']" , "" ));
96+ List <Index > foreignKeyIndexes = new ArrayList <>();
97+ alterTable .getAlterExpressions ().forEach (alterExpression -> {
98+ if (alterExpression .getIndex () instanceof ForeignKeyIndex foreignKeyIndex ){
99+ //case: ALTER TABLE FOREIGN KEY
100+ foreignKeyIndexes .add (alterExpression .getIndex ());
101+ } else if (alterExpression .getIndex ().getType ().equals ("PRIMARY KEY" )){
102+ //case: ALTER TABLE PRIMARY KEY
103+ extractPrimaryKeys (alterExpression .getIndex (), table );
104+ }
105+ });
106+ extractForeignKeys (foreignKeyIndexes , table );
107+ }
108+ });
109+ }
110+
111+
72112 /**
73113 * Looking for all foreign keys in this table and adding it to our model
74114 *
75- * @param parsedTable The SQL script parsed table
76- * @param table Table model
115+ * @param foreignKeyIndexes List of foreign key indexes
116+ * @param table Table model
77117 */
78- private static void extractForeignKeys (CreateTable parsedTable , Table table ) {
79- List <Index > foreignKeyIndexes = parsedTable .getIndexes ().stream ().filter (index -> index instanceof ForeignKeyIndex ).toList ();
118+ private static void extractForeignKeys (List <Index > foreignKeyIndexes , Table table ) {
80119 if (!foreignKeyIndexes .isEmpty ()) {
81120 foreignKeyIndexes .forEach (index -> {
82121 if (index instanceof ForeignKeyIndex foreignKeyIndex ) {
83122 ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint ();
84- foreignKeyConstraint .setColumns (foreignKeyIndex .getColumnsNames ());
85- foreignKeyConstraint .setReferencedColumns (foreignKeyIndex .getReferencedColumnNames ());
86- foreignKeyConstraint .setReferencedTableName (foreignKeyIndex .getTable ().getName ());
123+ foreignKeyConstraint .setColumns (foreignKeyIndex .getColumnsNames ()
124+ .stream ().map (s -> s .replaceAll ("[\" ']" , "" )).collect (Collectors .toList ()));
125+ foreignKeyConstraint .setReferencedColumns (foreignKeyIndex .getReferencedColumnNames ()
126+ .stream ().map (s -> s .replaceAll ("[\" ']" , "" )).collect (Collectors .toList ()));
127+ foreignKeyConstraint .setReferencedTableName (foreignKeyIndex .getTable ().getName ()
128+ .replaceAll ("[\" ']" , "" ));
87129 table .getForeignKeyConstraints ().add (foreignKeyConstraint );
88130 }
89131 });
90132 }
91133 }
92134
93135 /**
94- * Looking for all primary keys in this table
136+ * Extracting primary key information from the parsed data and setting them into the Table model
95137 *
96- * @param parsedTable The SQL script parsed table
97- * @param table Table model
138+ * @param primaryKeyIndex primaryKeyIndex
139+ * @param table Table model
98140 */
99- private static void extractPrimaryKeys (CreateTable parsedTable , Table table ) {
100- Optional <Index > optionalIndex = parsedTable .getIndexes ().stream ().filter (index -> index .getType ().equals ("PRIMARY KEY" )).findFirst ();
101- List <Index .ColumnParams > columnParamsList = optionalIndex .map (Index ::getColumns ).orElse (null );
141+ private static void extractPrimaryKeys (Index primaryKeyIndex , Table table ) {
142+ List <Index .ColumnParams > columnParamsList = primaryKeyIndex != null ? primaryKeyIndex .getColumns (): null ;
102143 if (columnParamsList != null ) {
103144 Set <Column > primaryKeyColumns = table .getColumns ().stream ().
104- filter (column -> columnParamsList .stream ().anyMatch (columnParams -> columnParams .getColumnName ().equals (column .getColumnName ()))).collect (Collectors .toSet ());
145+ filter (column -> columnParamsList .stream ().anyMatch (columnParams -> columnParams .getColumnName ().replaceAll ( "[ \" ']" , "" ). equals (column .getColumnName ()))).collect (Collectors .toSet ());
105146
106147 if (columnParamsList .size () > 1 ) {
107148 table .setNumOfPrimaryKeyColumns (columnParamsList .size ());
0 commit comments