|
@@ -1,412 +1,295 @@
|
|
|
-function get_object_fields(obj) {
|
|
|
|
|
- var field_array = [];
|
|
|
|
|
- obj = flatten_json(obj._source)
|
|
|
|
|
- for (field in obj) {
|
|
|
|
|
- field_array.push(field);
|
|
|
|
|
- }
|
|
|
|
|
- return field_array.sort();
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function get_all_fields(data) {
|
|
|
|
|
- var fields = [];
|
|
|
|
|
- _.each(data,function(hit) {
|
|
|
|
|
- fields = _.uniq(fields.concat(_.keys(hit)))
|
|
|
|
|
- })
|
|
|
|
|
- // Remove stupid angular key
|
|
|
|
|
- fields = _.without(fields,'$$hashKey')
|
|
|
|
|
- return fields;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function has_field(obj,field) {
|
|
|
|
|
- var obj_fields = get_object_fields(obj);
|
|
|
|
|
- if (_.inArray(obj_fields,field) < 0) {
|
|
|
|
|
- return false;
|
|
|
|
|
- } else {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+// Wrap this all up in a 'kbn' object so I don't have a billion globals
|
|
|
|
|
+(function() {
|
|
|
|
|
|
|
|
-function get_related_fields(docs,field) {
|
|
|
|
|
- var field_array = []
|
|
|
|
|
- _.each(docs, function(doc) {
|
|
|
|
|
- var keys = _.keys(doc)
|
|
|
|
|
- if(_.contains(keys,field))
|
|
|
|
|
- field_array = field_array.concat(keys)
|
|
|
|
|
- })
|
|
|
|
|
- var counts = _.countBy(_.without(field_array,field),function(field){return field;});
|
|
|
|
|
- return counts;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // Save a reference to this
|
|
|
|
|
+ var self = this;
|
|
|
|
|
|
|
|
-function recurse_field_dots(object,field) {
|
|
|
|
|
- var value = null;
|
|
|
|
|
- if (typeof object[field] != 'undefined')
|
|
|
|
|
- value = object[field];
|
|
|
|
|
- else if (nested = field.match(/(.*?)\.(.*)/))
|
|
|
|
|
- if(typeof object[nested[1]] != 'undefined')
|
|
|
|
|
- value = (typeof object[nested[1]][nested[2]] != 'undefined') ?
|
|
|
|
|
- object[nested[1]][nested[2]] : recurse_field_dots(
|
|
|
|
|
- object[nested[1]],nested[2]);
|
|
|
|
|
|
|
+ // Save a reference to the old versionof this
|
|
|
|
|
+ var wasKbn = self.kbn;
|
|
|
|
|
|
|
|
- return value;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // Create a safe refernce to the kbn object, for use below
|
|
|
|
|
+ var kbn = function(obj) { return new wrapper(obj); };
|
|
|
|
|
|
|
|
-// Probably useless now, leaving for cases where you might not want
|
|
|
|
|
-// a flat dot notated data structure
|
|
|
|
|
-function get_field_value(object,field,opt) {
|
|
|
|
|
- var value = recurse_field_dots(object['_source'],field);
|
|
|
|
|
|
|
+ // Create a global object for accessing these functions
|
|
|
|
|
+ self.kbn = kbn;
|
|
|
|
|
|
|
|
- if(value === null)
|
|
|
|
|
- return ''
|
|
|
|
|
- if(_.isArray(value))
|
|
|
|
|
- if (opt == 'raw') {
|
|
|
|
|
- return value;
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- var complex = false;
|
|
|
|
|
- _.each(value, function(el, index) {
|
|
|
|
|
- if (typeof(el) == 'object') {
|
|
|
|
|
- complex = true;
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- if (complex) {
|
|
|
|
|
- return JSON.stringify(value, null, 4);
|
|
|
|
|
- }
|
|
|
|
|
- return value.toString();
|
|
|
|
|
|
|
+ kbn.get_object_fields = function(obj) {
|
|
|
|
|
+ var field_array = [];
|
|
|
|
|
+ obj = kbn.flatten_json(obj._source)
|
|
|
|
|
+ for (field in obj) {
|
|
|
|
|
+ field_array.push(field);
|
|
|
}
|
|
}
|
|
|
- if(typeof value === 'object' && value != null)
|
|
|
|
|
- // Leaving this out for now
|
|
|
|
|
- //return opt == 'raw' ? value : JSON.stringify(value,null,4)
|
|
|
|
|
- return JSON.stringify(value,null,4)
|
|
|
|
|
-
|
|
|
|
|
- return (value != null) ? value.toString() : '';
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function top_field_values(docs,field,count) {
|
|
|
|
|
- var counts = _.countBy(_.pluck(docs,field),function(field){
|
|
|
|
|
- return _.isUndefined(field) ? '' : field;
|
|
|
|
|
- });
|
|
|
|
|
- return _.pairs(counts).sort(function(a, b) {
|
|
|
|
|
- return a[1] - b[1]
|
|
|
|
|
- }).reverse().slice(0,count)
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ return field_array.sort();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function add_to_query(original,field,value,negate) {
|
|
|
|
|
- var not = negate ? "-" : "";
|
|
|
|
|
- if(value !== '')
|
|
|
|
|
- var query = field + ":" + "\"" + addslashes(value.toString()) + "\"";
|
|
|
|
|
- else
|
|
|
|
|
- var query = "_missing_:" + field;
|
|
|
|
|
- var glue = original != "" ? " AND " : "";
|
|
|
|
|
- return original + glue + not + query;
|
|
|
|
|
-}
|
|
|
|
|
- /**
|
|
|
|
|
- * Calculate a graph interval
|
|
|
|
|
- *
|
|
|
|
|
- * from:: Date object containing the start time
|
|
|
|
|
- * to:: Date object containing the finish time
|
|
|
|
|
- * size:: Calculate to approximately this many bars
|
|
|
|
|
- * user_interval:: User specified histogram interval
|
|
|
|
|
- *
|
|
|
|
|
- */
|
|
|
|
|
-function calculate_interval(from,to,size,user_interval) {
|
|
|
|
|
- if(_.isObject(from))
|
|
|
|
|
- from = from.valueOf();
|
|
|
|
|
- if(_.isObject(to))
|
|
|
|
|
- to = to.valueOf();
|
|
|
|
|
- return user_interval == 0 ? round_interval((to - from)/size) : user_interval;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.get_all_fields = function(data) {
|
|
|
|
|
+ var fields = [];
|
|
|
|
|
+ _.each(data,function(hit) {
|
|
|
|
|
+ fields = _.uniq(fields.concat(_.keys(hit)))
|
|
|
|
|
+ })
|
|
|
|
|
+ // Remove stupid angular key
|
|
|
|
|
+ fields = _.without(fields,'$$hashKey')
|
|
|
|
|
+ return fields;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function get_bar_count(from,to,interval) {
|
|
|
|
|
- return (to - from)/interval;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.has_field = function(obj,field) {
|
|
|
|
|
+ var obj_fields = get_object_fields(obj);
|
|
|
|
|
+ if (_.inArray(obj_fields,field) < 0) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function round_interval (interval) {
|
|
|
|
|
- switch (true) {
|
|
|
|
|
- // 0.5s
|
|
|
|
|
- case (interval <= 500): return 100; // 0.1s
|
|
|
|
|
- // 5s
|
|
|
|
|
- case (interval <= 5000): return 1000; // 1s
|
|
|
|
|
- // 7.5s
|
|
|
|
|
- case (interval <= 7500): return 5000; // 5s
|
|
|
|
|
- // 15s
|
|
|
|
|
- case (interval <= 15000): return 10000; // 10s
|
|
|
|
|
- // 45s
|
|
|
|
|
- case (interval <= 45000): return 30000; // 30s
|
|
|
|
|
- // 3m
|
|
|
|
|
- case (interval <= 180000): return 60000; // 1m
|
|
|
|
|
- // 9m
|
|
|
|
|
- case (interval <= 450000): return 300000; // 5m
|
|
|
|
|
- // 20m
|
|
|
|
|
- case (interval <= 1200000): return 600000; // 10m
|
|
|
|
|
- // 45m
|
|
|
|
|
- case (interval <= 2700000): return 1800000; // 30m
|
|
|
|
|
- // 2h
|
|
|
|
|
- case (interval <= 7200000): return 3600000; // 1h
|
|
|
|
|
- // 6h
|
|
|
|
|
- case (interval <= 21600000): return 10800000; // 3h
|
|
|
|
|
- // 24h
|
|
|
|
|
- case (interval <= 86400000): return 43200000; // 12h
|
|
|
|
|
- // 48h
|
|
|
|
|
- case (interval <= 172800000): return 86400000; // 24h
|
|
|
|
|
- // 1w
|
|
|
|
|
- case (interval <= 604800000): return 86400000; // 24h
|
|
|
|
|
- // 3w
|
|
|
|
|
- case (interval <= 1814400000): return 604800000; // 1w
|
|
|
|
|
- // 2y
|
|
|
|
|
- case (interval < 3628800000): return 2592000000; // 30d
|
|
|
|
|
- default: return 31536000000; // 1y
|
|
|
|
|
|
|
+ kbn.get_related_fields = function(docs,field) {
|
|
|
|
|
+ var field_array = []
|
|
|
|
|
+ _.each(docs, function(doc) {
|
|
|
|
|
+ var keys = _.keys(doc)
|
|
|
|
|
+ if(_.contains(keys,field))
|
|
|
|
|
+ field_array = field_array.concat(keys)
|
|
|
|
|
+ })
|
|
|
|
|
+ var counts = _.countBy(_.without(field_array,field),function(field){return field;});
|
|
|
|
|
+ return counts;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-function secondsToHms(seconds){
|
|
|
|
|
- var numyears = Math.floor(seconds / 31536000);
|
|
|
|
|
- if(numyears){
|
|
|
|
|
- return numyears + 'y';
|
|
|
|
|
- }
|
|
|
|
|
- var numdays = Math.floor((seconds % 31536000) / 86400);
|
|
|
|
|
- if(numdays){
|
|
|
|
|
- return numdays + 'd';
|
|
|
|
|
- }
|
|
|
|
|
- var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);
|
|
|
|
|
- if(numhours){
|
|
|
|
|
- return numhours + 'h';
|
|
|
|
|
- }
|
|
|
|
|
- var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);
|
|
|
|
|
- if(numminutes){
|
|
|
|
|
- return numminutes + 'm';
|
|
|
|
|
- }
|
|
|
|
|
- var numseconds = (((seconds % 31536000) % 86400) % 3600) % 60;
|
|
|
|
|
- if(numseconds){
|
|
|
|
|
- return numseconds + 's';
|
|
|
|
|
- }
|
|
|
|
|
- return 'less then a second'; //'just now' //or other string you like;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.recurse_field_dots = function(object,field) {
|
|
|
|
|
+ var value = null;
|
|
|
|
|
+ if (typeof object[field] != 'undefined')
|
|
|
|
|
+ value = object[field];
|
|
|
|
|
+ else if (nested = field.match(/(.*?)\.(.*)/))
|
|
|
|
|
+ if(typeof object[nested[1]] != 'undefined')
|
|
|
|
|
+ value = (typeof object[nested[1]][nested[2]] != 'undefined') ?
|
|
|
|
|
+ object[nested[1]][nested[2]] : recurse_field_dots(
|
|
|
|
|
+ object[nested[1]],nested[2]);
|
|
|
|
|
+
|
|
|
|
|
+ return value;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function to_percent(number,outof) {
|
|
|
|
|
- return Math.round((number/outof)*10000)/100 + "%";
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // Probably useless now, leaving for cases where you might not want
|
|
|
|
|
+ // a flat dot notated data structure
|
|
|
|
|
+ kbn.get_field_value = function(object,field,opt) {
|
|
|
|
|
+ var value = kbn.recurse_field_dots(object['_source'],field);
|
|
|
|
|
|
|
|
-function addslashes(str) {
|
|
|
|
|
- str = str.replace(/\\/g, '\\\\');
|
|
|
|
|
- str = str.replace(/\'/g, '\\\'');
|
|
|
|
|
- str = str.replace(/\"/g, '\\"');
|
|
|
|
|
- str = str.replace(/\0/g, '\\0');
|
|
|
|
|
- return str;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ if(value === null)
|
|
|
|
|
+ return ''
|
|
|
|
|
+ if(_.isArray(value))
|
|
|
|
|
+ if (opt == 'raw') {
|
|
|
|
|
+ return value;
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ var complex = false;
|
|
|
|
|
+ _.each(value, function(el, index) {
|
|
|
|
|
+ if (typeof(el) == 'object') {
|
|
|
|
|
+ complex = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ if (complex) {
|
|
|
|
|
+ return JSON.stringify(value, null, 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ return value.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+ if(typeof value === 'object' && value != null)
|
|
|
|
|
+ // Leaving this out for now
|
|
|
|
|
+ //return opt == 'raw' ? value : JSON.stringify(value,null,4)
|
|
|
|
|
+ return JSON.stringify(value,null,4)
|
|
|
|
|
|
|
|
-// Create an ISO8601 compliant timestamp for ES
|
|
|
|
|
-//function ISODateString(unixtime) {
|
|
|
|
|
- //var d = new Date(parseInt(unixtime));
|
|
|
|
|
-function ISODateString(d) {
|
|
|
|
|
- if(is_int(d)) {
|
|
|
|
|
- d = new Date(parseInt(d));
|
|
|
|
|
|
|
+ return (value != null) ? value.toString() : '';
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function pad(n) {
|
|
|
|
|
- return n < 10 ? '0' + n : n
|
|
|
|
|
|
|
+ kbn.top_field_values = function(docs,field,count) {
|
|
|
|
|
+ var counts = _.countBy(_.pluck(docs,field),function(field){
|
|
|
|
|
+ return _.isUndefined(field) ? '' : field;
|
|
|
|
|
+ });
|
|
|
|
|
+ return _.pairs(counts).sort(function(a, b) {
|
|
|
|
|
+ return a[1] - b[1]
|
|
|
|
|
+ }).reverse().slice(0,count)
|
|
|
}
|
|
}
|
|
|
- return d.getFullYear() + '-' +
|
|
|
|
|
- pad(d.getMonth() + 1) + '-' +
|
|
|
|
|
- pad(d.getDate()) + 'T' +
|
|
|
|
|
- pad(d.getHours()) + ':' +
|
|
|
|
|
- pad(d.getMinutes()) + ':' +
|
|
|
|
|
- pad(d.getSeconds());
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-function pickDateString(d) {
|
|
|
|
|
- return dateFormat(d,'yyyy-mm-dd HH:MM:ss')
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Calculate a graph interval
|
|
|
|
|
+ *
|
|
|
|
|
+ * from:: Date object containing the start time
|
|
|
|
|
+ * to:: Date object containing the finish time
|
|
|
|
|
+ * size:: Calculate to approximately this many bars
|
|
|
|
|
+ * user_interval:: User specified histogram interval
|
|
|
|
|
+ *
|
|
|
|
|
+ */
|
|
|
|
|
+ kbn.calculate_interval = function(from,to,size,user_interval) {
|
|
|
|
|
+ if(_.isObject(from))
|
|
|
|
|
+ from = from.valueOf();
|
|
|
|
|
+ if(_.isObject(to))
|
|
|
|
|
+ to = to.valueOf();
|
|
|
|
|
+ return user_interval == 0 ? kbn.round_interval((to - from)/size) : user_interval;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function prettyDateString(d) {
|
|
|
|
|
- d = new Date(parseInt(d));
|
|
|
|
|
- d = utc_date_obj(d);
|
|
|
|
|
- return dateFormat(d,window.time_format);
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.round_interval = function(interval) {
|
|
|
|
|
+ switch (true) {
|
|
|
|
|
+ // 0.5s
|
|
|
|
|
+ case (interval <= 500): return 100; // 0.1s
|
|
|
|
|
+ // 5s
|
|
|
|
|
+ case (interval <= 5000): return 1000; // 1s
|
|
|
|
|
+ // 7.5s
|
|
|
|
|
+ case (interval <= 7500): return 5000; // 5s
|
|
|
|
|
+ // 15s
|
|
|
|
|
+ case (interval <= 15000): return 10000; // 10s
|
|
|
|
|
+ // 45s
|
|
|
|
|
+ case (interval <= 45000): return 30000; // 30s
|
|
|
|
|
+ // 3m
|
|
|
|
|
+ case (interval <= 180000): return 60000; // 1m
|
|
|
|
|
+ // 9m
|
|
|
|
|
+ case (interval <= 450000): return 300000; // 5m
|
|
|
|
|
+ // 20m
|
|
|
|
|
+ case (interval <= 1200000): return 600000; // 10m
|
|
|
|
|
+ // 45m
|
|
|
|
|
+ case (interval <= 2700000): return 1800000; // 30m
|
|
|
|
|
+ // 2h
|
|
|
|
|
+ case (interval <= 7200000): return 3600000; // 1h
|
|
|
|
|
+ // 6h
|
|
|
|
|
+ case (interval <= 21600000): return 10800000; // 3h
|
|
|
|
|
+ // 24h
|
|
|
|
|
+ case (interval <= 86400000): return 43200000; // 12h
|
|
|
|
|
+ // 48h
|
|
|
|
|
+ case (interval <= 172800000): return 86400000; // 24h
|
|
|
|
|
+ // 1w
|
|
|
|
|
+ case (interval <= 604800000): return 86400000; // 24h
|
|
|
|
|
+ // 3w
|
|
|
|
|
+ case (interval <= 1814400000): return 604800000; // 1w
|
|
|
|
|
+ // 2y
|
|
|
|
|
+ case (interval < 3628800000): return 2592000000; // 30d
|
|
|
|
|
+ default: return 31536000000; // 1y
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function utc_date_obj(d) {
|
|
|
|
|
- return new Date(
|
|
|
|
|
- d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),
|
|
|
|
|
- d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(),
|
|
|
|
|
- d.getUTCMilliseconds());
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.secondsToHms = function(seconds){
|
|
|
|
|
+ var numyears = Math.floor(seconds / 31536000);
|
|
|
|
|
+ if(numyears){
|
|
|
|
|
+ return numyears + 'y';
|
|
|
|
|
+ }
|
|
|
|
|
+ var numdays = Math.floor((seconds % 31536000) / 86400);
|
|
|
|
|
+ if(numdays){
|
|
|
|
|
+ return numdays + 'd';
|
|
|
|
|
+ }
|
|
|
|
|
+ var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);
|
|
|
|
|
+ if(numhours){
|
|
|
|
|
+ return numhours + 'h';
|
|
|
|
|
+ }
|
|
|
|
|
+ var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);
|
|
|
|
|
+ if(numminutes){
|
|
|
|
|
+ return numminutes + 'm';
|
|
|
|
|
+ }
|
|
|
|
|
+ var numseconds = (((seconds % 31536000) % 86400) % 3600) % 60;
|
|
|
|
|
+ if(numseconds){
|
|
|
|
|
+ return numseconds + 's';
|
|
|
|
|
+ }
|
|
|
|
|
+ return 'less then a second'; //'just now' //or other string you like;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function local_date_obj(d) {
|
|
|
|
|
- return new Date(Date.UTC(
|
|
|
|
|
- d.getFullYear(), d.getMonth(), d.getDate(),
|
|
|
|
|
- d.getHours(), d.getMinutes(), d.getSeconds()));
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.to_percent = function(number,outof) {
|
|
|
|
|
+ return Math.round((number/outof)*10000)/100 + "%";
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function is_int(value) {
|
|
|
|
|
- if ((parseFloat(value) == parseInt(value)) && !isNaN(value)) {
|
|
|
|
|
- return true;
|
|
|
|
|
- } else {
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ kbn.addslashes = function(str) {
|
|
|
|
|
+ str = str.replace(/\\/g, '\\\\');
|
|
|
|
|
+ str = str.replace(/\'/g, '\\\'');
|
|
|
|
|
+ str = str.replace(/\"/g, '\\"');
|
|
|
|
|
+ str = str.replace(/\0/g, '\\0');
|
|
|
|
|
+ return str;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-function interval_to_seconds(string) {
|
|
|
|
|
- var matches = string.match(/(\d+)([Mwdhmsy])/);
|
|
|
|
|
- switch (matches[2]) {
|
|
|
|
|
- case 'y': return matches[1]*31536000;;
|
|
|
|
|
- case 'M': return matches[1]*2592000;;
|
|
|
|
|
- case 'w': return matches[1]*604800;;
|
|
|
|
|
- case 'd': return matches[1]*86400;;
|
|
|
|
|
- case 'h': return matches[1]*3600;;
|
|
|
|
|
- case 'm': return matches[1]*60;;
|
|
|
|
|
- case 's': return matches[1];
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // histogram & trends
|
|
|
|
|
+ kbn.interval_to_seconds = function(string) {
|
|
|
|
|
+ var matches = string.match(/(\d+)([Mwdhmsy])/);
|
|
|
|
|
+ switch (matches[2]) {
|
|
|
|
|
+ case 'y': return matches[1]*31536000;;
|
|
|
|
|
+ case 'M': return matches[1]*2592000;;
|
|
|
|
|
+ case 'w': return matches[1]*604800;;
|
|
|
|
|
+ case 'd': return matches[1]*86400;;
|
|
|
|
|
+ case 'h': return matches[1]*3600;;
|
|
|
|
|
+ case 'm': return matches[1]*60;;
|
|
|
|
|
+ case 's': return matches[1];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function time_ago(string) {
|
|
|
|
|
- return new Date(new Date().getTime() - (interval_to_seconds(string)*1000))
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // This should go away, moment.js can do this
|
|
|
|
|
+ kbn.time_ago = function(string) {
|
|
|
|
|
+ return new Date(new Date().getTime() - (kbn.interval_to_seconds(string)*1000))
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-function flatten_json(object,root,array) {
|
|
|
|
|
- if (typeof array === 'undefined')
|
|
|
|
|
- var array = {};
|
|
|
|
|
- if (typeof root === 'undefined')
|
|
|
|
|
- var root = '';
|
|
|
|
|
- for(var index in object) {
|
|
|
|
|
- var obj = object[index]
|
|
|
|
|
- var rootname = root.length == 0 ? index : root + '.' + index;
|
|
|
|
|
- if(typeof obj == 'object' ) {
|
|
|
|
|
- if(_.isArray(obj)) {
|
|
|
|
|
- if(obj.length > 0 && typeof obj[0] === 'object') {
|
|
|
|
|
- var strval = '';
|
|
|
|
|
- for (var objidx = 0, objlen = obj.length; objidx < objlen; objidx++) {
|
|
|
|
|
- if (objidx > 0) {
|
|
|
|
|
- strval = strval + ', ';
|
|
|
|
|
|
|
+ // LOL. hahahahaha. DIE.
|
|
|
|
|
+ kbn.flatten_json = function(object,root,array) {
|
|
|
|
|
+ if (typeof array === 'undefined')
|
|
|
|
|
+ var array = {};
|
|
|
|
|
+ if (typeof root === 'undefined')
|
|
|
|
|
+ var root = '';
|
|
|
|
|
+ for(var index in object) {
|
|
|
|
|
+ var obj = object[index]
|
|
|
|
|
+ var rootname = root.length == 0 ? index : root + '.' + index;
|
|
|
|
|
+ if(typeof obj == 'object' ) {
|
|
|
|
|
+ if(_.isArray(obj)) {
|
|
|
|
|
+ if(obj.length > 0 && typeof obj[0] === 'object') {
|
|
|
|
|
+ var strval = '';
|
|
|
|
|
+ for (var objidx = 0, objlen = obj.length; objidx < objlen; objidx++) {
|
|
|
|
|
+ if (objidx > 0) {
|
|
|
|
|
+ strval = strval + ', ';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ strval = strval + JSON.stringify(obj[objidx]);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- strval = strval + JSON.stringify(obj[objidx]);
|
|
|
|
|
|
|
+ array[rootname] = strval;
|
|
|
|
|
+ } else if(obj.length === 1 && _.isNumber(obj[0])) {
|
|
|
|
|
+ array[rootname] = parseFloat(obj[0]);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ array[rootname] = typeof obj === 'undefined' ? null : obj;
|
|
|
}
|
|
}
|
|
|
- array[rootname] = strval;
|
|
|
|
|
- } else if(obj.length === 1 && _.isNumber(obj[0])) {
|
|
|
|
|
- array[rootname] = parseFloat(obj[0]);
|
|
|
|
|
} else {
|
|
} else {
|
|
|
- array[rootname] = typeof obj === 'undefined' ? null : obj;
|
|
|
|
|
|
|
+ kbn.flatten_json(obj,rootname,array)
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
- flatten_json(obj,rootname,array)
|
|
|
|
|
|
|
+ array[rootname] = typeof obj === 'undefined' ? null : obj;
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- array[rootname] = typeof obj === 'undefined' ? null : obj;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ return kbn.sortObj(array);
|
|
|
}
|
|
}
|
|
|
- return sortObj(array);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function xmlEnt(value) {
|
|
|
|
|
- if(_.isString(value)) {
|
|
|
|
|
- var stg1 = value.replace(/</g, '<')
|
|
|
|
|
- .replace(/>/g, '>')
|
|
|
|
|
- .replace(/\r\n/g, '<br/>')
|
|
|
|
|
- .replace(/\r/g, '<br/>')
|
|
|
|
|
- .replace(/\n/g, '<br/>')
|
|
|
|
|
- .replace(/\t/g, ' ')
|
|
|
|
|
- .replace(/ /g, ' ')
|
|
|
|
|
- .replace(/<del>/g, '<del>')
|
|
|
|
|
- .replace(/<\/del>/g, '</del>');
|
|
|
|
|
- return stg1
|
|
|
|
|
- } else {
|
|
|
|
|
- return value
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function sortObj(arr) {
|
|
|
|
|
- // Setup Arrays
|
|
|
|
|
- var sortedKeys = new Array();
|
|
|
|
|
- var sortedObj = {};
|
|
|
|
|
-
|
|
|
|
|
- // Separate keys and sort them
|
|
|
|
|
- for (var i in arr) {
|
|
|
|
|
- sortedKeys.push(i);
|
|
|
|
|
- }
|
|
|
|
|
- sortedKeys.sort();
|
|
|
|
|
|
|
|
|
|
- // Reconstruct sorted obj based on keys
|
|
|
|
|
- for (var i in sortedKeys) {
|
|
|
|
|
- sortedObj[sortedKeys[i]] = arr[sortedKeys[i]];
|
|
|
|
|
- }
|
|
|
|
|
- return sortedObj;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// WTF. Has to be a better way to do this. Hi Tyler.
|
|
|
|
|
-function int_to_tz(offset) {
|
|
|
|
|
- var hour = offset / 1000 / 3600
|
|
|
|
|
- var str = ""
|
|
|
|
|
- if (hour == 0) {
|
|
|
|
|
- str = "+0000"
|
|
|
|
|
- }
|
|
|
|
|
- if (hour < 0) {
|
|
|
|
|
- if (hour > -10)
|
|
|
|
|
- str = "-0" + (hour * -100)
|
|
|
|
|
- else
|
|
|
|
|
- str = "-" + (hour * -100)
|
|
|
|
|
- }
|
|
|
|
|
- if (hour > 0) {
|
|
|
|
|
- if (hour < 10)
|
|
|
|
|
- str = "+0" + (hour * 100)
|
|
|
|
|
- else
|
|
|
|
|
- str = "+" + (hour * 100)
|
|
|
|
|
|
|
+ kbn.xmlEnt = function(value) {
|
|
|
|
|
+ if(_.isString(value)) {
|
|
|
|
|
+ var stg1 = value.replace(/</g, '<')
|
|
|
|
|
+ .replace(/>/g, '>')
|
|
|
|
|
+ .replace(/\r\n/g, '<br/>')
|
|
|
|
|
+ .replace(/\r/g, '<br/>')
|
|
|
|
|
+ .replace(/\n/g, '<br/>')
|
|
|
|
|
+ .replace(/\t/g, ' ')
|
|
|
|
|
+ .replace(/ /g, ' ')
|
|
|
|
|
+ .replace(/<del>/g, '<del>')
|
|
|
|
|
+ .replace(/<\/del>/g, '</del>');
|
|
|
|
|
+ return stg1;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return value;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- str = str.substring(0,3) + ":" + str.substring(3);
|
|
|
|
|
- return str
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// Sets #hash, thus refreshing results
|
|
|
|
|
-function setHash(json) {
|
|
|
|
|
- window.location.hash = encodeURIComponent(Base64.encode(JSON.stringify(json)));
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ kbn.sortObj = function(arr) {
|
|
|
|
|
+ // Setup Arrays
|
|
|
|
|
+ var sortedKeys = new Array();
|
|
|
|
|
+ var sortedObj = {};
|
|
|
|
|
|
|
|
-// Add commas to numbers
|
|
|
|
|
-function addCommas(nStr) {
|
|
|
|
|
- nStr += '';
|
|
|
|
|
- var x = nStr.split('.');
|
|
|
|
|
- var x1 = x[0];
|
|
|
|
|
- var x2 = x.length > 1 ? '.' + x[1] : '';
|
|
|
|
|
- var rgx = /(\d+)(\d{3})/;
|
|
|
|
|
- while (rgx.test(x1)) {
|
|
|
|
|
- x1 = x1.replace(rgx, '$1' + ',' + '$2');
|
|
|
|
|
- }
|
|
|
|
|
- return x1 + x2;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Split up log spaceless strings
|
|
|
|
|
-// Str = string to split
|
|
|
|
|
-// num = number of letters between <wbr> tags
|
|
|
|
|
-function wbr(str, num) {
|
|
|
|
|
- str = htmlEntities(str);
|
|
|
|
|
- return str.replace(
|
|
|
|
|
- RegExp("(@?\\w{" + num + "}|[:;,])([\\w\"'])([\\w@]*)", "g"),
|
|
|
|
|
- function (all, text, char, trailer) {
|
|
|
|
|
- if (/@KIBANA_\w+_(START|END)@/.test(all)) {
|
|
|
|
|
- return text + char + trailer;
|
|
|
|
|
- } else {
|
|
|
|
|
- return text + "<del>​</del>" + char + trailer;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Separate keys and sort them
|
|
|
|
|
+ for (var i in arr) {
|
|
|
|
|
+ sortedKeys.push(i);
|
|
|
}
|
|
}
|
|
|
- );
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ sortedKeys.sort();
|
|
|
|
|
|
|
|
-function htmlEntities(str) {
|
|
|
|
|
- return String(str).replace(
|
|
|
|
|
- /&/g, '&').replace(
|
|
|
|
|
- /</g, '<').replace(
|
|
|
|
|
- />/g, '>').replace(
|
|
|
|
|
- /"/g, '"');
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function bucket_round(start,num,dir) {
|
|
|
|
|
- var resto = start%num;
|
|
|
|
|
- if (resto <= (num/2) || dir === 'down') {
|
|
|
|
|
- // Down
|
|
|
|
|
- return start-resto;
|
|
|
|
|
- } else {
|
|
|
|
|
- // Up
|
|
|
|
|
- return start+num-resto;
|
|
|
|
|
|
|
+ // Reconstruct sorted obj based on keys
|
|
|
|
|
+ for (var i in sortedKeys) {
|
|
|
|
|
+ sortedObj[sortedKeys[i]] = arr[sortedKeys[i]];
|
|
|
|
|
+ }
|
|
|
|
|
+ return sortedObj;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}).call(this);
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ UNDERSCORE.js Mixins
|
|
|
|
|
+*/
|
|
|
|
|
|
|
|
_.mixin({
|
|
_.mixin({
|
|
|
move: function (array, fromIndex, toIndex) {
|
|
move: function (array, fromIndex, toIndex) {
|