Skip to content

Instantly share code, notes, and snippets.

@esatemre
Created October 23, 2015 10:43
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esatemre/696278f3da014038be46 to your computer and use it in GitHub Desktop.
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

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