.../apache/hadoop/yarn/webapp/view/JQueryUI.java | 21 +++-- .../static/dt-plugin-1.10.7/sorting/natural.js | 94 ++++++++++++++++++++++ .../webapp/AppAttemptPage.java | 2 +- .../applicationhistoryservice/webapp/AppPage.java | 2 +- .../hadoop/yarn/server/webapp/WebPageUtils.java | 6 +- .../nodemanager/webapp/AllApplicationsPage.java | 8 +- .../nodemanager/webapp/AllContainersPage.java | 8 +- 7 files changed, 123 insertions(+), 18 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java index 9abfdac..81786f4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java @@ -65,14 +65,14 @@ @Override protected void render(Block html) { - html. - link(root_url("static/jquery/themes-1.9.1/base/jquery-ui.css")). - link(root_url("static/dt-1.9.4/css/jui-dt.css")). - script(root_url("static/jquery/jquery-1.8.2.min.js")). - script(root_url("static/jquery/jquery-ui-1.9.1.custom.min.js")). - script(root_url("static/dt-1.9.4/js/jquery.dataTables.min.js")). - script(root_url("static/yarn.dt.plugins.js")). - style("#jsnotice { padding: 0.2em; text-align: center; }", + html.link(root_url("static/jquery/themes-1.9.1/base/jquery-ui.css")) + .link(root_url("static/dt-1.9.4/css/jui-dt.css")) + .script(root_url("static/jquery/jquery-1.8.2.min.js")) + .script(root_url("static/jquery/jquery-ui-1.9.1.custom.min.js")) + .script(root_url("static/dt-1.9.4/js/jquery.dataTables.min.js")) + .script(root_url("static/yarn.dt.plugins.js")) + .script(root_url("static/dt-plugin-1.10.7/sorting/natural.js")) + .style("#jsnotice { padding: 0.2em; text-align: center; }", ".ui-progressbar { height: 1em; min-width: 5em }"); // required List list = Lists.newArrayList(); @@ -82,9 +82,8 @@ protected void render(Block html) { initProgressBars(list); if (!list.isEmpty()) { - html. - script().$type("text/javascript"). - _("$(function() {")._(list.toArray())._("});")._(); + html.script().$type("text/javascript")._("$(function() {") + ._(list.toArray())._("});")._(); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js new file mode 100644 index 0000000..9a05956 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js @@ -0,0 +1,94 @@ +/** + * Data can often be a complicated mix of numbers and letters (file names are a + * common example) and sorting them in a natural manner is quite a difficult + * problem. + * + * Fortunately a deal of work has already been done in this area by other + * authors - the following plug-in uses the [naturalSort() function by Jim + * Palmer](http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support) + * to provide natural sorting in DataTables. + * + * @name Natural sorting + * @summary Sort data with a mix of numbers and letters _naturally_. + * @author [Jim + * Palmer](http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support) + * + * @example $('#example').dataTable( { columnDefs: [ { type: 'natural', targets: + * 0 } ] } ); + */ + +(function() { + + /* + * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT + * license Author: Jim Palmer (based on chunking idea from Dave Koelle) + * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo + * See: http://js-naturalsort.googlecode.com/svn/trunk/naturalSort.js + */ + function naturalSort(a, b) { + var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, + sre = /(^[ ]*|[ ]*$)/g, + dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, + hre = /^0x[0-9a-f]+$/i, + ore = /^0/, + // convert all to strings and trim() + x = a.toString().replace(sre, '') || '', y = b.toString().replace(sre, '') + || '', + // chunk/tokenize + xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split( + '\0'), yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, + '').split('\0'), + // numeric, hex or date detection + xD = parseInt(x.match(hre), 10) + || (xN.length !== 1 && x.match(dre) && Date.parse(x)), yD = parseInt(y + .match(hre), 10) + || xD && y.match(dre) && Date.parse(y) || null; + + // first try and sort Hex codes or Dates + if (yD) { + if (xD < yD) { + return -1; + } else if (xD > yD) { + return 1; + } + } + + // natural sorting through split numeric strings and default strings + for ( var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { + // find floats not starting with '0', string or 0 if not defined (Clint + // Priest) + var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc], 10) + || xN[cLoc] || 0; + var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc], 10) + || yN[cLoc] || 0; + // handle numeric vs string comparison - number < string - (Kyle Adams) + if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { + return (isNaN(oFxNcL)) ? 1 : -1; + } + // rely on string comparison if different types - i.e. '02' < 2 != '02' < + // '2' + else if (typeof oFxNcL !== typeof oFyNcL) { + oFxNcL += ''; + oFyNcL += ''; + } + if (oFxNcL < oFyNcL) { + return -1; + } + if (oFxNcL > oFyNcL) { + return 1; + } + } + return 0; + } + + jQuery.extend(jQuery.fn.dataTableExt.oSort, { + "natural-asc" : function(a, b) { + return naturalSort(a, b); + }, + + "natural-desc" : function(a, b) { + return naturalSort(a, b) * -1; + } + }); + +}()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java index c7fe318..a08297d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java @@ -53,7 +53,7 @@ protected void preHead(Page.HTML<_> html) { protected String getContainersTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }]").toString(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java index 50dcd96..c0e1394 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java @@ -55,7 +55,7 @@ protected void preHead(Page.HTML<_> html) { protected String getAttemptsTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [1]") diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java index df63b77..b030abc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java @@ -49,7 +49,7 @@ private static String getAppsTableColumnDefs( boolean isFairSchedulerPage, boolean isResourceManager) { StringBuilder sb = new StringBuilder(); sb.append("[\n") - .append("{'sType':'string', 'aTargets': [0]") + .append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': " + (isFairSchedulerPage ? "[6, 7]": "[5, 6]")) @@ -76,7 +76,7 @@ public static String attemptsTableInit() { private static String getAttemptsTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [1]") .append(", 'mRender': renderHadoopDate }]").toString(); @@ -92,7 +92,7 @@ public static String containersTableInit() { private static String getContainersTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }]").toString(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java index 9a22743..4380566 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java @@ -54,7 +54,13 @@ private String appsTableInit() { // Sort by id upon page load append(", aaSorting: [[0, 'asc']]"). // applicationid, applicationstate - append(", aoColumns:[null, null]} ").toString(); + append(", aoColumns:[").append(getApplicationsIdColumnDefs()).append(", null]} ").toString(); + } + + private String getApplicationsIdColumnDefs() { + StringBuilder sb = new StringBuilder(); + return sb.append("{'sType':'natural', 'aTargets': [0]") + .append(", 'mRender': parseHadoopID }").toString(); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java index 1bbb945..24b8575 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java @@ -52,9 +52,15 @@ private String containersTableInit() { return tableInit(). // containerid, containerid, log-url - append(", aoColumns:[null, null, {bSearchable:false}]} ").toString(); + append(", aoColumns:[").append(getContainersIdColumnDefs()) + .append(", null, {bSearchable:false}]} ").toString(); } + private String getContainersIdColumnDefs() { + StringBuilder sb = new StringBuilder(); + return sb.append("{'sType':'natural', 'aTargets': [0]") + .append(", 'mRender': parseHadoopID }").toString(); + } @Override protected Class content() { return AllContainersBlock.class;