package tech.easyflow.datacenter.connector;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Row;
import tech.easyflow.datacenter.entity.DatacenterTable;
import tech.easyflow.datacenter.execution.model.DatacenterQueryRequest;
import tech.easyflow.datacenter.meta.entity.DatacenterSource;

import java.util.List;
import java.util.function.Consumer;

public interface QueryExecutor {

    /**
     * 分页查询结构化数据集。
     *
     * @param source 数据源
     * @param table 数据表
     * @param request 查询请求
     * @return 分页结果
     */
    Page<Row> queryPage(DatacenterSource source, DatacenterTable table, DatacenterQueryRequest request);

    /**
     * 执行原生 SQL 并返回完整结果。
     *
     * @param source 数据源
     * @param sql 已校验 SQL
     * @return 完整结果
     */
    List<Row> queryBySql(DatacenterSource source, String sql);

    /**
     * 在单次查询中按结果顺序消费原生 SQL 返回行。
     *
     * <p>缺省实现保持第三方连接器兼容；JDBC 连接器应覆盖此方法并使用单连接、
     * 单 ResultSet 流式读取。</p>
     *
     * @param source 数据源
     * @param sql 已校验 SQL
     * @param fetchSize JDBC 建议拉取行数
     * @param consumer 单行消费者
     */
    default void consumeBySql(
            DatacenterSource source,
            String sql,
            int fetchSize,
            Consumer<Row> consumer) {
        queryBySql(source, sql).forEach(consumer);
    }
}
