php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 521|回复: 0

clickhouse智能提示编辑器

[复制链接]

2871

主题

2881

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7285
贡献
0
注册时间
2021-4-14
最后登录
2024-9-20
在线时间
716 小时
QQ
发表于 2022-4-10 20:01:32 | 显示全部楼层 |阅读模式
对于经常写sql的人来说智能提示是非常重要的,这个非常影响写sql的效率和心情。

这里说的智能提示不仅仅是关键字(select等)的智能提示,还得要做到表字段的智能提示。

例如: 下面是mysql的智能提示(是利用codemirror做的)
image.png
上图是我很久以前搞的一个快速开发的后台系统中的一个小工具。

如果大家需要mysql结合db的schema来智能提示的可以去参考下开源AntMgr后台快速开发系统

clickhouse的智能提示
今天给大家分享ace_editor来封装clickhouse的智能提示。

效果如下:
image.png
使用方法
git clone下代码后打开demo

https://github.com/yuzd/ace_clickhouse
image.png
ace_clickhouse.js
我把 ace_editor 和 ace_lang_tools 还有关于 clickhouse的基本关键字提示的全都放在这一个js里面了。

打开ace_clickhouse.js 里面有四大部分

最上面的ace_editor
ace.define("ace/snippets"开头的是ace_lang_tools
然后是clickhouse的扩展内容(关键字和clickhouse的函数等)
最后一部分是theme
image.png
有需要你可以拆出来。

注意:我为了使用简单,暴露了一个ace_langTools在window的scope下。方便给下面的js使用(下面会讲到)

另外一个js:model-sql.js
这个是做表字段的智能提示的,
window.sqlTablesCompleter = {
    target: {
        database: 'log',
        table: 'testdb'
    },
    completerCache: [],
    getCompletions: function (editor, session, pos, prefix, callback) {
        var self = this;
        var key = self.target.database + '.' + self.target.table;
        if (self.completerCache[key]) {
            callback(null, self.completerCache[key]);
            return;
        }

        var sql = self.buildExploreQuery("COLUMNS");
        self._post(sql, function (response) {
            self.completerCache[key] = response.data.map(function (item) {
                return {
                    caption: item.text,
                    value: item.text,
                    meta: key,
                    docHTML: self._convertToHTML(item),
                };
            });
            callback(null, self.completerCache[key]);
        });
    },
    _convertToHTML: function (item) {
        var desc = item.value, space_index = 0, start = 0, line = "", next_line_end = 60, lines = [];
        for (var i = 0; i < desc.length; i++) {
            if (desc === ' ') {
                space_index = i;
            } else if (i >= next_line_end && space_index !== 0) {
                line = desc.slice(start, space_index);
                lines.push(line);
                start = space_index + 1;
                next_line_end = i + 60;
                space_index = 0;
            }
        }
        line = desc.slice(start);
        lines.push(line);
        return ["<b>", item.text, "</b>", "<hr></hr>", lines.join("&nbsp<br>")].join("");
    },
    _post: function (sql, callback) {
        //这里需要改造成去请求表的schema的数据,接口的返回格式如下所示
        callback(JSON.parse("{\n" +
            "    \"data\": [\n" +
            "        {\n" +
            "            \"text\": \"field1\",\n" +
            "            \"value\": \"DateTime\"\n" +
            "        },\n" +
            "        {\n" +
            "            \"text\": \"field2\",\n" +
            "            \"value\": \"String\"\n" +
            "        }\n" +
            "    ]\n" +
            "}"));
    }
};

如上面代码里面的注释一样,你需要调用一个接口去获取你需要智能提示的clickhouse的表的字段信息
然后在去把这个智能提示注册到ace_editor里面去
[mw_shl_code=applescript,true]
winwo.ace_langTools.addCompleter(sqlTablesCompleter);
[/mw_shl_code]
这样就搞定了

如果有哪些clickhouse的函数没有提示的,可以把函数提示内容添加到第一个js文件里面的

ace.define("ace/mode/clickhouse_info" 代码块中Funcs 和 FunctionsCompletions

照葫芦画瓢即可!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-9-20 08:49 , Processed in 0.183301 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表