| a | b | |
|---|
| 0 | + | /* comment */ |
|---|
| 0 | + | |
|---|
| 0 | + | comment = { |
|---|
| 0 | + | _id: "itsid" |
|---|
| 0 | + | _rev : "", |
|---|
| 0 | + | link_id: "id of item you comment", |
|---|
| 0 | + | parent: "id of parent"n |
|---|
| 0 | + | children: "comment children", |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | /* map function */ |
|---|
| 0 | + | function(doc) { |
|---|
| 0 | + | if (doc.kind == "comment") { |
|---|
| 0 | + | emit(doc.link_id, doc); |
|---|
| 0 | + | } |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | /* reduce */ |
|---|
| 0 | + | function (key, values) { |
|---|
| 0 | + | var idx_comments = {}; |
|---|
| 0 | + | var comments = []; |
|---|
| 0 | + | for (var i=0; i<values.length; i++) { |
|---|
| 0 | + | if (values[i]) { |
|---|
| 0 | + | idx_comments[values[i]['_id']] = values[i]; |
|---|
| 0 | + | if (!values[i]['parent']) |
|---|
| 0 | + | comments.push(values[i]); |
|---|
| 0 | + | } |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | function iter_comments(lcomments) { |
|---|
| 0 | + | for (var i=0; i<lcomments.length; i++) { |
|---|
| 0 | + | var comment = lcomments[i] || []; |
|---|
| 0 | + | var thread=[]; |
|---|
| 0 | + | if (comment['children'] && comment['children'].length > 0) { |
|---|
| 0 | + | |
|---|
| 0 | + | for (var j=0; j<comment['children'].length; j++) { |
|---|
| 0 | + | thread.push(idx_comments[comment['children'][j]]); |
|---|
| 0 | + | } |
|---|
| 0 | + | if (thread && thread.length >0) { |
|---|
| 0 | + | comment['thread'] = iter_comments(thread); |
|---|
| 0 | + | } else { |
|---|
| 0 | + | comment['thread'] = null; |
|---|
| 0 | + | } |
|---|
| 0 | + | } |
|---|
| 0 | + | lcomments[i] = comment |
|---|
| 0 | + | } |
|---|
| 0 | + | return lcomments; |
|---|
| 0 | + | } |
|---|
| 0 | + | tmp = iter_comments(comments); |
|---|
| 0 | + | return tmp; |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | |
|---|
| 0 | + | /* rereduce */ |
|---|
| 0 | + | function(key, values) { |
|---|
| 0 | + | function cmp(a, b) { |
|---|
| 0 | + | if (a['created'] > b['created']) |
|---|
| 0 | + | return true; |
|---|
| 0 | + | return false; |
|---|
| 0 | + | } |
|---|
| 0 | + | function swap(arr, i, j) { |
|---|
| 0 | + | var tmp = arr[i]; |
|---|
| 0 | + | arr[i] = arr[j]; |
|---|
| 0 | + | arr[j] = tmp; |
|---|
| 0 | + | } |
|---|
| 0 | + | function partition(arr, start, end, pivot) { |
|---|
| 0 | + | var pval = arr[pivot]; |
|---|
| 0 | + | swap(arr, pivot, end--); |
|---|
| 0 | + | while (start < end) { |
|---|
| 0 | + | if (cmp(arr[start], pval) { |
|---|
| 0 | + | swap(arr, start, pivot); |
|---|
| 0 | + | pivot++; |
|---|
| 0 | + | } |
|---|
| 0 | + | } |
|---|
| 0 | + | swap(arr, pivot, end+1); |
|---|
| 0 | + | return pivot; |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | function qsort(arr, start, end) { |
|---|
| 0 | + | if (start < end) { |
|---|
| 0 | + | var pivot = partition(arr, start, end, start); |
|---|
| 0 | + | qsort(arr, start, pivot); |
|---|
| 0 | + | qsort(arr, pivot+1, end) |
|---|
| 0 | + | } |
|---|
| 0 | + | } |
|---|
| 0 | + | |
|---|
| 0 | + | function iter_comments(comments) { |
|---|
| 0 | + | qsort(comments, 0, comments.length-1); |
|---|
| 0 | + | for (var i=0; i<comments.length; i++) { |
|---|
| 0 | + | comment = comments[i]; |
|---|
| 0 | + | if (comment['thread'] and comment['thread']>1) |
|---|
| 0 | + | comment['thread'] = iter_comments(comment['thread']); |
|---|
| 0 | + | comments[i] = comment; |
|---|
| 0 | + | |
|---|
| 0 | + | } |
|---|
| 0 | + | return comments; |
|---|
| 0 | + | } |
|---|
| 0 | + | return iter_comments(values); |
|---|
| 0 | + | } |
|---|
| ... | |
|---|