package com.uas.search.console.b2b.service;

import com.uas.search.b2b.model.SPage;
import com.uas.search.b2b.service.SearchService.Table_name;
import com.uas.search.console.b2b.jms.LuceneQueueMessage;
import com.uas.search.console.b2b.model.ParsedQueueMessage;
import com.uas.search.console.b2b.support.DownloadHelper;
import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;

import java.util.List;

/**
 * 索引处理
 * 
 * @author sunyj
 * @since 2016年11月10日 上午9:55:00
 */
public interface IndexService {

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

	/**
	 * 下载指定表的数据至本地文件中，以供建索引用
	 * 
	 * @param tableNames
	 *            可为空，指定的表，默认下载所有表的数据
	 * @return 花费总时间 ms
	 */
	public Long downloadData(List<Table_name> tableNames);

    /**
     * 下载指定表的数据至本地文件中，以供建索引用
     *
     * @param tableName
     *            指定的表
     * @param startFileIndex
     *            可为空，从第startFileIndex个文件开始下载（只指定一个表时才起作用）
     * @return 花费总时间 ms
     */
    public Long downloadData(Table_name tableName, Integer startFileIndex);

	/**
	 * 多线程下载指定表的数据至本地文件中，以供建索引用
	 *  @param tableNames     可为空，指定的表，默认下载所有表的数据
	 * @param threads        线程数量，默认为 1
     * @param validateResult 下载完成后，是否对结果进行校验
     * @return 下载的数据条数
     */
	public long multiDownloadData(List<Table_name> tableNames, Integer threads, DownloadHelper.ValidateResult validateResult);

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

	/**
	 * 将新对象添加在lucene索引中
	 * 
	 * @param <T>
	 * 
	 * @param obj
	 */
	public <T> T save(T obj);

	/**
	 * 根据新对象对lucene索引进行更新
	 * 
	 * @param <T>
	 * 
	 * @param obj
	 */
	public <T> T update(T obj);

	/**
	 * 将对象从lucene索引中删除
	 * 
	 * @param <T>
	 * 
	 * @param obj
	 */
	public <T> T delete(T obj);

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

	/**
	 * 根据实体类型名维护出问题的表的索引
	 * 
	 * @param tableName
	 *            需维护的实体类型名
	 * @param ids
	 *            需维护的id列表，多个id以英文逗号隔开
	 * @param method
	 *            需对索引做何种更改
	 * @return 维护的对象
	 */
	public List<Object> maintainIndexesByIds(String tableName, String ids, String method);

	/**
	 * 根据实体类型名维护出问题的表的索引
	 * 
	 * @param tableName
	 *            需维护的实体类型名
	 * @param data
	 *            需维护的数据，JSONArray格式
	 * @param method
	 *            需对索引做何种更改
	 * @return 维护的对象
	 */
	public List<Object> maintainIndexesByData(String tableName, String data, String method);

	/**
	 * 获取指定数据源实时更新情况的详细信息
	 * 
	 * @param dataSourceQualifier
	 *            数据源标识
	 * @param page
	 *            可为空，页码
	 * @param size
	 *            可为空，页大小
	 * @param searchContent
	 *            可为空，对消息内容进行搜索
	 * @return 等待更新的数据的信息
	 */
	public SPage<LuceneQueueMessage> getListenDetails(DataSourceQualifier dataSourceQualifier, Integer page,
			Integer size, String searchContent);

	/**
	 * 指定数据源消息队列出队消息
	 * 
	 * @param dataSourceQualifier
	 *            数据源标识
	 * @param messageId
	 *            所要出队的消息的id
	 * @return 是否出队成功
	 */
	public boolean dequeueLuceneQueueMessage(DataSourceQualifier dataSourceQualifier, String messageId);
}
