Commit 0bb87154 authored by wenmo's avatar wenmo

元数据查询与执行合并

parent 397a3faa
...@@ -113,7 +113,7 @@ public class StudioServiceImpl implements StudioService { ...@@ -113,7 +113,7 @@ public class StudioServiceImpl implements StudioService {
return result; return result;
} }
Driver driver = Driver.build(dataBase.getDriverConfig()).connect(); Driver driver = Driver.build(dataBase.getDriverConfig()).connect();
JdbcSelectResult selectResult = driver.query(sqlDTO.getStatement(),sqlDTO.getMaxRowNum()); JdbcSelectResult selectResult = driver.executeSql(sqlDTO.getStatement(),sqlDTO.getMaxRowNum());
driver.close(); driver.close();
result.setResult(selectResult); result.setResult(selectResult);
if(selectResult.isSuccess()){ if(selectResult.isSuccess()){
......
package com.dlink.result; package com.dlink.result;
import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
...@@ -13,9 +14,21 @@ public class AbstractResult { ...@@ -13,9 +14,21 @@ public class AbstractResult {
protected boolean success; protected boolean success;
protected LocalDateTime startTime; protected LocalDateTime startTime;
protected LocalDateTime endTime; protected LocalDateTime endTime;
protected long time;
protected String error; protected String error;
public void setStartTime(LocalDateTime startTime){ public void success(){
this.setEndTime(LocalDateTime.now());
this.setSuccess(true);
}
public void error(String error){
this.setEndTime(LocalDateTime.now());
this.setSuccess(false);
this.setError(error);
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime; this.startTime = startTime;
} }
...@@ -37,6 +50,10 @@ public class AbstractResult { ...@@ -37,6 +50,10 @@ public class AbstractResult {
public void setEndTime(LocalDateTime endTime) { public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime; this.endTime = endTime;
if (startTime != null && endTime != null) {
Duration duration = java.time.Duration.between(startTime, endTime);
time = duration.toMillis();
}
} }
public String getError() { public String getError() {
...@@ -46,4 +63,12 @@ public class AbstractResult { ...@@ -46,4 +63,12 @@ public class AbstractResult {
public void setError(String error) { public void setError(String error) {
this.error = error; this.error = error;
} }
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
} }
package com.dlink.utils; package com.dlink.utils;
import com.dlink.assertion.Asserts; import com.dlink.assertion.Asserts;
import com.dlink.constant.FlinkSQLConstant;
/** /**
* SqlUtil * SqlUtil
......
...@@ -24,6 +24,7 @@ import java.sql.SQLException; ...@@ -24,6 +24,7 @@ import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
/** /**
...@@ -177,7 +178,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -177,7 +178,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
@Override @Override
public boolean createTable(Table table) { public boolean createTable(Table table) throws Exception {
String sql = getCreateTableSql(table).replaceAll("\r\n", " "); String sql = getCreateTableSql(table).replaceAll("\r\n", " ");
if (Asserts.isNotNull(sql)) { if (Asserts.isNotNull(sql)) {
return execute(sql); return execute(sql);
...@@ -187,7 +188,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -187,7 +188,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
@Override @Override
public boolean dropTable(Table table) { public boolean dropTable(Table table) throws Exception {
String sql = getDropTableSql(table).replaceAll("\r\n", " "); String sql = getDropTableSql(table).replaceAll("\r\n", " ");
if (Asserts.isNotNull(sql)) { if (Asserts.isNotNull(sql)) {
return execute(sql); return execute(sql);
...@@ -197,7 +198,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -197,7 +198,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
@Override @Override
public boolean truncateTable(Table table) { public boolean truncateTable(Table table) throws Exception {
String sql = getTruncateTableSql(table).replaceAll("\r\n", " "); String sql = getTruncateTableSql(table).replaceAll("\r\n", " ");
if (Asserts.isNotNull(sql)) { if (Asserts.isNotNull(sql)) {
return execute(sql); return execute(sql);
...@@ -229,21 +230,23 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -229,21 +230,23 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
@Override @Override
public boolean execute(String sql) { public boolean execute(String sql) throws Exception {
Asserts.checkNullString(sql, "Sql 语句为空"); Asserts.checkNullString(sql, "Sql 语句为空");
String[] sqls = sql.split(";"); boolean res = false;
try (Statement statement = conn.createStatement()) { try (Statement statement = conn.createStatement()) {
for (int i = 0; i < sqls.length; i++) { res = statement.execute(sql);
if (Asserts.isNullString(sqls[i])) {
continue;
} }
statement.execute(sqls[i]); return res;
} }
return true;
} catch (SQLException e) { @Override
e.printStackTrace(); public int executeUpdate(String sql) throws Exception {
Asserts.checkNullString(sql, "Sql 语句为空");
int res = 0;
try (Statement statement = conn.createStatement()) {
res = statement.executeUpdate(sql);
} }
return false; return res;
} }
@Override @Override
...@@ -252,7 +255,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -252,7 +255,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
limit = 100; limit = 100;
} }
JdbcSelectResult result = new JdbcSelectResult(); JdbcSelectResult result = new JdbcSelectResult();
List<HashMap<String, Object>> datas = new ArrayList<>(); List<LinkedHashMap<String, Object>> datas = new ArrayList<>();
List<Column> columns = new ArrayList<>(); List<Column> columns = new ArrayList<>();
List<String> columnNameList = new ArrayList<>(); List<String> columnNameList = new ArrayList<>();
PreparedStatement preparedStatement = null; PreparedStatement preparedStatement = null;
...@@ -277,7 +280,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -277,7 +280,7 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
result.setColumns(columnNameList); result.setColumns(columnNameList);
while (results.next()) { while (results.next()) {
HashMap<String, Object> data = new HashMap<>(); LinkedHashMap<String, Object> data = new LinkedHashMap<>();
for (int i = 0; i < columns.size(); i++) { for (int i = 0; i < columns.size(); i++) {
data.put(columns.get(i).getName(), getTypeConvert().convertValue(results, columns.get(i).getName(), columns.get(i).getType())); data.put(columns.get(i).getName(), getTypeConvert().convertValue(results, columns.get(i).getName(), columns.get(i).getType()));
} }
...@@ -298,6 +301,42 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -298,6 +301,42 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
} }
@Override
public JdbcSelectResult executeSql(String sql, Integer limit) {
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql,config.getType());
List<Object> resList = new ArrayList<>();
JdbcSelectResult result = JdbcSelectResult.buildResult();
for(SQLStatement item : stmtList){
String type = item.getClass().getSimpleName();
if(type.toUpperCase().contains("SELECT")||type.toUpperCase().contains("SHOW")||type.toUpperCase().contains("DESC")){
return query(item.toString(),limit);
}else if(type.toUpperCase().contains("INSERT")||type.toUpperCase().contains("UPDATE")||type.toUpperCase().contains("DELETE")){
try {
resList.add(executeUpdate(item.toString()));
} catch (Exception e) {
e.printStackTrace();
resList.add(0);
result.setStatusList(resList);
result.error(e.getMessage());
return result;
}
}else {
try {
resList.add(execute(item.toString()));
} catch (Exception e) {
e.printStackTrace();
resList.add(false);
result.setStatusList(resList);
result.error(e.getMessage());
return result;
}
}
}
result.setStatusList(resList);
result.success();
return result;
}
@Override @Override
public List<SqlExplainResult> explain(String sql){ public List<SqlExplainResult> explain(String sql){
List<SqlExplainResult> sqlExplainResults = new ArrayList<>(); List<SqlExplainResult> sqlExplainResults = new ArrayList<>();
......
...@@ -9,6 +9,7 @@ import com.dlink.model.Table; ...@@ -9,6 +9,7 @@ import com.dlink.model.Table;
import com.dlink.result.SqlExplainResult; import com.dlink.result.SqlExplainResult;
import sun.misc.Service; import sun.misc.Service;
import java.sql.SQLException;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
...@@ -67,11 +68,11 @@ public interface Driver { ...@@ -67,11 +68,11 @@ public interface Driver {
boolean existTable(Table table); boolean existTable(Table table);
boolean createTable(Table table); boolean createTable(Table table) throws Exception;
boolean dropTable(Table table); boolean dropTable(Table table) throws Exception;
boolean truncateTable(Table table); boolean truncateTable(Table table) throws Exception;
String getCreateTableSql(Table table); String getCreateTableSql(Table table);
...@@ -87,10 +88,14 @@ public interface Driver { ...@@ -87,10 +88,14 @@ public interface Driver {
SelectResult select(String sql);*/ SelectResult select(String sql);*/
boolean execute(String sql); boolean execute(String sql) throws Exception;
int executeUpdate(String sql) throws Exception;
JdbcSelectResult query(String sql, Integer limit); JdbcSelectResult query(String sql, Integer limit);
JdbcSelectResult executeSql(String sql, Integer limit);
List<SqlExplainResult> explain(String sql); List<SqlExplainResult> explain(String sql);
} }
...@@ -5,7 +5,10 @@ import com.dlink.result.IResult; ...@@ -5,7 +5,10 @@ import com.dlink.result.IResult;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
/** /**
...@@ -14,17 +17,79 @@ import java.util.List; ...@@ -14,17 +17,79 @@ import java.util.List;
* @author wenmo * @author wenmo
* @since 2021/7/19 23:31 * @since 2021/7/19 23:31
*/ */
@Setter
@Getter
public class JdbcSelectResult extends AbstractResult implements IResult { public class JdbcSelectResult extends AbstractResult implements IResult {
private List<String> columns; private List<String> columns;
private List<HashMap<String,Object>> rowData; private List<LinkedHashMap<String,Object>> rowData;
private Integer total; private Integer total;
private Integer page; private Integer page;
private Integer limit; private Integer limit;
private static final String STATUS = "status";
private static final List<String> STATUS_COLUMN = new ArrayList<String>(){{ add("status"); }};
public JdbcSelectResult() {
}
public static JdbcSelectResult buildResult(){
JdbcSelectResult result = new JdbcSelectResult();
result.setStartTime(LocalDateTime.now());
return result;
}
public void setStatusList(List<Object> statusList){
this.setColumns(STATUS_COLUMN);
List<LinkedHashMap<String,Object>> dataList = new ArrayList<>();
for(Object item: statusList){
LinkedHashMap map = new LinkedHashMap<String,Object>();
map.put(STATUS,item);
dataList.add(map);
}
this.setRowData(dataList);
this.setTotal(statusList.size());
}
@Override @Override
public String getJobId() { public String getJobId() {
return null; return null;
} }
public List<String> getColumns() {
return columns;
}
public void setColumns(List<String> columns) {
this.columns = columns;
}
public List<LinkedHashMap<String, Object>> getRowData() {
return rowData;
}
public void setRowData(List<LinkedHashMap<String, Object>> rowData) {
this.rowData = rowData;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
} }
...@@ -3,7 +3,7 @@ import {StateType} from "@/pages/FlinkSqlStudio/model"; ...@@ -3,7 +3,7 @@ import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi"; import {connect} from "umi";
import {FireOutlined, ScheduleOutlined} from '@ant-design/icons'; import {FireOutlined, ScheduleOutlined} from '@ant-design/icons';
import StudioSqlConfig from "@/components/Studio/StudioRightTool/StudioSqlConfig"; import StudioSqlConfig from "@/components/Studio/StudioRightTool/StudioSqlConfig";
import {DIALECT} from "@/components/Studio/conf"; import {DIALECT, isSql} from "@/components/Studio/conf";
const { Title, Paragraph, Text, Link } = Typography; const { Title, Paragraph, Text, Link } = Typography;
...@@ -56,7 +56,7 @@ const StudioMsg = (props:any) => { ...@@ -56,7 +56,7 @@ const StudioMsg = (props:any) => {
return ( return (
<Typography> <Typography>
{current.console.result.startTime?(current.task.dialect === DIALECT.SQL ? renderCommonSqlContent(): {current.console.result.startTime?(isSql(current.task.dialect) ? renderCommonSqlContent():
renderFlinkSqlContent() ):<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> renderFlinkSqlContent() ):<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
} }
</Typography> </Typography>
......
import {Typography, Input, Button, Space, Table, Select, Tag, Form, Empty,Tooltip} from "antd"; import {Typography, Input, Button, Space, Table, Select, Tag, Form, Empty,Tooltip} from "antd";
import {StateType} from "@/pages/FlinkSqlStudio/model"; import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi"; import {connect} from "umi";
import {useState} from "react"; import React, {useState} from "react";
// import Highlighter from 'react-highlight-words'; // import Highlighter from 'react-highlight-words';
import { SearchOutlined } from '@ant-design/icons'; import {FireOutlined, SearchOutlined} from '@ant-design/icons';
import {showJobData} from "@/components/Studio/StudioEvent/DQL"; import {showJobData} from "@/components/Studio/StudioEvent/DQL";
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
import {DIALECT} from "@/components/Studio/conf"; import {DIALECT, isSql} from "@/components/Studio/conf";
const { Option } = Select; const { Option } = Select;
const { Title, Paragraph, Text, Link } = Typography; const { Title, Paragraph, Text, Link } = Typography;
...@@ -90,7 +90,7 @@ const StudioTable = (props:any) => { ...@@ -90,7 +90,7 @@ const StudioTable = (props:any) => {
title: item, title: item,
dataIndex: item, dataIndex: item,
key: item, key: item,
sorter: true, // sorter: true,
...getColumnSearchProps(item), ...getColumnSearchProps(item),
}); });
}); });
...@@ -100,26 +100,40 @@ const StudioTable = (props:any) => { ...@@ -100,26 +100,40 @@ const StudioTable = (props:any) => {
const showDetail=()=>{ const showDetail=()=>{
showJobData(current.console.result.jobId,dispatch) showJobData(current.console.result.jobId,dispatch)
}; };
return (
<div style={{width: '100%'}}> const renderFlinkSQLContent = () => {
{current.console&&current.console.result.success? return (<>
(<> <Button type="primary" onClick={showDetail} icon={<SearchOutlined/>}>
{current.task.dialect === DIALECT.FLINKSQL ?
(<Button type="primary" onClick={showDetail} icon={<SearchOutlined/>}>
获取最新数据 获取最新数据
</Button>):undefined </Button> &nbsp;
} {current.console.result.jobId && (<Tag color="blue" key={current.console.result.jobId}>
{result.rowData&&result.columns? <FireOutlined /> {current.console.result.jobId}
</Tag>)}
{result.columns?
<ProTable dataSource={result.rowData} columns={getColumns(result.columns)} search={false} <ProTable dataSource={result.rowData} columns={getColumns(result.columns)} search={false}
options={{ options={{
search: false, search: false,
}}/> }}/>
:(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />) :(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)
} }
</>): </>)
current.console&&current.console.result&&current.console.result.result&&current.console.result.result.rowData&&current.console.result.result.columns? }
(<ProTable dataSource={current.console.result.result.rowData} columns={getColumns(current.console.result.result.columns)} search={false}
/>):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)} const renderSQLContent = () => {
return (<>
{current.console.result.result?
<ProTable dataSource={current.console.result.result.rowData} columns={getColumns(current.console.result.result.columns)} search={false}
options={{
search: false,
}}/>
:(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)
}
</>)
}
return (
<div style={{width: '100%'}}>
{isSql(current.task.dialect)?renderSQLContent():renderFlinkSQLContent()}
</div> </div>
); );
}; };
......
...@@ -83,12 +83,6 @@ const StudioMenu = (props: any) => { ...@@ -83,12 +83,6 @@ const StudioMenu = (props: any) => {
type: "Studio/saveTabs", type: "Studio/saveTabs",
payload: newTabs, payload: newTabs,
}); });
if(current.task.dialect === DIALECT.SQL){
dispatch && dispatch({
type: "Studio/saveResult",
payload: res.datas.result,
});
}
useSession && showTables(currentSession.session, dispatch); useSession && showTables(currentSession.session, dispatch);
}) })
}; };
......
...@@ -60,7 +60,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -60,7 +60,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
list[i].icon = getIcon(list[i].type); list[i].icon = getIcon(list[i].type);
} }
} }
data = convertToTreeData(data, 0); data = convertToTreeData(list, 0);
setTreeData(data); setTreeData(data);
}; };
...@@ -75,7 +75,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -75,7 +75,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
list[i].icon = getIcon(list[i].type); list[i].icon = getIcon(list[i].type);
} }
} }
data = convertToTreeData(data, 0); data = convertToTreeData(list, 0);
setTreeData(data); setTreeData(data);
let node = getTreeNodeByKey(data,key); let node = getTreeNodeByKey(data,key);
onSelect([],{node:node}); onSelect([],{node:node});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment