package com.easyagents.federation.sql.execute;

import java.io.Serializable;
import java.util.List;

/**
 * 物理数据库 Optimizer 的非 ANALYZE Explain 结果。
 *
 * @param available 是否获得物理计划
 * @param nativePlan 数据库原生计划文本
 * @param nodeType 首个主要计划节点类型
 * @param scanType 扫描或访问方式
 * @param candidateIndexes 数据库返回的候选索引
 * @param chosenIndex 数据库选择的索引
 * @param estimatedRows 数据库估算行数
 * @param extraCondition 额外过滤或索引条件
 * @param diagnostic 不含凭据和参数值的诊断
 */
public record FederationPhysicalExplain(
    boolean available,
    String nativePlan,
    String nodeType,
    String scanType,
    List<String> candidateIndexes,
    String chosenIndex,
    Long estimatedRows,
    String extraCondition,
    String diagnostic
) implements Serializable {

    /**
     * 防御性复制候选索引。
     */
    public FederationPhysicalExplain {
        candidateIndexes = List.copyOf(candidateIndexes == null ? List.of() : candidateIndexes);
        nativePlan = nativePlan == null ? "" : nativePlan;
        diagnostic = diagnostic == null ? "" : diagnostic;
    }

    /**
     * 创建数据库不支持或未能提供物理计划的结果。
     *
     * @param diagnostic 诊断说明
     * @return 不可用结果
     */
    public static FederationPhysicalExplain unavailable(String diagnostic) {
        return new FederationPhysicalExplain(
            false,
            "",
            null,
            null,
            List.of(),
            null,
            null,
            null,
            diagnostic
        );
    }
}
