public Task <IEnumerable <MulticastCommentMessage> > GetMulticastCommentMessages(Tag tag, int trustMessageCountUpperLimit, int untrustMessageCountUpperLimit, IEnumerable <MessageCondition> conditions) { if (tag == null) { throw new ArgumentNullException(nameof(tag)); } var now = DateTime.UtcNow; return(Task.Run(() => { try { var filter = new Dictionary <Signature, HashSet <DateTime> >(); { foreach (var item in conditions) { filter.GetOrAdd(item.AuthorSignature, (_) => new HashSet <DateTime>()).Add(item.CreationTime); } } var trustedMetadatas = new List <MulticastClue>(); var untrustedMetadatas = new List <MulticastClue>(); { foreach (var MulticastClue in _coreManager.GetMulticastClues(tag, "ChatMessage")) { if (_searchSignatures.Contains(MulticastClue.Certificate.GetSignature())) { trustedMetadatas.Add(MulticastClue); } else { untrustedMetadatas.Add(MulticastClue); } } trustedMetadatas.Sort((x, y) => y.CreationTime.CompareTo(x.CreationTime)); untrustedMetadatas.Sort((x, y) => { int c; if (0 != (c = y.Cost.CashAlgorithm.CompareTo(x.Cost.CashAlgorithm))) { return c; } if (0 != (c = y.Cost.Value.CompareTo(x.Cost.Value))) { return c; } return y.CreationTime.CompareTo(x.CreationTime); }); } var results = new List <MulticastCommentMessage>(); foreach (var MulticastClue in CollectionUtils.Unite(trustedMetadatas.Take(trustMessageCountUpperLimit), untrustedMetadatas.Take(untrustMessageCountUpperLimit))) { if (filter.TryGetValue(MulticastClue.Certificate.GetSignature(), out var hashSet) && hashSet.Contains(MulticastClue.CreationTime)) { continue; } var stream = _coreManager.VolatileGetStream(MulticastClue.Metadata, 1024 * 1024 * 1); if (stream == null) { continue; } var content = ContentConverter.FromStream <CommentContent>(stream, 0); if (content == null) { continue; } var result = new MulticastCommentMessage( MulticastClue.Tag, MulticastClue.Certificate.GetSignature(), MulticastClue.CreationTime, MulticastClue.Cost, content); results.Add(result); } return (IEnumerable <MulticastCommentMessage>)results.ToArray(); } catch (Exception e) { Log.Error(e); } return Array.Empty <MulticastCommentMessage>(); })); }
public Task <IEnumerable <MulticastCommentMessage> > GetMulticastCommentMessages(Tag tag) { if (tag == null) { throw new ArgumentNullException(nameof(tag)); } var now = DateTime.UtcNow; return(Task.Run(() => { try { var results = new List <MulticastCommentMessage>(); var trusts = new List <MulticastMetadata>(); var untrusts = new List <MulticastMetadata>(); foreach (var multicastMetadata in _coreManager.GetMulticastMetadatas(tag, "ChatMessage")) { if (_searchSignatures.Contains(multicastMetadata.Certificate.GetSignature())) { trusts.Add(multicastMetadata); } else { if ((now - multicastMetadata.CreationTime).TotalDays > 7) { continue; } untrusts.Add(multicastMetadata); } } trusts.Sort((x, y) => y.CreationTime.CompareTo(x.CreationTime)); untrusts.Sort((x, y) => { int c; if (0 != (c = y.Cost.CashAlgorithm.CompareTo(x.Cost.CashAlgorithm))) { return c; } if (0 != (c = y.Cost.Value.CompareTo(x.Cost.Value))) { return c; } return y.CreationTime.CompareTo(x.CreationTime); }); foreach (var multicastMetadata in CollectionUtils.Unite(trusts.Take(1024), untrusts.Take(1024))) { var dic = _cache_ChatMessages.GetOrAdd(multicastMetadata.Tag, (_) => new LockedHashDictionary <MulticastMetadata, MulticastCommentMessage>()); // Cache { if (dic.TryGetValue(multicastMetadata, out var result)) { results.Add(result); continue; } } { var stream = _coreManager.VolatileGetStream(multicastMetadata.Metadata, 1024 * 1024 * 1); if (stream == null) { continue; } var content = ContentConverter.FromStream <CommentContent>(stream, 0); if (content == null) { continue; } var result = new MulticastCommentMessage( multicastMetadata.Tag, multicastMetadata.Certificate.GetSignature(), multicastMetadata.CreationTime, multicastMetadata.Cost, content); dic[multicastMetadata] = result; results.Add(result); } } return (IEnumerable <MulticastCommentMessage>)results.ToArray(); } catch (Exception e) { Log.Error(e); } return Array.Empty <MulticastCommentMessage>(); })); }