// Copyright Up and Running // 5/03/2014 parseSearchNode : function(node) { var url = ''; if (node.type == 'keyword') { var field = '_TEXT'; var text = node.keywords; } else if (node.value) { var field = node.metaField; var text = node.value; } if (text) var text_words = '"' + text.replace(/[ ]+/g, '", "') + '"'; if (!node.matcher || (node.matcher == 'Equals') || ((node.type == 'metadata') && (node.matcher == 'Contains'))) { if (this.isNumberString(text) || ((node.type == 'metadata') && (node.matcher == 'Contains'))) { url += '{ "terms" : { "' + field + '" : ["' + text + '"]}},'; } else { url += '{"has_child" : { "query" : { "match_phrase" : { "' + field + '" : "' + text + '"}}, "type" : "text" }},'; } } else if (node.matcher == 'Like') { url += '{ "has_child": { "query": { "flt_field": { "' + field + '": { "like_text" : "' + text + '", "max_query_terms" : 12 } } }, "type": "text" } }'; } else if (node.matcher == 'Contains') { if ((node.type == 'keyword')) { url += '{"has_child" : { "query" : '; } url += '{ "match_phrase" : { "' + field + '" : "' + text + '"}},'; if ((node.type == 'keyword')) { url += ' "type" : "text" }},'; } } else if (node.matcher == 'Greater than') { if (node.type == 'keyword') { url += '{"has_child" : { "filter" : '; } url += '{ "range" : { "' + field + '" : { "gt" : "' + text + '" }}},'; if (node.type == 'keyword') { url += ' "type" : "text" }},'; } } else if (node.matcher == 'Greater than or equal to') { if (node.type == 'keyword') { url += '{"has_child" : { "filter" : '; } url += '{ "range" : { "' + field + '" : { "gte" : "' + text + '" }}},'; if (node.type == 'keyword') { url += ' "type" : "text" }},'; } } else if (node.matcher == 'Less than') { if (node.type == 'keyword') { url += '{"has_child" : { "filter" : '; } url += '{ "range" : { "' + field + '" : { "lt" : "' + text + '" }}},'; if (node.type == 'keyword') { url += ' "type" : "text" }},'; } } else if (node.matcher == 'Less than or equal to') { if (node.type == 'keyword') { url += '{"has_child" : { "filter" : '; } url += '{ "range" : { "' + field + '" : { "lte" : "' + text + '" }}},'; if (node.type == 'keyword') { url += ' "type" : "text" }},'; } } return url; }, parseSearchTerm : function(term) { var url = ''; var svc = this; if (!!term.case) { if (term.not && (term.not == true)) { url += '{ "not" : '; } if (term.nodes && term.nodes.length > 1) { // Surrounds the root level with a group url += '{ "' + term.nodes[0].operator.toLowerCase() + '" : { "filters": ['; } } if (term.nodes && (term.nodes.length > 0)) { for (var index in term.nodes) { if (term.nodes.hasOwnProperty(index)) { var node = term.nodes[index]; if (node.not && (node.not == true)) { url += '{ "not" : '; } switch (node.type) { case 'keyword': url += svc.parseSearchNode(node); break; case 'metadata': if (!node.date1) { url += svc.parseSearchNode(node); } else { var date1, date2; switch (node.matcher) { case 'Equals': date1 = angular.copy(node.date1); date2 = date1; break; case 'On or before': date1 = '0001-01-01'; date2 = angular.copy(node.date1); break; case 'On or after': date1 = angular.copy(node.date1); date2 = '3000-01-01'; break; case 'Between': date1 = angular.copy(node.date1); date2 = angular.copy(node.date2); break; } url += '{ "range": { "' + node.metaField + '": { "gte": "' + date1 + '", "lte": "' + date2 + '" } } },'; } break; case 'score': url += '{ "has_child": { "type": "prediction", "filter": { "and": [{ "range": { "pvalue": { "gte": "' + node.value + '", "lte": "' + node.value2 + '" } } }, { "term": { "tag_name": "' + node.tagField + '" } }] } } },'; break; case 'tag': var dynTagSearches = svc.getDynTagSearches(svc.currentCase, node.tagField); if (dynTagSearches && ('null' != dynTagSearches) && !dynTagSearches.then && this.objSize(dynTagSearches)) { // is Dynamic Tag if (node.tagField && node.value && dynTagSearches[node.value] && dynTagSearches[node.value]['search'] && (dynTagSearches[node.value]['query'] != "")) { // Boolean condition [TRUE, FALSE] url += svc.parseSearchTerm(dynTagSearches[node.value]['search']) + ','; } else if (node.tagField && node.exist) { // Search for ANY value of the Dynamic Tag var searchExists = false; url += '{ "or": { "filters": [ '; angular.forEach(dynTagSearches, function (search, value) { if ((search['search'] != {}) && (search['query'] != '')) { searchExists = true; url += svc.parseSearchTerm(search['search']) + ','; } }); url = $filter('trimTail')(url, ','); url = $filter('trimTail')(url, ','); url += ' ]}} '; if (node.exist == 'not') { url = ' { "not" : ' + url + ' } '; } if (!searchExists) { url = ''; } } } else { // is Regular Tag if (node.tagField && node.value) { url += '{ "has_child": { "type": "tags", "filter":{ "and":[ { "term":{ "tag_name":"' + node.tagField + '" } } , {"term":{"current":true}} , {"term":{"tag_value":"' + node.value + '"}} ] } } },'; } else if (node.tagField && node.exist) { // Exists conditions if (node.exist == 'yes') { url += '{ "has_child": { "type": "tags", "filter":{ "and":[ { "term":{ "tag_name":"' + node.tagField + '" } }] } } },'; } else { url += '{ "not" : { "has_child": { "type": "tags", "filter":{ "and":[ { "term":{ "tag_name":"' + node.tagField + '" } }] } } } },'; } } } break; case 'search': var searches = svc.getSearches(svc.currentCase); if (searches[node.sSearch]) url += svc.parseSearchTerm(searches[node.sSearch]) + ','; break; case 'ids': var ids = $filter('trimTail')(node.ids, ','); ids = ids.split(/(?:,| )+/); if (ids instanceof Array) { ids = ids.join('", "'); } url += '{ "ids" : { "type" : "doc", "values" : ["' + ids + '"] } },'; break; case 'group': url += '{ "' + node.nodes[0].operator.toLowerCase() + '" : { "filters": ['; url += svc.parseSearchTerm(node); url = $filter('trimTail')(url, ','); url += ']}},'; break; } if (node.not && (node.not == true)) { url = $filter('trimTail')(url, ','); url += '},'; } } } url = $filter('trimTail')(url, ','); } if (term.case) { if (term.nodes && term.nodes.length > 1) { // Surrounds the root level with a group url = $filter('trimTail')(url, ','); url += ']}},'; } if (term.not && (term.not == true)) { url = $filter('trimTail')(url, ','); url += '},'; } } url = $filter('trimTail')(url, ','); return url; },