package com.uas.search.service;

import com.uas.search.annotation.NotEmpty;
import com.uas.search.model.ParsedQueueMessage;
import com.uas.search.support.DownloadHelper;

import java.util.List;
import java.util.Map;

/**
 * 索引处理
 *
 * @author sunyj
 * @since 2016年8月5日 下午2:33:58
 */
public interface IndexService {

    /**
     * 创建指定表的索引
     *
     * @param tableNames         可为空，指定的表，默认创建所有表的索引
     * @param componentFromFiles 可为空，器件索引数据是否来自文件，默认来自文件
     * @return 创建的索引花费总时间 ms
     */
    public Long createIndexes(List<String> tableNames, Boolean componentFromFiles);

    /**
     * 多线程下载器件的数据至本地文件中，以供建索引用
     *
     * @param threads        线程数量，默认为 1
     * @param startFileIndex 开始的文件，默认为 1
     * @param endFileIndex   结束的文件，默认为 1024 * 1024 * 1024
     * @param validateResult 下载完成后，是否对结果进行校验
     * @return 下载的数据条数
     */
    public long multiDownloadComponent(Integer threads, Integer startFileIndex, Integer endFileIndex, DownloadHelper.ValidateResult validateResult);

    /**
     * 多线程下载批次的数据至本地文件中，以供建索引用
     *
     * @param threads        线程数量，默认为 1
     * @param startFileIndex 开始的文件，默认为 1
     * @param endFileIndex   结束的文件，默认为 1024 * 1024 * 1024
     * @param validateResult 下载完成后，是否对结果进行校验
     * @return 下载的数据条数
     */
    public long multiDownloadGoods(Integer threads, Integer startFileIndex, Integer endFileIndex, DownloadHelper.ValidateResult validateResult);

    /**
     * 将新对象添加在lucene索引中
     *
     * @param obj 将添加的对象
     * @return 添加的对象
     */
    public Object save(Object obj);

    /**
     * 将新对象添加在lucene索引中
     *
     * @param obj 将更新的对象
     * @return 更新的对象
     */
    public Object update(Object obj);

    /**
     * 将对象从lucene索引中删除
     *
     * @param obj 将删除的对象
     * @return 删除的对象
     */
    public Object delete(Object obj);

    /**
     * 根据自队列消息解析出来的对象，对lucene索引进行添加、更新或删除操作
     *
     * @param parsedQueueMessage 自队列消息解析出来的对象
     * @return 维护的对象
     */
    public List<Object> maintainIndexes(@NotEmpty("parsedQueueMessage") ParsedQueueMessage parsedQueueMessage);

    /**
     * 根据实体类型名维护出问题的表的索引
     *
     * @param tableName  需维护的实体类型名
     * @param dataId     需维护的id
     * @param methodType 需对索引做何种更改
     * @param data       数据
     * @return 维护的对象
     */
    public List<Object> maintainIndexes(@NotEmpty("tableName") String tableName, @NotEmpty("dataId") Long dataId, @NotEmpty("methodType") String methodType, String data);

    /**
     * 根据（录入的词典）新词更新索引
     *
     * @param newWords 词典新词
     * @return 更新的对象
     */
    Map<String, List<Object>> updateIndexByNewWords(List<String> newWords);
}
