Created
October 23, 2015 10:43
-
-
Save esatemre/696278f3da014038be46 to your computer and use it in GitHub Desktop.
ElasticSearch Support for jQuery-QueryBuilder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*! | |
* 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 {}; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How to integrate it with Query Builder plugin?