Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
07a9f6a3
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
07a9f6a3
编写于
12月 09, 2018
作者:
C
Charly
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support for distribution key alters and performance optimizations
上级
827c07ec
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
201 addition
and
62 deletion
+201
-62
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java
.../dbeaver/ext/exasol/manager/ExasolTableColumnManager.java
+102
-3
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java
...l/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java
+73
-55
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java
...c/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java
+10
-0
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableColumn.java
...org/jkiss/dbeaver/ext/exasol/model/ExasolTableColumn.java
+6
-2
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java
...kiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java
+10
-2
未找到文件。
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java
浏览文件 @
07a9f6a3
...
...
@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.exasol.manager;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.ext.exasol.model.ExasolTable
;
import
org.jkiss.dbeaver.ext.exasol.model.ExasolTableBase
;
import
org.jkiss.dbeaver.ext.exasol.model.ExasolTableColumn
;
...
...
@@ -31,10 +32,13 @@ import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import
org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction
;
import
org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
org.jkiss.utils.CommonUtils
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -47,10 +51,14 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
private
static
final
String
SQL_ALTER
=
"ALTER TABLE %s MODIFY COLUMN %s "
;
private
static
final
String
SQL_COMMENT
=
"COMMENT ON COLUMN %s.%s IS '%s'"
;
private
static
final
Log
log
=
Log
.
getLog
(
ExasolTableColumnManager
.
class
);
private
static
final
String
CMD_ALTER
=
"Alter Column"
;
private
static
final
String
CMD_COMMENT
=
"Comment on Column"
;
private
static
final
String
DROP_DIST_KEY
=
"ALTER TABLE %s DROP DISTRIBUTION KEYS"
;
private
static
final
String
CREATE_DIST_KEY
=
"ALTER TABLE %s DISTRIBUTE BY %s"
;
// -----------------
...
...
@@ -92,10 +100,18 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
@Override
protected
void
addObjectModifyActions
(
DBRProgressMonitor
monitor
,
List
<
DBEPersistAction
>
actionList
,
ObjectChangeCommand
command
,
Map
<
String
,
Object
>
options
)
{
ExasolTableColumn
exasolColumn
=
command
.
getObject
();
Map
<
Object
,
Object
>
props
=
command
.
getProperties
();
if
(!
command
.
getProperties
().
isEmpty
())
{
if
(
props
.
containsKey
(
"defaultValue"
)
||
props
.
containsKey
(
"dataType"
)
||
props
.
containsKey
(
"scale"
)
||
props
.
containsKey
(
"maxLength"
)
||
props
.
containsKey
(
"autoGenerated"
)
||
props
.
containsKey
(
"identityValue"
)
||
props
.
containsKey
(
"required"
)
)
{
// build nullability tring
// build nullability
s
tring
String
nullability
=
""
;
if
(
exasolColumn
.
isOriRequired
()
!=
null
&&
exasolColumn
.
isOriRequired
()
!=
exasolColumn
.
isRequired
())
nullability
=
exasolColumn
.
isRequired
()
?
"NOT NULL"
:
"NULL"
;
...
...
@@ -110,13 +126,21 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
actionList
.
add
(
new
SQLDatabasePersistAction
(
CMD_ALTER
,
sqlAlterColumn
));
}
}
// Comment
DBEPersistAction
commentAction
=
buildCommentAction
(
exasolColumn
);
if
(
commentAction
!=
null
)
{
actionList
.
add
(
commentAction
);
}
if
(
command
.
getProperties
().
containsKey
(
"distKey"
))
{
try
{
actionList
.
addAll
(
modifyDistKey
(
exasolColumn
));
}
catch
(
DBException
e
)
{
log
.
error
(
"Failed to modify distkey settings"
,
e
);
}
}
}
private
String
formatIdentiy
(
Boolean
isAutoGenerated
,
BigDecimal
identityValue
)
...
...
@@ -190,5 +214,80 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
"ALTER TABLE "
+
exasolColumn
.
getTable
().
getFullyQualifiedName
(
DBPEvaluationContext
.
DDL
)
+
" ADD COLUMN "
+
addSQL
+
" "
)
);
if
(
exasolColumn
.
isDistKey
())
try
{
modifyDistKey
(
exasolColumn
);
}
catch
(
DBException
e
)
{
log
.
error
(
"Failed to generate distribution key"
,
e
);
}
}
/*
* handling for Distribution key
*/
private
Collection
<
String
>
removeColumnFromDistKey
(
ExasolTableColumn
exasolColumn
)
throws
DBException
{
ExasolTable
table
=
(
ExasolTable
)
exasolColumn
.
getParentObject
();
Collection
<
ExasolTableColumn
>
distKey
=
table
.
getDistributionKey
(
new
VoidProgressMonitor
());
if
(
distKey
.
size
()
==
1
)
{
}
return
null
;
}
private
SQLDatabasePersistAction
generateDropDist
(
ExasolTableColumn
exasolColumn
)
{
return
new
SQLDatabasePersistAction
(
"Drop Distribution Key"
,
String
.
format
(
DROP_DIST_KEY
,
((
ExasolTable
)
exasolColumn
.
getParentObject
()).
getFullyQualifiedName
(
DBPEvaluationContext
.
DDL
)
)
);
}
private
SQLDatabasePersistAction
generateCreateDist
(
Collection
<
ExasolTableColumn
>
distKey
)
{
ExasolTable
table
=
null
;
Collection
<
String
>
names
=
new
ArrayList
<
String
>();
for
(
ExasolTableColumn
c:
distKey
)
{
if
(
table
==
null
)
table
=
(
ExasolTable
)
c
.
getParentObject
();
names
.
add
(
c
.
getName
());
}
return
new
SQLDatabasePersistAction
(
"Create Distribution Key"
,
String
.
format
(
CREATE_DIST_KEY
,
table
.
getFullyQualifiedName
(
DBPEvaluationContext
.
DDL
),
CommonUtils
.
joinStrings
(
","
,
names
))
);
}
private
Collection
<
SQLDatabasePersistAction
>
modifyDistKey
(
ExasolTableColumn
exasolColumn
)
throws
DBException
{
ExasolTable
table
=
(
ExasolTable
)
exasolColumn
.
getParentObject
();
Collection
<
ExasolTableColumn
>
distKey
=
table
.
getDistributionKey
(
new
VoidProgressMonitor
());
Collection
<
SQLDatabasePersistAction
>
commands
=
new
ArrayList
<
SQLDatabasePersistAction
>();
if
(
table
.
getHasDistKey
(
new
VoidProgressMonitor
()))
{
commands
.
add
(
generateDropDist
(
exasolColumn
));
}
if
(!
distKey
.
isEmpty
())
commands
.
add
(
generateCreateDist
(
distKey
));
return
commands
;
}
}
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java
浏览文件 @
07a9f6a3
...
...
@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructCache;
import
org.jkiss.dbeaver.model.meta.Association
;
import
org.jkiss.dbeaver.model.meta.Property
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
org.jkiss.dbeaver.model.struct.DBSObjectState
;
import
org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey
;
...
...
@@ -44,6 +45,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.Timestamp
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Map
;
...
...
@@ -60,49 +62,52 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
private
Timestamp
createTime
;
private
Boolean
hasRead
;
private
long
tablecount
;
private
static
String
readAdditionalInfo
=
"select * from ("
+
"select"
+
" table_schema,"
+
" table_name,"
+
" table_owner,"
+
" table_has_distribution_key,"
+
" table_comment,"
+
" delete_percentage,"
+
" o.created,"
+
" o.last_commit,"
+
" s.raw_object_size,"
+
" s.mem_object_size,"
+
" s.object_type"
+
" from"
+
" EXA_ALL_OBJECTS o"
+
" inner join"
+
" EXA_ALL_TABLES T"
+
" on"
+
" o.root_name = t.table_schema and"
+
" t.table_name = o.object_name and"
+
" o.object_type = 'TABLE'"
+
" inner join "
+
" EXA_ALL_OBJECT_SIZES s"
+
" on"
+
" o.root_name = s.root_name and"
+
" o.object_name = s.object_name and"
+
" o.object_type = s.object_type"
+
" where o.root_name = '%s' and o.object_name = '%s' and t.table_schema = '%s' and t.table_name = '%s'"
+
" union all "
+
" select schema_name as table_schema,"
+
" object_name as table_name,"
+
" 'SYS' as table_owner,"
+
" false as table_has_distribution_key,"
+
" object_comment as table_comment,"
+
" 0 as delete_percentage,"
+
" cast( null as timestamp) as created,"
+
" cast( null as timestamp) as last_commit,"
+
" 0 as raw_object_size,"
+
" 0 as mem_object_size,"
+
" object_type"
+
" from SYS.EXA_SYSCAT WHERE object_type = 'TABLE' and schema_name = '%s' and object_name = '%s'"
+
") as o"
+
" order by table_schema,o.table_name"
;
private
static
String
readAdditionalInfo
=
"SELECT "
+
" * "
+
"FROM "
+
" ( "
+
" SELECT "
+
" table_schema, "
+
" table_name, "
+
" table_owner, "
+
" table_has_distribution_key, "
+
" table_comment, "
+
" delete_percentage, "
+
" o.created, "
+
" o.last_commit, "
+
" s.raw_object_size, "
+
" s.mem_object_size, "
+
" s.object_type "
+
" FROM "
+
" EXA_ALL_OBJECTS o "
+
" INNER JOIN EXA_ALL_TABLES T ON "
+
" o.object_id = t.table_object_id "
+
" INNER JOIN EXA_ALL_OBJECT_SIZES s ON "
+
" o.object_id = s.object_id "
+
" WHERE "
+
" o.object_id = %s AND o.object_id = %s AND t.table_object_id = %s "
+
"UNION ALL "
+
" SELECT "
+
" schema_name AS table_schema, "
+
" object_name AS table_name, "
+
" 'SYS' AS table_owner, "
+
" FALSE AS table_has_distribution_key, "
+
" object_comment AS table_comment, "
+
" 0 AS delete_percentage, "
+
" CAST( NULL AS TIMESTAMP) AS created, "
+
" CAST( NULL AS TIMESTAMP) AS last_commit, "
+
" 0 AS raw_object_size, "
+
" 0 AS mem_object_size, "
+
" object_type "
+
" FROM "
+
" SYS.EXA_SYSCAT "
+
" WHERE "
+
" object_type = 'TABLE' "
+
" AND schema_name = '%s' "
+
" AND object_name = '%s' ) AS o "
+
"ORDER BY "
+
" table_schema, "
+
" o.table_name"
;
private
static
String
count
=
"select count(*) as COUNTER from %s"
;
...
...
@@ -126,10 +131,9 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
try
(
JDBCStatement
stmt
=
session
.
createStatement
())
{
String
sql
=
String
.
format
(
readAdditionalInfo
,
ExasolUtils
.
quoteString
(
this
.
getSchema
().
getName
()),
ExasolUtils
.
quoteString
(
this
.
getName
()),
ExasolUtils
.
quoteString
(
this
.
getSchema
().
getName
()),
ExasolUtils
.
quoteString
(
this
.
getName
()),
this
.
getObjectId
(),
this
.
getObjectId
(),
this
.
getObjectId
(),
ExasolUtils
.
quoteString
(
this
.
getSchema
().
getName
()),
ExasolUtils
.
quoteString
(
this
.
getName
())
);
...
...
@@ -178,49 +182,49 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
// -----------------
// Properties
// -----------------
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
90
,
category
=
ExasolConstants
.
CAT_BASEOBJECT
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
90
,
category
=
ExasolConstants
.
CAT_BASEOBJECT
)
public
Boolean
getHasDistKey
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
hasDistKey
;
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
100
,
category
=
ExasolConstants
.
CAT_BASEOBJECT
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
100
,
category
=
ExasolConstants
.
CAT_BASEOBJECT
)
public
Timestamp
getLastCommit
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
lastCommit
;
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
100
,
category
=
ExasolConstants
.
CAT_DATETIME
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
100
,
category
=
ExasolConstants
.
CAT_DATETIME
)
public
Timestamp
getCreateTime
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
createTime
;
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
150
,
category
=
ExasolConstants
.
CAT_STATS
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
150
,
category
=
ExasolConstants
.
CAT_STATS
)
public
String
getRawsize
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
ExasolUtils
.
humanReadableByteCount
(
sizeRaw
,
true
);
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
200
,
category
=
ExasolConstants
.
CAT_STATS
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
200
,
category
=
ExasolConstants
.
CAT_STATS
)
public
String
getCompressedsize
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
ExasolUtils
.
humanReadableByteCount
(
sizeCompressed
,
true
);
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
250
,
category
=
ExasolConstants
.
CAT_STATS
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
250
,
category
=
ExasolConstants
.
CAT_STATS
)
public
float
getDeletePercentage
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
return
this
.
deletePercentage
;
}
@Property
(
viewable
=
false
,
expensive
=
tru
e
,
editable
=
false
,
order
=
300
,
category
=
ExasolConstants
.
CAT_STATS
)
@Property
(
viewable
=
true
,
expensive
=
fals
e
,
editable
=
false
,
order
=
300
,
category
=
ExasolConstants
.
CAT_STATS
)
public
long
getTableCount
(
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
hasRead
)
read
(
monitor
);
...
...
@@ -297,5 +301,19 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
return
DBSObjectState
.
NORMAL
;
}
public
Collection
<
ExasolTableColumn
>
getDistributionKey
(
DBRProgressMonitor
monitor
)
throws
DBException
{
ArrayList
<
ExasolTableColumn
>
distKeyCols
=
new
ArrayList
<
ExasolTableColumn
>();
for
(
ExasolTableColumn
c
:
getAttributes
(
monitor
))
{
if
(
c
.
isDistKey
())
{
distKeyCols
.
add
(
c
);
}
}
return
distKeyCols
;
}
}
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java
浏览文件 @
07a9f6a3
...
...
@@ -17,6 +17,7 @@
*/
package
org.jkiss.dbeaver.ext.exasol.model
;
import
java.math.BigDecimal
;
import
java.sql.ResultSet
;
import
java.util.Collection
;
import
java.util.Collections
;
...
...
@@ -47,6 +48,8 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
private
String
remarks
;
private
String
objectType
;
private
BigDecimal
objectId
;
public
ExasolTableBase
(
ExasolSchema
schema
,
String
name
,
boolean
persisted
)
{
...
...
@@ -58,6 +61,8 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
setName
(
JDBCUtils
.
safeGetString
(
dbResult
,
"TABLE_NAME"
));
this
.
remarks
=
JDBCUtils
.
safeGetString
(
dbResult
,
"REMARKS"
);
this
.
objectType
=
JDBCUtils
.
safeGetString
(
dbResult
,
"TABLE_TYPE"
);
this
.
objectId
=
JDBCUtils
.
safeGetBigDecimal
(
dbResult
,
"OBJECT_ID"
);
}
...
...
@@ -172,5 +177,10 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
return
Collections
.
emptyList
();
}
public
BigDecimal
getObjectId
()
{
return
this
.
objectId
;
}
}
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableColumn.java
浏览文件 @
07a9f6a3
...
...
@@ -235,11 +235,16 @@ public class ExasolTableColumn extends JDBCTableColumn<ExasolTableBase>
this
.
remarks
=
remarks
;
}
@Property
(
viewable
=
fals
e
,
order
=
121
)
@Property
(
viewable
=
true
,
editable
=
true
,
updatable
=
tru
e
,
order
=
121
)
public
Boolean
isDistKey
()
{
return
isInDistKey
;
}
public
void
setDistKey
(
Boolean
distKey
)
{
this
.
isInDistKey
=
distKey
;
}
// no hidden columns supported in exasol
@Override
...
...
@@ -316,5 +321,4 @@ public class ExasolTableColumn extends JDBCTableColumn<ExasolTableBase>
return
false
;
}
}
plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java
浏览文件 @
07a9f6a3
...
...
@@ -45,6 +45,8 @@ public final class ExasolTableCache
+
" table_schem = '%s'"
+
"order by "
+
" table_name,c.ordinal_position"
;
private
static
final
String
SQL_TABLES
=
"SELECT * FROM \"$ODBCJDBC\".ALL_TABLES WHERE TABLE_SCHEM = '%s' and TABLE_TYPE = 'TABLE' order by TABLE_NAME"
;
public
ExasolTableCache
()
{
super
(
"TABLE_NAME"
);
...
...
@@ -57,8 +59,14 @@ public final class ExasolTableCache
{
JDBCDatabaseMetaData
meta
=
session
.
getMetaData
();
return
meta
.
getTables
(
"EXA_DB"
,
exasolSchema
.
getName
(),
null
,
new
String
[]
{
"TABLE"
}).
getSourceStatement
();
String
sql
=
String
.
format
(
SQL_TABLES
,
exasolSchema
.
getName
());
JDBCStatement
dbstat
=
session
.
createStatement
();
((
JDBCStatementImpl
)
dbstat
).
setQueryString
(
sql
);
return
dbstat
;
}
@SuppressWarnings
(
"rawtypes"
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录