Skip to content

Instantly share code, notes, and snippets.

@lukesh
Created April 27, 2016 18:11
Show Gist options
  • Save lukesh/0229201e6a3fa559ef1cb5a3418d5089 to your computer and use it in GitHub Desktop.
Save lukesh/0229201e6a3fa559ef1cb5a3418d5089 to your computer and use it in GitHub Desktop.
if (!ctx.hasProperty('applicable_rules')) { exit; }
// TODO: or if rules numFound == 0?
// TODO: set some context data if no rules data or zero rules?
var applicable_rules_data = ctx.getProperty('applicable_rules_data');
var rules_to_exclude = request.getParam('rules.exclude');
// Arrays of things to put into response (by way of the ctx/context and the post-Solr stage)
var rules_response = {
"excluded_rules": [],
"banners": [],
"redirects": [],
"applicable_rules": [],
"applicable_rules_ids": [],
"applicable_rules_debug": [],
"rules_errors": []
};
for(var rule_index=0; rule_index < applicable_rules_data.response.docs.size(); rule_index++) {
var rule_doc = applicable_rules_data.response.docs[rule_index];
rules_response["applicable_rules_ids"].push(rule_doc.id);
rules_response["applicable_rules"].push(rule_doc);
rules_response["applicable_rules_debug"].push(rule_doc.toString());
var excluded = false;
if (rules_to_exclude) {
// TODO: optimize this check, add support for comma-separated values too
for (var i=0; i < rules_to_exclude.size(); i++) {
if (rule_doc.id == rules_to_exclude[i]) {
excluded = true;
rules_response["excluded_rules"].push(rules_to_exclude[i]);
break;
}
}
}
if (!excluded) {
var rule_type = rule_doc.type;
switch (rule_type) {
case 'response_value': // e.g. key="banner", "redirect"... etc
if (!rules_response[rule_doc.key]) { rules_response[rule_doc.key] = []; }
rules_response[rule_doc.key].push(rule_doc.value);
break;
case 'boost':
// boost_param=bq, boost_query=id:2^5
request.addParam(rule_doc.boost_param, rule_doc.boost_query);
break;
case 'block':
request.addParam("fq", "-{!terms f=id}" + Java.type('java.lang.String').join(',',rule_doc.ids));
break;
case 'query_rewrite':
if (rule_doc.new_q) { request.putSingleParam("q", rule_doc.new_q[0]); }
break;
case 'set_params':
for (var px=0; px < rule_doc.param_keys.size(); px++) {
switch (rule_doc.param_policies[px]) {
case 'append':
request.addParam(rule_doc.param_keys[px], rule_doc.param_values[px]);
break
case 'replace':
request.putSingleParam(rule_doc.param_keys[px], rule_doc.param_values[px]);
break
}
}
break;
default:
rules_response["rules_errors"].push(("Unknown rule type '" + rule_type + "' on rule " + rule_doc.id).toString());
break;
}
}
}
ctx.setProperty("rules_response", rules_response);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment