codefuse-ai/CodeFuse-Query

关于XML和Java文件间的数据流转

Closed this issue · 1 comments

您好,请问CodeFuse-Query支持Java-xml间的数据流转吗?如果采用mybaties框架,CodeFuse-Query框架支撑Java字符串 user 到对应的xml中 #{user}的映射吗?

CodeFuse-Query 支持多语言之间互相联查,在抽取的时候你需要对抽取的项目使用-lang java xml来进行抽取。
假设我们有一个 mybatis 生成的 resultMap 如下:

<resultMap id="BaseDO" type="com.xx.dao.ExampleDO">
    <!--
        This element is automatically generated by MyBatis Generator, do not modify.
    -->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="identifier" jdbcType="VARCHAR" property="identifier" />
</resultMap>

则我们可以用如下代码实现一个getDOClassFromResultMap,从而将 xml 中的 DOClass 信息与 java 中抽取的 Class 信息对应起来,以方便接下来的查询:

// script
use coref::java::*
use coref::xml::*

fn default_xml_db() -> XmlDB { return XmlDB::load("coref_xml_src.db") }
fn default_java_db() -> JavaDB { return JavaDB::load("coref_java_src.db") }

schema DBElement extends XmlElement {}

impl DBElement {
    // find XmlElement with name "resultMap"
    pub fn __all__(db: XmlDB) -> *Self {
        for (x in XmlElement(db)) {
            if (x.getElementName() = "resultMap") {
                yield DBElement { ..x }
            }
        }
    }

    // get attribute "type" from XmlElement "resultMap"
    pub fn getType(self) -> string {
        for (a in self.getAttribute()) {
            if (a.getName() = "type") {
                return a.getValue()
            }
        }
    }
}

// if DBElement's type name equals to Java Class name, then collect this Class info
fn getDOClassFromResultMap() -> *Class {
    for (c in Class(default_java_db()), e in DBElement(default_xml_db())) {
        if (c.getQualifiedName() = e.getType()) {
            yield c
        }
    }
}

// example query, just get the class name, you could do other queries
query do_class
from c in getDOClassFromResultMap()
select c.getQualifiedName() as do_class_name

问题中所提到的查询也可以以此为基础通过类似的方法解决。