Revision 303139353737 () - Diff

Link to this snippet: https://friendpaste.com/22qa8u7nWWqFLrwCF6E7cT
Embed:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
/* comment */

comment = {
_id: "itsid"
_rev : "",
link_id: "id of item you comment",
parent: "id of parent"n
children: "comment children",
}

/* map function */
function(doc) {
if (doc.kind == "comment") {
emit(doc.link_id, doc);
}
}

/* reduce */
function (key, values) {
var idx_comments = {};
var comments = [];
for (var i=0; i<values.length; i++) {
if (values[i]) {
idx_comments[values[i]['_id']] = values[i];
if (!values[i]['parent'])
comments.push(values[i]);
}
}

function iter_comments(lcomments) {
for (var i=0; i<lcomments.length; i++) {
var comment = lcomments[i] || [];
var thread=[];
if (comment['children'] && comment['children'].length > 0) {

for (var j=0; j<comment['children'].length; j++) {
thread.push(idx_comments[comment['children'][j]]);
}
if (thread && thread.length >0) {
comment['thread'] = iter_comments(thread);
} else {
comment['thread'] = null;
}
}
lcomments[i] = comment
}
return lcomments;
}
tmp = iter_comments(comments);
return tmp;
}


/* rereduce */
function(key, values) {
function cmp(a, b) {
if (a['created'] > b['created'])
return true;
return false;
}
function swap(arr, i, j) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
function partition(arr, start, end, pivot) {
var pval = arr[pivot];
swap(arr, pivot, end--);
while (start < end) {
if (cmp(arr[start], pval) {
swap(arr, start, pivot);
pivot++;
}
}
swap(arr, pivot, end+1);
return pivot;
}
function qsort(arr, start, end) {
if (start < end) {
var pivot = partition(arr, start, end, start);
qsort(arr, start, pivot);
qsort(arr, pivot+1, end)
}
}
function iter_comments(comments) {
qsort(comments, 0, comments.length-1);
for (var i=0; i<comments.length; i++) {
comment = comments[i];
if (comment['thread'] and comment['thread']>1)
comment['thread'] = iter_comments(comment['thread']);
comments[i] = comment;

}
return comments;
}
return iter_comments(values);
}