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

import java.util.List;

import com.uas.search.b2b.model.SPage;
import com.uas.search.b2b.service.SearchService.Table_name;
import com.uas.search.console.b2b.model.LuceneQueueMessage;
import com.uas.search.console.b2b.model.ParsedQueueMessage;

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

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

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

	/**
	 * 将新对象添加在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> maintainIndexes(String tableName, String ids, String method);

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

	/**
	 * 消息队列出队消息
	 * 
	 * @param messageId
	 *            所要出队的消息的id
	 * @return 是否出队成功
	 */
	public boolean dequeueLuceneQueueMessage(String messageId);
}
