monaco-sql-languages icon indicating copy to clipboard operation
monaco-sql-languages copied to clipboard

我想提示column的信息,需要获取table的名称,要如何获取

Open HaydenOrz opened this issue 1 year ago • 10 comments

我想提示column的信息,需要获取table的名称,要如何获取啊

Originally posted by @dcycurry in https://github.com/DTStack/monaco-sql-languages/issues/105#issuecomment-1960738532

HaydenOrz avatar Feb 23 '24 06:02 HaydenOrz

这个功能我们还在开发中, 相关进展可以关注: https://github.com/DTStack/dt-sql-parser/discussions/250 和 https://github.com/DTStack/dt-sql-parser/pull/253

HaydenOrz avatar Feb 23 '24 06:02 HaydenOrz

@dcycurry 可以先手工处理,供参考,大概的思路是:

  1. 拿到你当前的sql内容,建议把光标位置用一个占位符处理一下,以便sql-parser能解析成功。
  2. 使用sql-parser解析,定义一个visitor收集解析到的tableName
  3. 根据tableName去请求columns
import { PostgresSQL, AbstractParseTreeVisitor, type PostgreSQLParserVisitor } from 'dt-sql-parser'
const sql = 'your sql'
class MyVisitor extends AbstractParseTreeVisitor<void> implements PostgreSQLParserVisitor<void> {
  public result = { tableName: '' }
  visitTable_name(ctx: Table_nameContext) {
    if (ctx.text) this.result.tableName = ctx.text.toLowerCase()
  }
}

setupLanguageFeatures({
   languageId: LanguageIdEnum.PG,
   completionService: async(model,
      position,
      _completionContext,
      suggestions) => {
         // 先根据参数里的model和position定位你要解析的sql位置,这段我就略过了
          const sql = 'your sql'
          const parser = new PostgresSQL()
          const tree = parser.parse(sql)
          const visitor = new MyVisitor()
          visitor.visit(tree)
          // 这个visitor会返回tableName,你只需要根据当前tableName请求columns就行
         const columns = await fetchColumns(visitor.result.tableName)
         return { completionItems: columns }
      }
})

Kijin-Seija avatar Mar 19 '24 03:03 Kijin-Seija

@Kijin-Seija 非常感谢!现在能提示table name 和columns了

dcycurry avatar Mar 25 '24 08:03 dcycurry

#111

HaydenOrz avatar Mar 28 '24 12:03 HaydenOrz

@dcycurry @Kijin-Seija

monaco-sql-languages 0.12.0-beta.11 版本已发布: https://www.npmjs.com/package/monaco-sql-languages/v/0.12.0-beta.11

新增支持了自动补全过程中收集实体,现在你可以在 completionService 的最后一个参数中接收实体信息(表名、字段名等)

另外,此版本上有一些破坏性变更,如果更新后报错,请查看最新的文档。

HaydenOrz avatar Apr 01 '24 12:04 HaydenOrz

请在尽快确认该功能是否可用或者是否符合期望,有任何问题,欢迎反馈。

如果没有反馈,本issue将在一周后关闭。

HaydenOrz avatar Apr 01 '24 12:04 HaydenOrz

@HaydenOrz 升级后,webpack编译时遇到这个问题,你知道如何解决吗 image

dcycurry avatar Apr 07 '24 03:04 dcycurry

@HaydenOrz 升级后,webpack编译时遇到这个问题

@dcycurry 看起来像是 webpack 配置中,处理 js 的 loader 版本太旧了, class static block 在 es2022 版本才支持,具体解决方式需要看 webpack 配置中处理js 的loader是什么。 如果用的是 ts-loader 那么需要升级 typescript 和 ts-loader 版本,swc 和 esbuild 同理。

HaydenOrz avatar Apr 07 '24 03:04 HaydenOrz

@HaydenOrz 感谢大佬🙏,大部分情况我可以收集到实体了,这里提一种例外的情况 SELECT * FROM database111.<cursor> 光标在<cursor>位置时希望收集到database111这个database,这个情况你们考虑收集吗? 目前似乎可以根据syntax中的wordRanges来判断一下,也能实现 image

dcycurry avatar Apr 07 '24 07:04 dcycurry

SELECT * FROM database111.<cursor> 光标在<cursor>位置时希望收集到database111这个database,这个情况你们考虑收集吗?

暂时不考虑收集,原因同 https://github.com/DTStack/dt-sql-parser/issues/284#issuecomment-2033478419

HaydenOrz avatar Apr 07 '24 08:04 HaydenOrz

@dcycurry @Kijin-Seija

monaco-sql-languages 0.12.0-beta.11 版本已发布: https://www.npmjs.com/package/monaco-sql-languages/v/0.12.0-beta.11

新增支持了自动补全过程中收集实体,现在你可以在 completionService 的最后一个参数中接收实体信息(表名、字段名等)

另外,此版本上有一些破坏性变更,如果更新后报错,请查看最新的文档。

感谢,目前升级后使用上没什么问题。就是有些节点好像改用g4 文件里备注的别名了,我得重新梳理一下🤣 image

Kijin-Seija avatar Apr 16 '24 08:04 Kijin-Seija