diff --git a/main/webapp/modules/core/scripts/dialogs/clustering-dialog.html b/main/webapp/modules/core/scripts/dialogs/clustering-dialog.html index 3e23fbf43..e1bbc83f6 100644 --- a/main/webapp/modules/core/scripts/dialogs/clustering-dialog.html +++ b/main/webapp/modules/core/scripts/dialogs/clustering-dialog.html @@ -18,25 +18,25 @@
+ + @@ -54,7 +54,7 @@ - + diff --git a/main/webapp/modules/core/scripts/dialogs/clustering-dialog.js b/main/webapp/modules/core/scripts/dialogs/clustering-dialog.js index 4b3951f81..5f08a4793 100644 --- a/main/webapp/modules/core/scripts/dialogs/clustering-dialog.js +++ b/main/webapp/modules/core/scripts/dialogs/clustering-dialog.js @@ -23,8 +23,8 @@ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @@ -37,9 +37,9 @@ function ClusteringDialog(columnName, expression) { this._method = "binning"; this._function = "fingerprint"; this._params = {}; - + this._facets = []; - + this._createDialog(); this._cluster(); } @@ -50,7 +50,7 @@ ClusteringDialog.prototype._createDialog = function() { this._elmts = DOM.bind(dialog); this._elmts.dialogHeader.text($.i18n._('core-dialogs')["cluster-edit"]+' "' + this._columnName + '"'); - + this._elmts.or_dialog_descr.html($.i18n._('core-dialogs')["cluster-descr"]); this._elmts.or_dialog_findMore.html($.i18n._('core-dialogs')["find-more"]); this._elmts.or_dialog_method.html($.i18n._('core-dialogs')["method"]); @@ -66,13 +66,13 @@ ClusteringDialog.prototype._createDialog = function() { this._elmts.or_dialog_ppm.html($.i18n._('core-dialogs')["ppm"]); this._elmts.or_dialog_ngramSize.html($.i18n._('core-dialogs')["ngram-size"]); this._elmts.or_dialog_radius.html($.i18n._('core-dialogs')["ngram-radius"]); - this._elmts.or_dialog_blockChars.html($.i18n._('core-dialogs')["block-chars"]); + this._elmts.or_dialog_blockChars.html($.i18n._('core-dialogs')["block-chars"]); this._elmts.selectAllButton.html($.i18n._('core-buttons')["select-all"]); this._elmts.deselectAllButton.html($.i18n._('core-buttons')["unselect-all"]); this._elmts.applyReClusterButton.html($.i18n._('core-buttons')["merge-cluster"]); this._elmts.applyCloseButton.html($.i18n._('core-buttons')["merge-close"]); this._elmts.closeButton.html($.i18n._('core-buttons')["close"]); - + this._elmts.methodSelector.change(function() { var selection = $(this).find("option:selected").text(); if (selection == $.i18n._('core-dialogs')["key-collision"]) { @@ -87,55 +87,55 @@ ClusteringDialog.prototype._createDialog = function() { self._elmts.distanceFunctionSelector.change(); } }); - + var changer = function() { - self._function = $(this).find("option:selected").text(); + self._function = $(this).find("option:selected").val(); $(".function-params").hide(); $("#" + self._function + "-params").show(); params_changer(); }; - + this._elmts.keyingFunctionSelector.change(changer); this._elmts.distanceFunctionSelector.change(changer); - + var params_changer = function() { self._params = {}; $(".dialog-body input.param:visible").each(function() { var e = $(this); var name = e.attr('name'); var datatype = e.attr('datatype') || 'string'; - var value = e.val(); + var value = e.val(); if (datatype == 'int') { value = parseInt(value,10); } else if (datatype == 'float') { value = parseFloat(value); - } + } self._params[name] = value; }); self._cluster(); }; - + this._elmts.ngramSize.change(params_changer); this._elmts.radius.change(params_changer); this._elmts.ngramBlock.change(params_changer); - + this._elmts.selectAllButton.click(function() { self._selectAll(); }); this._elmts.deselectAllButton.click(function() { self._deselectAll(); }); this._elmts.applyReClusterButton.click(function() { self._onApplyReCluster(); }); this._elmts.applyCloseButton.click(function() { self._onApplyClose(); }); this._elmts.closeButton.click(function() { self._dismiss(); }); - + this._level = DialogSystem.showDialog(dialog); }; ClusteringDialog.prototype._renderTable = function(clusters) { var self = this; - + var container = this._elmts.tableContainer; - + if (clusters.length > 0) { var table = $('
').addClass("clustering-dialog-entry-table")[0]; - + var trHead = table.insertRow(table.rows.length); trHead.className = "header"; $(trHead.insertCell(0)).text($.i18n._('core-dialogs')["cluster-size"]); @@ -147,9 +147,9 @@ ClusteringDialog.prototype._renderTable = function(clusters) { var renderCluster = function(cluster) { var tr = table.insertRow(table.rows.length); tr.className = table.rows.length % 2 === 0 ? "odd" : "even"; - + $(tr.insertCell(0)).text(cluster.choices.length); - + $(tr.insertCell(1)).text(cluster.rowCount); var facet = { @@ -165,7 +165,7 @@ ClusteringDialog.prototype._renderTable = function(clusters) { "s":[ ] }; - + var ul = $(''); var choices = cluster.choices; var rowCount = 0; @@ -173,7 +173,7 @@ ClusteringDialog.prototype._renderTable = function(clusters) { var parent = $(this).closest("tr"); var value = $(this).text(); cluster.value = value; - + parent.find("input[type='text']").val(value); var checkbox = parent.find("input[type='checkbox']"); checkbox.prop('checked', true).change(); @@ -193,7 +193,7 @@ ClusteringDialog.prototype._renderTable = function(clusters) { }; li.appendTo(ul); } - + var params = [ "project=" + encodeURIComponent(theProject.id), "ui=" + encodeURIComponent(JSON.stringify({ @@ -203,7 +203,7 @@ ClusteringDialog.prototype._renderTable = function(clusters) { var url = "project?" + params.join("&"); var div = $('
').addClass("clustering-dialog-value-focus"); - + var browseLink = $(''+$.i18n._('core-dialogs')["browse-this-cluster"]+'') .addClass("clustering-dialog-browse-focus") .attr("href",url) @@ -215,7 +215,7 @@ ClusteringDialog.prototype._renderTable = function(clusters) { .mouseleave(function() { browseLink.css("visibility", "hidden"); }) .append(ul) .append(div); - + var editCheck = $('') .change(function() { cluster.edit = this.checked; @@ -224,26 +224,26 @@ ClusteringDialog.prototype._renderTable = function(clusters) { if (cluster.edit) { editCheck.attr("checked", "true"); } - + var input = $('') .attr("value", cluster.value) .bind("keyup change input",function() { cluster.value = this.value; }).appendTo(tr.insertCell(4)); }; - + for (var i = 0; i < clusters.length; i++) { renderCluster(clusters[i]); } - + container.empty().append(table); - + this._elmts.resultSummary.html( (clusters.length === this._clusters.length) ? ("" + this._clusters.length + " cluster" + ((this._clusters.length != 1) ? "s" : "") + " "+$.i18n._('core-dialogs')["found"]) : ("" + clusters.length + " cluster" + ((clusters.length != 1) ? "s" : "") + " "+$.i18n._('core-dialogs')["filtered-from"]+ this._clusters.length +$.i18n._('core-dialogs')["from-total"] ) ); - + } else { container.html( '
'+$.i18n._('core-dialogs')["no-cluster-found"]+'
'+$.i18n._('core-dialogs')["try-another-method"]+'
' @@ -253,23 +253,23 @@ ClusteringDialog.prototype._renderTable = function(clusters) { ClusteringDialog.prototype._cluster = function() { var self = this; - + var container = this._elmts.tableContainer.html( '
'+$.i18n._('core-dialogs')["clustering"]+'
' ); - + this._elmts.resultSummary.empty(); $.post( "command/core/compute-clusters?" + $.param({ project: theProject.id }), - { - engine: JSON.stringify(ui.browsingEngine.getJSON()), - clusterer: JSON.stringify({ - 'type' : this._method, + { + engine: JSON.stringify(ui.browsingEngine.getJSON()), + clusterer: JSON.stringify({ + 'type' : this._method, 'function' : this._function, 'column' : this._columnName, 'params' : this._params - }) + }) }, function(data) { self._updateData(data); @@ -287,26 +287,26 @@ ClusteringDialog.prototype._updateData = function(data) { value: this[0].v, size: this.length }; - + var sum = 0; var sumSquared = 0; var rowCount = 0; $.each(cluster.choices, function() { rowCount += this.c; - - var l = this.v.length; + + var l = this.v.length; sum += l; sumSquared += l * l; }); - + cluster.rowCount = rowCount; cluster.avg = sum / cluster.choices.length; cluster.variance = Math.sqrt(sumSquared / cluster.choices.length - cluster.avg * cluster.avg); - + clusters.push(cluster); }); this._clusters = clusters; - + this._resetFacets(); this._updateAll(); }; @@ -320,14 +320,14 @@ ClusteringDialog.prototype._deselectAll = function() { }; ClusteringDialog.prototype._onApplyClose = function() { - var self = this; + var self = this; this._apply(function() { self._dismiss(); }); }; ClusteringDialog.prototype._onApplyReCluster = function() { - var self = this; + var self = this; this._apply(function() { self._cluster(); }); @@ -343,14 +343,14 @@ ClusteringDialog.prototype._apply = function(onDone) { for (var j = 0; j < cluster.choices.length; j++) { values.push(cluster.choices[j].v); } - + edits.push({ from: values, to: cluster.value }); } } - + if (edits.length > 0) { Refine.postCoreProcess( "mass-edit", @@ -408,7 +408,7 @@ ClusteringDialog.prototype._resetFacets = function() { r.elmt.remove(); } this._facets = []; - + this._createFacet($.i18n._('core-dialogs')["choices-in-cluster"], "size"); this._createFacet($.i18n._('core-dialogs')["rows-in-cluster"], "rowCount"); this._createFacet($.i18n._('core-dialogs')["choice-avg-length"], "avg"); @@ -426,9 +426,9 @@ ClusteringDialog.prototype._createFacet = function(title, property) { ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { this._dialog = dialog; this._property = property; - + var self = this; - + var max = Number.NEGATIVE_INFINITY; var min = Number.POSITIVE_INFINITY; for (var i = 0; i < clusters.length; i++) { @@ -437,7 +437,7 @@ ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { max = Math.max(max, val); min = Math.min(min, val); } - + this._min = min; this._max = max; if (min >= max) { @@ -445,7 +445,7 @@ ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { this._baseBins = []; } else { var diff = max - min; - + this._step = 1; if (diff > 10) { while (this._step * 100 < diff) { @@ -456,7 +456,7 @@ ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { this._step /= 10; } } - + this._min = (Math.floor(this._min / this._step) * this._step); this._max = (Math.ceil(this._max / this._step) * this._step); this._binCount = 1 + Math.ceil((this._max - this._min) / this._step); @@ -469,10 +469,10 @@ ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { this._max = (Math.ceil(this._max / this._step) * this._step); } this._baseBins = this._computeDistribution(clusters); - + this._from = this._min; this._to = this._max; - + elmt.addClass("clustering-dialog-facet"); var html = $( '
' + title + '
' + @@ -481,12 +481,12 @@ ClusteringDialog.Facet = function(dialog, title, property, elmt, clusters) { '' + '
' ).appendTo(elmt); - + this._elmts = DOM.bind(html); - + this._histogram = new HistogramWidget(this._elmts.histogramContainer, { binColors: [ "#ccccff", "#6666ff" ] }); this._sliderWidget = new SliderWidget(this._elmts.sliderWidgetDiv); - + this._elmts.sliderWidgetDiv.bind("slide", function(evt, data) { self._from = data.from; self._to = data.to; @@ -509,7 +509,7 @@ ClusteringDialog.Facet.prototype.restrict = function(clusters) { if (!this._baseBins.length || (this._from == this._min && this._to == this._max)) { return clusters; } - + var clusters2 = []; for (var i = 0; i < clusters.length; i++) { var cluster = clusters[i]; @@ -525,20 +525,20 @@ ClusteringDialog.Facet.prototype.update = function(clusters) { if (!this._baseBins.length) { return; } - + var bins = this._computeDistribution(clusters); this._sliderWidget.update( - this._min, - this._max, - this._step, + this._min, + this._max, + this._step, this._from, this._to ); this._histogram.update( - this._min, - this._max, - this._step, + this._min, + this._max, + this._step, [ this._baseBins, bins ] ); }; @@ -552,13 +552,13 @@ ClusteringDialog.Facet.prototype._computeDistribution = function(clusters) { for (var b = 0; b < this._binCount; b++) { bins.push(0); } - + for (var i = 0; i < clusters.length; i++) { var cluster = clusters[i]; var val = cluster[this._property]; var bin = Math.round((val - this._min) / this._step); bins[bin]++; } - + return bins; };