<?xml version="1.0" encoding="UTF-8" ?>
<orm ext:registerShortName="true" ext:appName="nop-code" ext:icon="code-2" ext:entityPackageName="io.nop.code.dao.entity"
     ext:basePackageName="io.nop.code" ext:mavenGroupId="io.github.entropy-cloud" ext:mavenArtifactId="nop-code"
     ext:allowIdAsColName="true" ext:useStdFields="true"
     x:schema="/nop/schema/orm/orm.xdef" xmlns:x="/nop/schema/xdsl.xdef" xmlns:ext="ext" xmlns:i18n-en="i18n-en">

    <domains>
        <domain name="codeId" precision="36" stdSqlType="VARCHAR"/>
        <domain name="filePath" precision="500" stdSqlType="VARCHAR"/>
        <domain name="qualifiedName" precision="500" stdSqlType="VARCHAR"/>
        <domain name="symbolName" precision="200" stdSqlType="VARCHAR"/>
        <domain name="packageName" precision="200" stdSqlType="VARCHAR"/>
        <domain name="signature" precision="2000" stdSqlType="VARCHAR"/>
        <domain name="documentation" precision="4000" stdSqlType="VARCHAR"/>
        <domain name="language" precision="20" stdSqlType="VARCHAR"/>
        <domain name="lineNumber" stdSqlType="INTEGER"/>
        <domain name="columnNumber" stdSqlType="INTEGER"/>
        <domain name="jsonContent" precision="4096" stdDomain="json" stdSqlType="VARCHAR"/>
        <domain name="jsonImport" precision="8192" stdDomain="json" stdSqlType="VARCHAR"/>
    </domains>

    <dicts>
        <dict label="符号类型" name="code/symbol_kind" valueType="string">
            <description>代码符号类型枚举</description>
            <option code="CLASS" label="类" value="10"/>
            <option code="INTERFACE" label="接口" value="20"/>
            <option code="ENUM" label="枚举" value="30"/>
            <option code="ANNOTATION_TYPE" label="注解类型" value="40"/>
            <option code="TYPE_ALIAS" label="类型别名" value="45"/>
            <option code="MIXIN" label="Mixin" value="46"/>
            <option code="DECORATOR" label="装饰器" value="47"/>
            <option code="METHOD" label="方法" value="50"/>
            <option code="FUNCTION" label="函数" value="55"/>
            <option code="CONSTRUCTOR" label="构造器" value="60"/>
            <option code="FIELD" label="字段" value="70"/>
            <option code="CONSTANT" label="常量" value="80"/>
            <option code="NAMESPACE" label="命名空间" value="90"/>
            <option code="PARAMETER" label="参数" value="95"/>
            <option code="LOCAL_VARIABLE" label="局部变量" value="96"/>
            <option code="TYPE_PARAMETER" label="类型参数" value="97"/>
            <option code="IMPORT" label="导入" value="98"/>
        </dict>
        <dict label="访问修饰符" name="code/access_modifier" valueType="string">
            <description>符号的访问级别</description>
            <option code="PUBLIC" label="公开" value="10"/>
            <option code="PROTECTED" label="受保护" value="20"/>
            <option code="PRIVATE" label="私有" value="30"/>
            <option code="PACKAGE_PRIVATE" label="包私有" value="40"/>
            <option code="INTERNAL" label="内部" value="41"/>
            <option code="NO_MODIFIER" label="无修饰符" value="50"/>
        </dict>
        <dict label="引用类型" name="code/reference_kind" valueType="string">
            <description>符号引用的类型</description>
            <option code="READ" label="读取" value="10"/>
            <option code="WRITE" label="写入" value="20"/>
            <option code="CALL" label="调用" value="30"/>
            <option code="TYPE_REFERENCE" label="类型引用" value="40"/>
            <option code="EXTENDS" label="继承" value="50"/>
            <option code="IMPLEMENTS" label="实现" value="60"/>
            <option code="ANNOTATES" label="注解" value="70"/>
            <option code="IMPORTS" label="导入" value="80"/>
            <option code="OVERRIDES" label="重写" value="90"/>
        </dict>
        <dict label="索引状态" name="code/index_status" valueType="string">
            <description>索引状态</description>
            <option code="CREATED" label="已创建" value="10"/>
            <option code="INDEXING" label="索引中" value="20"/>
            <option code="READY" label="就绪" value="30"/>
            <option code="ERROR" label="错误" value="40"/>
            <option code="COMPLETED" label="已完成" value="50"/>
            <option code="DETECTED" label="已检测" value="60"/>
        </dict>
        <dict label="编程语言" name="code/language" valueType="string">
            <description>编程语言类型</description>
            <option code="JAVA" label="Java" value="10"/>
            <option code="PYTHON" label="Python" value="20"/>
            <option code="TYPESCRIPT" label="TypeScript" value="30"/>
            <option code="JAVASCRIPT" label="JavaScript" value="40"/>
        </dict>
        <dict label="继承关系类型" name="code/relation_type" valueType="string">
            <description>类型继承关系</description>
            <option code="EXTENDS" label="继承" value="10"/>
            <option code="IMPLEMENTS" label="实现" value="20"/>
        </dict>
    </dicts>

    <entities>
        <!-- ========================================
             核心索引实体
             ======================================== -->

        <!-- 代码索引 -->
        <entity className="io.nop.code.dao.entity.NopCodeIndex" displayName="代码索引" i18n-en:displayName="Code Index"
                name="io.nop.code.dao.entity.NopCodeIndex" registerShortName="true"
                tableName="nop_code_index" ext:icon="search">
            <columns>
                <column code="ID" displayName="索引ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" stdSqlType="VARCHAR" tagSet="seq" ui:show="X"/>
                <column code="NAME" displayName="索引名称" mandatory="true" name="name"
                        precision="100" propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="ROOT_PATH" displayName="根路径" mandatory="true" name="rootPath"
                        precision="500" propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LANGUAGE" displayName="编程语言" domain="language" name="language"
                        precision="20" propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SYMBOL_COUNT" displayName="符号数量" name="symbolCount"
                        propId="5" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="FILE_COUNT" displayName="文件数量" name="fileCount"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="STATUS" displayName="状态" name="status" precision="20"
                        propId="7" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/index_status"/>
                <column code="LAST_INDEXED" displayName="最后索引时间" name="lastIndexed"
                        propId="8" stdDataType="long" stdSqlType="BIGINT"/>
                <column code="INDEX_VERSION" displayName="索引版本" name="indexVersion"
                        propId="9" stdDataType="int" stdSqlType="INTEGER"/>
            </columns>
            <comment>代码索引主表</comment>
            <relations>
                <to-many displayName="文件列表" name="files" refEntityName="io.nop.code.dao.entity.NopCodeFile"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="符号列表" name="symbols" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="依赖列表" name="dependencies" refEntityName="io.nop.code.dao.entity.NopCodeDependency"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="执行流" name="flows" refEntityName="io.nop.code.dao.entity.NopCodeFlow"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="引用" name="usages" refEntityName="io.nop.code.dao.entity.NopCodeUsage"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="调用" name="calls" refEntityName="io.nop.code.dao.entity.NopCodeCall"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="继承" name="inheritances" refEntityName="io.nop.code.dao.entity.NopCodeInheritance"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="注解使用" name="annotationUsages" refEntityName="io.nop.code.dao.entity.NopCodeAnnotationUsage"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
                <to-many displayName="语义边" name="semanticEdges" refEntityName="io.nop.code.dao.entity.NopCodeSemanticEdge"
                          refPropName="index" cascadeDelete="true">
                    <join>
                        <on leftProp="id" rightProp="indexId"/>
                    </join>
                </to-many>
            </relations>
            <indexes>
                <index name="idx_nop_code_index_status">
                    <column name="status"/>
                </index>
                <index name="idx_nop_code_index_root_path">
                    <column name="rootPath"/>
                </index>
                <index name="idx_nop_code_index_language">
                    <column name="language"/>
                </index>
                <index name="idx_nop_code_index_last_indexed">
                    <column name="lastIndexed"/>
                </index>
            </indexes>
        </entity>

        <!-- 文件 -->
        <entity className="io.nop.code.dao.entity.NopCodeFile" displayName="代码文件" i18n-en:displayName="Code File"
                name="io.nop.code.dao.entity.NopCodeFile" registerShortName="true"
                tableName="nop_code_file" ext:icon="file-code">
            <columns>
                <column code="ID" displayName="文件ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="FILE_PATH" displayName="文件路径" domain="filePath" mandatory="true" name="filePath"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR" tagSet="disp"/>
                <column code="PACKAGE_NAME" displayName="包名" domain="packageName" name="packageName"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LANGUAGE" displayName="语言" domain="language" name="language"
                        precision="20" propId="5" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LINE_COUNT" displayName="行数" name="lineCount"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="IMPORTS" displayName="导入列表" domain="jsonImport" name="imports"
                        propId="7" stdDataType="string" stdSqlType="VARCHAR" ui:control="textarea"/>
                <column code="SOURCE_CODE" displayName="源代码" name="sourceCode"
                        propId="8" stdDataType="string" stdSqlType="CLOB" ui:control="textarea"/>
                <column code="FILE_HASH" displayName="文件内容哈希" name="fileHash"
                        precision="64" propId="9" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LAST_MODIFIED" displayName="最后修改时间" name="lastModified"
                        propId="10" stdDataType="long" stdSqlType="BIGINT"/>
                <column code="FILE_SIZE" displayName="文件大小" name="fileSize"
                        propId="11" stdDataType="long" stdSqlType="BIGINT"/>
            </columns>
            <comment>源代码文件,imports字段存储JSON数组</comment>
            <relations>
                <to-one name="index" refDisplayName="文件列表" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="files" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-many displayName="符号列表" name="symbols" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                         refPropName="file">
                    <join>
                        <on leftProp="id" rightProp="fileId"/>
                    </join>
                </to-many>
                <to-many displayName="引用" name="usages" refEntityName="io.nop.code.dao.entity.NopCodeUsage"
                         refPropName="file">
                    <join>
                        <on leftProp="id" rightProp="fileId"/>
                    </join>
                </to-many>
                <to-many displayName="调用" name="calls" refEntityName="io.nop.code.dao.entity.NopCodeCall"
                         refPropName="file">
                    <join>
                        <on leftProp="id" rightProp="fileId"/>
                    </join>
                </to-many>
            </relations>
            <unique-keys>
                <unique-key columns="indexId,filePath" constraint="UK_NOP_CODE_FILE_PATH" name="filePathKey"/>
            </unique-keys>
        </entity>

        <!-- ========================================
             符号统一表 - 支持所有符号类型
             ======================================== -->

        <!-- 符号表 - 统一存储类、接口、枚举、注解、方法、字段等 -->
        <entity className="io.nop.code.dao.entity.NopCodeSymbol" displayName="符号" i18n-en:displayName="Symbol"
                name="io.nop.code.dao.entity.NopCodeSymbol" registerShortName="true"
                tableName="nop_code_symbol" ext:icon="code">
            <columns>
                <column code="ID" displayName="符号ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="FILE_ID" displayName="文件ID" domain="codeId" mandatory="true" name="fileId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="KIND" displayName="符号类型" mandatory="true" name="kind"
                        precision="20" propId="4" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/symbol_kind"/>
                <column code="NAME" displayName="名称" domain="symbolName" mandatory="true" name="name"
                        propId="5" stdDataType="string" stdSqlType="VARCHAR" tagSet="disp"/>
                <column code="QUALIFIED_NAME" displayName="全限定名" domain="qualifiedName" name="qualifiedName"
                        propId="6" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="ACCESS_MODIFIER" displayName="访问修饰符" name="accessModifier"
                        precision="20" propId="7" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/access_modifier"/>
                <column code="DEPRECATED" displayName="已废弃" name="deprecated"
                        propId="8" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="DOCUMENTATION" displayName="文档注释" domain="documentation" name="documentation"
                        propId="9" stdDataType="string" stdSqlType="VARCHAR" ui:control="textarea"/>
                <column code="LINE" displayName="起始行" domain="lineNumber" name="line"
                        propId="10" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="COLUMN" displayName="起始列" domain="columnNumber" name="column"
                        propId="11" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="END_LINE" displayName="结束行" domain="lineNumber" name="endLine"
                        propId="12" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="END_COLUMN" displayName="结束列" domain="columnNumber" name="endColumn"
                        propId="13" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="USAGE_COUNT" displayName="使用次数" name="usageCount"
                        propId="14" stdDataType="int" stdSqlType="INTEGER"/>
                <!-- 层级关系 -->
                <column code="PARENT_ID" displayName="父符号ID" domain="codeId" name="parentId"
                        propId="15" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="DECLARING_SYMBOL_ID" displayName="所属类型ID" domain="codeId" name="declaringSymbolId"
                        propId="16" stdDataType="string" stdSqlType="VARCHAR"/>
                <!-- 类/接口/枚举特有字段 -->
                <column code="SUPER_CLASS_NAME" displayName="父类名" domain="qualifiedName" name="superClassName"
                        propId="17" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="IS_ABSTRACT" displayName="抽象" name="isAbstract"
                        propId="18" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="IS_FINAL" displayName="final" name="isFinal"
                        propId="19" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <!-- 方法特有字段 -->
                <column code="SIGNATURE" displayName="签名" domain="signature" name="signature"
                        propId="20" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="RETURN_TYPE" displayName="返回类型" domain="qualifiedName" name="returnType"
                        propId="21" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="IS_STATIC" displayName="static" name="isStatic"
                        propId="22" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="IS_SYNCHRONIZED" displayName="synchronized" name="isSynchronized"
                        propId="23" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="IS_NATIVE" displayName="native" name="isNative"
                        propId="24" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <!-- 字段特有字段 -->
                <column code="FIELD_TYPE" displayName="字段类型" domain="qualifiedName" name="fieldType"
                        propId="25" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="IS_VOLATILE" displayName="volatile" name="isVolatile"
                        propId="26" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="IS_TRANSIENT" displayName="transient" name="isTransient"
                        propId="27" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <!-- JSON扩展字段 - 存储详细信息 -->
                <column code="EXT_DATA" displayName="扩展数据" domain="jsonContent" name="extData"
                        propId="28" stdDataType="string" stdSqlType="VARCHAR" ui:control="textarea"/>
                <column code="ASYNC_FLAG" displayName="异步" name="asyncFlag"
                        propId="29" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="READONLY_FLAG" displayName="只读" name="readonlyFlag"
                        propId="30" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="RAW_RETURN_TYPE" displayName="原始返回类型" domain="qualifiedName" name="rawReturnType"
                        propId="31" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="RAW_FIELD_TYPE" displayName="原始字段类型" domain="qualifiedName" name="rawFieldType"
                        propId="32" stdDataType="string" stdSqlType="VARCHAR"/>
            </columns>
            <comment>
                符号统一表。extData存储JSON格式的扩展信息:
                - 类/接口: {typeParameters:[], interfaces:[], innerClasses:[]}
                - 枚举: {constants:[{name,line,documentation,annotations[]}], interfaces:[]}
                - 注解类型: {attributes:[], isRepeatable, targets, retention}
                - 方法: {parameters:[], exceptions:[], typeParameters:[], overrides:[]}
                - 构造器: {parameters:[], exceptions:[]}
                - 字段: {defaultValue, annotations:[]}
            </comment>
            <relations>
                <to-one name="index" refDisplayName="符号列表" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="symbols" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="file" refDisplayName="符号列表" refEntityName="io.nop.code.dao.entity.NopCodeFile"
                        refPropName="symbols" tagSet="pub">
                    <join>
                        <on leftProp="fileId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="parent" refDisplayName="子符号" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="children" tagSet="pub">
                    <join>
                        <on leftProp="parentId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="declaringSymbol" refDisplayName="成员" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="members" tagSet="pub">
                    <join>
                        <on leftProp="declaringSymbolId" rightProp="id"/>
                    </join>
                </to-one>
                <to-many displayName="子符号" name="children" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                         refPropName="parent">
                    <join>
                        <on leftProp="id" rightProp="parentId"/>
                    </join>
                </to-many>
                <to-many displayName="成员" name="members" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                         refPropName="declaringSymbol">
                    <join>
                        <on leftProp="id" rightProp="declaringSymbolId"/>
                    </join>
                </to-many>
                <to-many displayName="引用" name="usages" refEntityName="io.nop.code.dao.entity.NopCodeUsage"
                         refPropName="symbol">
                    <join>
                        <on leftProp="id" rightProp="symbolId"/>
                    </join>
                </to-many>
                <to-many displayName="注解使用" name="annotations" refEntityName="io.nop.code.dao.entity.NopCodeAnnotationUsage"
                         refPropName="annotatedSymbol">
                    <join>
                        <on leftProp="id" rightProp="annotatedSymbolId"/>
                    </join>
                </to-many>
                <to-many displayName="入口执行流" name="entryFlows" refEntityName="io.nop.code.dao.entity.NopCodeFlow"
                         refPropName="entryPoint">
                    <join>
                        <on leftProp="id" rightProp="entryPointId"/>
                    </join>
                </to-many>
                <to-many displayName="流成员" name="flowMemberships" refEntityName="io.nop.code.dao.entity.NopCodeFlowMembership"
                         refPropName="symbol">
                    <join>
                        <on leftProp="id" rightProp="symbolId"/>
                    </join>
                </to-many>
                <to-many displayName="被调用" name="callees" refEntityName="io.nop.code.dao.entity.NopCodeCall"
                         refPropName="caller">
                    <join>
                        <on leftProp="id" rightProp="callerId"/>
                    </join>
                </to-many>
                <to-many displayName="调用" name="callers" refEntityName="io.nop.code.dao.entity.NopCodeCall"
                         refPropName="callee">
                    <join>
                        <on leftProp="id" rightProp="calleeId"/>
                    </join>
                </to-many>
                <to-many displayName="父类型" name="superTypes" refEntityName="io.nop.code.dao.entity.NopCodeInheritance"
                         refPropName="subType">
                    <join>
                        <on leftProp="id" rightProp="subTypeId"/>
                    </join>
                </to-many>
                <to-many displayName="子类型" name="subTypes" refEntityName="io.nop.code.dao.entity.NopCodeInheritance"
                         refPropName="superType">
                    <join>
                        <on leftProp="id" rightProp="superTypeId"/>
                    </join>
                </to-many>
            </relations>
            <indexes>
                <index name="ix_nop_code_symbol_index_id_qualified_name">
                    <column name="indexId"/>
                    <column name="qualifiedName"/>
                </index>
                <index name="ix_nop_code_symbol_index_id_name">
                    <column name="indexId"/>
                    <column name="name"/>
                </index>
                <index name="ix_nop_code_symbol_index_id_kind">
                    <column name="indexId"/>
                    <column name="kind"/>
                </index>
                <index name="ix_nop_code_symbol_index_id_declaring_symbol_id">
                    <column name="indexId"/>
                    <column name="declaringSymbolId"/>
                </index>
                <index name="ix_nop_code_symbol_file_id">
                    <column name="fileId"/>
                </index>
                <index name="ix_nop_code_symbol_parent_id">
                    <column name="parentId"/>
                </index>
            </indexes>
        </entity>

        <!-- ========================================
             关系实体(引用、调用、继承)
             ======================================== -->

        <!-- 符号引用 -->
        <entity className="io.nop.code.dao.entity.NopCodeUsage" displayName="符号引用" i18n-en:displayName="Symbol Usage"
                name="io.nop.code.dao.entity.NopCodeUsage" registerShortName="true"
                tableName="nop_code_usage" ext:icon="link-2">
            <columns>
                <column code="ID" displayName="ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SYMBOL_ID" displayName="被引用符号ID" domain="codeId" mandatory="true" name="symbolId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="FILE_ID" displayName="文件ID" domain="codeId" mandatory="true" name="fileId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="KIND" displayName="引用类型" mandatory="true" name="kind"
                        precision="20" propId="5" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/reference_kind"/>
                <column code="LINE" displayName="行号" domain="lineNumber" mandatory="true" name="line"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="COLUMN" displayName="列号" domain="columnNumber" name="column"
                        propId="7" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="ENCLOSING_SYMBOL_ID" displayName="所在符号ID" domain="codeId" name="enclosingSymbolId"
                        propId="8" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="CONTEXT" displayName="上下文" name="context"
                        precision="1000" propId="9" stdDataType="string" stdSqlType="VARCHAR"/>
            </columns>
            <comment>符号引用关系</comment>
            <relations>
                <to-one name="index" refDisplayName="引用" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="usages" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="symbol" refDisplayName="引用" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="usages" tagSet="pub">
                    <join>
                        <on leftProp="symbolId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="file" refDisplayName="引用" refEntityName="io.nop.code.dao.entity.NopCodeFile"
                        refPropName="usages" tagSet="pub">
                    <join>
                        <on leftProp="fileId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="enclosingSymbol" refDisplayName="引用" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="enclosingUsages" tagSet="pub">
                    <join>
                        <on leftProp="enclosingSymbolId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_usage_symbol_id">
                    <column name="symbolId"/>
                </index>
                <index name="ix_nop_code_usage_index_id_kind">
                    <column name="indexId"/>
                    <column name="kind"/>
                </index>
                <index name="ix_nop_code_usage_file_id">
                    <column name="fileId"/>
                </index>
                <index name="ix_nop_code_usage_enclosing_symbol_id">
                    <column name="enclosingSymbolId"/>
                </index>
            </indexes>
            <unique-keys>
                <unique-key columns="indexId,symbolId,fileId,kind,line,column" name="uk_usage_unique"/>
            </unique-keys>
        </entity>

        <!-- 方法调用 -->
        <entity className="io.nop.code.dao.entity.NopCodeCall" displayName="方法调用" i18n-en:displayName="Method Call"
                name="io.nop.code.dao.entity.NopCodeCall" registerShortName="true"
                tableName="nop_code_call" ext:icon="waypoints">
            <columns>
                <column code="ID" displayName="ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="CALLER_ID" displayName="调用方ID" domain="codeId" mandatory="true" name="callerId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="CALLEE_ID" displayName="被调用方ID" domain="codeId" mandatory="true" name="calleeId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="FILE_ID" displayName="文件ID" domain="codeId" mandatory="true" name="fileId"
                        propId="5" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LINE" displayName="行号" domain="lineNumber" mandatory="true" name="line"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="COLUMN" displayName="列号" domain="columnNumber" name="column"
                        propId="7" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="CALL_TYPE" displayName="调用类型" name="callType"
                        precision="20" propId="8" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/call_type"/>
                <column code="CONTEXT" displayName="上下文" name="context"
                        precision="2000" propId="9" stdDataType="string" stdSqlType="VARCHAR"/>
            </columns>
            <comment>方法调用关系</comment>
            <relations>
                <to-one name="index" refDisplayName="调用" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="calls" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="caller" refDisplayName="调用者" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="callees" tagSet="pub">
                    <join>
                        <on leftProp="callerId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="callee" refDisplayName="被调用者" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="callers" tagSet="pub">
                    <join>
                        <on leftProp="calleeId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="file" refDisplayName="调用" refEntityName="io.nop.code.dao.entity.NopCodeFile"
                        refPropName="calls" tagSet="pub">
                    <join>
                        <on leftProp="fileId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_call_caller_id">
                    <column name="callerId"/>
                </index>
                <index name="ix_nop_code_call_callee_id">
                    <column name="calleeId"/>
                </index>
                <index name="ix_nop_code_call_file_id">
                    <column name="fileId"/>
                </index>
                <index name="ix_nop_code_call_index_id">
                    <column name="indexId"/>
                </index>
            </indexes>
            <unique-keys>
                <unique-key columns="indexId,callerId,calleeId,line,column" name="uk_call_unique"/>
            </unique-keys>
        </entity>

        <!-- 继承关系 -->
        <entity className="io.nop.code.dao.entity.NopCodeInheritance" displayName="继承关系" i18n-en:displayName="Inheritance"
                name="io.nop.code.dao.entity.NopCodeInheritance" registerShortName="true"
                tableName="nop_code_inheritance" ext:icon="git-branch">
            <columns>
                <column code="ID" displayName="ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SUB_TYPE_ID" displayName="子类型ID" domain="codeId" mandatory="true" name="subTypeId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SUPER_TYPE_ID" displayName="父类型ID" domain="codeId" mandatory="true" name="superTypeId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="RELATION_TYPE" displayName="关系类型" mandatory="true" name="relationType"
                        precision="20" propId="5" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/relation_type"/>
            </columns>
            <comment>
                继承关系。relationType: EXTENDS(类继承类/接口继承接口), IMPLEMENTS(类实现接口)
            </comment>
            <relations>
                <to-one name="index" refDisplayName="继承" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="inheritances" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="subType" refDisplayName="父类型" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="superTypes" tagSet="pub">
                    <join>
                        <on leftProp="subTypeId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="superType" refDisplayName="子类型" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="subTypes" tagSet="pub">
                    <join>
                        <on leftProp="superTypeId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_inheritance_sub_type_id">
                    <column name="subTypeId"/>
                </index>
                <index name="ix_nop_code_inheritance_super_type_id">
                    <column name="superTypeId"/>
                </index>
                <index name="ix_nop_code_inheritance_index_id">
                    <column name="indexId"/>
                </index>
            </indexes>
            <unique-keys>
                <unique-key columns="indexId,subTypeId,superTypeId,relationType" name="uk_inheritance_unique"/>
            </unique-keys>
        </entity>

        <!-- 注解使用 -->
        <entity className="io.nop.code.dao.entity.NopCodeAnnotationUsage" displayName="注解使用" i18n-en:displayName="Annotation Usage"
                name="io.nop.code.dao.entity.NopCodeAnnotationUsage" registerShortName="true"
                tableName="nop_code_annotation_usage" ext:icon="bookmark">
            <columns>
                <column code="ID" displayName="ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR" />
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="ANNOTATION_TYPE_ID" displayName="注解类型ID" domain="codeId" mandatory="true" name="annotationTypeId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="ANNOTATED_SYMBOL_ID" displayName="被注解符号ID" domain="codeId" name="annotatedSymbolId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="LINE" displayName="行号" domain="lineNumber" name="line"
                        propId="5" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="COLUMN" displayName="列号" domain="columnNumber" name="column"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="ATTRIBUTES" displayName="属性值" domain="jsonContent" name="attributes"
                        propId="7" stdDataType="string" stdSqlType="VARCHAR" ui:control="textarea"/>
            </columns>
            <comment>
                注解使用记录。attributes存储JSON: {name:value, ...}
            </comment>
            <relations>
                <to-one name="index" refDisplayName="注解使用" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="annotationUsages" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="annotationType" refDisplayName="注解使用" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="annotationUsages" tagSet="pub">
                    <join>
                        <on leftProp="annotationTypeId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="annotatedSymbol" refDisplayName="注解使用" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="annotations" tagSet="pub">
                    <join>
                        <on leftProp="annotatedSymbolId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_annotation_usage_annotation_type_id">
                    <column name="annotationTypeId"/>
                </index>
                <index name="ix_nop_code_annotation_usage_annotated_symbol_id">
                    <column name="annotatedSymbolId"/>
                </index>
                <index name="ix_nop_code_annotation_usage_index_id">
                    <column name="indexId"/>
                </index>
            </indexes>
            <unique-keys>
                <unique-key columns="indexId,annotationTypeId,annotatedSymbolId" name="uk_annotation_usage_unique"/>
            </unique-keys>
        </entity>

        <!-- ========================================
             文件依赖关系
             ======================================== -->

        <!-- 文件依赖 -->
        <entity className="io.nop.code.dao.entity.NopCodeDependency" displayName="文件依赖" i18n-en:displayName="File Dependency"
                name="io.nop.code.dao.entity.NopCodeDependency" registerShortName="true"
                tableName="nop_code_dependency" ext:icon="network">
            <columns>
                <column code="ID" displayName="依赖ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" stdSqlType="VARCHAR" tagSet="seq" ui:show="X"/>
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SOURCE_FILE_PATH" displayName="源文件路径" domain="filePath" mandatory="true" name="sourceFilePath"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR" tagSet="disp"/>
                <column code="TARGET_FILE_PATH" displayName="目标文件路径" domain="filePath" name="targetFilePath"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="IMPORT_STATEMENT" displayName="导入语句" name="importStatement"
                        precision="500" propId="5" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="RESOLVED" displayName="是否已解析" name="resolved"
                        propId="6" stdDataType="boolean" stdSqlType="BOOLEAN"/>
            </columns>
            <comment>文件级别的依赖关系,记录源文件导入了哪些目标文件</comment>
            <relations>
                <to-one name="index" refDisplayName="依赖" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="dependencies" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_dependency_index_id_source_file_path">
                    <column name="indexId"/>
                    <column name="sourceFilePath"/>
                </index>
                <index name="ix_nop_code_dependency_index_id_target_file_path">
                    <column name="indexId"/>
                    <column name="targetFilePath"/>
                </index>
            </indexes>
        </entity>
        <!-- ========================================
             执行流追踪
             ======================================== -->

        <!-- 执行流 -->
        <entity className="io.nop.code.dao.entity.NopCodeFlow" displayName="执行流" i18n-en:displayName="Execution Flow"
                name="io.nop.code.dao.entity.NopCodeFlow" registerShortName="true"
                tableName="nop_code_flow" ext:icon="route">
            <columns>
                <column code="ID" displayName="流ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR"/>
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="NAME" displayName="流名称" domain="symbolName" name="name"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR" tagSet="disp"/>
                <column code="ENTRY_POINT_ID" displayName="入口符号ID" domain="codeId" name="entryPointId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="ENTRY_POINT_QUALIFIED_NAME" displayName="入口全限定名" domain="qualifiedName" name="entryPointQualifiedName"
                        propId="5" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="DEPTH" displayName="最大追踪深度" name="depth"
                        propId="6" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="SYMBOL_COUNT" displayName="符号总数" name="symbolCount"
                        propId="7" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="FILE_SPREAD" displayName="文件扩散评分" name="fileSpread"
                        propId="8" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="EXTERNAL_SCORE" displayName="外部调用评分" name="externalScore"
                        propId="9" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="SECURITY_SCORE" displayName="安全敏感评分" name="securityScore"
                        propId="10" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="TEST_GAP" displayName="测试覆盖缺口评分" name="testGap"
                        propId="11" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="DEPTH_SCORE" displayName="深度复杂度评分" name="depthScore"
                        propId="12" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="OVERALL_SCORE" displayName="综合关键度评分" name="overallScore"
                        propId="13" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="STATUS" displayName="状态" name="status" precision="20"
                        propId="14" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/index_status"/>
                <column code="CREATED_TIME" displayName="创建时间" name="createTime"
                        propId="15" stdDataType="timestamp" stdSqlType="DATETIME"/>
                <column code="UPDATE_TIME" displayName="更新时间" name="updateTime"
                        propId="16" stdDataType="timestamp" stdSqlType="DATETIME"/>
                <column code="CREATED_BY" displayName="创建人" name="createdBy"
                        precision="50" propId="17" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="UPDATED_BY" displayName="更新人" name="updatedBy"
                        precision="50" propId="18" stdDataType="string" stdSqlType="VARCHAR"/>
            </columns>
            <comment>执行流追踪,记录从入口点出发的调用链路及关键度评分</comment>
            <relations>
                <to-one name="index" refDisplayName="执行流" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="flows" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="entryPoint" refDisplayName="执行流" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="entryFlows" tagSet="pub">
                    <join>
                        <on leftProp="entryPointId" rightProp="id"/>
                    </join>
                </to-one>
                <to-many cascadeDelete="true" displayName="成员" name="memberships" refEntityName="io.nop.code.dao.entity.NopCodeFlowMembership"
                         refPropName="flow">
                    <join>
                        <on leftProp="id" rightProp="flowId"/>
                    </join>
                </to-many>
            </relations>
            <indexes>
                <index name="ix_nop_code_flow_entry_point_id">
                    <column name="entryPointId"/>
                </index>
                <index name="ix_nop_code_flow_index_id_status">
                    <column name="indexId"/>
                    <column name="status"/>
                </index>
            </indexes>
        </entity>

        <!-- 执行流-符号成员 -->
        <entity className="io.nop.code.dao.entity.NopCodeFlowMembership" displayName="执行流成员" i18n-en:displayName="Execution Flow Membership"
                name="io.nop.code.dao.entity.NopCodeFlowMembership" registerShortName="true"
                tableName="nop_code_flow_membership" ext:icon="share-2">
            <columns>
                <column code="ID" displayName="ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR"/>
                <column code="FLOW_ID" displayName="流ID" domain="codeId" mandatory="true" name="flowId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SYMBOL_ID" displayName="符号ID" domain="codeId" mandatory="true" name="symbolId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="DEPTH" displayName="深度" name="depth"
                        propId="4" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="IS_ENTRY" displayName="是否入口" name="isEntry"
                        propId="5" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="CREATED_TIME" displayName="创建时间" name="createTime"
                        propId="6" stdDataType="timestamp" stdSqlType="DATETIME"/>
                <column code="CREATED_BY" displayName="创建人" name="createdBy"
                        precision="50" propId="7" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="UPDATE_TIME" displayName="更新时间" name="updateTime"
                        propId="8" stdDataType="timestamp" stdSqlType="DATETIME"/>
                <column code="UPDATED_BY" displayName="更新人" name="updatedBy"
                        precision="50" propId="9" stdDataType="string" stdSqlType="VARCHAR"/>
            </columns>
            <comment>执行流与符号的多对多关系,记录符号在流中的深度和入口标记</comment>
            <relations>
                <to-one name="flow" refDisplayName="成员" refEntityName="io.nop.code.dao.entity.NopCodeFlow"
                        refPropName="memberships" tagSet="pub">
                    <join>
                        <on leftProp="flowId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="symbol" refDisplayName="流成员" refEntityName="io.nop.code.dao.entity.NopCodeSymbol"
                        refPropName="flowMemberships" tagSet="pub">
                    <join>
                        <on leftProp="symbolId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <indexes>
                <index name="ix_nop_code_flow_membership_flow_id">
                    <column name="flowId"/>
                </index>
                <index name="ix_nop_code_flow_membership_symbol_id">
                    <column name="symbolId"/>
                </index>
            </indexes>
            <unique-keys>
                <unique-key columns="flowId,symbolId" constraint="UK_NOP_CODE_FLOW_MEMBERSHIP" name="flowSymbolKey"/>
            </unique-keys>
        </entity>

        <entity className="io.nop.code.dao.entity.NopCodeSemanticEdge" displayName="语义边"
                name="io.nop.code.dao.entity.NopCodeSemanticEdge" registerShortName="true"
                tableName="nop_code_semantic_edge" useLogicalDelete="true" deleteFlagProp="delFlag">
            <columns>
                <column code="ID" displayName="边ID" domain="codeId" mandatory="true" name="id"
                        primary="true" propId="1" stdDataType="string" tagSet="seq" ui:show="X" stdSqlType="VARCHAR"/>
                <column code="INDEX_ID" displayName="索引ID" domain="codeId" mandatory="true" name="indexId"
                        propId="2" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="SOURCE_SYMBOL_ID" displayName="源符号ID" domain="codeId" mandatory="true" name="sourceSymbolId"
                        propId="3" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="TARGET_SYMBOL_ID" displayName="目标符号ID" domain="codeId" mandatory="true" name="targetSymbolId"
                        propId="4" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="DIRECTED" displayName="有向" name="directed"
                        propId="5" stdDataType="boolean" stdSqlType="BOOLEAN"/>
                <column code="RELATION_TYPE" displayName="关系类型" mandatory="true" name="relationType"
                        precision="40" propId="6" stdDataType="string" stdSqlType="VARCHAR" ext:dict="code/relation_type"/>
                <column code="CONFIDENCE" displayName="置信度级别" mandatory="true" name="confidence"
                        propId="7" stdDataType="int" stdSqlType="INTEGER"/>
                <column code="CONFIDENCE_SCORE" displayName="置信度分数" name="confidenceScore"
                        propId="8" stdDataType="double" stdSqlType="DOUBLE"/>
                <column code="RATIONALE" displayName="原因" name="rationale"
                        precision="500" propId="9" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="EXTRACTOR_ID" displayName="提取器ID" name="extractorId"
                        precision="40" propId="10" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="EXT_DATA" displayName="扩展数据" domain="jsonContent" name="extData"
                        propId="11" stdDataType="string" stdSqlType="VARCHAR" ui:control="textarea"/>
                <column code="CREATED_BY" displayName="创建人" name="createdBy"
                        propId="12" stdDataType="string" stdSqlType="VARCHAR"/>
                <column code="CREATE_TIME" displayName="创建时间" name="createTime"
                        propId="13" stdDataType="timestamp" stdSqlType="DATETIME"/>
                <column code="DEL_FLAG" displayName="逻辑删除" name="delFlag" precision="1"
                        propId="14" stdDataType="boolean" stdSqlType="TINYINT" stdDomain="boolFlag"/>
            </columns>
            <indexes>
                <index name="ix_nop_code_semantic_edge_index_id">
                    <column name="indexId"/>
                </index>
                <index name="ix_nop_code_semantic_edge_source_symbol_id">
                    <column name="sourceSymbolId"/>
                </index>
                <index name="ix_nop_code_semantic_edge_target_symbol_id">
                    <column name="targetSymbolId"/>
                </index>
                <index name="ix_nop_code_semantic_edge_relation_type">
                    <column name="relationType"/>
                </index>
            </indexes>
            <relations>
                <to-one name="index" refDisplayName="语义边" refEntityName="io.nop.code.dao.entity.NopCodeIndex"
                        refPropName="semanticEdges" tagSet="pub">
                    <join>
                        <on leftProp="indexId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="sourceSymbol" refDisplayName="源符号边" refEntityName="io.nop.code.dao.entity.NopCodeSymbol" tagSet="pub">
                    <join>
                        <on leftProp="sourceSymbolId" rightProp="id"/>
                    </join>
                </to-one>
                <to-one name="targetSymbol" refDisplayName="目标符号边" refEntityName="io.nop.code.dao.entity.NopCodeSymbol" tagSet="pub">
                    <join>
                        <on leftProp="targetSymbolId" rightProp="id"/>
                    </join>
                </to-one>
            </relations>
            <unique-keys>
                <unique-key columns="indexId,sourceSymbolId,targetSymbolId,relationType" name="uk_semantic_edge_unique"/>
            </unique-keys>
        </entity>
    </entities>
</orm>