-
Notifications
You must be signed in to change notification settings - Fork 10
/
QuickSqlTestData.java
153 lines (136 loc) · 6.94 KB
/
QuickSqlTestData.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* Copyright 2021-2022 the original author or authors.
*/
package org.qstd;
import org.qstd.dbtype.DatabaseMetadataFinderFactory;
import org.qstd.dbtype.DatabaseMetadataFinderWithCache;
import org.qstd.dbtype.DatabaseType;
import org.qstd.dbtype.DatabaseUrlFinder;
import javax.sql.DataSource;
import java.util.List;
import static java.util.Arrays.stream;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
/**
* Class allowing to ease the generation of datasets to test SQL queries.
* Methods produce INSERT statements taking account of database integrity constraints.
*
* @see SqlQuery
* @see DatasetRow
* @see DatabaseMetadataFinder
* @see DatabaseMetadataFinderFactory
* @see DatabaseMetadataFinderWithCache
*/
public class QuickSqlTestData {
private final DatasetRowsGenerator datasetRowsGenerator;
private final DatabaseType dbType;
private InsertStatementsGenerator insertStatementGenerator;
private QuickSqlTestData(DatasetRowsGenerator datasetRowsGenerator, DatabaseType dbType) {
this.datasetRowsGenerator = datasetRowsGenerator;
this.dbType = dbType;
insertStatementGenerator = new InsertStatementsGenerator(dbType);
}
/**
* Factory method to build an instance of <code>org.qstd.QuickSqlTestData</code> from a data source.
* <em>The retrieval of database metadata, such as not null columns or primary keys, is cached for each table.</em>
* @param dataSource A data source
* @return An instance of <code>org.qstd.QuickSqlTestData</code>
*/
public static QuickSqlTestData buildFrom(DataSource dataSource) {
String dbUrl = DatabaseUrlFinder.INSTANCE.findDbUrlFrom(dataSource);
DatabaseType dbType = DatabaseType.findFromDbUrl(dbUrl);
DatabaseMetadataFinder databaseMetadataFinder = DatabaseMetadataFinderFactory.createDatabaseMetadataFinderFrom(dataSource, dbType);
DatabaseMetadataFinder databaseMetadataFinderWithCache = DatabaseMetadataFinderWithCache.buildFrom(databaseMetadataFinder);
return buildFrom(dataSource, dbType, databaseMetadataFinderWithCache);
}
/**
* Factory method to build an instance of <code>org.qstd.QuickSqlTestData</code> from a data source,
* a database type and a database metadata finder.
* @param dataSource A datasource
* @param dbType A database type
* @param databaseMetadataFinder A database metadata finder
* @return An instance of <code>org.qstd.QuickSqlTestData</code>
*/
public static QuickSqlTestData buildFrom(DataSource dataSource, DatabaseType dbType, DatabaseMetadataFinder databaseMetadataFinder) {
DatasetRowsGenerator datasetRowsGenerator = new DatasetRowsGenerator(dataSource, dbType, databaseMetadataFinder);
return new QuickSqlTestData(datasetRowsGenerator, dbType);
}
/**
* Generates an SQL script allowing to test the SQL query given in parameter.
* This script contains INSERT statements.
* It takes into account the database integrity constraints.
* @param sqlQuery An SQL query
* @return An SQL script allowing to test the SQL query given in parameter
*/
public String generateInsertScriptFor(String sqlQuery) {
return generateInsertScriptFor(sqlQuery, emptyList());
}
/**
* Generates an SQL script allowing to test an SQL query with its bind parameter values.
* This script contains INSERT statements.
* It takes into account the database integrity constraints.
* @param query An SQL query with bind parameters
* @param parameters Bind parameter values
* @return An SQL script allowing to test the SQL query with its bind parameter values
*/
public String generateInsertScriptFor(String query, List<Object> parameters) {
List<SqlQuery> sqlQueries = singletonList(new SqlQuery(query, parameters));
return generateInsertScriptFor(sqlQueries);
}
/**
* Generates an SQL script allowing to test the list of SQL queries given in parameter.
* This script contains INSERT statements.
* It takes into account the database integrity constraints.
* @param sqlQueries SQL queries
* @return An SQL script allowing to test the SQL queries given in parameter
*/
public String generateInsertScriptFor(List<SqlQuery> sqlQueries) {
List<DatasetRow> datasetRows = datasetRowsGenerator.generateDatasetRowsFor(sqlQueries);
return insertStatementGenerator.generateInsertScriptFor(datasetRows);
}
/**
* Generates a list of INSERT statements allowing to test the list of SQL queries given in parameter.
* These INSERT statements take into account the database integrity constraints.
* @param sqlQueries SQL queries
* @return An SQL script allowing to test the SQL queries given in parameter
*/
public String generateInsertScriptFor(String... sqlQueries) {
List<SqlQuery> queries = stream(sqlQueries)
.map(SqlQuery::new)
.collect(toList());
return generateInsertScriptFor(queries);
}
/**
* Generates a list of INSERT statements allowing to create in database the dataset row given in parameter.
* These INSERT statements take into account the database integrity constraints.
* @param datasetRow A dataset row
* @return A list of INSERT statements allowing to create in database the dataset row given in parameter
*/
public List<String> generateInsertListFor(DatasetRow datasetRow) {
SqlQuery sqlQuery = SqlQuery.buildFromRow(datasetRow, dbType);
return generateInsertListFor(sqlQuery.toString());
}
/**
* Generates a list of INSERT statements allowing to test the SQL queries given in parameter.
* These INSERT statements take into account the database integrity constraints.
* @param sqlQueries SQL queries
* @return A list of INSERT statements allowing to test the SQL queries given in parameter
*/
public List<String> generateInsertListFor(String... sqlQueries) {
List<SqlQuery> sqlQueryObjects = stream(sqlQueries)
.map(SqlQuery::new)
.collect(toList());
List<DatasetRow> datasetRows = datasetRowsGenerator.generateDatasetRowsFor(sqlQueryObjects);
return insertStatementGenerator.generateInsertStatementsFor(datasetRows);
}
}