Skip to content

Commit 1365bdc

Browse files
committed
added BeforeMigrationRule and AfterMigrationRule
1 parent d17f6bc commit 1365bdc

File tree

12 files changed

+129
-39
lines changed

12 files changed

+129
-39
lines changed

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

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package dev.matrix.roomigrant.compiler
22

33
import com.squareup.kotlinpoet.*
4+
import dev.matrix.roomigrant.AfterMigrationRule
5+
import dev.matrix.roomigrant.BeforeMigrationRule
46
import dev.matrix.roomigrant.FieldMigrationRule
57
import dev.matrix.roomigrant.GenerateRoomMigrations
68
import dev.matrix.roomigrant.compiler.data.Scheme
7-
import dev.matrix.roomigrant.compiler.rules.FieldRule
8-
import dev.matrix.roomigrant.compiler.rules.FieldRules
9-
import dev.matrix.roomigrant.compiler.rules.RulesHolder
9+
import dev.matrix.roomigrant.compiler.rules.*
1010
import javax.annotation.processing.ProcessingEnvironment
1111
import javax.lang.model.element.ElementKind
1212
import javax.lang.model.element.TypeElement
@@ -17,7 +17,7 @@ import javax.tools.StandardLocation
1717
/**
1818
* @author matrixdev
1919
*/
20-
@Suppress("UNCHECKED_CAST")
20+
@Suppress("UNCHECKED_CAST", "MemberVisibilityCanBePrivate")
2121
class Database(val environment: ProcessingEnvironment, element: TypeElement) {
2222

2323
val migrationType = ClassName("android.arch.persistence.room.migration", "Migration")
@@ -29,8 +29,8 @@ class Database(val environment: ProcessingEnvironment, element: TypeElement) {
2929
val elementClassName = element.asClassName().simpleName()
3030
val migrationListClassName = ClassName(packageName, "${elementClassName}_Migrations")
3131

32+
val rules = Rules()
3233
val migrations = ArrayList<Migration>()
33-
val fieldRules = FieldRules()
3434
val rulesHolderList = ArrayList<RulesHolder>()
3535

3636
init {
@@ -48,7 +48,17 @@ class Database(val environment: ProcessingEnvironment, element: TypeElement) {
4848

4949
method.getAnnotation(FieldMigrationRule::class.java)?.also {
5050
val rule = FieldRule(this, holder, method.simpleName.toString())
51-
fieldRules.put(it.version1, it.version2, it.table, it.field, rule)
51+
rules.putFieldRule(it.version1, it.version2, it.table, it.field, rule)
52+
}
53+
54+
method.getAnnotation(BeforeMigrationRule::class.java)?.also {
55+
val rule = LifecycleRule(this, holder, method.simpleName.toString())
56+
rules.putBeforeRule(it.version1, it.version2, rule)
57+
}
58+
59+
method.getAnnotation(AfterMigrationRule::class.java)?.also {
60+
val rule = LifecycleRule(this, holder, method.simpleName.toString())
61+
rules.putAfterRule(it.version1, it.version2, rule)
5262
}
5363
}
5464

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

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

37+
state.rules.getBeforeRule(scheme1.version, scheme2.version)?.also {
38+
funcSpecBuilder.addCode(it.getInvokeCode(databaseArgName))
39+
}
40+
3741
migrate()
3842

43+
state.rules.getAfterRule(scheme1.version, scheme2.version)?.also {
44+
funcSpecBuilder.addCode(it.getInvokeCode(databaseArgName))
45+
}
46+
3947
typeSpec = TypeSpec.objectBuilder(className)
4048
.superclass(state.migrationType)
4149
.addSuperclassConstructorParameter("%L, %L", scheme1.version, scheme2.version)
@@ -88,19 +96,19 @@ class Migration(
8896
val fields = LinkedHashMap<String, String>()
8997
for (it in tableDiff.fieldsDiff.same) {
9098
val rule = getFieldRule(table2, it.field2)
91-
fields[it.field2.name] = rule?.invokeCodeWrapped ?: it.copySql
99+
fields[it.field2.name] = rule?.inStringTemplate ?: it.copySql
92100
}
93101
for (it in tableDiff.fieldsDiff.added) {
94102
val rule = getFieldRule(table2, it)
95-
fields[it.name] = rule?.invokeCodeWrapped ?: it.defaultSqlValue
103+
fields[it.name] = rule?.inStringTemplate ?: it.defaultSqlValue
96104
}
97105
for (it in tableDiff.fieldsDiff.affinityChanged) {
98106
val rule = getFieldRule(table2, it.field2)
99-
fields[it.field2.name] = rule?.invokeCodeWrapped ?: it.castSql
107+
fields[it.field2.name] = rule?.inStringTemplate ?: it.castSql
100108
}
101109
for (it in tableDiff.fieldsDiff.nullabilityChanged) {
102110
val rule = getFieldRule(table2, it.field2)
103-
fields[it.field2.name] = rule?.invokeCodeWrapped ?: it.toNotNullableSql
111+
fields[it.field2.name] = rule?.inStringTemplate ?: it.toNotNullableSql
104112
}
105113

106114
val sb = StringBuilder()
@@ -138,7 +146,7 @@ class Migration(
138146
}
139147

140148
private fun getFieldRule(table: Table, field: Field): FieldRule? {
141-
return state.fieldRules.get(scheme1.version, scheme2.version, table.name, field.name)
149+
return state.rules.getFieldRule(scheme1.version, scheme2.version, table.name, field.name)
142150
}
143151

144152
private fun execSql(query: String) {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ data class FieldRule(
1212
val methodName: String) {
1313

1414
val invokeCode = CodeBlock.of("%T.%L.%L()", state.migrationListClassName, holder.name, methodName)
15-
val invokeCodeWrapped = "\${$invokeCode}"
15+
val inStringTemplate = "\${$invokeCode}"
1616

17-
}
17+
}

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

-21
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package dev.matrix.roomigrant.compiler.rules
2+
3+
import dev.matrix.roomigrant.compiler.Database
4+
import com.squareup.kotlinpoet.CodeBlock
5+
6+
/**
7+
* @author matrixdev
8+
*/
9+
data class LifecycleRule(
10+
val state: Database,
11+
val holder: RulesHolder,
12+
val methodName: String) {
13+
14+
fun getInvokeCode(databaseArgName: String) = CodeBlock.of("%T.%L.%L($databaseArgName)\n", state.migrationListClassName, holder.name, methodName)
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package dev.matrix.roomigrant.compiler.rules
2+
3+
/**
4+
* @author matrixdev
5+
*/
6+
class Rules {
7+
8+
private val fieldRules = HashMap<String, FieldRule>()
9+
private val beforeRules = HashMap<String, LifecycleRule>()
10+
private val afterRules = HashMap<String, LifecycleRule>()
11+
12+
fun getFieldRule(version1: Int, version2: Int, table: String, field: String): FieldRule? {
13+
return fieldRules[packFieldRuleKey(version1, version2, table, field)]
14+
}
15+
16+
fun putFieldRule(version1: Int, version2: Int, table: String, field: String, rule: FieldRule) {
17+
fieldRules[packFieldRuleKey(version1, version2, table, field)] = rule
18+
}
19+
20+
fun getBeforeRule(version1: Int, version2: Int): LifecycleRule? {
21+
return beforeRules[packLifecycleRuleKey(version1, version2)]
22+
}
23+
24+
fun putBeforeRule(version1: Int, version2: Int, rule: LifecycleRule) {
25+
beforeRules[packLifecycleRuleKey(version1, version2)] = rule
26+
}
27+
28+
fun getAfterRule(version1: Int, version2: Int): LifecycleRule? {
29+
return afterRules[packLifecycleRuleKey(version1, version2)]
30+
}
31+
32+
fun putAfterRule(version1: Int, version2: Int, rule: LifecycleRule) {
33+
afterRules[packLifecycleRuleKey(version1, version2)] = rule
34+
}
35+
36+
private fun packLifecycleRuleKey(version1: Int, version2: Int) =
37+
"$version1-$version2"
38+
39+
private fun packFieldRuleKey(version1: Int, version2: Int, table: String, field: String) =
40+
"$version1-$version2-$table-$field"
41+
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.matrix.roomigrant
2+
3+
/**
4+
* @author matrixdev
5+
*/
6+
@Target(AnnotationTarget.FUNCTION)
7+
@Retention(AnnotationRetention.SOURCE)
8+
annotation class AfterMigrationRule(
9+
val version1: Int,
10+
val version2: Int)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.matrix.roomigrant
2+
3+
/**
4+
* @author matrixdev
5+
*/
6+
@Target(AnnotationTarget.FUNCTION)
7+
@Retention(AnnotationRetention.SOURCE)
8+
annotation class BeforeMigrationRule(
9+
val version1: Int,
10+
val version2: Int)

RoomigrantLib/src/main/java/dev/matrix/roomigrant/FieldMigrationRule.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ annotation class FieldMigrationRule(
99
val version1: Int,
1010
val version2: Int,
1111
val table: String,
12-
val field: String)
12+
val field: String)

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package dev.matrix.roomigrant.test
22

3+
import android.arch.persistence.db.SupportSQLiteDatabase
4+
import dev.matrix.roomigrant.AfterMigrationRule
5+
import dev.matrix.roomigrant.BeforeMigrationRule
36
import dev.matrix.roomigrant.FieldMigrationRule
47

58
/**
69
* @author matrixdev
710
*/
11+
@Suppress("FunctionName")
812
class Rules {
913

1014
@FieldMigrationRule(version1 = 3, version2 = 4, table = "Object1Dbo", field = "intValRenamed")
@@ -17,4 +21,15 @@ class Rules {
1721
return "`Object1Dbo`.`stringVal`"
1822
}
1923

20-
}
24+
@BeforeMigrationRule(version1 = 1, version2 = 2)
25+
fun migrate_1_2_before(db: SupportSQLiteDatabase) {
26+
val cursor = db.query("pragma table_info(Object1Dbo)")
27+
assert(cursor.count == 1)
28+
}
29+
30+
@AfterMigrationRule(version1 = 1, version2 = 2)
31+
fun migrate_1_2_after(db: SupportSQLiteDatabase) {
32+
val cursor = db.query("pragma table_info(Object1Dbo)")
33+
assert(cursor.count == 3)
34+
}
35+
}

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
}
1010

1111
dependencies {
12-
classpath 'com.android.tools.build:gradle:3.1.3'
12+
classpath 'com.android.tools.build:gradle:3.2.1'
1313
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1414
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
1515
}
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Sun Jul 15 21:42:25 EEST 2018
1+
#Tue Dec 18 12:36:59 EET 2018
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

0 commit comments

Comments
 (0)