public async Task <IReadOnlyList <IContactAppService> > FindAll(ContactQueryFilter queryFilter = default) { Check(); try { var contactIdList = await ContactSearch(queryFilter); var list_contact = await LoadAll(contactIdList); return(list_contact); } catch (Exception ex) { Logger.LogError(ex, "contact findAll() exception"); return(null); } }
/// <summary> /// find <typeparamref name="TContact"/> by <paramref name="query"/> /// </summary> /// <param name="query"></param> /// <returns></returns> public async Task <TContact?> Find([DisallowNull] ContactQueryFilter query) { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find({JsonConvert.SerializeObject(query)})"); } var contactList = await FindAll(query); if (contactList.Count > 1) { Logger.LogWarning($"find() got more than one({contactList.Count}) result"); } var index = 0; foreach (var contact in contactList) { var valid = await Puppet.ContactValidate(contact.Id); if (valid) { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find() confirm contact[{index}] with id={contact.Id} is valid result, return it."); } } else { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace($"find() confirm contact[{index}] with id={contact.Id} is INVALID result, try next"); } } if (valid) { await contact.Ready(true); return(contact); } index++; } Logger.LogWarning($"find() got {contactList.Count} contacts but no one is valid."); return(null); }
protected async Task <IReadOnlyList <string> > ContactSearch(ContactQueryFilter query, params string[] searchIdList) { if (searchIdList == null) { searchIdList = (await _puppetService.ContactList()).ToArray(); } if (query == null) { return(searchIdList); } var filterFuncion = query.Every <ContactQueryFilter, ContactPayload>(); const int BATCH_SIZE = 16; var batchIndex = 0; var resultIdList = new List <string>(); while (BATCH_SIZE * batchIndex < searchIdList.Length) { var batchSearchIdList = searchIdList.Skip( BATCH_SIZE * batchIndex ).Take(BATCH_SIZE); var matchBatchIdFutureList = batchSearchIdList.Select(Matcher); var matchBatchIdList = await Task.WhenAll(matchBatchIdFutureList.ToArray()); var batchSearchIdResultList = matchBatchIdList.Where(t => !string.IsNullOrWhiteSpace(t)); resultIdList.AddRange(batchSearchIdResultList); batchIndex++; } return(resultIdList); async Task <string> Matcher(string id) { try { /** * Does LRU cache matter at here? */ // const rawPayload = await this.contactRawPayload(id) // const payload = await this.contactRawPayloadParser(rawPayload) var payload = await ContactPayloadAsync(id); if (payload != null && filterFuncion(payload)) { return(id); } } catch (Exception exception) { //if (Logger.IsEnabled(LogLevel.Trace)) //{ // Logger.LogTrace(exception, $"contactSearch() contactPayload failed."); //} await ContactPayloadDirty(id); } return(null); } }
// TODO 待完善 public void Find(ContactQueryFilter query) { var contactList = FindAll(query); }