示例#1
0
        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);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
 // TODO 待完善
 public void Find(ContactQueryFilter query)
 {
     var contactList = FindAll(query);
 }