This is an automated email from the ASF dual-hosted git repository.

kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 8ac72e8  [Feature-5087][SqlTask] Add a switch to send mail and print 
head logs in SqlTask (#5088)
8ac72e8 is described below

commit 8ac72e80e6656ab2119f938e038df663765e1379
Author: Shiwen Cheng <[email protected]>
AuthorDate: Fri Mar 19 15:07:39 2021 +0800

    [Feature-5087][SqlTask] Add a switch to send mail and print head logs in 
SqlTask (#5088)
    
    * [Feature-5087][SqlTask] Add the switch to send mail and print head logs 
in SqlTask
    
    * [Feature-5087][SqlTask] Add SqlParametersTest
---
 .../apache/dolphinscheduler/common/Constants.java  |  5 ++
 .../common/task/sql/SqlParameters.java             | 28 +++++++++
 .../common/task/SqlParametersTest.java             | 68 ++++++++++++++++++++++
 .../server/worker/task/sql/SqlTask.java            | 28 +++++----
 .../home/pages/dag/_source/formModel/tasks/sql.vue | 34 +++++++++--
 .../src/js/module/i18n/locale/en_US.js             |  3 +
 .../src/js/module/i18n/locale/zh_CN.js             |  3 +
 pom.xml                                            |  1 +
 8 files changed, 153 insertions(+), 17 deletions(-)

diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
index eb71239..7925ee0 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
@@ -332,6 +332,11 @@ public final class Constants {
     public static final Pattern REGEX_MAIL_NAME = 
Pattern.compile("^([a-z0-9A-Z]+[_|\\-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$");
 
     /**
+     * default display rows
+     */
+    public static final int DEFAULT_DISPLAY_ROWS = 10;
+
+    /**
      * read permission
      */
     public static final int READ_PERMISSION = 2 * 1;
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/sql/SqlParameters.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/sql/SqlParameters.java
index 3b5d39f..a83cd64 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/sql/SqlParameters.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/task/sql/SqlParameters.java
@@ -51,6 +51,16 @@ public class SqlParameters extends AbstractParameters {
     private int sqlType;
 
     /**
+     * send email
+     */
+    private Boolean sendEmail;
+
+    /**
+     * display rows
+     */
+    private int displayRows;
+
+    /**
      * udf list
      */
     private String udfs;
@@ -124,6 +134,22 @@ public class SqlParameters extends AbstractParameters {
         this.sqlType = sqlType;
     }
 
+    public Boolean getSendEmail() {
+        return sendEmail;
+    }
+
+    public void setSendEmail(Boolean sendEmail) {
+        this.sendEmail = sendEmail;
+    }
+
+    public int getDisplayRows() {
+        return displayRows;
+    }
+
+    public void setDisplayRows(int displayRows) {
+        this.displayRows = displayRows;
+    }
+
     public String getShowType() {
         return showType;
     }
@@ -189,6 +215,8 @@ public class SqlParameters extends AbstractParameters {
                 + ", datasource=" + datasource
                 + ", sql='" + sql + '\''
                 + ", sqlType=" + sqlType
+                + ", sendEmail=" + sendEmail
+                + ", displayRows=" + displayRows
                 + ", udfs='" + udfs + '\''
                 + ", showType='" + showType + '\''
                 + ", connParams='" + connParams + '\''
diff --git 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/task/SqlParametersTest.java
 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/task/SqlParametersTest.java
new file mode 100644
index 0000000..6fc4d6c
--- /dev/null
+++ 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/task/SqlParametersTest.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.task;
+
+import org.apache.dolphinscheduler.common.task.sql.SqlParameters;
+import org.apache.dolphinscheduler.common.utils.CollectionUtils;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SqlParametersTest {
+
+    private final String type = "MYSQL";
+    private final String sql = "select * from t_ds_user";
+    private final String udfs = "test-udfs-1.0.0-SNAPSHOT.jar";
+    private final int datasource = 1;
+    private final int sqlType = 0;
+    private final Boolean sendEmail = true;
+    private final int displayRows = 10;
+    private final String showType = "TABLE";
+    private final String title = "sql test";
+    private final int groupId = 0;
+
+    @Test
+    public void testSqlParameters() {
+        SqlParameters sqlParameters = new SqlParameters();
+        
Assert.assertTrue(CollectionUtils.isEmpty(sqlParameters.getResourceFilesList()));
+
+        sqlParameters.setType(type);
+        sqlParameters.setSql(sql);
+        sqlParameters.setUdfs(udfs);
+        sqlParameters.setDatasource(datasource);
+        sqlParameters.setSqlType(sqlType);
+        sqlParameters.setSendEmail(sendEmail);
+        sqlParameters.setDisplayRows(displayRows);
+        sqlParameters.setShowType(showType);
+        sqlParameters.setTitle(title);
+        sqlParameters.setGroupId(groupId);
+
+        Assert.assertEquals(type, sqlParameters.getType());
+        Assert.assertEquals(sql, sqlParameters.getSql());
+        Assert.assertEquals(udfs, sqlParameters.getUdfs());
+        Assert.assertEquals(datasource, sqlParameters.getDatasource());
+        Assert.assertEquals(sqlType, sqlParameters.getSqlType());
+        Assert.assertEquals(sendEmail, sqlParameters.getSendEmail());
+        Assert.assertEquals(displayRows, sqlParameters.getDisplayRows());
+        Assert.assertEquals(showType, sqlParameters.getShowType());
+        Assert.assertEquals(title, sqlParameters.getTitle());
+        Assert.assertEquals(groupId, sqlParameters.getGroupId());
+
+        Assert.assertTrue(sqlParameters.checkParameters());
+    }
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java
index 8f21d5e..06df564 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/task/sql/SqlTask.java
@@ -149,13 +149,13 @@ public class SqlTask extends AbstractTask {
                     logger);
 
             // execute sql task
-            executeFuncAndSql(mainSqlBinds, preStatementSqlBinds, 
postStatementSqlBinds, createFuncs, sqlParameters.getLocalParams());
+            executeFuncAndSql(mainSqlBinds, preStatementSqlBinds, 
postStatementSqlBinds, createFuncs);
 
             setExitStatusCode(Constants.EXIT_CODE_SUCCESS);
 
         } catch (Exception e) {
             setExitStatusCode(Constants.EXIT_CODE_FAILURE);
-            logger.error("sql task error", e);
+            logger.error("sql task error: {}", e.toString());
             throw e;
         }
     }
@@ -238,8 +238,7 @@ public class SqlTask extends AbstractTask {
     public void executeFuncAndSql(SqlBinds mainSqlBinds,
                                   List<SqlBinds> preStatementsBinds,
                                   List<SqlBinds> postStatementsBinds,
-                                  List<String> createFuncs,
-                                  List<Property> properties) {
+                                  List<String> createFuncs) throws Exception {
         Connection connection = null;
         PreparedStatement stmt = null;
         ResultSet resultSet = null;
@@ -268,15 +267,15 @@ public class SqlTask extends AbstractTask {
             } else if (sqlParameters.getSqlType() == 
SqlType.NON_QUERY.ordinal()) {
                 // non query statement
                 String updateResult = String.valueOf(stmt.executeUpdate());
-                result = setNonQuerySqlReturn(updateResult, properties);
+                result = setNonQuerySqlReturn(updateResult, 
sqlParameters.getLocalParams());
             }
 
             postSql(connection, postStatementsBinds);
             this.setResultString(result);
 
         } catch (Exception e) {
-            logger.error("execute sql error", e);
-            throw new RuntimeException("execute sql error");
+            logger.error("execute sql error: {}", e.getMessage());
+            throw e;
         } finally {
             close(resultSet, stmt, connection);
         }
@@ -319,12 +318,19 @@ public class SqlTask extends AbstractTask {
             rowCount++;
         }
         String result = JSONUtils.toJsonString(resultJSONArray);
-        logger.debug("execute sql : {}", result);
-        try {
+        logger.debug("execute sql result : {}", result);
+
+        int displayRows = sqlParameters.getDisplayRows() > 0 ? 
sqlParameters.getDisplayRows() : Constants.DEFAULT_DISPLAY_ROWS;
+        displayRows = Math.min(displayRows, resultJSONArray.size());
+        logger.info("display sql result {} rows as follows:", displayRows);
+        for (int i = 0; i < displayRows; i++) {
+            String row = JSONUtils.toJsonString(resultJSONArray.get(i));
+            logger.info("row {} : {}", i + 1, row);
+        }
+
+        if (sqlParameters.getSendEmail() == null || 
sqlParameters.getSendEmail()) {
             sendAttachment(sqlParameters.getGroupId(), 
StringUtils.isNotEmpty(sqlParameters.getTitle()) ? sqlParameters.getTitle() : 
taskExecutionContext.getTaskName() + " query result sets",
                     JSONUtils.toJsonString(resultJSONArray));
-        } catch (Exception e) {
-            logger.warn("sql task sendAttachment error! msg : {} ", 
e.getMessage());
         }
         return result;
     }
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
index 965d126..d016c30 100644
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
@@ -32,9 +32,18 @@
         <div style="display: inline-block;">
           <m-sql-type @on-sqlType="_onSqlType" 
:sql-type="sqlType"></m-sql-type>
         </div>
+        <div style="display: inline-block;" v-if="sqlType === '0'">
+          <span class="text-b">{{$t('Send Email')}}</span>
+          <el-switch size="small" v-model="sendEmail"></el-switch>
+        </div>
+        <div style="display: inline-block;" v-if="sqlType === '0'">
+          <span class="text-b">{{$t('Display query result')}}</span>
+          <m-select-input v-model="displayRows" :list="[1,10,25,50,100]" 
style="width: 70px;"></m-select-input>
+          <span>({{$t('Rows')}})</span>
+        </div>
       </div>
     </m-list-box>
-    <template v-if="sqlType === 0">
+    <template v-if="sqlType === '0' && sendEmail">
       <m-list-box>
         <div slot="text"><strong 
class='requiredIcon'>*</strong>{{$t('Title')}}</div>
         <div slot="content">
@@ -54,7 +63,7 @@
         </div>
       </m-list-box>
     </template>
-    <m-list-box v-if="type === 'HIVE'">
+    <m-list-box v-show="type === 'HIVE'">
       <div slot="text">{{$t('SQL Parameter')}}</div>
       <div slot="content">
         <el-input
@@ -141,6 +150,7 @@
   import mLocalParams from './_source/localParams'
   import mStatementList from './_source/statementList'
   import mWarningGroups from './_source/warningGroups'
+  import mSelectInput from '../_source/selectInput'
   import disabledState from '@/module/mixin/disabledState'
   import codemirror from 
'@/conf/home/pages/resource/pages/file/pages/_source/codemirror'
 
@@ -164,6 +174,10 @@
         udfs: '',
         // Sql type
         sqlType: '0',
+        // Send email
+        sendEmail: false,
+        // Display rows
+        displayRows: 10,
         // Email title
         title: '',
         // Sql parameter
@@ -240,11 +254,11 @@
         if (!this.$refs.refDs._verifDatasource()) {
           return false
         }
-        if (this.sqlType === '0' && !this.title) {
+        if (this.sqlType === '0' && this.sendEmail && !this.title) {
           this.$message.warning(`${i18n.$t('Mail subject required')}`)
           return false
         }
-        if (this.sqlType === '0' && (this.groupId === '' || this.groupId === 
null)) {
+        if (this.sqlType === '0' && this.sendEmail && (this.groupId === '' || 
this.groupId === null)) {
           this.$message.warning(`${i18n.$t('Alarm group required')}`)
           return false
         }
@@ -277,6 +291,8 @@
           sql: editor.getValue(),
           udfs: this.udfs,
           sqlType: this.sqlType,
+          sendEmail: this.sendEmail,
+          displayRows: this.displayRows,
           title: this.title,
           groupId: this.groupId,
           localParams: this.localParams,
@@ -326,6 +342,8 @@
           sql: editor ? editor.getValue() : '',
           udfs: this.udfs,
           sqlType: this.sqlType,
+          sendEmail: this.sendEmail,
+          displayRows: this.displayRows,
           title: this.title,
           groupId: this.groupId,
           localParams: this.localParams,
@@ -345,7 +363,7 @@
     watch: {
       // Listening to sqlType
       sqlType (val) {
-        if (val !== 0) {
+        if (val !== '0') {
           this.title = ''
           this.groupId = null
         }
@@ -372,6 +390,8 @@
         this.sql = o.params.sql || ''
         this.udfs = o.params.udfs || ''
         this.sqlType = o.params.sqlType
+        this.sendEmail = o.params.sendEmail || false
+        this.displayRows = o.params.displayRows || 10
         this.connParams = o.params.connParams || ''
         this.localParams = o.params.localParams || []
         this.preStatements = o.params.preStatements || []
@@ -402,6 +422,8 @@
           datasource: this.rtDatasource,
           udfs: this.udfs,
           sqlType: this.sqlType,
+          sendEmail: this.sendEmail,
+          displayRows: this.displayRows,
           title: this.title,
           groupId: this.groupId,
           localParams: this.localParams,
@@ -411,6 +433,6 @@
         }
       }
     },
-    components: { mListBox, mDatasource, mLocalParams, mUdfs, mSqlType, 
mStatementList, mScriptBox, mWarningGroups }
+    components: { mListBox, mDatasource, mLocalParams, mUdfs, mSqlType, 
mStatementList, mScriptBox, mWarningGroups, mSelectInput }
   }
 </script>
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js 
b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
index 06ce54c..58fa7e2 100755
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
@@ -130,6 +130,9 @@ export default {
   'App Name': 'App Name',
   'Please enter app name(optional)': 'Please enter app name(optional)',
   'SQL Type': 'SQL Type',
+  'Send Email': 'Send Email',
+  'Display query result': 'Display query result',
+  Rows: 'Rows',
   Title: 'Title',
   'Please enter the title of email': 'Please enter the title of email',
   Table: 'Table',
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js 
b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
index 30c24c9..4d7260b 100755
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
@@ -130,6 +130,9 @@ export default {
   'App Name': '任务名称',
   'Please enter app name(optional)': '请输入任务名称(选填)',
   'SQL Type': 'sql类型',
+  'Send Email': '发送邮件',
+  'Display query result': '展示查询结果',
+  Rows: '行',
   Title: '主题',
   'Please enter the title of email': '请输入邮件主题',
   Table: '表名',
diff --git a/pom.xml b/pom.xml
index 2d18af9..96c2e94 100644
--- a/pom.xml
+++ b/pom.xml
@@ -854,6 +854,7 @@
                         <include>**/common/task/EntityTestUtils.java</include>
                         
<include>**/common/task/FlinkParametersTest.java</include>
                         
<include>**/common/task/HttpParametersTest.java</include>
+                        
<include>**/common/task/SqlParametersTest.java</include>
                         
<include>**/common/task/SqoopParameterEntityTest.java</include>
                         
<include>**/common/threadutils/ThreadPoolExecutorsTest.java</include>
                         
<include>**/common/threadutils/ThreadUtilsTest.java</include>

Reply via email to