Skip to content

Commit 70d7634

Browse files
committed
Merge branch 'DBTOOLS-1725-additional-dependencies' into 'master'
DBTOOLS-1725 added new overloads of the diff method to PgCodeKeeperApi See merge request codekeeper/pgcodekeeper-core!70
2 parents 5d6a8ab + a7ddb53 commit 70d7634

File tree

10 files changed

+108
-61
lines changed

10 files changed

+108
-61
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1010
### Added
1111

1212
- Added connection test with databases.
13+
- Added new overloads of the diff method to PgCodeKeeperApi.
1314

1415
### Changed
1516

CHANGELOG.ru.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
### Добавлено
1111

1212
- Добавлены тесты соединения с базами данных.
13+
- Добавлены новые перегрузки метода diff в PgCodeKeeperApi.
1314

1415
### Изменено
1516

src/main/java/org/pgcodekeeper/core/PgDiff.java

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -73,50 +73,34 @@ public List<Object> getErrors() {
7373
return Collections.unmodifiableList(errors);
7474
}
7575

76-
/**
77-
* Selects all objects for diff, compares them between source and target
78-
* and generates a migration script.
79-
*
80-
* @param oldDb the source database schema
81-
* @param newDb the target database schema
82-
* @param ignoreList list of objects to ignore during comparison
83-
* @return SQL migration script
84-
* @throws InterruptedException if the operation is interrupted
85-
* @throws IOException if an I/O error occurs
86-
*/
87-
public String diff(AbstractDatabase oldDb, AbstractDatabase newDb, IgnoreList ignoreList)
88-
throws InterruptedException, IOException {
89-
TreeElement root = DiffTree.create(settings, oldDb, newDb);
90-
root.setAllChecked();
91-
92-
return diff(root, oldDb, newDb, null, null, ignoreList);
93-
}
94-
9576
/**
9677
* Gets selected elements from root, compares them between source and target
9778
* and generates a migration script.
9879
*
99-
* @param root the root of the diff tree
100-
* @param oldDb the source database schema
101-
* @param newDb the target database schema
102-
* @param additionalDepciesOldDb additional dependencies in old database
103-
* @param additionalDepciesNewDb additional dependencies in new database
104-
* @param ignoreList list of objects to ignore during comparison
80+
* @param root the root of the diff tree
81+
* @param oldDb the source database schema
82+
* @param newDb the target database schema
83+
* @param additionalDependenciesOldDb additional dependencies in old database
84+
* @param additionalDependenciesNewDb additional dependencies in new database
85+
* @param ignoreList list of objects to ignore during comparison
10586
* @return SQL migration script
10687
* @throws IOException if an I/O error occurs
10788
*/
10889
public String diff(TreeElement root,
109-
AbstractDatabase oldDb, AbstractDatabase newDb,
110-
List<Entry<PgStatement, PgStatement>> additionalDepciesOldDb,
111-
List<Entry<PgStatement, PgStatement>> additionalDepciesNewDb, IgnoreList ignoreList) throws IOException {
90+
AbstractDatabase oldDb,
91+
AbstractDatabase newDb,
92+
List<Entry<PgStatement, PgStatement>> additionalDependenciesOldDb,
93+
List<Entry<PgStatement, PgStatement>> additionalDependenciesNewDb,
94+
IgnoreList ignoreList)
95+
throws IOException {
11296
List<TreeElement> selected = getSelectedElements(root, ignoreList);
11397
if (selected.isEmpty()) {
11498
return EMPTY_SCRIPT;
11599
}
116100

117101
Set<PgStatement> toRefresh = new LinkedHashSet<>();
118-
var actions = resolveDependencies(selected, oldDb, newDb, additionalDepciesOldDb,
119-
additionalDepciesNewDb, toRefresh);
102+
var actions = resolveDependencies(selected, oldDb, newDb, additionalDependenciesOldDb,
103+
additionalDependenciesNewDb, toRefresh);
120104
if (actions.isEmpty()) {
121105
return EMPTY_SCRIPT;
122106
}
@@ -220,9 +204,11 @@ protected List<TreeElement> getSelectedElements(TreeElement root, IgnoreList ign
220204
}
221205

222206
private Set<ActionContainer> resolveDependencies(List<TreeElement> selected,
223-
AbstractDatabase oldDb, AbstractDatabase newDb,
224-
List<Entry<PgStatement, PgStatement>> additionalDepciesOldDb,
225-
List<Entry<PgStatement, PgStatement>> additionalDepciesNewDb, Set<PgStatement> toRefresh) {
207+
AbstractDatabase oldDb,
208+
AbstractDatabase newDb,
209+
List<Entry<PgStatement, PgStatement>> additionalDependenciesOldDb,
210+
List<Entry<PgStatement, PgStatement>> additionalDependenciesNewDb,
211+
Set<PgStatement> toRefresh) {
226212
addColumnsAsElements(oldDb, newDb, selected);
227213

228214
selected.sort(new CompareTree());
@@ -246,7 +232,7 @@ private Set<ActionContainer> resolveDependencies(List<TreeElement> selected,
246232
objects.add(new DbObject(oldStatement, newStatement));
247233
}
248234
return DepcyResolver.resolve(oldDb, newDb,
249-
additionalDepciesOldDb, additionalDepciesNewDb, toRefresh, objects, settings);
235+
additionalDependenciesOldDb, additionalDependenciesNewDb, toRefresh, objects, settings);
250236
}
251237

