package com.easyagents.federation.sql.runtime;

import java.util.List;

/**
 * 使用精确 SQL、参数类型、revision、运行指纹和策略版本隔离计划的缓存键。
 *
 * @param sql 精确 SQL；精确匹配会减少命中，但不会产生错误碰撞
 * @param scopeChecksum 查询范围稳定校验和
 * @param parameterTypes 参数 JDBC 类型
 * @param runtimeIdentityFingerprint 实际候选 Runtime 身份指纹
 * @param enginePolicyFingerprint Engine 策略实现与版本指纹
 * @param statisticsSnapshotVersion 查询级统计缓存协议版本；实际表统计由计划指纹校验
 * @param requestPolicyVersion 请求级策略上下文版本
 */
record PlanCacheKey(
    String sql,
    String scopeChecksum,
    List<Integer> parameterTypes,
    String runtimeIdentityFingerprint,
    String enginePolicyFingerprint,
    String statisticsSnapshotVersion,
    String requestPolicyVersion
) {

    /**
     * 保留旧单源测试与内部调用的兼容构造器。
     */
    PlanCacheKey(
        String sql,
        com.easyagents.federation.sql.source.SourceId sourceId,
        long minimumRevision,
        long sourceRevision,
        List<Integer> parameterTypes,
        String adapterId,
        String runtimeFingerprint,
        String enginePolicyFingerprint,
        String requestPolicyVersion,
        long sourceGeneration
    ) {
        this(
            sql,
            "single:" + sourceId.value() + ':' + minimumRevision,
            parameterTypes,
            sourceRevision + ":" + adapterId + ':' + runtimeFingerprint + ':' + sourceGeneration,
            enginePolicyFingerprint,
            "none",
            requestPolicyVersion
        );
    }

    /**
     * 防御性复制参数类型。
     */
    PlanCacheKey {
        parameterTypes = List.copyOf(parameterTypes);
    }
}
