如何停止做同样的事情

您喜欢一遍又一遍地重复日常操作吗? 所以我不。 但每次在 SQL 客户端中使用 Rostelecom 存储时,我都必须手动注册表之间的所有连接。 尽管事实上在 90% 的情况下,连接表的字段和条件在查询之间是一致的! 似乎任何 SQL 客户端都有自动完成功能,但对于存储来说,它并不总是有效:它们很少包含唯一约束和外键以提高性能,如果没有这个,程序将不知道实体如何与每个实体相关。其他以及它能为您提供什么。

如何停止做同样的事情

在经历了否认、愤怒、讨价还价、沮丧和接近接受之后,我决定 - 为什么不尝试自己实现二十一点自动填充并以正确的方式进行呢? 我使用dbeaver客户端,用java编写,它有一个开源社区版本。 一个简单的计划已经成熟:

  1. 在源代码中查找负责自动完成的类
  2. 重定向它们以使用外部元数据并从那里提取有关连接的信息

我很快就弄清楚了第一点 - 我在错误跟踪器中找到了调整自动填充的请求以及相关的请求 犯罪 发现了 SQLCompletionAnalyzer 类。 我查看了代码,这就是我需要的。 剩下的就是重写它,以便一切正常。 我等待一个空闲的夜晚,开始思考实施方案。 我决定用json编写表链接规则(元数据)。 我没有使用这种格式的实际经验,当前的任务被视为纠正这一遗漏的机会。

为了使用 json,我决定使用该库 json-简单 来自谷歌。 这就是惊喜的开始。 事实证明,dbeaver 作为一个真正的应用程序,是使用 OSGi 框架在 Eclipse 平台上编写的。 对于经验丰富的开发人员来说,这个东西可以方便地管理依赖关系,但对我来说,这更像是黑魔法,我显然还没有准备好:像往常一样,我从 json-simple 库的标头中导入我需要的类编辑后的类,在 pom.xml 中指定它,之后项目断然拒绝正常组装并因错误而崩溃。

最后,我设法修复了构建错误:我按照 OSGI 的要求,不在 pom.xml 中注册库,而是在 manifest.mf 清单中注册库,同时将其指定为 import-package。 这不是最漂亮的解决方案,但它确实有效。 然后下一个惊喜出现了。 如果你在 Intellij Idea 中进行开发,你不能直接基于 eclipse 平台开始调试你的项目:一个没有经验的开发人员在没有查询完成的情况下所遭受的痛苦应该不亚于分析师。 海狸开发者自己前来救援,在 wiki 中指出了所有需要完成的手鼓舞蹈。 最烦人的是,即使在所有这些蹲下之后,该项目也不想在调试中启动,并通过 import-package 连接 json 库(尽管它仍然成功组装成成品)。

到那时,我已经意识到使用 json 来完成任务的不便 - 毕竟元数据应该手动编辑,而 xml 格式更适合于此。 支持 xml 的第二个论点是 JDK 中存在所有必要的类,这使得停止与外部库的冲突成为可能。 我非常高兴地将所有元数据从 json 转移到 xml 并开始编辑自动完成逻辑。

元数据示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tableRelations>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_partner</rightTable>
        <joinColumnPair leftColumn="partner_key" rightColumn="partner_key"/>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
    </tableRelation>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_branch</rightTable>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
        <joinColumnPair leftColumn="branch_key" rightColumn="branch_key"/>
    </tableRelation>
</tableRelations>

结果我 做了改变 进入 SQLUtils 和 SQLCompletionAnalyzer 类。 这个想法是这样的:如果程序无法使用基本逻辑找到合适的自动完成建议,那么它会使用外部 xml 文件检查是否存在可能的连接。 文件本身存储成对的表,指示需要链接这些表的字段。 默认设置对记录 eff_dttm 和 exp_dttm 的技术有效日期以及逻辑删除标志deleted_ind 的限制。

当对代码进行更改时,出现了问题 - 谁将用元数据填充文件? 存储库中有很多实体,自己注册所有连接的成本很高。 因此,我决定将这项任务分配给我的分析师同事。 我在 svn 中发布了元数据文件,从那里用程序签出到本地目录。 原理是这样的:存储库中是否出现了新的实体? 一名分析师将可能的连接输入到文件中,提交更改,其余的分析师自行检查并享受工作自动完成:社区、知识积累等等。 为同事举办了一个关于使用该程序的研讨会,在 Confluence 上写了一篇文章 - 现在公司有了一个更方便的工具。

开发此功能让我认识到无需害怕修改开源项目 - 一般来说,它们具有清晰的架构,甚至语言的基本知识也足以进行实验。 只要有一定的毅力,您甚至可以摆脱讨厌的常规操作,从而节省时间进行新的实验。

来源: habr.com

添加评论