package com.netease.nim.uikit.contact.core.provider;
import android.text.TextUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.contact.core.item.AbsContactItem;
import com.netease.nim.uikit.contact.core.item.MsgItem;
import com.netease.nim.uikit.contact.core.query.TextQuery;
import com.netease.nim.uikit.contact.core.util.ContactHelper;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.lucene.LuceneService;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.search.model.MsgIndexRecord;
import java.util.ArrayList;
import java.util.List;
/**
* 消息全文检索数据提供者
*/
public final class MsgDataProvider {
private static final String TAG = "MsgDataProvider";
public static final List<AbsContactItem> provide(TextQuery query) {
if (TextUtils.isEmpty(query.text) || TextUtils.isEmpty(query.text.trim())) {
return new ArrayList<>(0);
}
// fetch result
List<MsgIndexRecord> sources;
boolean querySession;
if (query.extra != null) {
SessionTypeEnum sessionType = (SessionTypeEnum) query.extra[0];
String sessionId = (String) query.extra[1];
MsgIndexRecord anchor = null;
if (query.extra.length >= 3) {
anchor = (MsgIndexRecord) query.extra[2];
}
sources = searchSession(query.text, sessionType, sessionId, anchor);
querySession = true;
} else {
sources = searchAllSession(query.text);
querySession = false;
}
// build AbsContactItem
if (sources == null) {
return new ArrayList<>(0);
}
List<AbsContactItem> items = new ArrayList<>(sources.size());
for (MsgIndexRecord r : sources) {
items.add(new MsgItem(ContactHelper.makeContactFromMsgIndexRecord(r), r, querySession));
}
return items;
}
private static List<MsgIndexRecord> searchSession(String query, SessionTypeEnum sessionType, String sessionId, MsgIndexRecord anchor) {
long startTime = System.currentTimeMillis();
List<MsgIndexRecord> result;
if (anchor != null) {
result = NIMClient.getService(LuceneService.class).searchSessionNextPageBlock(query, sessionType, sessionId, anchor, 50);
} else {
result = NIMClient.getService(LuceneService.class).searchSessionBlock(query, sessionType, sessionId);
}
log(true, result, System.currentTimeMillis() - startTime);
return result;
}
private static List<MsgIndexRecord> searchAllSession(String query) {
long startTime = System.currentTimeMillis();
List<MsgIndexRecord> result = NIMClient.getService(LuceneService.class).searchAllSessionBlock(query, -1);
log(false, result, System.currentTimeMillis() - startTime);
return result;
}
private static void log(boolean searchSession, List<MsgIndexRecord> result, long cost) {
LogUtil.d(TAG, (searchSession ? "search session" : "search all session") + ", result size=" + (result == null ? 0 : result.size()) + ", cost=" + cost);
}
}