Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
HaydenOrz opened this issue Feb 23, 2024 · 11 comments
Closed
Labels
new features New feature or request question Further information is requested

Comments

@HaydenOrz
Copy link
Collaborator

HaydenOrz commented Feb 23, 2024

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

Originally posted by @dcycurry in #105 (comment)

@HaydenOrz
Copy link
Collaborator Author

这个功能我们还在开发中, 相关进展可以关注: DTStack/dt-sql-parser#250DTStack/dt-sql-parser#253

@HaydenOrz HaydenOrz changed the title 我想提示column的信息,需要获取table的名称,要如何获取啊 我想提示column的信息,需要获取table的名称,要如何获取 Feb 23, 2024
@HaydenOrz HaydenOrz added question Further information is requested new features New feature or request labels Feb 23, 2024
@Kijin-Seija
Copy link
Contributor

Kijin-Seija commented Mar 19, 2024

@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 }
      }
})

@dcycurry
Copy link

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

@HaydenOrz
Copy link
Collaborator Author

#111

@HaydenOrz
Copy link
Collaborator Author

@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
Copy link
Collaborator Author

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

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

@dcycurry
Copy link

dcycurry commented Apr 7, 2024

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

@HaydenOrz
Copy link
Collaborator Author

HaydenOrz commented Apr 7, 2024

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

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

@dcycurry
Copy link

dcycurry commented Apr 7, 2024

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

@HaydenOrz
Copy link
Collaborator Author

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

暂时不考虑收集,原因同 DTStack/dt-sql-parser#284 (comment)

@Kijin-Seija
Copy link
Contributor

Kijin-Seija commented Apr 16, 2024

@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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
new features New feature or request question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants