Skip to content

Commit be53b2d

Browse files
committed
- added support for multiple OnMigrationEndRule or OnMigrationStartRule annotations on same migration
1 parent 501f7ca commit be53b2d

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

RoomigrantCompiler/src/main/java/dev/matrix/roomigrant/compiler/Migration.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ class Migration(
3434
funcSpecBuilder.addModifiers(KModifier.OVERRIDE)
3535
funcSpecBuilder.addParameter(databaseArgName, state.sqLiteDatabaseType)
3636

37-
state.rules.getOnStartRule(scheme1.version, scheme2.version)?.also {
37+
state.rules.getOnStartRules(scheme1.version, scheme2.version).forEach {
3838
funcSpecBuilder.addStatement("%L", it.getInvokeCode(databaseArgName, scheme1.version, scheme2.version))
3939
}
4040

4141
migrate()
4242

43-
state.rules.getOnEndRule(scheme1.version, scheme2.version)?.also {
43+
state.rules.getOnEndRules(scheme1.version, scheme2.version).forEach {
4444
funcSpecBuilder.addStatement("%L", it.getInvokeCode(databaseArgName, scheme1.version, scheme2.version))
4545
}
4646

RoomigrantCompiler/src/main/java/dev/matrix/roomigrant/compiler/rules/RuleByVersion.kt

+6
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ interface RuleByVersion {
77
val version1: Int
88
val version2: Int
99
}
10+
11+
fun <T : RuleByVersion> T.checkVersion(version1: Int, version2: Int): Boolean {
12+
if (this.version1 != -1 && this.version1 != version1) return false
13+
if (this.version2 != -1 && this.version2 != version2) return false
14+
return true
15+
}

RoomigrantCompiler/src/main/java/dev/matrix/roomigrant/compiler/rules/Rules.kt

+5-9
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,15 @@ class Rules(private val database: Database, element: TypeElement) {
6161
}
6262

6363
fun getFieldRule(version1: Int, version2: Int, table: String, field: String): FieldRule? {
64-
return fieldRules[table]?.get(field)?.findByVersion(version1, version2)
64+
return fieldRules[table]?.get(field)?.find { it.checkVersion(version1, version2) }
6565
}
6666

67-
fun getOnEndRule(version1: Int, version2: Int): InvokeRule? {
68-
return onEndRules.findByVersion(version1, version2)
67+
fun getOnEndRules(version1: Int, version2: Int): Sequence<InvokeRule> {
68+
return onEndRules.asSequence().filter { it.checkVersion(version1, version2) }
6969
}
7070

71-
fun getOnStartRule(version1: Int, version2: Int): InvokeRule? {
72-
return onStartRules.findByVersion(version1, version2)
73-
}
74-
75-
private fun <T : RuleByVersion> Iterable<T>.findByVersion(version1: Int, version2: Int): T? {
76-
return find { (it.version1 == -1 || it.version1 == version1) && (it.version2 == -1 || it.version2 == version2) }
71+
fun getOnStartRules(version1: Int, version2: Int): Sequence<InvokeRule> {
72+
return onStartRules.asSequence().filter { it.checkVersion(version1, version2) }
7773
}
7874

7975
}

RoomigrantTest/src/main/java/dev/matrix/roomigrant/test/Rules.kt

+12
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,21 @@ class Rules {
2727
assert(cursor.count == 1)
2828
}
2929

30+
@OnMigrationStartRule(version1 = 1)
31+
fun migrate_1_n_before(db: SupportSQLiteDatabase, version1: Int, version2: Int) {
32+
val cursor = db.query("pragma table_info(Object1Dbo)")
33+
assert(cursor.count == 1)
34+
}
35+
3036
@OnMigrationEndRule(version1 = 1, version2 = 2)
3137
fun migrate_1_2_after(db: SupportSQLiteDatabase, version1: Int, version2: Int) {
3238
val cursor = db.query("pragma table_info(Object1Dbo)")
3339
assert(cursor.count == 3)
3440
}
41+
42+
@OnMigrationEndRule(version2 = 2)
43+
fun migrate_n_2_after(db: SupportSQLiteDatabase, version1: Int, version2: Int) {
44+
val cursor = db.query("pragma table_info(Object1Dbo)")
45+
assert(cursor.count == 3)
46+
}
3547
}

0 commit comments

Comments
 (0)