Skip to content

Instantly share code, notes, and snippets.

@esatemre
Created October 23, 2015 10:43
Show Gist options
  • Select an option

  • Save esatemre/696278f3da014038be46 to your computer and use it in GitHub Desktop.

Select an option

Save esatemre/696278f3da014038be46 to your computer and use it in GitHub Desktop.
ElasticSearch Support for jQuery-QueryBuilder
*!
* jQuery QueryBuilder ElasticSearch Filter Support
* Allows to convert exported rules as a ElasticSearch filter query object.
* Copyright 2015 Esat Emre Demirel (http://blog.esatemre.com)
*/
function getRawFilter(data) {
var hede = parse(data);
return JSON.stringify(hede);
}
function parse(data) {
if (!data.rules) {
return {};
}
var parts = [];
data.rules.forEach(function (rule) {
if (rule.rules && rule.rules.length > 0) {
parts.push(parse(rule));
} else {
parts.push(getElasticFilter(rule.operator, rule.field, changeType(rule.value, rule.type)));
}
});
var res = {};
if (parts.length > 0) {
res[data.condition.toLowerCase()] = parts;
}
return res;
}
function format(field, value) {
var object = {};
object[field] = value;
return object;
}
function formatArray(field, value) {
var object = {}, array = [];
var splitted = value.toLowerCase().split(',');
splitted.forEach(function (str) { array.push(str); });
object[field] = array;
return object;
}
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function changeType(value, type) {
switch (type) {
case 'integer': return parseInt(value);
case 'double': return parseFloat(value);
default: return value;
}
}
function getElasticFilter(operator, field, value) {
switch (operator) {
case "equal": return { "term": format(field, value) };
case "not_equal": return { "not": { "term": format(field, value) } };
case "in": return { "terms": formatArray(field, value) };
case "not_in": return { "not": { "terms": formatArray(field, value) } };
case "less": return { "range": format(field, { 'lt': value}) };
case "less_or_equal":return { "range": format(field, { 'lte': value}) };
case "greater": return { "range": format(field, { 'gt': value}) };
case "greater_or_equal": return { "range": format(field, { 'gte': value }) };
case "between": return { "range": format(field, { 'gte': value[0], 'lte': value[1] }) };
case "not_between": return { "range": format(field, { 'lt': value[0], 'gt': value[1] }) };
case "begins_with": return { "prefix": format(field, value) };
case "not_begins_with": return {"not":{"prefix": format(field, value) }};
case "contains": return { "regexp": format(field, '.*' + escapeRegExp(value) + '.*') };
case "not_contains": return { "not": { "regexp": format(field, '.*' + escapeRegExp(value) + '.*') } };
case "ends_with": return { "regexp": format(field, '.*' + escapeRegExp(value)) };
case "not_ends_with": return { "not": { "regexp": format(field, '.*' + escapeRegExp(value)) } };
case "is_empty": return { "term": format(field, "") };
case "is_not_empty": return { "not": { "term": format(field, "") } };
case "is_null": return { "term": format(field, null) };
case "is_not_null": return { "not": { "term": format(field, null) } };
default: return {};
}
}
@prashantguleria
Copy link
Copy Markdown

How to integrate it with Query Builder plugin?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment