in site/js/ponymail.js [3373:3504]
function addNgram(json, state) {
// Start from the beginning
var D = new Date(state.dfrom)
// Are we measuring emails or topics?
if (state.topics) {
json.emails = json.thread_struct
}
// For each day from $beginning to $now, push the no. of emails sent that day into an array
var daily = []
var zz = 0
if (json.emails.length >= json.max) {
document.getElementById('trends').innerHTML = "NOTE: Too many results found (≥" + json.max + ") , n-grams may be distorted"
state.broken = true
}
for (var i in json.emails) {
var f = parseInt(json.emails[i].epoch/86400)
daily[f] = daily[f] ? daily[f]+1 : 1
zz++;
}
tsum.push(zz)
nsum[state.ngram] = zz
var arr = []
while (D <= state.dto) {
var day = new Date(D)
D.setDate(D.getDate()+1)
var d = parseInt(D.getTime()/86400/1000) // make correct pointer to daily[] array
arr.push([day, daily[d] ? daily[d] : 0])
}
ngram_data[state.ngram] = arr
var ngram_names = []
for (var n in ngram_data) ngram_names.push(n)
// Sort so that the largest areas will be at the bottom in case of stacking
ngram_names.sort(function(a,b) { return nsum[b] - nsum[a] })
tsum = []
for (var nn in ngram_names) {
tsum.push(nsum[ngram_names[nn]])
}
var ngram_arr = []
var avg = {}
// find a suitable rolling-average timespan
// set it to 1/15th of the timespan, or at least 3 days
var ndays = parseInt(ngram_data[ngram_names[0]].length/15)
if (ndays < 3) {
ndays = 3
}
// For each ngram array we have, compile it into the quokka array
for (var d in ngram_data[ngram_names[0]]) {
var x = []
var z = 0;
for (var ni in ngram_names) {
var n = ngram_names[ni]
// Are we doing a rolling average ? let's calc it regardless, because ponies..
avg[n] = avg[n] ? avg[n] : []
avg[n].push(ngram_data[n][d][1])
if (avg[n].length > ndays) {
avg[n].shift();
}
var sum = 0;
for (var a in avg[n]) {
sum += avg[n][a]
}
sum = sum/avg[n].length;
// Set the date for the array element
x[0] = ngram_data[n][d][0];
// push value (or rolling avg) into the quokka array
x.push(state.avg ? sum*parseInt(ndays/3) : ngram_data[n][d][1])
}
if (!state.avg || d%parseInt(ndays/3) == 0) {
ngram_arr.push(x)
}
}
// Draw the current timeline
var names_neat = []
for (var i in ngram_names) {
var nn = []
var name = unescape(ngram_names[i])
if (name.match(/^q=[a-z_]+=/)) {
name = name.replace(/^q=/, "")
}
while (name.match(/([^=]+)=([^=&]+)&?/)) {
var m = name.match(/([^=]+)=([^&=]+)&?/)
name = name.replace(m[0], "")
nn.push(m[1] + ": " + m[2])
}
if (name.match(/&?q=(.[^&=]+)/)) {
nn.push("query: " + name.match(/&?q=(.[^&=]+)/)[1])
}
names_neat.push(nn.join(", "))
}
//quokkaLines("ngramCanvas", names_neat, ngram_arr, {stack: state.stack, curve: true, verts: false, title: "n-gram stats for " + state.listname + "@" + state.domain })
// Fetch next ngram analysis if any are waiting
if (state.ngrams.length > 0) {
document.getElementById('trends').innerHTML = state.ngrams.length + " n-grams left to analyze..."
var nngram = state.ngrams.pop()
GetAsync('/api/stats.lua?' + (state.topics ? "" : 'quick=true&') + 'list='+state.listname+'&domain='+state.domain+'&d=' + state.dbl + "&" + nngram, { plaw:state.plaw, topics: state.topics, stack: state.stack, ngram: nngram, ngrams: state.ngrams, listname: state.listname, domain: state.domain, dbl: state.dbl, dfrom: state.dfrom, dto: state.dto, tspan: state.tspan, dspan: state.dspan, query: state.query, avg: state.avg }, addNgram)
} else {
document.getElementById('trends').innerHTML = "Rendering chart, hold on..!"
window.setTimeout(function() {
document.getElementById('trends').innerHTML = "n-gram analysis completed!"
if (state.broken) {
document.getElementById('trends').innerHTML += "<br/><b>Note:</b>Some n-gram objects exceeded the maximum result count (" + json.max + "), so the results may be distorted."
}
quokkaLines("ngramCanvas", names_neat, ngram_arr, {broken: state.broken, stack: state.stack, curve: true, verts: false, title: "n-gram stats for " + state.listname + "@" + state.domain }, tsum)
// power law distribution check
if (state.plaw) {
document.getElementById('plawCanvas').style.display = "block"
tsum.sort(function(b,a) {return a - b})
var ref = tsum[0]
var xs = []
for (var i in tsum) {
xs.push([i, tsum[i], ref])
ref /= 2
}
quokkaLines("plawCanvas", ['Actual distribution', 'PL distribution reference'], xs, {nosum: true, curve: false, verts: false, title: "Power Law distribution check chart"})
}
}, 200)
}
}