Skip to content

Commit

Permalink
feat(database): add GenSqlScriptBySelection action
Browse files Browse the repository at this point in the history
Add a new action called GenSqlScriptBySelection to generate SQL scripts based on selected text in the editor. This action is available for all projects and can be invoked from the editor context menu. It retrieves the necessary information from the database and displays a prompt with the selected text, database version, and relevant tables.
  • Loading branch information
phodal committed Jan 24, 2024
1 parent ead7980 commit f597094
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 26 deletions.
4 changes: 4 additions & 0 deletions exts/database/README.md
Expand Up @@ -6,6 +6,10 @@ This directory contains extensions that are specific to a database.

Or others?

## 自然语言 SQL 生成

根据数据库表生成 JPA 、 MyBatis 、 Spring Data JDBC 等代码。

## Usecases: PL/SQL to Java

1. Generate Repository from PL/SQL code
Expand Down
@@ -0,0 +1,70 @@
package cc.unitmesh.database.actions

import cc.unitmesh.devti.AutoDevBundle
import cc.unitmesh.devti.intentions.action.base.AbstractChatIntention
import com.intellij.database.model.ObjectKind
import com.intellij.database.psi.DbElement
import com.intellij.database.psi.DbPsiFacade
import com.intellij.database.util.DasUtil
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile


class GenSqlScriptBySelection : AbstractChatIntention() {
override fun priority(): Int = 1001

override fun startInWriteAction(): Boolean = false

override fun getFamilyName(): String = AutoDevBundle.message("migration.database.plsql")

override fun getText(): String = AutoDevBundle.message("migration.database.sql.generate")

override fun isAvailable(project: Project, editor: Editor?, psiFile: PsiFile?): Boolean {
return true
}

override fun invoke(project: Project, editor: Editor?, psiFile: PsiFile?) {
val dbPsiFacade = DbPsiFacade.getInstance(project)
val dataSource = dbPsiFacade.dataSources.firstOrNull() ?: return
val dbms = dataSource.delegateDataSource.dbms
val model = dataSource.delegateDataSource.model

val selectedText = editor?.selectionModel?.selectedText

val rawDataSource = dbPsiFacade.getDataSourceManager(dataSource).dataSources.firstOrNull() ?: return
val databaseVersion = rawDataSource.databaseVersion
val schemaName = rawDataSource.name.substringBeforeLast('@')
val dasTables = rawDataSource.let {
val tables = DasUtil.getTables(it)
tables.filter { table -> table.kind == ObjectKind.TABLE && table.dasParent?.name == schemaName }
}.toList()

val tables = getDbElements(schemaName, dbPsiFacade)
println("elements: $tables")
val prompt = """
|Database: $databaseVersion
|Requirement: $selectedText
|Tables: ${tables.joinToString { it.name }}
|Tables: ${dasTables.joinToString { it.name }}
""".trimMargin()

println(prompt)
}

private fun getDbElements(tableName: String, dbPsiFacade: DbPsiFacade): List<DbElement> {
return dbPsiFacade.dataSources
.flatMap { dataSource ->
val dasTable = DasUtil.getTables(dataSource).filter {
it.dasParent?.name == tableName
}.filterNotNull().firstOrNull() ?: return@flatMap emptyList<DbElement>()

val columns = DasUtil.getColumns(dasTable)
columns.map { column ->
dataSource.findElement(column)
}.filterNotNull()

}
.toList()
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion exts/database/src/main/resources/cc.unitmesh.database.xml
Expand Up @@ -21,7 +21,7 @@
<categoryKey>intention.category.llm</categoryKey>
</autoDevIntention>
<autoDevIntention>
<className>cc.unitmesh.database.actions.VisualSqlAction</className>
<className>cc.unitmesh.database.actions.GenSqlScriptBySelection</className>
<bundleName>messages.AutoDevBundle</bundleName>
<categoryKey>intention.category.llm</categoryKey>
</autoDevIntention>
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages/AutoDevBundle.properties
Expand Up @@ -119,3 +119,4 @@ migration.database.plsql.generate.unittest=Generate Unit Test
migration.database.plsql.generate.entity=Generate Entity
migration.database.plsql.visual=Visualize PL/SQL
migration.database.plsql.modular.design=Modular Code
migration.database.sql.generate=Generate SQL (by selection)

0 comments on commit f597094

Please sign in to comment.