Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dlink
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhaowei
dlink
Commits
7d66ec37
Unverified
Commit
7d66ec37
authored
Oct 25, 2022
by
ZackYoung
Committed by
GitHub
Oct 25, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Udf template use (#1154)
* 添加数据开发 udf与udf模板使用 * 添加数据开发 udf与udf模板使用 * change sql * 去掉库名
parent
c841efa4
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
200 additions
and
24 deletions
+200
-24
UDFController.java
...min/src/main/java/com/dlink/controller/UDFController.java
+37
-0
CatalogueTaskDTO.java
...k-admin/src/main/java/com/dlink/dto/CatalogueTaskDTO.java
+4
-0
CatalogueServiceImpl.java
...ain/java/com/dlink/service/impl/CatalogueServiceImpl.java
+2
-0
TaskServiceImpl.java
...src/main/java/com/dlink/service/impl/TaskServiceImpl.java
+19
-3
pom.xml
dlink-core/pom.xml
+4
-0
Dialect.java
dlink-core/src/main/java/com/dlink/config/Dialect.java
+14
-2
UDFUtil.java
dlink-core/src/main/java/com/dlink/utils/UDFUtil.java
+37
-0
dinky_dml.sql
dlink-doc/sql/upgrade/0.6.8_schema/mysql/dinky_dml.sql
+10
-2
SimpleTaskForm.tsx
...omponents/Studio/StudioTree/components/SimpleTaskForm.tsx
+63
-8
data.d.ts
dlink-web/src/components/Studio/StudioTree/data.d.ts
+1
-0
index.tsx
dlink-web/src/pages/SettingCenter/UDFTemplate/index.tsx
+9
-9
No files found.
dlink-admin/src/main/java/com/dlink/controller/UDFController.java
View file @
7d66ec37
...
@@ -25,7 +25,10 @@ import com.dlink.model.UDFTemplate;
...
@@ -25,7 +25,10 @@ import com.dlink.model.UDFTemplate;
import
com.dlink.service.UDFTemplateService
;
import
com.dlink.service.UDFTemplateService
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
...
@@ -38,6 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
...
@@ -38,6 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.lang.Dict
;
import
cn.hutool.core.util.StrUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
/**
/**
...
@@ -52,6 +58,37 @@ public class UDFController {
...
@@ -52,6 +58,37 @@ public class UDFController {
@Resource
@Resource
UDFTemplateService
udfTemplateService
;
UDFTemplateService
udfTemplateService
;
@PostMapping
(
"/template/tree"
)
public
Result
<
List
<
Object
>>
listUdfTemplates
()
{
List
<
UDFTemplate
>
list
=
udfTemplateService
.
list
();
Map
<
String
,
Dict
>
one
=
new
HashMap
<>(
3
);
Map
<
String
,
Dict
>
two
=
new
HashMap
<>(
3
);
Map
<
String
,
Dict
>
three
=
new
HashMap
<>(
3
);
Map
<
String
,
Object
>
result
=
new
HashMap
<>(
3
);
list
.
forEach
(
t
->
{
one
.
putIfAbsent
(
t
.
getCodeType
(),
Dict
.
create
().
set
(
"label"
,
t
.
getCodeType
()).
set
(
"value"
,
t
.
getCodeType
()));
two
.
putIfAbsent
(
t
.
getCodeType
()
+
t
.
getFunctionType
(),
Dict
.
create
().
set
(
"label"
,
t
.
getFunctionType
()).
set
(
"value"
,
t
.
getFunctionType
()));
three
.
putIfAbsent
(
t
.
getCodeType
()
+
t
.
getFunctionType
()
+
t
.
getId
(),
Dict
.
create
().
set
(
"label"
,
t
.
getName
()).
set
(
"value"
,
t
.
getId
()));
});
Set
<
String
>
twoKeys
=
two
.
keySet
();
Set
<
String
>
threeKeys
=
three
.
keySet
();
one
.
forEach
((
k1
,
v1
)
->
{
result
.
put
(
k1
,
v1
);
ArrayList
<
Dict
>
c1
=
new
ArrayList
<>();
v1
.
put
(
"children"
,
c1
);
twoKeys
.
stream
().
filter
(
x
->
x
.
contains
(
k1
)).
map
(
x
->
StrUtil
.
strip
(
x
,
k1
)).
forEach
(
k2
->
{
Dict
v2
=
two
.
get
(
k1
+
k2
);
c1
.
add
(
v2
);
ArrayList
<
Dict
>
c2
=
new
ArrayList
<>();
v2
.
put
(
"children"
,
c2
);
threeKeys
.
stream
().
filter
(
x
->
x
.
contains
(
k1
+
k2
)).
map
(
x
->
StrUtil
.
strip
(
x
,
k1
+
k2
)).
forEach
(
k3
->
{
c2
.
add
(
three
.
get
(
k1
+
k2
+
k3
));
});
});
});
return
Result
.
succeed
(
CollUtil
.
newArrayList
(
result
.
values
()));
}
@PostMapping
(
"/template/list"
)
@PostMapping
(
"/template/list"
)
public
ProTableResult
<
UDFTemplate
>
listUdfTemplates
(
@RequestBody
JsonNode
para
)
{
public
ProTableResult
<
UDFTemplate
>
listUdfTemplates
(
@RequestBody
JsonNode
para
)
{
return
udfTemplateService
.
selectForProTable
(
para
);
return
udfTemplateService
.
selectForProTable
(
para
);
...
...
dlink-admin/src/main/java/com/dlink/dto/CatalogueTaskDTO.java
View file @
7d66ec37
...
@@ -21,6 +21,9 @@ package com.dlink.dto;
...
@@ -21,6 +21,9 @@ package com.dlink.dto;
import
com.dlink.config.Dialect
;
import
com.dlink.config.Dialect
;
import
java.util.HashMap
;
import
java.util.Map
;
import
lombok.Getter
;
import
lombok.Getter
;
import
lombok.Setter
;
import
lombok.Setter
;
...
@@ -40,4 +43,5 @@ public class CatalogueTaskDTO {
...
@@ -40,4 +43,5 @@ public class CatalogueTaskDTO {
private
String
name
;
private
String
name
;
private
String
alias
;
private
String
alias
;
private
String
dialect
=
Dialect
.
DEFAULT
.
getValue
();
private
String
dialect
=
Dialect
.
DEFAULT
.
getValue
();
private
Map
<
String
,
String
>
config
=
new
HashMap
<>();
}
}
dlink-admin/src/main/java/com/dlink/service/impl/CatalogueServiceImpl.java
View file @
7d66ec37
...
@@ -36,6 +36,7 @@ import com.dlink.service.StatementService;
...
@@ -36,6 +36,7 @@ import com.dlink.service.StatementService;
import
com.dlink.service.TaskService
;
import
com.dlink.service.TaskService
;
import
com.dlink.service.TaskVersionService
;
import
com.dlink.service.TaskVersionService
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -83,6 +84,7 @@ public class CatalogueServiceImpl extends SuperServiceImpl<CatalogueMapper, Cata
...
@@ -83,6 +84,7 @@ public class CatalogueServiceImpl extends SuperServiceImpl<CatalogueMapper, Cata
task
.
setName
(
catalogueTaskDTO
.
getName
());
task
.
setName
(
catalogueTaskDTO
.
getName
());
task
.
setAlias
(
catalogueTaskDTO
.
getAlias
());
task
.
setAlias
(
catalogueTaskDTO
.
getAlias
());
task
.
setDialect
(
catalogueTaskDTO
.
getDialect
());
task
.
setDialect
(
catalogueTaskDTO
.
getDialect
());
task
.
setConfig
(
Collections
.
singletonList
(
catalogueTaskDTO
.
getConfig
()));
taskService
.
saveOrUpdateTask
(
task
);
taskService
.
saveOrUpdateTask
(
task
);
Catalogue
catalogue
=
new
Catalogue
();
Catalogue
catalogue
=
new
Catalogue
();
catalogue
.
setTenantId
(
catalogueTaskDTO
.
getTenantId
());
catalogue
.
setTenantId
(
catalogueTaskDTO
.
getTenantId
());
...
...
dlink-admin/src/main/java/com/dlink/service/impl/TaskServiceImpl.java
View file @
7d66ec37
...
@@ -74,6 +74,7 @@ import com.dlink.model.TaskOperatingSavepointSelect;
...
@@ -74,6 +74,7 @@ import com.dlink.model.TaskOperatingSavepointSelect;
import
com.dlink.model.TaskOperatingStatus
;
import
com.dlink.model.TaskOperatingStatus
;
import
com.dlink.model.TaskVersion
;
import
com.dlink.model.TaskVersion
;
import
com.dlink.model.UDFPath
;
import
com.dlink.model.UDFPath
;
import
com.dlink.model.UDFTemplate
;
import
com.dlink.result.SqlExplainResult
;
import
com.dlink.result.SqlExplainResult
;
import
com.dlink.result.TaskOperatingResult
;
import
com.dlink.result.TaskOperatingResult
;
import
com.dlink.service.AlertGroupService
;
import
com.dlink.service.AlertGroupService
;
...
@@ -92,6 +93,7 @@ import com.dlink.service.StatementService;
...
@@ -92,6 +93,7 @@ import com.dlink.service.StatementService;
import
com.dlink.service.TaskService
;
import
com.dlink.service.TaskService
;
import
com.dlink.service.TaskVersionService
;
import
com.dlink.service.TaskVersionService
;
import
com.dlink.service.UDFService
;
import
com.dlink.service.UDFService
;
import
com.dlink.service.UDFTemplateService
;
import
com.dlink.utils.CustomStringJavaCompiler
;
import
com.dlink.utils.CustomStringJavaCompiler
;
import
com.dlink.utils.JSONUtil
;
import
com.dlink.utils.JSONUtil
;
import
com.dlink.utils.UDFUtil
;
import
com.dlink.utils.UDFUtil
;
...
@@ -134,6 +136,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
...
@@ -134,6 +136,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
import
com.fasterxml.jackson.databind.node.ObjectNode
;
import
com.fasterxml.jackson.databind.node.ObjectNode
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.lang.tree.Tree
;
import
cn.hutool.core.lang.tree.Tree
;
import
cn.hutool.core.lang.tree.TreeNode
;
import
cn.hutool.core.lang.tree.TreeNode
;
import
cn.hutool.core.lang.tree.TreeUtil
;
import
cn.hutool.core.lang.tree.TreeUtil
;
...
@@ -175,6 +178,8 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
...
@@ -175,6 +178,8 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
private
CatalogueService
catalogueService
;
private
CatalogueService
catalogueService
;
@Autowired
@Autowired
private
FragmentVariableService
fragmentVariableService
;
private
FragmentVariableService
fragmentVariableService
;
@Autowired
private
UDFTemplateService
udfTemplateService
;
@Value
(
"${spring.datasource.driver-class-name}"
)
@Value
(
"${spring.datasource.driver-class-name}"
)
private
String
driver
;
private
String
driver
;
...
@@ -361,7 +366,17 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
...
@@ -361,7 +366,17 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
@Override
@Override
public
boolean
saveOrUpdateTask
(
Task
task
)
{
public
boolean
saveOrUpdateTask
(
Task
task
)
{
// to compiler java udf
if
(
Dialect
.
isUDF
(
task
.
getDialect
()))
{
if
(
CollUtil
.
isNotEmpty
(
task
.
getConfig
())
&&
Asserts
.
isNullString
(
task
.
getStatement
()))
{
Map
<
String
,
String
>
config
=
task
.
getConfig
().
get
(
0
);
UDFTemplate
template
=
udfTemplateService
.
getById
(
config
.
get
(
"templateId"
));
if
(
template
!=
null
)
{
String
code
=
UDFUtil
.
templateParse
(
task
.
getDialect
(),
template
.
getTemplateCode
(),
config
.
get
(
"className"
));
task
.
setStatement
(
code
);
}
}
}
// to compiler udf
if
(
Asserts
.
isNotNullString
(
task
.
getDialect
())
&&
Dialect
.
JAVA
.
equalsVal
(
task
.
getDialect
())
if
(
Asserts
.
isNotNullString
(
task
.
getDialect
())
&&
Dialect
.
JAVA
.
equalsVal
(
task
.
getDialect
())
&&
Asserts
.
isNotNullString
(
task
.
getStatement
()))
{
&&
Asserts
.
isNotNullString
(
task
.
getStatement
()))
{
CustomStringJavaCompiler
compiler
=
new
CustomStringJavaCompiler
(
task
.
getStatement
());
CustomStringJavaCompiler
compiler
=
new
CustomStringJavaCompiler
(
task
.
getStatement
());
...
@@ -371,6 +386,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
...
@@ -371,6 +386,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
}
else
{
}
else
{
task
.
setSavePointPath
(
UDFUtil
.
getScalaFullClassName
(
task
.
getStatement
()));
task
.
setSavePointPath
(
UDFUtil
.
getScalaFullClassName
(
task
.
getStatement
()));
}
}
// if modify task else create task
// if modify task else create task
if
(
task
.
getId
()
!=
null
)
{
if
(
task
.
getId
()
!=
null
)
{
Task
taskInfo
=
getById
(
task
.
getId
());
Task
taskInfo
=
getById
(
task
.
getId
());
...
@@ -486,7 +502,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
...
@@ -486,7 +502,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
@Override
@Override
public
Task
getUDFByClassName
(
String
className
)
{
public
Task
getUDFByClassName
(
String
className
)
{
Task
task
=
getOne
(
Task
task
=
getOne
(
new
QueryWrapper
<
Task
>().
in
(
"dialect"
,
"Java"
,
"Python"
,
"Scala"
).
eq
(
"enabled"
,
1
).
eq
(
"save_point_path"
,
className
));
new
QueryWrapper
<
Task
>().
in
(
"dialect"
,
Dialect
.
JAVA
,
Dialect
.
SCALA
,
Dialect
.
PYTHON
).
eq
(
"enabled"
,
1
).
eq
(
"save_point_path"
,
className
));
Assert
.
check
(
task
);
Assert
.
check
(
task
);
task
.
setStatement
(
statementService
.
getById
(
task
.
getId
()).
getStatement
());
task
.
setStatement
(
statementService
.
getById
(
task
.
getId
()).
getStatement
());
return
task
;
return
task
;
...
@@ -495,7 +511,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
...
@@ -495,7 +511,7 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
@Override
@Override
public
List
<
Task
>
getAllUDF
()
{
public
List
<
Task
>
getAllUDF
()
{
List
<
Task
>
tasks
=
List
<
Task
>
tasks
=
list
(
new
QueryWrapper
<
Task
>().
in
(
"dialect"
,
"Java"
,
"Python"
,
"Scala"
).
eq
(
"enabled"
,
1
).
isNotNull
(
"save_point_path"
));
list
(
new
QueryWrapper
<
Task
>().
in
(
"dialect"
,
Dialect
.
JAVA
,
Dialect
.
SCALA
,
Dialect
.
PYTHON
).
eq
(
"enabled"
,
1
).
isNotNull
(
"save_point_path"
));
return
tasks
.
stream
().
peek
(
task
->
{
return
tasks
.
stream
().
peek
(
task
->
{
Assert
.
check
(
task
);
Assert
.
check
(
task
);
task
.
setStatement
(
statementService
.
getById
(
task
.
getId
()).
getStatement
());
task
.
setStatement
(
statementService
.
getById
(
task
.
getId
()).
getStatement
());
...
...
dlink-core/pom.xml
View file @
7d66ec37
...
@@ -38,6 +38,10 @@
...
@@ -38,6 +38,10 @@
<groupId>
com.dlink
</groupId>
<groupId>
com.dlink
</groupId>
<artifactId>
dlink-common
</artifactId>
<artifactId>
dlink-common
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.freemarker
</groupId>
<artifactId>
freemarker
</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>
com.fasterxml.jackson.core
</groupId>
<groupId>
com.fasterxml.jackson.core
</groupId>
<artifactId>
jackson-annotations
</artifactId>
<artifactId>
jackson-annotations
</artifactId>
...
...
dlink-core/src/main/java/com/dlink/config/Dialect.java
View file @
7d66ec37
...
@@ -28,8 +28,8 @@ import com.dlink.assertion.Asserts;
...
@@ -28,8 +28,8 @@ import com.dlink.assertion.Asserts;
* @since 2021/12/13
* @since 2021/12/13
**/
**/
public
enum
Dialect
{
public
enum
Dialect
{
//
FLINKSQL
(
"FlinkSql"
),
FLINKJAR
(
"FlinkJar"
),
FLINKSQLENV
(
"FlinkSqlEnv"
),
SQL
(
"Sql"
),
JAVA
(
"Java"
),
PYTHON
(
"PYTHON
"
),
FLINKSQL
(
"FlinkSql"
),
FLINKJAR
(
"FlinkJar"
),
FLINKSQLENV
(
"FlinkSqlEnv"
),
SQL
(
"Sql"
),
JAVA
(
"Java"
),
PYTHON
(
"Python"
),
SCALA
(
"Scala
"
),
MYSQL
(
"Mysql"
),
ORACLE
(
"Oracle"
),
SQLSERVER
(
"SqlServer"
),
POSTGRESQL
(
"PostgreSql"
),
CLICKHOUSE
(
"ClickHouse"
),
MYSQL
(
"Mysql"
),
ORACLE
(
"Oracle"
),
SQLSERVER
(
"SqlServer"
),
POSTGRESQL
(
"PostgreSql"
),
CLICKHOUSE
(
"ClickHouse"
),
DORIS
(
"Doris"
),
PHOENIX
(
"Phoenix"
),
HIVE
(
"Hive"
),
STARROCKS
(
"StarRocks"
),
KUBERNETES_APPLICATION
(
"KubernetesApplaction"
);
DORIS
(
"Doris"
),
PHOENIX
(
"Phoenix"
),
HIVE
(
"Hive"
),
STARROCKS
(
"StarRocks"
),
KUBERNETES_APPLICATION
(
"KubernetesApplaction"
);
...
@@ -82,5 +82,17 @@ public enum Dialect {
...
@@ -82,5 +82,17 @@ public enum Dialect {
return
false
;
return
false
;
}
}
}
}
public
static
boolean
isUDF
(
String
value
)
{
Dialect
dialect
=
Dialect
.
get
(
value
);
switch
(
dialect
)
{
case
JAVA:
case
SCALA:
case
PYTHON:
return
true
;
default
:
return
false
;
}
}
}
}
dlink-core/src/main/java/com/dlink/utils/UDFUtil.java
View file @
7d66ec37
...
@@ -19,6 +19,8 @@
...
@@ -19,6 +19,8 @@
package
com
.
dlink
.
utils
;
package
com
.
dlink
.
utils
;
import
com.dlink.assertion.Asserts
;
import
com.dlink.config.Dialect
;
import
com.dlink.constant.PathConstant
;
import
com.dlink.constant.PathConstant
;
import
com.dlink.pool.ClassEntity
;
import
com.dlink.pool.ClassEntity
;
import
com.dlink.pool.ClassPool
;
import
com.dlink.pool.ClassPool
;
...
@@ -49,12 +51,16 @@ import org.slf4j.LoggerFactory;
...
@@ -49,12 +51,16 @@ import org.slf4j.LoggerFactory;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.lang.Dict
;
import
cn.hutool.core.lang.Opt
;
import
cn.hutool.core.lang.Opt
;
import
cn.hutool.core.lang.PatternPool
;
import
cn.hutool.core.lang.PatternPool
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.util.ReUtil
;
import
cn.hutool.core.util.ReUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.crypto.digest.MD5
;
import
cn.hutool.crypto.digest.MD5
;
import
cn.hutool.extra.template.TemplateConfig
;
import
cn.hutool.extra.template.TemplateEngine
;
import
cn.hutool.extra.template.TemplateUtil
;
import
groovy.lang.GroovyClassLoader
;
import
groovy.lang.GroovyClassLoader
;
/**
/**
...
@@ -76,6 +82,37 @@ public class UDFUtil {
...
@@ -76,6 +82,37 @@ public class UDFUtil {
public
static
final
String
PYTHON_UDF_DEF
=
"@ud(?:f|tf|af|taf).*\\n+def\\s+(.*)\\(.*\\):"
;
public
static
final
String
PYTHON_UDF_DEF
=
"@ud(?:f|tf|af|taf).*\\n+def\\s+(.*)\\(.*\\):"
;
public
static
final
String
SCALA_UDF_CLASS
=
"class\\s+(\\w+)(\\s*\\(.*\\)){0,1}\\s+extends"
;
public
static
final
String
SCALA_UDF_CLASS
=
"class\\s+(\\w+)(\\s*\\(.*\\)){0,1}\\s+extends"
;
public
static
final
String
SCALA_UDF_PACKAGE
=
"package\\s+(.*);"
;
public
static
final
String
SCALA_UDF_PACKAGE
=
"package\\s+(.*);"
;
private
static
final
TemplateEngine
ENGINE
=
TemplateUtil
.
createEngine
(
new
TemplateConfig
());
/**
* 模板解析
*
* @param dialect 方言
* @param template 模板
* @param className 类名
* @return {@link String}
*/
public
static
String
templateParse
(
String
dialect
,
String
template
,
String
className
)
{
List
<
String
>
split
=
StrUtil
.
split
(
className
,
"."
);
switch
(
Dialect
.
get
(
dialect
))
{
case
JAVA:
case
SCALA:
String
clazz
=
CollUtil
.
getLast
(
split
);
String
packageName
=
StrUtil
.
strip
(
className
,
clazz
);
Dict
data
=
Dict
.
create
()
.
set
(
"className"
,
clazz
)
.
set
(
"package"
,
Asserts
.
isNullString
(
packageName
)
?
""
:
StrUtil
.
strip
(
packageName
,
"."
));
return
ENGINE
.
getTemplate
(
template
).
render
(
data
);
case
PYTHON:
default
:
String
clazzName
=
split
.
get
(
0
);
Dict
data2
=
Dict
.
create
()
.
set
(
"className"
,
clazzName
)
.
set
(
"attr"
,
split
.
size
()
>
1
?
split
.
get
(
1
)
:
null
);
return
ENGINE
.
getTemplate
(
template
).
render
(
data2
);
}
}
public
static
List
<
UDF
>
getUDF
(
String
statement
)
{
public
static
List
<
UDF
>
getUDF
(
String
statement
)
{
ProcessEntity
process
=
ProcessContextHolder
.
getProcess
();
ProcessEntity
process
=
ProcessContextHolder
.
getProcess
();
...
...
dlink-doc/sql/upgrade/0.6.8_schema/mysql/dinky_dml.sql
View file @
7d66ec37
...
@@ -58,9 +58,17 @@ VALUES (1, 1, 1, current_time, current_time);
...
@@ -58,9 +58,17 @@ VALUES (1, 1, 1, current_time, current_time);
-- Records of dlink_udf_template
-- Records of dlink_udf_template
-- ----------------------------
-- ----------------------------
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
VALUES
(
1
,
'java_udf'
,
'
java'
,
'UDF'
,
'package ${package};
\n\n
import org.apache.flink.table.functions.ScalarFunction;
\n\n
public class ${className} extends ScalarFunction {
\n
public String eval(String s) {
\n
return null;
\n
}
\n
}'
,
NULL
,
'2022-10-19 09:17:37'
,
'2022-10-19 09:17:3
7'
);
VALUES
(
1
,
'java_udf'
,
'
Java'
,
'UDF'
,
'${(package==
\'\'
)?string(
\'\'
,
\'
package
\'
+package+
\'
;
\'
)}
\n\n
import org.apache.flink.table.functions.ScalarFunction;
\n\n
public class ${className} extends ScalarFunction {
\n
public String eval(String s) {
\n
return null;
\n
}
\n
}'
,
NULL
,
'2022-10-19 09:17:37'
,
'2022-10-25 17:45:5
7'
);
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
VALUES
(
2
,
'java_udtf'
,
'
java'
,
'UDTF'
,
'package ${package};
\n\n
import org.apache.flink.table.functions.ScalarFunction;
\n\n
@FunctionHint(output = @DataTypeHint(
\"
ROW<word STRING, length INT>
\"
))
\n
public static class ${className} extends TableFunction<Row> {
\n\n
public void eval(String str) {
\n
for (String s : str.split(
\"
\"
)) {
\n
// use collect(...) to emit a row
\n
collect(Row.of(s, s.length()));
\n
}
\n
}
\n
}'
,
NULL
,
'2022-10-19 09:22:58'
,
'2022-10-19 10:01:57
'
);
VALUES
(
2
,
'java_udtf'
,
'
Java'
,
'UDTF'
,
'${(package==
\'\'
)?string(
\'\'
,
\'
package
\'
+package+
\'
;
\'
)}
\n\n
import org.apache.flink.table.functions.ScalarFunction;
\n\n
@FunctionHint(output = @DataTypeHint(
\"
ROW<word STRING, length INT>
\"
))
\n
public static class ${className} extends TableFunction<Row> {
\n\n
public void eval(String str) {
\n
for (String s : str.split(
\"
\"
)) {
\n
// use collect(...) to emit a row
\n
collect(Row.of(s, s.length()));
\n
}
\n
}
\n
}'
,
NULL
,
'2022-10-19 09:22:58'
,
'2022-10-25 17:49:30
'
);
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
VALUES
(
3
,
'scala_udf'
,
'Scala'
,
'UDF'
,
'${(package==
\'\'
)?string(
\'\'
,
\'
package
\'
+package+
\'
;
\'
)}
\n\n
import org.apache.flink.table.api._
\n
import org.apache.flink.table.functions.ScalarFunction
\n\n
// 定义可参数化的函数逻辑
\n
class ${className} extends ScalarFunction {
\n
def eval(s: String, begin: Integer, end: Integer): String = {
\n
\"
this is scala
\"\n
}
\n
}'
,
NULL
,
'2022-10-25 09:21:32'
,
'2022-10-25 17:49:46'
);
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
VALUES
(
4
,
'python_udf_1'
,
'Python'
,
'UDF'
,
'from pyflink.table import ScalarFunction, DataTypes
\n
from pyflink.table.udf import udf
\n\n
class ${className}(ScalarFunction):
\n
def __init__(self):
\n
pass
\n\n
def eval(self, variable):
\n
return str(variable)
\n\n\n
${attr!
\'
f
\'
} = udf(HashCode(), result_type=DataTypes.STRING())'
,
NULL
,
'2022-10-25 09:23:07'
,
'2022-10-25 09:34:01'
);
INSERT
INTO
`dlink_udf_template`
(
`id`
,
`name`
,
`code_type`
,
`function_type`
,
`template_code`
,
`enabled`
,
`create_time`
,
`update_time`
)
VALUES
(
5
,
'python_udf_2'
,
'Python'
,
'UDF'
,
'from pyflink.table import DataTypes
\n
from pyflink.table.udf import udf
\n\n
@udf(result_type=DataTypes.STRING())
\n
def ${className}(variable1:string):
\n
return
\'\'
'
,
NULL
,
'2022-10-25 09:25:13'
,
'2022-10-25 09:34:47'
);
dlink-web/src/components/Studio/StudioTree/components/SimpleTaskForm.tsx
View file @
7d66ec37
...
@@ -18,12 +18,13 @@
...
@@ -18,12 +18,13 @@
*/
*/
import
React
,
{
useState
}
from
'react'
;
import
React
,
{
use
Effect
,
use
State
}
from
'react'
;
import
{
Button
,
Form
,
Input
,
Modal
,
Select
}
from
'antd'
;
import
{
Button
,
Form
,
Input
,
Modal
,
Select
,
Cascader
}
from
'antd'
;
import
type
{
TaskTableListItem
}
from
'../data.d'
;
import
type
{
TaskTableListItem
}
from
'../data.d'
;
import
{
DIALECT
}
from
"@/components/Studio/conf"
;
import
{
DIALECT
}
from
"@/components/Studio/conf"
;
import
{
useIntl
}
from
"umi"
;
import
{
useIntl
}
from
"umi"
;
import
{
postAll
,
postDataArray
}
from
"@/components/Common/crud"
;
const
{
Option
}
=
Select
;
const
{
Option
}
=
Select
;
...
@@ -32,6 +33,7 @@ export type UpdateFormProps = {
...
@@ -32,6 +33,7 @@ export type UpdateFormProps = {
onSubmit
:
(
values
:
Partial
<
TaskTableListItem
>
)
=>
void
;
onSubmit
:
(
values
:
Partial
<
TaskTableListItem
>
)
=>
void
;
updateModalVisible
:
boolean
;
updateModalVisible
:
boolean
;
isCreate
:
boolean
;
isCreate
:
boolean
;
dialect
:
string
;
values
:
Partial
<
TaskTableListItem
>
;
values
:
Partial
<
TaskTableListItem
>
;
};
};
...
@@ -39,21 +41,37 @@ const formLayout = {
...
@@ -39,21 +41,37 @@ const formLayout = {
labelCol
:
{
span
:
7
},
labelCol
:
{
span
:
7
},
wrapperCol
:
{
span
:
13
},
wrapperCol
:
{
span
:
13
},
};
};
const
isUDF
=
(
dialect
:
string
)
=>
{
return
(
dialect
==
DIALECT
.
SCALA
||
dialect
==
DIALECT
.
PYTHON
||
dialect
==
DIALECT
.
JAVA
)
}
const
SimpleTaskForm
:
React
.
FC
<
UpdateFormProps
>
=
(
props
)
=>
{
const
SimpleTaskForm
:
React
.
FC
<
UpdateFormProps
>
=
(
props
)
=>
{
const
intl
=
useIntl
();
const
intl
=
useIntl
();
const
l
=
(
id
:
string
,
defaultMessage
?:
string
,
value
?:
{})
=>
intl
.
formatMessage
({
id
,
defaultMessage
},
value
);
const
l
=
(
id
:
string
,
defaultMessage
?:
string
,
value
?:
{})
=>
intl
.
formatMessage
({
id
,
defaultMessage
},
value
);
useEffect
(()
=>
{
getTemplateTreeData
()
},
[])
const
[
formVals
,
setFormVals
]
=
useState
<
Partial
<
TaskTableListItem
>>
({
const
[
formVals
,
setFormVals
]
=
useState
<
Partial
<
TaskTableListItem
>>
({
id
:
props
.
values
.
id
,
id
:
props
.
values
.
id
,
name
:
props
.
values
.
name
,
name
:
props
.
values
.
name
,
alias
:
props
.
values
.
alias
,
alias
:
props
.
values
.
alias
,
parentId
:
props
.
values
.
parentId
,
parentId
:
props
.
values
.
parentId
,
config
:
props
.
values
.
config
,
});
});
const
[
dialect
,
setDialect
]
=
useState
<
string
>
(
''
)
const
[
templateTree
,
setTemplateTree
]
=
useState
<
Array
<
Object
>>
([])
const
[
templateData
,
setTemplateData
]
=
useState
<
Array
<
Object
>>
([])
const
[
defaultTemplateData
,
setDefaultTemplateData
]
=
useState
<
Array
<
Object
>>
([])
const
[
form
]
=
Form
.
useForm
();
const
[
form
]
=
Form
.
useForm
();
const
getTemplateTreeData
=
async
()
=>
{
const
resp
=
await
postAll
(
"/api/udf/template/tree"
)
setTemplateTree
(
resp
.
datas
)
}
const
{
const
{
onSubmit
:
handleUpdate
,
onSubmit
:
handleUpdate
,
onCancel
:
handleUpdateModalVisible
,
onCancel
:
handleUpdateModalVisible
,
...
@@ -62,11 +80,31 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
...
@@ -62,11 +80,31 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
isCreate
,
isCreate
,
}
=
props
;
}
=
props
;
const
submitForm
=
async
()
=>
{
const
submitForm
=
async
()
=>
{
const
fieldsValue
=
await
form
.
validateFields
();
const
fieldsValue
=
await
form
.
validateFields
();
setFormVals
({...
formVals
,
...
fieldsValue
});
const
data
=
{...
formVals
,
...
fieldsValue
};
handleUpdate
({...
formVals
,
...
fieldsValue
});
try
{
data
.
config
=
{
templateId
:
String
(
data
[
'config.templateId'
][
1
]),
className
:
data
[
'config.className'
],
}
}
catch
(
e
)
{
}
setFormVals
(
data
);
handleUpdate
(
data
);
};
};
const
handlerSetDialect
=
(
value
:
string
)
=>
{
setDialect
(
value
)
if
(
isUDF
(
value
))
{
templateTree
.
map
(
x
=>
{
if
(
x
.
label
==
value
)
{
setTemplateData
(
x
.
children
)
setDefaultTemplateData
([
x
.
children
[
0
].
label
,
x
.
children
[
0
].
children
[
0
].
label
])
}
})
}
}
const
renderContent
=
()
=>
{
const
renderContent
=
()
=>
{
return
(
return
(
...
@@ -75,7 +113,7 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
...
@@ -75,7 +113,7 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
label=
"作业类型"
name=
"dialect"
label=
"作业类型"
name=
"dialect"
tooltip=
'指定作业类型,默认为 FlinkSql'
tooltip=
'指定作业类型,默认为 FlinkSql'
>
>
<
Select
defaultValue=
{
DIALECT
.
FLINKSQL
}
value=
{
DIALECT
.
FLINKSQL
}
>
<
Select
defaultValue=
{
DIALECT
.
FLINKSQL
}
value=
{
DIALECT
.
FLINKSQL
}
onChange=
{
handlerSetDialect
}
>
<
Option
value=
{
DIALECT
.
FLINKSQL
}
>
{
DIALECT
.
FLINKSQL
}
</
Option
>
<
Option
value=
{
DIALECT
.
FLINKSQL
}
>
{
DIALECT
.
FLINKSQL
}
</
Option
>
<
Option
value=
{
DIALECT
.
KUBERNETES_APPLICATION
}
>
{
DIALECT
.
KUBERNETES_APPLICATION
}
</
Option
>
<
Option
value=
{
DIALECT
.
KUBERNETES_APPLICATION
}
>
{
DIALECT
.
KUBERNETES_APPLICATION
}
</
Option
>
<
Option
value=
{
DIALECT
.
FLINKJAR
}
>
{
DIALECT
.
FLINKJAR
}
</
Option
>
<
Option
value=
{
DIALECT
.
FLINKJAR
}
>
{
DIALECT
.
FLINKJAR
}
</
Option
>
...
@@ -89,9 +127,9 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
...
@@ -89,9 +127,9 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
<
Option
value=
{
DIALECT
.
HIVE
}
>
{
DIALECT
.
HIVE
}
</
Option
>
<
Option
value=
{
DIALECT
.
HIVE
}
>
{
DIALECT
.
HIVE
}
</
Option
>
<
Option
value=
{
DIALECT
.
PHOENIX
}
>
{
DIALECT
.
PHOENIX
}
</
Option
>
<
Option
value=
{
DIALECT
.
PHOENIX
}
>
{
DIALECT
.
PHOENIX
}
</
Option
>
<
Option
value=
{
DIALECT
.
STARROCKS
}
>
{
DIALECT
.
STARROCKS
}
</
Option
>
<
Option
value=
{
DIALECT
.
STARROCKS
}
>
{
DIALECT
.
STARROCKS
}
</
Option
>
<
Option
value=
{
DIALECT
.
JAVA
}
>
{
DIALECT
.
JAVA
}
</
Option
>
<
Option
key=
{
DIALECT
.
JAVA
}
value=
{
DIALECT
.
JAVA
}
>
{
DIALECT
.
JAVA
}
</
Option
>
<
Option
value=
{
DIALECT
.
SCALA
}
>
{
DIALECT
.
SCALA
}
</
Option
>
<
Option
key=
{
DIALECT
.
SCALA
}
value=
{
DIALECT
.
SCALA
}
>
{
DIALECT
.
SCALA
}
</
Option
>
<
Option
value=
{
DIALECT
.
PYTHON
}
>
{
DIALECT
.
PYTHON
}
</
Option
>
<
Option
key=
{
DIALECT
.
PYTHON
}
value=
{
DIALECT
.
PYTHON
}
>
{
DIALECT
.
PYTHON
}
</
Option
>
<
Option
value=
{
DIALECT
.
SQL
}
>
{
DIALECT
.
SQL
}
</
Option
>
<
Option
value=
{
DIALECT
.
SQL
}
>
{
DIALECT
.
SQL
}
</
Option
>
</
Select
>
</
Select
>
</
Form
.
Item
>)
:
undefined
}
</
Form
.
Item
>)
:
undefined
}
...
@@ -107,6 +145,23 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
...
@@ -107,6 +145,23 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
rules=
{
[{
required
:
true
,
message
:
'请输入别名!'
}]
}
>
rules=
{
[{
required
:
true
,
message
:
'请输入别名!'
}]
}
>
<
Input
placeholder=
"请输入"
/>
<
Input
placeholder=
"请输入"
/>
</
Form
.
Item
>
</
Form
.
Item
>
{
isUDF
(
dialect
)
?
(<>
<
Form
.
Item
name=
"config.templateId"
label=
"udf 模板"
rules=
{
[{
required
:
true
,
message
:
'请选择udf模板!'
}]
}
>
{
<
Cascader
value=
{
defaultTemplateData
}
options=
{
templateData
}
/>
}
</
Form
.
Item
>
<
Form
.
Item
name=
"config.className"
label=
"类名或方法名"
rules=
{
[{
required
:
true
,
message
:
'请输入类名或方法名!'
}]
}
>
<
Input
placeholder=
"请输入"
/>
</
Form
.
Item
>
</>)
:
undefined
}
</>
</>
);
);
};
};
...
...
dlink-web/src/components/Studio/StudioTree/data.d.ts
View file @
7d66ec37
...
@@ -31,5 +31,6 @@ export type TaskTableListItem = {
...
@@ -31,5 +31,6 @@ export type TaskTableListItem = {
name
:
string
,
name
:
string
,
alias
:
string
,
alias
:
string
,
dialect
:
string
,
dialect
:
string
,
config
:
Object
<
string
,
object
>
,
parentId
:
number
,
parentId
:
number
,
};
};
dlink-web/src/pages/SettingCenter/UDFTemplate/index.tsx
View file @
7d66ec37
...
@@ -28,10 +28,11 @@ import 'antd/dist/antd.css';
...
@@ -28,10 +28,11 @@ import 'antd/dist/antd.css';
import
'./index.css'
;
import
'./index.css'
;
import
CodeEdit
from
"@/components/Common/CodeEdit"
;
import
CodeEdit
from
"@/components/Common/CodeEdit"
;
import
{
useIntl
}
from
"umi"
;
import
{
useIntl
}
from
"umi"
;
import
{
DIALECT
}
from
"@/components/Studio/conf"
;
const
{
Option
}
=
Select
;
const
{
Option
}
=
Select
;
const
UDFTemplate
:
React
.
FC
<
{}
>
=
(
props
)
=>
{
const
UDFTemplate
:
React
.
FC
<
{}
>
=
()
=>
{
const
[
open
,
setOpen
]
=
useState
(
false
);
const
[
open
,
setOpen
]
=
useState
(
false
);
...
@@ -89,7 +90,6 @@ const UDFTemplate: React.FC<{}> = (props) => {
...
@@ -89,7 +90,6 @@ const UDFTemplate: React.FC<{}> = (props) => {
title=
{
(
tModel
.
id
?
'修改'
:
'添加'
)
+
"UDF模板"
}
title=
{
(
tModel
.
id
?
'修改'
:
'添加'
)
+
"UDF模板"
}
width=
{
720
}
width=
{
720
}
onClose=
{
onClose
}
onClose=
{
onClose
}
open=
{
open
}
extra=
{
extra=
{
<
Space
>
<
Space
>
<
Button
onClick=
{
onClose
}
>
{
l
(
'button.cancel'
)
}
</
Button
>
<
Button
onClick=
{
onClose
}
>
{
l
(
'button.cancel'
)
}
</
Button
>
...
@@ -119,9 +119,9 @@ const UDFTemplate: React.FC<{}> = (props) => {
...
@@ -119,9 +119,9 @@ const UDFTemplate: React.FC<{}> = (props) => {
rules=
{
[{
required
:
true
,
message
:
'请选择代码类型'
}]
}
rules=
{
[{
required
:
true
,
message
:
'请选择代码类型'
}]
}
>
>
<
Select
placeholder=
"请选择代码类型"
>
<
Select
placeholder=
"请选择代码类型"
>
<
Option
value=
"java"
>
java
</
Option
>
<
Option
value=
{
DIALECT
.
JAVA
}
>
{
DIALECT
.
JAVA
}
</
Option
>
<
Option
value=
"python"
>
python
</
Option
>
<
Option
value=
{
DIALECT
.
SCALA
}
>
{
DIALECT
.
SCALA
}
</
Option
>
<
Option
value=
"scala"
>
scala
</
Option
>
<
Option
value=
{
DIALECT
.
PYTHON
}
>
{
DIALECT
.
PYTHON
}
</
Option
>
</
Select
>
</
Select
>
</
Form
.
Item
>
</
Form
.
Item
>
</
Col
>
</
Col
>
...
@@ -166,8 +166,8 @@ const UDFTemplate: React.FC<{}> = (props) => {
...
@@ -166,8 +166,8 @@ const UDFTemplate: React.FC<{}> = (props) => {
const
deleteUDFTemplate
=
(
id
:
number
)
=>
{
const
deleteUDFTemplate
=
(
id
:
number
)
=>
{
Modal
.
confirm
({
Modal
.
confirm
({
title
:
'删除
集群
'
,
title
:
'删除
模板
'
,
content
:
'确定删除该
集群
吗?'
,
content
:
'确定删除该
模板
吗?'
,
okText
:
l
(
'button.confirm'
),
okText
:
l
(
'button.confirm'
),
cancelText
:
l
(
'button.cancel'
),
cancelText
:
l
(
'button.cancel'
),
onOk
:
async
()
=>
{
onOk
:
async
()
=>
{
...
@@ -230,7 +230,7 @@ const UDFTemplate: React.FC<{}> = (props) => {
...
@@ -230,7 +230,7 @@ const UDFTemplate: React.FC<{}> = (props) => {
},
{
},
{
title
:
l
(
'global.table.operate'
),
title
:
l
(
'global.table.operate'
),
key
:
'action'
,
key
:
'action'
,
render
:
(
text
,
record
,
_
,
action
)
=>
(
render
:
(
text
,
record
)
=>
(
<
Space
size=
"middle"
>
<
Space
size=
"middle"
>
<
Button
type=
"primary"
icon=
{
<
FormOutlined
/>
}
onClick=
{
()
=>
changeModel
(
record
)
}
></
Button
>
<
Button
type=
"primary"
icon=
{
<
FormOutlined
/>
}
onClick=
{
()
=>
changeModel
(
record
)
}
></
Button
>
<
Button
type=
"primary"
icon=
{
<
DeleteOutlined
/>
}
onClick=
{
()
=>
{
<
Button
type=
"primary"
icon=
{
<
DeleteOutlined
/>
}
onClick=
{
()
=>
{
...
@@ -245,7 +245,7 @@ const UDFTemplate: React.FC<{}> = (props) => {
...
@@ -245,7 +245,7 @@ const UDFTemplate: React.FC<{}> = (props) => {
<
PageContainer
title=
{
false
}
>
<
PageContainer
title=
{
false
}
>
{
<
Box
/>
}
{
<
Box
/>
}
<
ProTable
<
ProTable
request=
{
(
params
,
sorter
,
filter
)
=>
getTemplate
()
}
request=
{
()
=>
getTemplate
()
}
columns=
{
columns
}
columns=
{
columns
}
search=
{
false
}
search=
{
false
}
toolBarRender=
{
()
=>
[
toolBarRender=
{
()
=>
[
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment