Merge pull request #133 from nephanim/perf/export
Improve export performance
This commit is contained in:
commit
bf13c55266
@ -26,11 +26,34 @@ namespace PluralKit.Bot
|
||||
|
||||
public async Task<DataFileSystem> ExportSystem(PKSystem system)
|
||||
{
|
||||
// Export members
|
||||
var members = new List<DataFileMember>();
|
||||
foreach (var member in await _members.GetBySystem(system)) members.Add(await ExportMember(member));
|
||||
var pkMembers = await _members.GetBySystem(system); // Read all members in the system
|
||||
var messageCounts = await _members.MessageCountsPerMember(system); // Count messages proxied by all members in the system
|
||||
members.AddRange(pkMembers.Select(m => new DataFileMember
|
||||
{
|
||||
Id = m.Hid,
|
||||
Name = m.Name,
|
||||
DisplayName = m.DisplayName,
|
||||
Description = m.Description,
|
||||
Birthday = m.Birthday != null ? Formats.DateExportFormat.Format(m.Birthday.Value) : null,
|
||||
Pronouns = m.Pronouns,
|
||||
Color = m.Color,
|
||||
AvatarUrl = m.AvatarUrl,
|
||||
Prefix = m.Prefix,
|
||||
Suffix = m.Suffix,
|
||||
Created = Formats.TimestampExportFormat.Format(m.Created),
|
||||
MessageCount = messageCounts.Where(x => x.Member.Equals(m.Id)).Select(x => x.MessageCount).FirstOrDefault()
|
||||
}));
|
||||
|
||||
// Export switches
|
||||
var switches = new List<DataFileSwitch>();
|
||||
foreach (var sw in await _switches.GetSwitches(system, 999999)) switches.Add(await ExportSwitch(sw));
|
||||
var switchList = await _switches.GetTruncatedSwitchList(system, Instant.FromDateTimeUtc(DateTime.MinValue.ToUniversalTime()), SystemClock.Instance.GetCurrentInstant());
|
||||
switches.AddRange(switchList.Select(x => new DataFileSwitch
|
||||
{
|
||||
Timestamp = Formats.TimestampExportFormat.Format(x.TimespanStart),
|
||||
Members = x.Members.Select(m => m.Hid).ToList() // Look up member's HID using the member export from above
|
||||
}));
|
||||
|
||||
return new DataFileSystem
|
||||
{
|
||||
|
@ -172,6 +172,25 @@ namespace PluralKit {
|
||||
return await conn.QuerySingleAsync<int>("select count(*) from messages where member = @Id", member);
|
||||
}
|
||||
|
||||
public struct MessageBreakdownListEntry
|
||||
{
|
||||
public int Member;
|
||||
public int MessageCount;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<MessageBreakdownListEntry>> MessageCountsPerMember(PKSystem system)
|
||||
{
|
||||
using (var conn = await _conn.Obtain())
|
||||
return await conn.QueryAsync<MessageBreakdownListEntry>(
|
||||
@"SELECT messages.member, COUNT(messages.member) messagecount
|
||||
FROM members
|
||||
JOIN messages
|
||||
ON members.id = messages.member
|
||||
WHERE members.system = @System
|
||||
GROUP BY messages.member",
|
||||
new { System = system.Id });
|
||||
}
|
||||
|
||||
public async Task<int> MemberCount(PKSystem system)
|
||||
{
|
||||
using (var conn = await _conn.Obtain())
|
||||
@ -362,7 +381,7 @@ namespace PluralKit {
|
||||
var switchMembersEntries = await conn.QueryAsync<SwitchMembersListEntry>(
|
||||
@"SELECT switch_members.member, switches.timestamp
|
||||
FROM switches
|
||||
JOIN switch_members
|
||||
LEFT JOIN switch_members
|
||||
ON switches.id = switch_members.switch
|
||||
WHERE switches.system = @System
|
||||
AND (
|
||||
@ -451,7 +470,7 @@ namespace PluralKit {
|
||||
select new SwitchListEntry
|
||||
{
|
||||
TimespanStart = g.Key,
|
||||
Members = g.Select(x => memberObjects[x.Member]).ToList()
|
||||
Members = g.Where(x => x.Member != 0).Select(x => memberObjects[x.Member]).ToList()
|
||||
};
|
||||
|
||||
// Loop through every switch that overlaps the range and add it to the output list
|
||||
|
Loading…
Reference in New Issue
Block a user