From a125b3a0dd9a5abe8767f0a9e1237d584ccdbabb Mon Sep 17 00:00:00 2001 From: datagear Date: Sun, 5 Jan 2020 21:32:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=A1=B5=E6=B7=BB=E5=8A=A0=E5=88=97=E7=B1=BB=E5=88=AB=E9=9B=86?= =?UTF-8?q?=E3=80=81=E5=88=97=E6=A0=87=E7=AD=BE=E9=9B=86=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/datagear/analysis/ColumnMeta.java | 19 +++- .../org/datagear/analysis/DataCategory.java | 23 ++++ .../analysis/support/SqlDataSetFactory.java | 50 +++++--- .../support/SqlDataSetFactoryTest.java | 6 +- .../domain/SqlDataSetFactoryEntity.java | 92 ++++++++++++++- .../org/datagear/management/ddl/datagear.sql | 2 + .../mapper/SqlDataSetFactoryEntityMapper.xml | 14 ++- .../resources/locales/datagear.properties | 6 + .../view/analysis/dataSet/dataSet_form.ftl | 107 +++++++++++++++++- .../src/main/webapp/static/css/common.css | 3 +- 10 files changed, 294 insertions(+), 28 deletions(-) create mode 100644 datagear-analysis/src/main/java/org/datagear/analysis/DataCategory.java diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/ColumnMeta.java b/datagear-analysis/src/main/java/org/datagear/analysis/ColumnMeta.java index e6e5dfd7..e8dc2d66 100644 --- a/datagear-analysis/src/main/java/org/datagear/analysis/ColumnMeta.java +++ b/datagear-analysis/src/main/java/org/datagear/analysis/ColumnMeta.java @@ -22,6 +22,9 @@ public class ColumnMeta /** 数据类型 */ private DataType dataType; + /** 数据类别 */ + private DataCategory dataCategory; + /** 展示标签 */ private String label; @@ -29,11 +32,12 @@ public class ColumnMeta { } - public ColumnMeta(String name, DataType dataType) + public ColumnMeta(String name, DataType dataType, DataCategory dataCategory) { super(); this.name = name; this.dataType = dataType; + this.dataCategory = dataCategory; } public String getName() @@ -56,6 +60,16 @@ public class ColumnMeta this.dataType = dataType; } + public DataCategory getDataCategory() + { + return dataCategory; + } + + public void setDataCategory(DataCategory dataCategory) + { + this.dataCategory = dataCategory; + } + public boolean hasLabel() { return (this.label != null && !this.label.isEmpty()); @@ -74,6 +88,7 @@ public class ColumnMeta @Override public String toString() { - return getClass().getSimpleName() + " [name=" + name + ", dataType=" + dataType + "]"; + return getClass().getSimpleName() + " [name=" + name + ", dataType=" + dataType + ", dataCategory=" + + dataCategory + ", label=" + label + "]"; } } diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/DataCategory.java b/datagear-analysis/src/main/java/org/datagear/analysis/DataCategory.java new file mode 100644 index 00000000..f20ea312 --- /dev/null +++ b/datagear-analysis/src/main/java/org/datagear/analysis/DataCategory.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018 datagear.tech. All Rights Reserved. + */ + +/** + * + */ +package org.datagear.analysis; + +/** + * 数据类别。 + * + * @author datagear@163.com + * + */ +public enum DataCategory +{ + /** 维度 */ + DIMENSION, + + /** 标量 */ + SCALAR +} diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/support/SqlDataSetFactory.java b/datagear-analysis/src/main/java/org/datagear/analysis/support/SqlDataSetFactory.java index acf5bed8..113f58be 100644 --- a/datagear-analysis/src/main/java/org/datagear/analysis/support/SqlDataSetFactory.java +++ b/datagear-analysis/src/main/java/org/datagear/analysis/support/SqlDataSetFactory.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import org.datagear.analysis.ColumnMeta; +import org.datagear.analysis.DataCategory; import org.datagear.analysis.DataSet; import org.datagear.analysis.DataSetException; import org.datagear.analysis.DataSetExportValues; @@ -53,6 +54,8 @@ public class SqlDataSetFactory extends AbstractDataSetFactory private String sql; + private DataCategory[] dataCategories; + private String[] columnLabels; public SqlDataSetFactory() @@ -60,11 +63,12 @@ public class SqlDataSetFactory extends AbstractDataSetFactory super(); } - public SqlDataSetFactory(String id, ConnectionFactory connectionFactory, String sql) + public SqlDataSetFactory(String id, ConnectionFactory connectionFactory, String sql, DataCategory[] dataCategories) { super(id); this.connectionFactory = connectionFactory; this.sql = sql; + this.dataCategories = dataCategories; } public ConnectionFactory getConnectionFactory() @@ -87,6 +91,16 @@ public class SqlDataSetFactory extends AbstractDataSetFactory this.sql = sql; } + public DataCategory[] getDataCategories() + { + return dataCategories; + } + + public void setDataCategories(DataCategory[] dataCategories) + { + this.dataCategories = dataCategories; + } + public String[] getColumnLabels() { return columnLabels; @@ -595,8 +609,11 @@ public class SqlDataSetFactory extends AbstractDataSetFactory DataType dataType = toDataType(metaData, i); - ColumnMeta columnMeta = new ColumnMeta(columnName, dataType); - columnMeta.setLabel(getColumnLabel(i - 1)); + ColumnMeta columnMeta = createColumnMeta(); + columnMeta.setName(columnName); + columnMeta.setDataType(dataType); + setDataCategory(columnMeta, i); + setColumnLabel(columnMeta, i); columnMetas.add(columnMeta); } @@ -604,18 +621,20 @@ public class SqlDataSetFactory extends AbstractDataSetFactory return new DataSetMeta(columnMetas); } - /** - * 获取列标签,没有则返回{@code null}。 - * - * @param index - * @return - */ - protected String getColumnLabel(int index) + protected void setDataCategory(ColumnMeta columnMeta, int column) { - if (this.columnLabels == null || index >= this.columnLabels.length) - return null; + if (this.dataCategories == null || (column - 1) >= this.dataCategories.length) + throw new DataSetException("The data category must be set for column [" + column + "]"); - return this.columnLabels[index]; + columnMeta.setDataCategory(this.dataCategories[column - 1]); + } + + protected void setColumnLabel(ColumnMeta columnMeta, int column) + { + if (this.columnLabels == null || (column - 1) >= this.columnLabels.length) + return; + + columnMeta.setLabel(this.columnLabels[column - 1]); } /** @@ -700,4 +719,9 @@ public class SqlDataSetFactory extends AbstractDataSetFactory { return PARAMETER_SQL_RESOLVER.resolve(sql); } + + protected ColumnMeta createColumnMeta() + { + return new ColumnMeta(); + } } diff --git a/datagear-analysis/src/test/java/org/datagear/analysis/support/SqlDataSetFactoryTest.java b/datagear-analysis/src/test/java/org/datagear/analysis/support/SqlDataSetFactoryTest.java index a000c655..0f42fa9a 100644 --- a/datagear-analysis/src/test/java/org/datagear/analysis/support/SqlDataSetFactoryTest.java +++ b/datagear-analysis/src/test/java/org/datagear/analysis/support/SqlDataSetFactoryTest.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import org.datagear.analysis.ColumnMeta; +import org.datagear.analysis.DataCategory; import org.datagear.analysis.DataSet; import org.datagear.analysis.DataSetMeta; import org.datagear.analysis.DataSetParam; @@ -67,7 +68,8 @@ public class SqlDataSetFactoryTest extends DBTestSupport dataSetParams.add(new DataSetParam("id", DataType.INTEGER, true)); dataSetParams.add(new DataSetParam("name", DataType.STRING, true)); - SqlDataSetFactory sqlDataSetFactory = new SqlDataSetFactory("1", connectionFactory, sql); + SqlDataSetFactory sqlDataSetFactory = new SqlDataSetFactory("1", connectionFactory, sql, + new DataCategory[] { DataCategory.DIMENSION, DataCategory.SCALAR }); sqlDataSetFactory.setParams(dataSetParams); sqlDataSetFactory.setColumnLabels(columnLabels); @@ -87,6 +89,7 @@ public class SqlDataSetFactoryTest extends DBTestSupport Assert.assertEquals("ID", columnMeta.getName()); Assert.assertEquals(DataType.INTEGER, columnMeta.getDataType()); + Assert.assertEquals(DataCategory.DIMENSION, columnMeta.getDataCategory()); Assert.assertEquals(columnLabels[0], columnMeta.getLabel()); } @@ -95,6 +98,7 @@ public class SqlDataSetFactoryTest extends DBTestSupport Assert.assertEquals("NAME", columnMeta.getName()); Assert.assertEquals(DataType.STRING, columnMeta.getDataType()); + Assert.assertEquals(DataCategory.SCALAR, columnMeta.getDataCategory()); Assert.assertEquals(columnLabels[1], columnMeta.getLabel()); } diff --git a/datagear-management/src/main/java/org/datagear/management/domain/SqlDataSetFactoryEntity.java b/datagear-management/src/main/java/org/datagear/management/domain/SqlDataSetFactoryEntity.java index d92a276d..f29b2297 100644 --- a/datagear-management/src/main/java/org/datagear/management/domain/SqlDataSetFactoryEntity.java +++ b/datagear-management/src/main/java/org/datagear/management/domain/SqlDataSetFactoryEntity.java @@ -9,6 +9,7 @@ package org.datagear.management.domain; import java.util.Date; +import org.datagear.analysis.DataCategory; import org.datagear.analysis.support.SqlDataSetFactory; import org.datagear.util.resource.ConnectionFactory; @@ -23,6 +24,8 @@ public class SqlDataSetFactoryEntity extends SqlDataSetFactory { private static final long serialVersionUID = 1L; + public static final String SPLITTER = ","; + /** 授权资源类型 */ public static final String AUTHORIZATION_RESOURCE_TYPE = "DataSet"; @@ -44,10 +47,10 @@ public class SqlDataSetFactoryEntity extends SqlDataSetFactory this.createTime = new Date(); } - public SqlDataSetFactoryEntity(String id, SchemaConnectionFactory connectionFactory, String sql, String name, - User createUser) + public SqlDataSetFactoryEntity(String id, SchemaConnectionFactory connectionFactory, String sql, + DataCategory[] dataCategories, String name, User createUser) { - super(id, connectionFactory, sql); + super(id, connectionFactory, sql, dataCategories); this.name = name; this.createTime = new Date(); } @@ -87,6 +90,73 @@ public class SqlDataSetFactoryEntity extends SqlDataSetFactory this.name = name; } + public String getDataCategoriesText() + { + StringBuilder sb = new StringBuilder(); + + DataCategory[] dataCategories = getDataCategories(); + + if (dataCategories != null) + { + for (int i = 0; i < dataCategories.length; i++) + { + if (i > 0) + sb.append(SPLITTER + " "); + + sb.append(dataCategories[i].name()); + } + } + + return sb.toString(); + } + + public void setDataCategoriesText(String dataCategoriesText) + { + String[] texts = split(dataCategoriesText); + + DataCategory[] dataCategories = new DataCategory[texts.length]; + + for (int i = 0; i < texts.length; i++) + { + String text = texts[i].trim(); + + if (DataCategory.DIMENSION.name().equalsIgnoreCase(text)) + dataCategories[i] = DataCategory.DIMENSION; + else if (DataCategory.SCALAR.name().equalsIgnoreCase(text)) + dataCategories[i] = DataCategory.SCALAR; + else + throw new IllegalArgumentException("illegal data categories text [" + dataCategoriesText + "]"); + } + + setDataCategories(dataCategories); + } + + public String getColumnLabelsText() + { + StringBuilder sb = new StringBuilder(); + + String[] columnLabels = getColumnLabels(); + + if (columnLabels != null) + { + for (int i = 0; i < columnLabels.length; i++) + { + if (i > 0) + sb.append(SPLITTER + " "); + + sb.append(columnLabels[i]); + } + } + + return sb.toString(); + } + + public void setColumnLabelsText(String columnLabelsText) + { + String[] texts = split(columnLabelsText); + setColumnLabels(texts); + } + @Override public User getCreateUser() { @@ -120,4 +190,20 @@ public class SqlDataSetFactoryEntity extends SqlDataSetFactory { this.dataPermission = dataPermission; } + + protected String[] split(String texts) + { + texts = texts.trim(); + + if (texts.startsWith(SPLITTER)) + texts = texts.substring(SPLITTER.length()); + if (texts.endsWith(SPLITTER)) + texts = texts.substring(0, texts.length() - SPLITTER.length()); + + String[] array = texts.split(SPLITTER); + for (int i = 0; i < array.length; i++) + array[i] = array[i].trim(); + + return array; + } } diff --git a/datagear-management/src/main/resources/org/datagear/management/ddl/datagear.sql b/datagear-management/src/main/resources/org/datagear/management/ddl/datagear.sql index a37b0c73..7bb7bd2c 100644 --- a/datagear-management/src/main/resources/org/datagear/management/ddl/datagear.sql +++ b/datagear-management/src/main/resources/org/datagear/management/ddl/datagear.sql @@ -170,6 +170,8 @@ CREATE TABLE DATAGEAR_SQL_DATA_SET_FACTORY DSF_NAME VARCHAR(100) NOT NULL, DSF_SCHEMA_ID VARCHAR(50) NOT NULL, DSF_SQL VARCHAR(1000) NOT NULL, + DSF_DC_TEXT VARCHAR(500) NOT NULL, + DSF_CL_TEXT VARCHAR(500), DSF_CREATE_USER_ID VARCHAR(50), DSF_CREATE_TIME TIMESTAMP, PRIMARY KEY (DSF_ID) diff --git a/datagear-management/src/main/resources/org/datagear/management/mapper/SqlDataSetFactoryEntityMapper.xml b/datagear-management/src/main/resources/org/datagear/management/mapper/SqlDataSetFactoryEntityMapper.xml index eac2360b..be0a8c55 100644 --- a/datagear-management/src/main/resources/org/datagear/management/mapper/SqlDataSetFactoryEntityMapper.xml +++ b/datagear-management/src/main/resources/org/datagear/management/mapper/SqlDataSetFactoryEntityMapper.xml @@ -6,13 +6,13 @@ INSERT INTO DATAGEAR_SQL_DATA_SET_FACTORY ( - DSF_ID, DSF_NAME, DSF_SCHEMA_ID, DSF_SQL, DSF_CREATE_USER_ID, - DSF_CREATE_TIME + DSF_ID, DSF_NAME, DSF_SCHEMA_ID, DSF_SQL, DSF_DC_TEXT, + DSF_CL_TEXT, DSF_CREATE_USER_ID, DSF_CREATE_TIME ) VALUES ( - #{entity.id}, #{entity.name}, #{entity.schemaConnectionFactory.schema.id}, #{entity.sql}, #{entity.createUser.id}, - #{entity.createTime} + #{entity.id}, #{entity.name}, #{entity.schemaConnectionFactory.schema.id}, #{entity.sql}, #{entity.dataCategoriesText}, + #{entity.columnLabelsText, jdbcType=VARCHAR}, #{entity.createUser.id}, #{entity.createTime} ) @@ -20,7 +20,9 @@ UPDATE DATAGEAR_SQL_DATA_SET_FACTORY SET DSF_NAME = #{entity.name}, DSF_SCHEMA_ID = #{entity.schemaConnectionFactory.schema.id}, - DSF_SQL = #{entity.sql} + DSF_SQL = #{entity.sql}, + DSF_DC_TEXT = #{entity.dataCategoriesText}, + DSF_CL_TEXT = #{entity.columnLabelsText, jdbcType=VARCHAR} WHERE DSF_ID = #{entity.id} @@ -137,6 +139,8 @@ B.SCHEMA_ID AS ${_iq_}schemaConnectionFactory.schema.id${_iq_}, B.SCHEMA_TITLE AS ${_iq_}schemaConnectionFactory.schema.title${_iq_}, A.DSF_SQL AS ${_iq_}sql${_iq_}, + A.DSF_DC_TEXT AS ${_iq_}dataCategoriesText${_iq_}, + A.DSF_CL_TEXT AS ${_iq_}columnLabelsText${_iq_}, , A.DSF_CREATE_TIME AS ${_iq_}createTime${_iq_} FROM diff --git a/datagear-web/src/main/resources/locales/datagear.properties b/datagear-web/src/main/resources/locales/datagear.properties index a174f801..9d11fb8e 100644 --- a/datagear-web/src/main/resources/locales/datagear.properties +++ b/datagear-web/src/main/resources/locales/datagear.properties @@ -617,12 +617,18 @@ dataSet.selectDataSet=\u9009\u62E9\u6570\u636E\u96C6 dataSet.name=\u540D\u79F0 dataSet.dataSource=\u6570\u636E\u6E90 dataSet.sql=SQL\u8BED\u53E5 +dataSet.dataCategories=SQL\u5217\u7C7B\u522B\u96C6 +dataSet.columnLabels=SQL\u5217\u6807\u7B7E\u96C6 dataSet.createUser=\u521B\u5EFA\u7528\u6237 dataSet.createTime=\u521B\u5EFA\u65F6\u95F4 dataSet.loadMoreData=\u52A0\u8F7D\u66F4\u591A\u6570\u636E dataSet.refreshSqlResult=\u5237\u65B0\u67E5\u8BE2\u7ED3\u679C dataSet.noMoreData=\u6CA1\u6709\u66F4\u591A\u6570\u636E\u4E86 dataSet.sqlPreviewButtonTip=\u9884\u89C8SQL\u67E5\u8BE2\u7ED3\u679C\uFF08\u7F16\u8F91\u533A\uFF1ACtrl+Enter\uFF09 +dataSet.DataCategory.DIMENSION=\u7EF4\u5EA6 +dataSet.DataCategory.SCALAR=\u91CF\u5EA6 +dataSet.dataCategoriesSplitByComma=\u591A\u4E2A\u7C7B\u522B\u4EE5\u82F1\u6587\u9017\u53F7\uFF08,\uFF09\u5206\u9694 +dataSet.columnLabelsSplitByComma=\u591A\u4E2A\u6807\u7B7E\u4EE5\u82F1\u6587\u9017\u53F7\uFF08,\uFF09\u5206\u9694 #Chart chart.manageChart=\u7BA1\u7406\u56FE\u8868 diff --git a/datagear-web/src/main/webapp/WEB-INF/view/analysis/dataSet/dataSet_form.ftl b/datagear-web/src/main/webapp/WEB-INF/view/analysis/dataSet/dataSet_form.ftl index 7308fd81..c33eb9a3 100644 --- a/datagear-web/src/main/webapp/WEB-INF/view/analysis/dataSet/dataSet_form.ftl +++ b/datagear-web/src/main/webapp/WEB-INF/view/analysis/dataSet/dataSet_form.ftl @@ -65,6 +65,23 @@ readonly 是否只读操作,允许为null +
+
+ +
+
+ + +
+
+
+
+ +
+
+ +
+
<#if !readonly> @@ -82,7 +99,7 @@ readonly 是否只读操作,允许为null (function(po) { $.initButtons(po.element()); - var sqlEditorHeight = $(window).height()/5*2; + var sqlEditorHeight = $(window).height()/10*3; po.element(".sql-editor-wrapper").height(sqlEditorHeight); po.element(".sql-preview-wrapper").height(sqlEditorHeight); po.element(".form-item-value-sql").height(sqlEditorHeight + 25); @@ -109,6 +126,48 @@ readonly 是否只读操作,允许为null po.sqlEditor.setReadOnly(true); + po.dataCategoriesLabels = ["<@spring.message code='dataSet.DataCategory.DIMENSION' />", "<@spring.message code='dataSet.DataCategory.SCALAR' />"]; + po.dataCategoriesValues = ["DIMENSION", "SCALAR"]; + + po.splitByComma = function(val) + { + return val.split(/,\s*/); + }; + + po.convertCommaText = function(srcAry, destAry, srcText) + { + if(!srcText) + return ""; + + var destText = ""; + var srcs = po.splitByComma(srcText); + for(var i=0; i -1) + { + if(destText != "") + destText += ", "; + destText += destAry[srcIdx]; + } + } + + return destText; + }; + + var dataCategoriesText = po.element("input[name='dataCategoriesText']").val(); + po.element("input[name='dataCategoriesTextLabel']").attr("value", + po.convertCommaText(po.dataCategoriesValues, po.dataCategoriesLabels, dataCategoriesText)); + <#if !readonly> po.element(".select-schema-button").click(function() { @@ -230,7 +289,7 @@ readonly 是否只读操作,允许为null var newColumns = [ { title : "<@spring.message code='rowNumber' />", data : "", defaultContent: "", - render : po.renderRowNumberColumn, className : "column-row-number", width : "5em" + render : po.renderRowNumberColumn, className : "column-row-number", width : "3em" } ]; newColumns = newColumns.concat(columns); @@ -285,6 +344,42 @@ readonly 是否只读操作,允许为null }); }; + po.extractLastDataCategoryText = function(term) + { + return po.splitByComma(term).pop(); + }; + + po.element("input[name='dataCategoriesTextLabel']") + .on("keydown", function() + { + if (event.keyCode === $.ui.keyCode.TAB && $(this).autocomplete( "instance" ).menu.active) + event.preventDefault(); + }) + .on("focus", function() + { + $(this).autocomplete("search", ""); + }) + .autocomplete( + { + minLength: 0, + source: function(request,response) + { + response($.ui.autocomplete.filter(po.dataCategoriesLabels, po.extractLastDataCategoryText(request.term))); + }, + focus: function() + { + return false; + }, + select: function(event, ui) + { + var terms = po.splitByComma(this.value); + terms.pop(); + terms.push(ui.item.value); + this.value = terms; + return false; + } + }); + $.validator.addMethod("dataSetSqlRequired", function(value, element) { var sql = po.sqlEditor.getValue(); @@ -299,17 +394,23 @@ readonly 是否只读操作,允许为null "name" : "required", "schemaConnectionFactory.schema.title" : "required", "sql" : "dataSetSqlRequired", + "dataCategoriesTextLabel" : "required" }, messages : { "name" : "<@spring.message code='validation.required' />", "schemaConnectionFactory.schema.title" : "<@spring.message code='validation.required' />", - "sql" : "<@spring.message code='validation.required' />" + "sql" : "<@spring.message code='validation.required' />", + "dataCategoriesTextLabel" : "<@spring.message code='validation.required' />" }, submitHandler : function(form) { po.element("textarea[name='sql']").val(po.sqlEditor.getValue()); + var dataCategoriesTextLabel = po.element("input[name='dataCategoriesTextLabel']").val(); + po.element("input[name='dataCategoriesText']").val( + po.convertCommaText(po.dataCategoriesLabels, po.dataCategoriesValues, dataCategoriesTextLabel)); + $(form).ajaxSubmit( { success : function() diff --git a/datagear-web/src/main/webapp/static/css/common.css b/datagear-web/src/main/webapp/static/css/common.css index 96f9b09a..30537b72 100644 --- a/datagear-web/src/main/webapp/static/css/common.css +++ b/datagear-web/src/main/webapp/static/css/common.css @@ -110,7 +110,8 @@ form .form-content .form-item .form-item-value .input{ vertical-align: middle; } form .form-content .form-item .form-item-value input[type=text], -form .form-content .form-item .form-item-value input[type=password]{ +form .form-content .form-item .form-item-value input[type=password], +form .form-content .form-item .form-item-value .input{ height: 1.5em; } form .form-content .form-item .form-item-value textarea{