diff --git a/src/main/java/com/metaweb/gridworks/GridworksServlet.java b/src/main/java/com/metaweb/gridworks/GridworksServlet.java index b603650d9..31f05eeb0 100644 --- a/src/main/java/com/metaweb/gridworks/GridworksServlet.java +++ b/src/main/java/com/metaweb/gridworks/GridworksServlet.java @@ -38,6 +38,7 @@ import com.metaweb.gridworks.commands.info.GetAllProjectMetadataCommand; import com.metaweb.gridworks.commands.info.GetExpressionHistoryCommand; import com.metaweb.gridworks.commands.info.GetHistoryCommand; import com.metaweb.gridworks.commands.info.GetModelsCommand; +import com.metaweb.gridworks.commands.info.GetColumnsInfoCommand; import com.metaweb.gridworks.commands.info.GetOperationsCommand; import com.metaweb.gridworks.commands.info.GetProcessesCommand; import com.metaweb.gridworks.commands.info.GetProjectMetadataCommand; @@ -83,6 +84,7 @@ public class GridworksServlet extends HttpServlet { _commands.put("get-processes", new GetProcessesCommand()); _commands.put("get-history", new GetHistoryCommand()); _commands.put("get-operations", new GetOperationsCommand()); + _commands.put("get-columns-info", new GetColumnsInfoCommand()); _commands.put("get-scatterplot", new GetScatterplotCommand()); _commands.put("undo-redo", new UndoRedoCommand()); diff --git a/src/main/java/com/metaweb/gridworks/browsing/charting/ScatterplotCharter.java b/src/main/java/com/metaweb/gridworks/browsing/charting/ScatterplotCharter.java index 884c60e12..7c35bd175 100644 --- a/src/main/java/com/metaweb/gridworks/browsing/charting/ScatterplotCharter.java +++ b/src/main/java/com/metaweb/gridworks/browsing/charting/ScatterplotCharter.java @@ -32,13 +32,13 @@ public class ScatterplotCharter { private static final int LIN = 0; private static final int LOG = 1; - private static final int RADIAL = 2; + private static final int POLAR = 2; private static int getAxisDim(String type) { if ("log".equals(type)) { return LOG; - } else if ("rad".equals(type) || "radial".equals(type)) { - return RADIAL; + } else if ("pol".equals(type) || "polar".equals(type)) { + return POLAR; } else { return LIN; } @@ -108,17 +108,17 @@ public class ScatterplotCharter { max_y = index_y.getMax(); } - width = (o.has("w")) ? o.getInt("w") : 20; - height = (o.has("h")) ? o.getInt("h") : 20; - - dot = (o.has("dot")) ? o.getDouble("dot") : 0.1d; + width = (o.has("w")) ? o.getInt("w") : 50; + height = (o.has("h")) ? o.getInt("h") : 50; + dot = (o.has("dot")) ? o.getDouble("dot") : 0.2d; + dim = (o.has("dim")) ? getAxisDim(o.getString("dim")) : LIN; delta_x = max_x - min_x; delta_y = max_y - min_y; - if (dim == RADIAL) { + if (dim == POLAR) { rx = (o.has("rx")) ? o.getDouble("rx") : 0.0d; ry = (o.has("ry")) ? o.getDouble("ry") : 0.0d; } else if (dim == LOG) { @@ -181,7 +181,7 @@ public class ScatterplotCharter { if (dim == LOG) { x = Math.log10(xv - min_x) * w / log_delta_x - dot / 2; y = Math.log10(yv - min_y) * h / log_delta_y - dot / 2; - } else if (dim == RADIAL) { + } else if (dim == POLAR) { x = (xv - min_x) * w / delta_x - dot / 2; y = (yv - min_y) * h / delta_y - dot / 2; } else { diff --git a/src/main/java/com/metaweb/gridworks/commands/info/GetAllProjectMetadataCommand.java b/src/main/java/com/metaweb/gridworks/commands/info/GetAllProjectMetadataCommand.java index 4550c7ffa..67336ec9e 100644 --- a/src/main/java/com/metaweb/gridworks/commands/info/GetAllProjectMetadataCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/info/GetAllProjectMetadataCommand.java @@ -29,7 +29,6 @@ public class GetAllProjectMetadataCommand extends Command { Properties options = new Properties(); writer.object(); - writer.key("projects"); writer.object(); Map m = ProjectManager.singleton.getAllProjectMetadata(); @@ -41,7 +40,6 @@ public class GetAllProjectMetadataCommand extends Command { } } writer.endObject(); - writer.endObject(); } catch (JSONException e) { respondException(response, e); diff --git a/src/main/java/com/metaweb/gridworks/commands/info/GetColumnsInfoCommand.java b/src/main/java/com/metaweb/gridworks/commands/info/GetColumnsInfoCommand.java new file mode 100644 index 000000000..9b8df22c1 --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/commands/info/GetColumnsInfoCommand.java @@ -0,0 +1,97 @@ +package com.metaweb.gridworks.commands.info; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.metaweb.gridworks.browsing.facets.NumericBinIndex; +import com.metaweb.gridworks.commands.Command; +import com.metaweb.gridworks.expr.Evaluable; +import com.metaweb.gridworks.expr.MetaParser; +import com.metaweb.gridworks.expr.ParsingException; +import com.metaweb.gridworks.model.Column; +import com.metaweb.gridworks.model.Project; + +public class GetColumnsInfoCommand extends Command { + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + try { + //long start = System.currentTimeMillis(); + + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Type", "application/json"); + + Project project = getProject(request); + //Engine engine = getEngine(request, project); + + JSONWriter writer = new JSONWriter(response.getWriter()); + + writer.array(); + for (Column column : project.columnModel.columns) { + writer.object(); + write(project, column, writer); + writer.endObject(); + } + writer.endArray(); + + //Gridworks.log("Obtained columns info in " + (System.currentTimeMillis() - start) + "ms"); + } catch (Exception e) { + e.printStackTrace(); + respondException(response, e); + } + } + + private NumericBinIndex getBinIndex(Project project, Column column) { + String expression = "value"; + String key = "numeric-bin:" + expression; + Evaluable eval = null; + try { + eval = MetaParser.parse(expression); + } catch (ParsingException e) { + // this should never happen + } + NumericBinIndex index = (NumericBinIndex) column.getPrecompute(key); + if (index == null) { + index = new NumericBinIndex(project, column.getName(), column.getCellIndex(), eval); + column.setPrecompute(key, index); + } + return index; + } + + private void write(Project project, Column column, JSONWriter writer) throws JSONException { + NumericBinIndex columnIndex = getBinIndex(project, column); + if (columnIndex != null) { + writer.key("name"); + writer.value(column.getName()); + boolean is_numeric = columnIndex.isNumeric(); + writer.key("is_numeric"); + writer.value(is_numeric); + writer.key("numeric_row_count"); + writer.value(columnIndex.getNumericRowCount()); + writer.key("non_numeric_row_count"); + writer.value(columnIndex.getNonNumericRowCount()); + writer.key("error_row_count"); + writer.value(columnIndex.getErrorRowCount()); + writer.key("blank_row_count"); + writer.value(columnIndex.getBlankRowCount()); + if (is_numeric) { + writer.key("min"); + writer.value(columnIndex.getMin()); + writer.key("max"); + writer.value(columnIndex.getMax()); + writer.key("step"); + writer.value(columnIndex.getStep()); + } + } else { + writer.key("error"); + writer.value("error finding numeric information on the '" + column.getName() + "' column"); + } + } +} diff --git a/src/main/java/com/metaweb/gridworks/commands/info/GetScatterplotCommand.java b/src/main/java/com/metaweb/gridworks/commands/info/GetScatterplotCommand.java index 1cd0e0d4b..8063dfb99 100644 --- a/src/main/java/com/metaweb/gridworks/commands/info/GetScatterplotCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/info/GetScatterplotCommand.java @@ -23,6 +23,7 @@ public class GetScatterplotCommand extends Command { try { //long start = System.currentTimeMillis(); + Project project = getProject(request); Engine engine = getEngine(request, project); JSONObject conf = getJsonParameter(request,"plotter"); @@ -38,7 +39,7 @@ public class GetScatterplotCommand extends Command { sos.close(); } - //Gridworks.log("drawn scatterplot in " + (System.currentTimeMillis() - start) + "ms"); + //Gridworks.log("Drawn scatterplot in " + (System.currentTimeMillis() - start) + "ms"); } catch (Exception e) { e.printStackTrace(); respondException(response, e); diff --git a/src/main/webapp/scripts/dialogs/scatterplot-dialog.js b/src/main/webapp/scripts/dialogs/scatterplot-dialog.js index 31760c5bc..17d43cc16 100644 --- a/src/main/webapp/scripts/dialogs/scatterplot-dialog.js +++ b/src/main/webapp/scripts/dialogs/scatterplot-dialog.js @@ -1,8 +1,6 @@ function ScatterplotDialog(column) { this._column = column; this._plot_method = "lin"; - this._plot_size = Math.max(Math.floor("500" / theProject.columnModel.columns.length / 5) * 5,"20"); - this._dot_size = 0.3; this._createDialog(); } @@ -30,8 +28,8 @@ ScatterplotDialog.prototype._createDialog = function() { '' + '' + '' + - 'Plot Size: px' + - 'Dot Size: px' + + 'Plot Size: px' + + 'Dot Size: px' + '' + '' + '' + @@ -84,78 +82,100 @@ ScatterplotDialog.prototype._createDialog = function() { ScatterplotDialog.prototype._renderMatrix = function() { var self = this; - var columns = theProject.columnModel.columns; var container = this._elmts.tableContainer.html( - '
Processing...
' + '
Processing...
' ); - if (columns.length > 0) { - var table = ''; - - var createScatterplot = function(cx, cy) { - var title = cx + ' (x) vs. ' + cy + ' (y)'; - var link = ''; - var plotter_params = { - 'cx' : cx, - 'cy' : cy, - 'w' : self._plot_size * 3, - 'h' : self._plot_size * 3, - 'dot': self._dot_size, - 'dim': self._plot_method - }; - var params = { - project: theProject.id, - engine: JSON.stringify(ui.browsingEngine.getJSON()), - plotter: JSON.stringify(plotter_params) - }; - var url = "/command/get-scatterplot?" + $.param(params); - return link + ''; + if (theProject.columnModel.columns.length > 0) { + var params = { + project: theProject.id }; - - for (var i = 0; i < columns.length; i++) { - table += ''; - var div_class = "column_header"; - if (columns[i].name == this._column) div_class += " current_column"; - table += '' - for (var j = i + 1; j < columns.length; j++) { - var cx = columns[i].name; - var cy = columns[j].name; + $.getJSON("/command/get-columns-info?" + $.param(params),function(data) { + if (data == null || typeof data.length == 'undefined') { + container.html("Error calling 'get-columns-info'"); + return; + } - var div_class = "scatterplot"; - if (cx == this._column || cy == this._column) div_class += " current_column"; - table += ''; + var columns = []; + for (var i = 0; i < data.length; i++) { + if (data[i].is_numeric) { + columns.push(data[i]); + } } - table += ''; - } - - table += "
' + columns[i].name + '
' + createScatterplot(cx,cy) + '
"; - - var width = container.width(); - container.empty().css("width", width + "px").append($(table)); - - container.find("a").click(function() { - var options = { - "name" : $(this).attr("title"), - "x_columnName" : $(this).attr("cx"), - "y_columnName" : $(this).attr("cy"), - "x_expression" : "value", - "y_expression" : "value", - "dot" : self._dot_size, - "dim" : self._plot_method + + if (typeof self._plot_size == 'undefined') { + self._plot_size = Math.max(Math.floor(500 / columns.length / 5) * 5,20); + self._dot_size = 0.4; + self._elmts.plotSize.val(self._plot_size); + self._elmts.dotSize.val(self._dot_size); + } + + var table = ''; + + var createScatterplot = function(cx, cy) { + var title = cx + ' (x) vs. ' + cy + ' (y)'; + var link = ''; + var plotter_params = { + 'cx' : cx, + 'cy' : cy, + 'w' : self._plot_size * 3, + 'h' : self._plot_size * 3, + 'dot': self._dot_size, + 'dim': self._plot_method + }; + var params = { + project: theProject.id, + engine: JSON.stringify(ui.browsingEngine.getJSON()), + plotter: JSON.stringify(plotter_params) + }; + var url = "/command/get-scatterplot?" + $.param(params); + return link + ''; }; - console.log(options); - ui.browsingEngine.addFacet("scatterplot", options); - //self._dismiss(); - }); - container.find(".scatterplot").hover( - function() { - $(this).find('img').addClass("hover"); - } , function() { - $(this).find('img').removeClass("hover"); + for (var i = 0; i < columns.length; i++) { + table += ''; + var div_class = "column_header"; + if (columns[i].name == self._column) div_class += " current_column"; + table += '' + for (var j = i + 1; j < columns.length; j++) { + var cx = columns[i].name; + var cy = columns[j].name; + + var div_class = "scatterplot"; + if (cx == self._column || cy == self._column) div_class += " current_column"; + table += ''; + } + table += ''; } - ); + + table += "
' + columns[i].name + '
' + createScatterplot(cx,cy) + '
"; + + var width = container.width(); + container.empty().css("width", width + "px").append($(table)); + + container.find("a").click(function() { + var options = { + "name" : $(this).attr("title"), + "x_columnName" : $(this).attr("cx"), + "y_columnName" : $(this).attr("cy"), + "x_expression" : "value", + "y_expression" : "value", + "dot" : self._dot_size, + "dim" : self._plot_method + }; + ui.browsingEngine.addFacet("scatterplot", options); + //self._dismiss(); + }); + + container.find(".scatterplot").hover( + function() { + $(this).find('img').addClass("hover"); + } , function() { + $(this).find('img').removeClass("hover"); + } + ); + }); } else { container.html( '
There are no columns in this dataset
' diff --git a/src/main/webapp/scripts/widgets/scatterplot-widget.js b/src/main/webapp/scripts/widgets/scatterplot-widget.js index edc38c6e6..f4cd071b4 100644 --- a/src/main/webapp/scripts/widgets/scatterplot-widget.js +++ b/src/main/webapp/scripts/widgets/scatterplot-widget.js @@ -97,12 +97,10 @@ ScatterplotWidget.prototype._render = function() { ctx.restore(); } - self._plotter.dot = "0.4"; self._plotter.color = "000088"; img2.src = self._get_image_url(self._plotter); } } - self._plotter.dot = "0.4"; self._plotter.color = "000000"; img.src = self._get_image_url(self._plotter); };