move "userdata" views into own database
[mygpo.git] / couchdb / userdata / _design / heatmap / views / by_episode / reduce.js
blob456a1e07a47bcaa3469d872dbcefee686734c3d9
1 function (keys, values, rereduce)
3     function unique(arr) {
4         var a = [];
5         var l = arr.length;
6         for(var i=0; i<l; i++) {
7             for(var j=i+1; j<l; j++) {
8                 if (arr[i] === arr[j])
9                     j = ++i;
10             }
11             a.push(arr[i]);
12         }
13         return a;
14     };
16     function flatten(arr)
17     {
18         var flattened = []
19         for(var n in arr)
20         {
21             for(var x in arr[n])
22             {
23                 flattened.push(arr[n][x]);
24             }
25         }
26         return flattened
27     };
29     function sortNumerical(a, b)
30     {
31         if(a < b)
32         {
33             return -1;
34         }
35         else if (a > b)
36         {
37             return 1;
38         }
39         else
40         {
41             return 0;
42         }
43     };
45     function mergeBorders(borders, maxBorders)
46     {
47         last = null;
48         newBorders = [];
50         lastBorder = borders[borders.length-1];
51         minDist = lastBorder / maxBorders;
53         for(var n in borders)
54         {
55             border = borders[n];
57             if(last == null)
58             {
59             }
60             else if (border == lastBorder)
61             {
62             }
63             else if ((border - last) < minDist)
64             {
65                 continue;
66             }
68             newBorders.push(border);
69             last = border;
70         }
72         return newBorders;
73     };
75     var all_borders = [];
77     if (rereduce)
78     {
79         for(var n in values)
80         {
81             all_borders.push(values[n].borders);
82         }
83     }
84     else
85     {
86         all_borders = values;
87     }
89     var borders = flatten(all_borders);
90     borders = unique(borders);
91     borders.sort(sortNumerical);
92     borders = mergeBorders(borders, 50);
94     var heatmap = [];
96     for(var n=0; n<borders.length-1; n++)
97     {
98         heatmap.push(0);
99     }
101     for(var n in values)
102     {
103         j = 0;
104         var length = 0;
105         var increment = 1;
107         if(rereduce)
108         {
109             length = values[n].borders.length-1;
110             increment = 1;
111         }
112         else
113         {
114             length = values[n].length;
115             increment = 2;
116         }
119         for(var i=0; i<length; i+=increment)
120         {
121             var from = 0;
122             var until = 0;
124             if(rereduce)
125             {
126                 from  = values[n].borders[i];
127                 until = values[n].borders[i+1];
128             }
129             else
130             {
131                 from  = values[n][i];
132                 until = values[n][i+1];
133             }
135             while(borders[j] < from)
136             {
137                 j++;
138             }
140             while(borders[j] < until)
141             {
142                 if(rereduce)
143                 {
144                     heatmap[j++] += values[n].heatmap[i];
145                 }
146                 else
147                 {
148                     heatmap[j++] += 1;
149                 }
150             }
151         }
152     }
154     return {heatmap: heatmap, borders: borders};