252238
@Deprecated

src/main/java/org/pgcodekeeper/core/api/PgCodeKeeperApi.java

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.pgcodekeeper.core.model.difftree.*;
2323
import org.pgcodekeeper.core.model.exporter.ModelExporter;
2424
import org.pgcodekeeper.core.schema.AbstractDatabase;
25+
import org.pgcodekeeper.core.schema.PgStatement;
2526
import org.pgcodekeeper.core.settings.ISettings;
2627
import org.pgcodekeeper.core.monitor.IMonitor;
2728
import org.pgcodekeeper.core.utils.ProjectUpdater;
@@ -31,6 +32,7 @@
3132
import java.util.Collection;
3233
import java.util.Collections;
3334
import java.util.List;
35+
import java.util.Map;
3436

3537
/**
3638
* Main API class for pgCodeKeeper database operations.
@@ -48,7 +50,7 @@ public final class PgCodeKeeperApi {
4850
* @throws InterruptedException if the thread is interrupted during the operation
4951
*/
5052
public static String diff(ISettings settings, AbstractDatabase oldDb, AbstractDatabase newDb)
51-
throws PgCodekeeperException, IOException, InterruptedException {
53+
throws IOException, InterruptedException {
5254
return diff(settings, oldDb, newDb, Collections.emptyList());
5355
}
5456

@@ -63,10 +65,63 @@ public static String diff(ISettings settings, AbstractDatabase oldDb, AbstractDa
6365
* @throws IOException if I/O operations fail or ignore list file cannot be read
6466
* @throws InterruptedException if the thread is interrupted during the operation
6567
*/
66-
public static String diff(ISettings settings, AbstractDatabase oldDb, AbstractDatabase newDb,
67-
Collection<String> ignoreLists) throws IOException, InterruptedException {
68+
public static String diff(ISettings settings,
69+
AbstractDatabase oldDb,
70+
AbstractDatabase newDb,
71+
Collection<String> ignoreLists)
72+
throws IOException, InterruptedException {
73+
return diff(settings, oldDb, newDb, null, null, ignoreLists);
74+
}
75+
76+
/**
77+
* Compares two databases and generates a migration script with filtering and additional dependencies.
78+
*
79+
* @param settings ISettings object
80+
* @param oldDb the old database version to compare from
81+
* @param newDb the new database version to compare to
82+
* @param additionalDependenciesOldDb additional dependencies in old database
83+
* @param additionalDependenciesNewDb additional dependencies in new database
84+
* @param ignoreLists collection of paths to files containing objects to ignore
85+
* @return the generated migration script as a string
86+
* @throws IOException if I/O operations fail or ignore list file cannot be read
87+
* @throws InterruptedException if the thread is interrupted during the operation
88+
*/
89+
public static String diff(ISettings settings,
90+
AbstractDatabase oldDb,
91+
AbstractDatabase newDb,
92+
List<Map.Entry<PgStatement, PgStatement>> additionalDependenciesOldDb,
93+
List<Map.Entry<PgStatement, PgStatement>> additionalDependenciesNewDb,
94+
Collection<String> ignoreLists)
95+
throws IOException, InterruptedException {
96+
TreeElement root = DiffTree.create(settings, oldDb, newDb);
97+
root.setAllChecked();
98+
return diff(settings, root, oldDb, newDb, additionalDependenciesOldDb, additionalDependenciesNewDb, ignoreLists);
99+
}
100+
101+
/**
102+
* Compares two databases and generates a migration script with filtering and additional dependencies.
103+
*
104+
* @param settings ISettings object
105+
* @param root root element of tree
106+
* @param oldDb the old database version to compare from
107+
* @param newDb the new database version to compare to
108+
* @param additionalDependenciesOldDb additional dependencies in old database
109+
* @param additionalDependenciesNewDb additional dependencies in new database
110+
* @param ignoreLists collection of paths to files containing objects to ignore
111+
* @return the generated migration script as a string
112+
* @throws IOException if I/O operations fail or ignore list file cannot be read
113+
*/
114+
public static String diff(ISettings settings,
115+
TreeElement root,
116+
AbstractDatabase oldDb,
117+
AbstractDatabase newDb,
118+
List<Map.Entry<PgStatement, PgStatement>> additionalDependenciesOldDb,
119+
List<Map.Entry<PgStatement, PgStatement>> additionalDependenciesNewDb,
120+
Collection<String> ignoreLists)
121+
throws IOException {
68122
IgnoreList ignoreList = IgnoreParser.parseLists(ignoreLists);
69-
return new PgDiff(settings).diff(oldDb, newDb, ignoreList);
123+
return new PgDiff(settings)
124+
.diff(root, oldDb, newDb, additionalDependenciesOldDb, additionalDependenciesNewDb, ignoreList);
70125
}
71126

72127
/**
@@ -101,8 +156,7 @@ public static void export(ISettings settings, AbstractDatabase dbToExport, Strin
101156
Collection<String> ignoreLists, IMonitor monitor)
102157
throws IOException, InterruptedException {
103158
IgnoreList ignoreList = IgnoreParser.parseLists(ignoreLists);
104-
TreeElement root;
105-
root = DiffTree.create(settings, dbToExport, null, monitor);
159+
TreeElement root = DiffTree.create(settings, dbToExport, null, monitor);
106160
root.setAllChecked();
107161

108162
List<TreeElement> selected = getSelectedElements(settings, root, ignoreList);

src/main/java/org/pgcodekeeper/core/ignoreparser/IgnoreParser.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,10 @@ private void ruleRest(Rule_restContext ruleRest, boolean isShow) {
138138
public static IgnoreList parseLists(Collection<String> ignoreLists) throws IOException {
139139
IgnoreList ignoreList = new IgnoreList();
140140
IgnoreParser ignoreParser = new IgnoreParser(ignoreList);
141-
for (String ignoreListPath : ignoreLists) {
142-
ignoreParser.parse(Paths.get(ignoreListPath));
141+
if (ignoreLists != null) {
142+
for (String ignoreListPath : ignoreLists) {
143+
ignoreParser.parse(Paths.get(ignoreListPath));
144+
}
143145
}
144146
return ignoreList;
145147
}

src/main/java/org/pgcodekeeper/core/model/graph/DepcyResolver.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -563,13 +563,16 @@ private Boolean getRecreatedObj(AbstractTable oldTable, AbstractTable newTable)
563563
return recreatedObjs.computeIfAbsent(oldTable.getQualifiedName(), x -> oldTable.isRecreated(newTable, settings));
564564
}
565565

566-
public static Set<ActionContainer> resolve(AbstractDatabase oldDb, AbstractDatabase newDb,
567-
List<Entry<PgStatement, PgStatement>> additionalDepciesOldDb,
568-
List<Entry<PgStatement, PgStatement>> additionalDepciesNewDb,
569-
Set<PgStatement> toRefresh, List<DbObject> dbObjects, ISettings settings) {
566+
public static Set<ActionContainer> resolve(AbstractDatabase oldDb,
567+
AbstractDatabase newDb,
568+
List<Entry<PgStatement, PgStatement>> additionalDependenciesOldDb,
569+
List<Entry<PgStatement, PgStatement>> additionalDependenciesNewDb,
570+
Set<PgStatement> toRefresh,
571+
List<DbObject> dbObjects,
572+
ISettings settings) {
570573
DepcyResolver depRes = new DepcyResolver(oldDb, newDb, settings, toRefresh);
571-
depRes.oldDepcyGraph.addCustomDepcies(additionalDepciesOldDb);
572-
depRes.newDepcyGraph.addCustomDepcies(additionalDepciesNewDb);
574+
depRes.oldDepcyGraph.addCustomDepcies(additionalDependenciesOldDb);
575+
depRes.newDepcyGraph.addCustomDepcies(additionalDependenciesNewDb);
573576
depRes.fillObjects(dbObjects);
574577
depRes.recreateDrops();
575578
depRes.removeExtraActions();

src/test/java/org/pgcodekeeper/core/it/IntegrationTestUtils.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.junit.jupiter.api.Assertions;
1919
import org.pgcodekeeper.core.*;
20+
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2021
import org.pgcodekeeper.core.loader.DatabaseLoader;
2122
import org.pgcodekeeper.core.loader.PgDumpLoader;
2223
import org.pgcodekeeper.core.model.difftree.DbObjType;
@@ -87,7 +88,7 @@ public static void assertDiffSame(AbstractDatabase db, String template, ISetting
8788

8889
public static void assertDiff(AbstractDatabase oldDb, AbstractDatabase newDb, ISettings settings, String errorMessage)
8990
throws IOException, InterruptedException {
90-
String script = new PgDiff(settings).diff(oldDb, newDb, null);
91+
String script = PgCodeKeeperApi.diff(settings, oldDb, newDb);
9192
Assertions.assertEquals("", script.trim(), errorMessage);
9293
}
9394

@@ -129,7 +130,7 @@ public static String getScript(String fileNameTemplate, CoreSettings settings, C
129130
AbstractDatabase dbNew = loadTestDump(fileNameTemplate + FILES_POSTFIX.NEW_SQL, clazz, settings);
130131
assertDiffSame(dbNew, fileNameTemplate, settings);
131132

132-
return new PgDiff(settings).diff(dbOld, dbNew, null);
133+
return PgCodeKeeperApi.diff(settings, dbOld, dbNew);
133134
}
134135

135136
public static void assertEqualsDependencies(String dbTemplate, String userTemplateName,
@@ -144,7 +145,7 @@ public static void assertEqualsDependencies(String dbTemplate, String userTempla
144145
TreeElement tree = DiffTree.create(settings, oldDbFull, newDbFull, null);
145146

146147
setSelected(selected, tree, oldDbFull, newDbFull);
147-
String script = new PgDiff(settings).diff(tree, oldDbFull, newDbFull, null, null, null);
148+
String script = PgCodeKeeperApi.diff(settings, tree, oldDbFull, newDbFull, null, null, null);
148149
var userSelTemplate = null == userTemplateName ? dbTemplate : dbTemplate + "_" + userTemplateName;
149150
assertResult(script, userSelTemplate, clazz);
150151
}

src/test/java/org/pgcodekeeper/core/it/diff/ms/MsMoveDataDiffTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.junit.jupiter.params.provider.ValueSource;
2020
import org.pgcodekeeper.core.DatabaseType;
2121
import org.pgcodekeeper.core.FILES_POSTFIX;
22-
import org.pgcodekeeper.core.PgDiff;
22+
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2323
import org.pgcodekeeper.core.schema.AbstractDatabase;
2424
import org.pgcodekeeper.core.settings.CoreSettings;
2525

@@ -58,7 +58,7 @@ void moveDataTest(String fileNameTemplate) throws IOException, InterruptedExcept
5858
assertDiffSame(dbOld, fileNameTemplate, settings);
5959
assertDiffSame(dbNew, fileNameTemplate, settings);
6060

61-
String script = new PgDiff(settings).diff(dbOld, dbNew, null);
61+
String script = PgCodeKeeperApi.diff(settings, dbOld, dbNew);
6262
String content = script.replaceAll("([0-9a-fA-F]{32})", "randomly_generated_part");
6363

6464
assertResult(content, fileNameTemplate, MsMoveDataDiffTest.class);

src/test/java/org/pgcodekeeper/core/it/diff/pg/LibDiffTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
import org.junit.jupiter.params.ParameterizedTest;
2020
import org.junit.jupiter.params.provider.ValueSource;
2121
import org.pgcodekeeper.core.FILES_POSTFIX;
22-
import org.pgcodekeeper.core.PgDiff;
2322
import org.pgcodekeeper.core.TestUtils;
23+
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
24+
import org.pgcodekeeper.core.it.IntegrationTestUtils;
2425
import org.pgcodekeeper.core.loader.DatabaseLoader;
2526
import org.pgcodekeeper.core.loader.LibraryLoader;
2627
import org.pgcodekeeper.core.schema.AbstractDatabase;
@@ -31,8 +32,6 @@
3132
import java.util.ArrayList;
3233
import java.util.List;
3334

34-
import static org.pgcodekeeper.core.it.IntegrationTestUtils.*;
35-
3635
class LibDiffTest {
3736

3837
@ParameterizedTest
@@ -70,13 +69,13 @@ private void testLibrary(String fileNameTemplate, List<String> libList, boolean
7069
libs.add(TestUtils.getPathToResource(lib, getClass()).toString());
7170
}
7271
AbstractDatabase dbOld = DatabaseLoader.createDb(settings);
73-
AbstractDatabase dbNew = loadTestDump(fileNameTemplate + FILES_POSTFIX.NEW_SQL, getClass(), settings);
72+
AbstractDatabase dbNew = IntegrationTestUtils.loadTestDump(fileNameTemplate + FILES_POSTFIX.NEW_SQL, getClass(), settings);
7473
LibraryLoader loader = new LibraryLoader(dbNew, null, null);
7574

7675
loader.loadLibraries(settings, isIgnorePrivileges, libs);
7776

78-
String script = new PgDiff(settings).diff(dbOld, dbNew, null);
77+
String script = PgCodeKeeperApi.diff(settings, dbOld, dbNew);
7978

80-
assertResult(script, fileNameTemplate, getClass());
79+
IntegrationTestUtils.assertResult(script, fileNameTemplate, getClass());
8180
}
8281
}

src/test/java/org/pgcodekeeper/core/it/diff/pg/PgMoveDataDiffTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.junit.jupiter.params.provider.ValueSource;
2020
import org.pgcodekeeper.core.DatabaseType;
2121
import org.pgcodekeeper.core.FILES_POSTFIX;
22-
import org.pgcodekeeper.core.PgDiff;
22+
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2323
import org.pgcodekeeper.core.it.IntegrationTestUtils;
2424
import org.pgcodekeeper.core.schema.AbstractDatabase;
2525
import org.pgcodekeeper.core.settings.CoreSettings;
@@ -68,7 +68,7 @@ void moveDataTest(String fileNameTemplate) throws IOException, InterruptedExcept
6868
IntegrationTestUtils.assertDiffSame(dbOld, fileNameTemplate, settings);
6969
IntegrationTestUtils.assertDiffSame(dbNew, fileNameTemplate, settings);
7070

71-
String script = new PgDiff(settings).diff(dbOld, dbNew, null);
71+
String script = PgCodeKeeperApi.diff(settings, dbOld, dbNew);
7272
String content = script.replaceAll("([0-9a-fA-F]{32})", "randomly_generated_part");
7373

7474
IntegrationTestUtils.assertResult(content, fileNameTemplate, PgMoveDataDiffTest.class);

0 commit comments

Comments
 (0)