Browse Source

moving mixing logic into mix_results helper/suggest

size-bug
Harish Krishna 10 years ago
parent
commit
43745d2bae
  1. 9
      controller/suggest.js
  2. 53
      helper/suggest.js

9
controller/suggest.js

@ -46,15 +46,8 @@ function setup( backend, query, query_mixer ){
async.parallel(async_query, function(err, results) { async.parallel(async_query, function(err, results) {
// results is equal to: {a: docs, b: docs, c: docs} // results is equal to: {a: docs, b: docs, c: docs}
var splice_length = parseInt((SIZE / Object.keys(results).length), 10);
var results_keys = Object.keys(async_query); var results_keys = Object.keys(async_query);
var combined = suggest.mix_results(results, results_keys, SIZE);
var combined = [];
results_keys.forEach(function(key){
combined = combined.concat(suggest.sort_by_score(results[key]).splice(0,splice_length));
});
combined = suggest.dedup(combined);
suggest.respond(combined); suggest.respond(combined);
}); });

53
helper/suggest.js

@ -17,21 +17,46 @@ function setup(backend, res, next) {
}); });
}; };
var dedup = function(combined) {
var unique_ids = [];
return combined.filter(function(item, pos) {
if (unique_ids.indexOf(item.text) === -1) {
unique_ids.push(item.text);
return true;
}
return false;
});
};
var sort_by_score = function(combined) { var sort_by_score = function(combined) {
return combined.sort(function(a,b) { return combined.map(function(doc) {
return doc.sort(function(a,b) {
return b.score - a.score; return b.score - a.score;
}); });
}).reduce(function(a,b) { //flatten
return a.concat(b);
});
};
var mix_results = function(results, results_keys, size) {
var i = 0;
var j = 0;
var l = results_keys.length;
var combined = [];
var unique_ids = [];
while (i<size && l > 0) {
if (results[results_keys[j]].length) {
combined[j] = combined[j] || [];
var res = results[results_keys[j]][0];
if (unique_ids.indexOf(res.text) === -1) {
combined[j].push(res);
unique_ids.push(res.text);
i++;
}
results[results_keys[j]].splice(0,1);
} else {
results_keys.splice(j,1);
l = results_keys.length;
j--;
}
j++;
if (j%l === 0) {
j=0;
}
}
return sort_by_score(combined);
}; };
var reply = function(res, docs) { var reply = function(res, docs) {
@ -77,9 +102,7 @@ function setup(backend, res, next) {
return { return {
query_backend: query_backend, query_backend: query_backend,
dedup: dedup, mix_results: mix_results,
sort_by_score: sort_by_score,
reply: reply,
respond: respond respond: respond
}; };

Loading…
Cancel
Save