/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.repository.pgsql
 * @ClassName: PdfVectorRepository
 * @Description: PDF向量Repository接口，提供向量数据访问方法，支持向量相似度搜索
 * @Author: 张志锋
 * @Date: 2025-10-31
 * @Version: 1.0
 * @Copyright: © 2025 智慧评标-主观分助手
 */
package com.zhpb.gdyd_zhpb_zgf.repository.pgsql;

import com.zhpb.gdyd_zhpb_zgf.entity.pgsql.PdfVector;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * PDF向量Repository接口
 */
@Repository
public interface PdfVectorRepository extends JpaRepository<PdfVector, Long> {

    /**
     * 根据文件路径查找向量
     *
     * @param filePath 文件路径
     * @return PDF向量对象
     */
    PdfVector findByFilePath(String filePath);

    /**
     * 根据项目ID查找所有向量
     *
     * @param projectId 项目ID
     * @return PDF向量列表
     */
    List<PdfVector> findByProjectId(String projectId);

    /**
     * 根据文件ID查找向量记录
     *
     * @param fileId 文件ID
     * @return PDF向量列表
     */
    List<PdfVector> findByFileId(String fileId);

    /**
     * 统计文件ID对应的向量化记录数量
     *
     * @param fileId 文件ID
     * @return 向量化记录数量
     */
    long countByFileId(String fileId);

    /**
     * 向量相似度搜索（使用pgvector的余弦相似度）
     * 返回相似度最高的前N条记录
     * 
     * 注意：此方法需要传入向量字符串，格式：[0.1,0.2,0.3,...]
     * 使用pgvector的<=>操作符进行余弦距离计算
     * 
     * @param vectorStr 查询向量字符串（格式：[0.1,0.2,...]）
     * @param limit 返回数量限制
     * @return 相似度最高的向量列表
     */
    @Query(value = "SELECT *, 1 - (vector <=> CAST(:vectorStr AS vector)) AS similarity " +
            "FROM t_pdf_vector " +
            "ORDER BY vector <=> CAST(:vectorStr AS vector) " +
            "LIMIT :limit", nativeQuery = true)
    List<PdfVector> findSimilarVectors(@Param("vectorStr") String vectorStr, @Param("limit") int limit);
}

