Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/deploy-document.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@ name: Deploy Document
on:
push:
branches: [master]
paths:
- 'document/**'
pull_request:
branches: [master]
paths:
- 'document/**'
workflow_dispatch:

permissions:
Expand Down
7 changes: 1 addition & 6 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@ plugins {
group = "cn.enaium"
version = "${property("version")}"

sourceSets {
main {
resources.srcDir("../shared/src/main/resources")
}
}

repositories {
mavenCentral()
intellijPlatform {
Expand All @@ -38,6 +32,7 @@ dependencies {
implementation(libs.kotlinpoet)
implementation(libs.javapoet)
implementation(libs.antlr4.intellij.adaptor)
implementation(libs.h2)
implementation(project(":common"))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ package cn.enaium.jimmer.buddy.database.generate
import cn.enaium.jimmer.buddy.database.model.Column
import cn.enaium.jimmer.buddy.database.model.GenerateEntityModel
import cn.enaium.jimmer.buddy.database.model.Table
import com.intellij.openapi.project.Project
import java.nio.file.Path

/**
* @author Enaium
*/
interface EntityGenerate {
fun generate(
projectDir: Path,
project: Project,
generateEntity: GenerateEntityModel,
tables: Set<Table>
): List<Path>
Expand All @@ -36,6 +37,54 @@ interface EntityGenerate {
.filter { it -> it.value.size == tables.count { it.primaryKeys.isNotEmpty() } }.map { it.value.first() }
.toSet()
}

fun replaceName(tables: Set<Table>, generateEntity: GenerateEntityModel): Set<Table> {
return tables.map { table ->
table.copy(
name = table.name.replace(Regex(generateEntity.tableNameRegex), generateEntity.tableNameReplace),
columns = table.columns.map { column ->
column.copy(
name = column.name.replace(
Regex(generateEntity.columnNameRegex),
generateEntity.columnNameReplace
)
)
}.toSet(),
primaryKeys = table.primaryKeys.map { primaryKey ->
primaryKey.copy(
column = primaryKey.column.copy(
name = primaryKey.column.name.replace(
Regex(generateEntity.columnNameRegex),
generateEntity.columnNameReplace
)
)
)
}.toSet(),
foreignKeys = table.foreignKeys.map { foreignKey ->
foreignKey.copy(
column = foreignKey.column.copy(
name = foreignKey.column.name.replace(
Regex(generateEntity.columnNameRegex),
generateEntity.columnNameReplace
)
)
)
}.toMutableSet(),
uniqueKeys = table.uniqueKeys.map { uniqueKey ->
uniqueKey.copy(
columns = uniqueKey.columns.map { column ->
column.copy(
name = column.name.replace(
Regex(generateEntity.columnNameRegex),
generateEntity.columnNameReplace
)
)
}.toSet()
)
}.toSet()
)
}.toSet()
}
}

internal const val BASE_ENTITY = "BaseEntity"
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ package cn.enaium.jimmer.buddy.database.generate
import cn.enaium.jimmer.buddy.database.model.Column
import cn.enaium.jimmer.buddy.database.model.ForeignKey
import cn.enaium.jimmer.buddy.database.model.GenerateEntityModel
import cn.enaium.jimmer.buddy.extensions.template.BuddyTemplateFile
import cn.enaium.jimmer.buddy.storage.JimmerBuddySetting
import cn.enaium.jimmer.buddy.utility.firstCharLowercase
import cn.enaium.jimmer.buddy.utility.snakeToCamelCase
import cn.enaium.jimmer.buddy.utility.toPlural
import com.intellij.ide.fileTemplates.FileTemplateManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessProjectDir
import com.squareup.javapoet.*
import org.babyfish.jimmer.sql.*
import org.jetbrains.annotations.Nullable
Expand All @@ -38,10 +42,13 @@ class JavaEntityGenerate : EntityGenerate {
val javaTypeMappings = JimmerBuddySetting.INSTANCE.state.typeMapping.mapValues { it.value.javaType }

override fun generate(
projectDir: Path,
project: Project,
generateEntity: GenerateEntityModel,
tables: Set<cn.enaium.jimmer.buddy.database.model.Table>
): List<Path> {

val tables = replaceName(tables, generateEntity)

val idSuffix = "_${generateEntity.primaryKeyName}"

val commonColumns = getCommonColumns(tables)
Expand Down Expand Up @@ -111,6 +118,15 @@ class JavaEntityGenerate : EntityGenerate {
}
}

try {
val templateManager = FileTemplateManager.getInstance(project)
templateManager.getInternalTemplate(BuddyTemplateFile.GENERATE_ENTITY_DOC).also {
type.addJavadoc(it.getText(templateManager.defaultProperties))
}
} catch (_: Throwable) {

}

if (commonColumns.isNotEmpty()) type.addSuperinterface(ClassName.get(packageName, BASE_ENTITY))
// Add table columns
type.addMethods(
Expand Down Expand Up @@ -289,12 +305,12 @@ class JavaEntityGenerate : EntityGenerate {
}

// Write to file
return type2Builder.map { (_, type) ->
projectDir.resolve(generateEntity.relativePath).also {
return type2Builder.mapNotNull { (_, type) ->
project.guessProjectDir()?.toNioPath()?.resolve(generateEntity.relativePath)?.let {
JavaFile.builder(packageName, type.build())
.indent(" ")
.build()
.writeTo(it)
.writeToPath(it)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ package cn.enaium.jimmer.buddy.database.generate
import cn.enaium.jimmer.buddy.database.model.Column
import cn.enaium.jimmer.buddy.database.model.ForeignKey
import cn.enaium.jimmer.buddy.database.model.GenerateEntityModel
import cn.enaium.jimmer.buddy.extensions.template.BuddyTemplateFile
import cn.enaium.jimmer.buddy.storage.JimmerBuddySetting
import cn.enaium.jimmer.buddy.utility.firstCharLowercase
import cn.enaium.jimmer.buddy.utility.snakeToCamelCase
import cn.enaium.jimmer.buddy.utility.toPlural
import com.intellij.ide.fileTemplates.FileTemplateManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessProjectDir
import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import org.babyfish.jimmer.sql.*
Expand All @@ -37,10 +41,13 @@ class KotlinEntityGenerate : EntityGenerate {
val kotlinTypeMappings = JimmerBuddySetting.INSTANCE.state.typeMapping.mapValues { it.value.kotlinType }

override fun generate(
projectDir: Path,
project: Project,
generateEntity: GenerateEntityModel,
tables: Set<cn.enaium.jimmer.buddy.database.model.Table>
): List<Path> {

val tables = replaceName(tables, generateEntity)

val idSuffix = "_${generateEntity.primaryKeyName}"

val commonColumns = getCommonColumns(tables)
Expand Down Expand Up @@ -110,6 +117,15 @@ class KotlinEntityGenerate : EntityGenerate {
}
}

try {
val templateManager = FileTemplateManager.getInstance(project)
templateManager.getInternalTemplate(BuddyTemplateFile.GENERATE_ENTITY_DOC).also {
type.addKdoc(it.getText(templateManager.defaultProperties))
}
} catch (_: Throwable) {

}

if (commonColumns.isNotEmpty()) type.addSuperinterface(ClassName(packageName, BASE_ENTITY))
// Add table columns
type.addProperties(
Expand Down Expand Up @@ -265,8 +281,8 @@ class KotlinEntityGenerate : EntityGenerate {
}

// Write to file
return type2Builder.map { (tableName, typeBuilder) ->
projectDir.resolve(generateEntity.relativePath).also {
return type2Builder.mapNotNull { (tableName, typeBuilder) ->
project.guessProjectDir()?.toNioPath()?.resolve(generateEntity.relativePath)?.let {
FileSpec.builder(packageName, tableName)
.indent(" ")
.addType(typeBuilder.build()).build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,20 @@ import com.intellij.openapi.observable.properties.PropertyGraph
*/
class GenerateEntityModel : BaseState() {
private val graph: PropertyGraph = PropertyGraph()
val relativePathProperty = graph.property<String>("")
val packageNameProperty = graph.property<String>("")
val relativePathProperty = graph.property("")
val packageNameProperty = graph.property("")
val languageProperty = graph.property<Language>(Language.KOTLIN)
val commentProperty = graph.property<Boolean>(false)
val tableAnnotationProperty = graph.property<Boolean>(false)
val columnAnnotationProperty = graph.property<Boolean>(false)
val idViewAnnotationProperty = graph.property<Boolean>(false)
val joinTableAnnotationProperty = graph.property<Boolean>(false)
val primaryKeyNameProperty = graph.property<String>("id")
val commentProperty = graph.property(false)
val tableAnnotationProperty = graph.property(false)
val columnAnnotationProperty = graph.property(false)
val idViewAnnotationProperty = graph.property(false)
val joinTableAnnotationProperty = graph.property(false)
val primaryKeyNameProperty = graph.property("id")
val associationProperty = graph.property<Association>(Association.REAL)
val tableNameRegexProperty = graph.property("")
val tableNameReplaceProperty = graph.property("")
val columnNameRegexProperty = graph.property("")
val columnNameReplaceProperty = graph.property("")

val relativePath: String by relativePathProperty
val packageName: String by packageNameProperty
Expand All @@ -45,6 +49,10 @@ class GenerateEntityModel : BaseState() {
val joinTableAnnotation: Boolean by joinTableAnnotationProperty
val primaryKeyName: String by primaryKeyNameProperty
val association: Association by associationProperty
val tableNameRegex: String by tableNameRegexProperty
val tableNameReplace: String by tableNameReplaceProperty
val columnNameRegex: String by columnNameRegexProperty
val columnNameReplace: String by columnNameReplaceProperty

enum class Language(val text: String) {
KOTLIN("Kotlin"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ package cn.enaium.jimmer.buddy.database.model
data class UniqueKey(
val name: String,
val tableName: String,
val columns: List<Column>,
val columns: Set<Column>,
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package cn.enaium.jimmer.buddy.dialog

import cn.enaium.jimmer.buddy.storage.JimmerBuddySetting
import cn.enaium.jimmer.buddy.storage.JimmerBuddySetting.DatabaseItem
import cn.enaium.jimmer.buddy.utility.jarFileChooserField
import com.intellij.openapi.components.BaseState
import com.intellij.openapi.observable.properties.PropertyGraph
import com.intellij.openapi.ui.DialogWrapper
Expand Down Expand Up @@ -58,6 +59,9 @@ class AddDatabase(val select: DatabaseItem? = null) : DialogWrapper(false) {
row("Table Name Pattern:") {
textField().align(Align.FILL).bindText(databaseModel.tableNamePatternProperty)
}
row("Driver File:") {
jarFileChooserField(databaseModel.driverFileProperty).align(Align.FILL)
}
}
}

Expand All @@ -73,25 +77,28 @@ class AddDatabase(val select: DatabaseItem? = null) : DialogWrapper(false) {
databaseModel.password,
databaseModel.catalog,
databaseModel.schemaPattern,
databaseModel.tableNamePattern
databaseModel.tableNamePattern,
databaseModel.driverFile
)
super.doOKAction()
}

private inner class DatabaseModel : BaseState() {
private val graph: PropertyGraph = PropertyGraph()
val uriProperty = graph.property<String>(select?.uri ?: "")
val uriProperty = graph.property(select?.uri ?: "")
val usernameProperty = graph.property<String>(select?.username ?: "")
val passwordProperty = graph.property<String>(select?.password ?: "")
val catalogProperty = graph.property<String>(select?.catalog ?: "")
val schemaPatternProperty = graph.property<String>(select?.schemaPattern ?: "")
val tableNamePatternProperty = graph.property<String>(select?.tableNamePattern ?: "")
val driverFileProperty = graph.property<String>(select?.driverFile ?: "")

val uri: String by uriProperty
val username: String by usernameProperty
val password: String by passwordProperty
val catalog: String by catalogProperty
val schemaPattern: String by schemaPatternProperty
val tableNamePattern: String by tableNamePatternProperty
val driverFile: String by driverFileProperty
}
}
Loading