-
Notifications
You must be signed in to change notification settings - Fork 0
/
TagsPerMonth.cs
86 lines (73 loc) · 3.08 KB
/
TagsPerMonth.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using LinqDb;
//using LinqdbClient;
using StackData;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Testing
{
class TagsPerMonth : ITest
{
public void Do(string path)
{
//var db = new Db(path, "admin", "admin");
var db = new Db(path);
Stopwatch sw = new Stopwatch();
sw.Start();
Dictionary<DateTime, Dictionary<int, int>> result = new Dictionary<DateTime, Dictionary<int, int>>();
DateTime min_date = db.Table<Question>().OrderBy(f => f.CreationDate).Take(1).Select(f => new { f.CreationDate }).First().CreationDate;
for (DateTime cd = min_date; ; cd = cd.AddMonths(1))
{
DateTime from = new DateTime(cd.Year, cd.Month, 1);
DateTime to = new DateTime(cd.Year, cd.Month, DateTime.DaysInMonth(cd.Year, cd.Month), 23, 59, 59);
var qs = db.Table<Question>().Between(f => f.CreationDate, from, to, BetweenBoundaries.BothInclusive).GetIds().Ids;
if (qs == null || !qs.Any())
{
break;
}
var res = new Dictionary<int, int>(); //tag_id, count
var tags = db.Table<QuestionTags>().Intersect(f => f.QuestionId, qs.Select(f => f).ToList())
.Select(f => new { f.QuestionId, f.TagId });
foreach (var tag in tags)
{
if (!res.ContainsKey(tag.TagId))
{
res[tag.TagId] = 1;
}
else
{
res[tag.TagId]++;
}
}
result[from] = res;
}
//pick some tags for display
var display_tags = new Dictionary<string, int>() { { "c#", 0 }, { "java", 0 }, { "javascript", 0 }, { "jquery", 0 } };
var display_ids = new List<int>();
foreach (var t in display_tags.Keys.ToList())
{
var dt_id = db.Table<Tag>().Where(f => f.Name == t).SelectEntity().FirstOrDefault();
if (dt_id == null)
{
throw new Exception("Tag not found: " + t);
}
display_tags[t] = dt_id.Id;
}
foreach (var entry in result.OrderBy(f => f.Key))
{
Console.Write("{0}-{1} - ", entry.Key.Year, entry.Key.Month);
foreach (var t in display_tags)
{
Console.Write("{0}:{1} ", t.Key, (entry.Value.ContainsKey(t.Value) ? entry.Value[t.Value] : 0));
}
Console.WriteLine();
}
sw.Stop();
Console.WriteLine("Tag activity per month: {0} sec", sw.Elapsed.TotalSeconds);
db.Dispose();
}
}
}