55
66import javax .sql .DataSource ;
77
8+ import io .github .databaseaudits .audit .catalog .DuplicateForeignKeyAudit ;
89import io .github .databaseaudits .audit .catalog .ForeignKeyIndexAudit ;
910import io .github .databaseaudits .audit .catalog .ForeignKeyNotNullAudit ;
1011import io .github .databaseaudits .audit .catalog .ForeignKeyTypeMatchAudit ;
1112import io .github .databaseaudits .audit .catalog .PrimaryKeyPresenceAudit ;
13+ import io .github .databaseaudits .audit .catalog .PrimaryKeyTypeAudit ;
1214import io .github .databaseaudits .audit .catalog .RedundantIndexAudit ;
15+ import io .github .databaseaudits .audit .catalog .UniqueIndexNotNullAudit ;
16+ import io .github .databaseaudits .audit .jpa .EagerCollectionFetchAudit ;
17+ import io .github .databaseaudits .audit .jpa .MissingVersionAttributeAudit ;
1318import io .github .databaseaudits .audit .jpa .SchemaEntityValidationAudit ;
19+ import io .github .databaseaudits .audit .jpa .UnmappedDatabaseObjectAudit ;
20+ import io .github .databaseaudits .audit .runtime .OffsetPaginationAudit ;
21+ import io .github .databaseaudits .audit .runtime .RepeatedStatementAudit ;
1422import io .github .databaseaudits .audit .runtime .UnconditionalMutationAudit ;
1523import io .github .databaseaudits .audit .runtime .plan .JoinIndexAudit ;
1624import io .github .databaseaudits .audit .runtime .plan .OrderByIndexAudit ;
25+ import io .github .databaseaudits .audit .runtime .plan .UnusedIndexAudit ;
1726import io .github .databaseaudits .audit .runtime .plan .WhereClauseIndexAudit ;
1827import io .github .databaseaudits .capture .SqlCapturingStatementInspector ;
28+ import io .github .databaseaudits .catalog .ForeignKeyCatalog ;
1929import io .github .databaseaudits .catalog .IndexCatalog ;
2030import io .github .databaseaudits .jdbc .CatalogQueries ;
2131import io .github .databaseaudits .plan .QueryPlanExplainer ;
2232import io .github .databaseaudits .platform .DatabasePlatform ;
2333import io .github .databaseaudits .spring .boot .assertion .AuditAssertion ;
2434import io .github .databaseaudits .spring .boot .assertion .DatabaseAuditAssertions ;
35+ import io .github .databaseaudits .spring .boot .assertion .DuplicateForeignKeyAuditAssertion ;
36+ import io .github .databaseaudits .spring .boot .assertion .EagerCollectionFetchAuditAssertion ;
2537import io .github .databaseaudits .spring .boot .assertion .ForeignKeyIndexAuditAssertion ;
2638import io .github .databaseaudits .spring .boot .assertion .ForeignKeyNotNullAuditAssertion ;
2739import io .github .databaseaudits .spring .boot .assertion .ForeignKeyTypeMatchAuditAssertion ;
2840import io .github .databaseaudits .spring .boot .assertion .JoinIndexAuditAssertion ;
41+ import io .github .databaseaudits .spring .boot .assertion .MissingVersionAttributeAuditAssertion ;
42+ import io .github .databaseaudits .spring .boot .assertion .OffsetPaginationAuditAssertion ;
2943import io .github .databaseaudits .spring .boot .assertion .OrderByIndexAuditAssertion ;
3044import io .github .databaseaudits .spring .boot .assertion .PrimaryKeyPresenceAuditAssertion ;
45+ import io .github .databaseaudits .spring .boot .assertion .PrimaryKeyTypeAuditAssertion ;
3146import io .github .databaseaudits .spring .boot .assertion .RedundantIndexAuditAssertion ;
47+ import io .github .databaseaudits .spring .boot .assertion .RepeatedStatementAuditAssertion ;
3248import io .github .databaseaudits .spring .boot .assertion .SchemaEntityValidationAuditAssertion ;
3349import io .github .databaseaudits .spring .boot .assertion .UnconditionalMutationAuditAssertion ;
50+ import io .github .databaseaudits .spring .boot .assertion .UniqueIndexNotNullAuditAssertion ;
51+ import io .github .databaseaudits .spring .boot .assertion .UnmappedDatabaseObjectAuditAssertion ;
52+ import io .github .databaseaudits .spring .boot .assertion .UnusedIndexAuditAssertion ;
3453import io .github .databaseaudits .spring .boot .assertion .WhereClauseIndexAuditAssertion ;
3554import jakarta .persistence .EntityManagerFactory ;
3655
@@ -100,10 +119,18 @@ public DatabaseAuditSuite(final DataSource dataSource,
100119 final CatalogQueries catalogQueries = new CatalogQueries (dataSource );
101120 final IndexCatalog indexCatalog =
102121 new IndexCatalog (catalogQueries , platform );
122+ final ForeignKeyCatalog foreignKeyCatalog =
123+ new ForeignKeyCatalog (catalogQueries , platform );
103124
104125 // The one legitimate enumeration of the roster, in family order
105126 // (catalog, JPA, runtime); everything else drives it through all().
106- final List <AuditAssertion > roster = new ArrayList <>(List .of (
127+ // The explicit type witness keeps javac's common-supertype inference
128+ // from picking the package-private AbstractAuditAssertion (compiling
129+ // an inaccessible-type error) instead of the public AuditAssertion.
130+ final List <AuditAssertion > roster = new ArrayList <>(List .<AuditAssertion >of (
131+ new DuplicateForeignKeyAuditAssertion (
132+ new DuplicateForeignKeyAudit (foreignKeyCatalog ),
133+ platform ),
107134 new ForeignKeyIndexAuditAssertion (new ForeignKeyIndexAudit (
108135 catalogQueries , indexCatalog , platform ), platform ),
109136 new ForeignKeyNotNullAuditAssertion (
@@ -115,18 +142,38 @@ public DatabaseAuditSuite(final DataSource dataSource,
115142 new PrimaryKeyPresenceAuditAssertion (
116143 new PrimaryKeyPresenceAudit (catalogQueries , platform ),
117144 platform ),
145+ new PrimaryKeyTypeAuditAssertion (
146+ new PrimaryKeyTypeAudit (catalogQueries , platform ),
147+ platform ),
118148 new RedundantIndexAuditAssertion (
119149 new RedundantIndexAudit (indexCatalog ), platform ),
150+ new UniqueIndexNotNullAuditAssertion (
151+ new UniqueIndexNotNullAudit (catalogQueries ,
152+ indexCatalog , platform ),
153+ platform ),
154+ new EagerCollectionFetchAuditAssertion (
155+ EagerCollectionFetchAudit .forEntityManagerFactory (
156+ entityManagerFactory ),
157+ platform ),
158+ new MissingVersionAttributeAuditAssertion (
159+ MissingVersionAttributeAudit .forEntityManagerFactory (
160+ entityManagerFactory ),
161+ platform ),
120162 new SchemaEntityValidationAuditAssertion (
121163 SchemaEntityValidationAudit .forEntityManagerFactory (
122164 entityManagerFactory , dataSource ),
165+ platform ),
166+ new UnmappedDatabaseObjectAuditAssertion (
167+ UnmappedDatabaseObjectAudit .forEntityManagerFactory (
168+ entityManagerFactory , dataSource ),
123169 platform )));
124170
125- // The plan-based runtime audits (Join/OrderBy/WhereClause) are
171+ // The plan-based runtime audits (Join/OrderBy/Unused/ WhereClause) are
126172 // PostgreSQL-only — they fail fast on every other platform — so they are
127173 // wired only where the platform can run them; the facade's runtime and
128174 // all-family runs then stay clean on MySQL/MariaDB. The capture-based
129- // UnconditionalMutation audit runs on every platform.
175+ // OffsetPagination/RepeatedStatement/UnconditionalMutation audits run on
176+ // every platform.
130177 if (platform == DatabasePlatform .POSTGRESQL ) {
131178 final QueryPlanExplainer queryPlanExplainer =
132179 new QueryPlanExplainer (dataSource , platform );
@@ -136,10 +183,18 @@ public DatabaseAuditSuite(final DataSource dataSource,
136183 roster .add (new OrderByIndexAuditAssertion (
137184 new OrderByIndexAudit (queryPlanExplainer , sqlCapturer ),
138185 platform ));
186+ roster .add (new UnusedIndexAuditAssertion (
187+ new UnusedIndexAudit (queryPlanExplainer , sqlCapturer ,
188+ indexCatalog , foreignKeyCatalog ),
189+ platform ));
139190 roster .add (new WhereClauseIndexAuditAssertion (
140191 new WhereClauseIndexAudit (queryPlanExplainer , sqlCapturer ),
141192 platform ));
142193 }
194+ roster .add (new OffsetPaginationAuditAssertion (
195+ new OffsetPaginationAudit (sqlCapturer ), platform ));
196+ roster .add (new RepeatedStatementAuditAssertion (
197+ new RepeatedStatementAudit (sqlCapturer ), platform ));
143198 roster .add (new UnconditionalMutationAuditAssertion (
144199 new UnconditionalMutationAudit (sqlCapturer ), platform ));
145200
0 commit comments