diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java index 3725990a236fdb33743cbde4bf38223608be889e..2ff4a5aa137af0b07eb15de962d1d62ae6eaa984 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/manager/ExasolTableColumnManager.java @@ -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 actionList, ObjectChangeCommand command, Map options) { ExasolTableColumn exasolColumn = command.getObject(); + Map 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 string String nullability = ""; if (exasolColumn.isOriRequired() != null && exasolColumn.isOriRequired() != exasolColumn.isRequired()) nullability = exasolColumn.isRequired() ? "NOT NULL" : "NULL"; @@ -110,12 +126,20 @@ public class ExasolTableColumnManager extends SQLTableColumnManager removeColumnFromDistKey(ExasolTableColumn exasolColumn) throws DBException + { + ExasolTable table = (ExasolTable) exasolColumn.getParentObject(); + Collection 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 distKey) + { + ExasolTable table = null; + Collection names = new ArrayList(); + + 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 modifyDistKey(ExasolTableColumn exasolColumn) throws DBException + { + ExasolTable table = (ExasolTable) exasolColumn.getParentObject(); + Collection distKey = table.getDistributionKey(new VoidProgressMonitor()); + Collection commands = new ArrayList(); + + if (table.getHasDistKey(new VoidProgressMonitor())) + { + commands.add(generateDropDist(exasolColumn)); + } + + if (!distKey.isEmpty()) + commands.add(generateCreateDist(distKey)); + return commands; + } + + } diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java index df9ac1eb7a842334ea7feff4dcd258021dd192f7..8301b3c578c759b125a55ee8e29e36a58ef647d5 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java +++ b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTable.java @@ -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()) ); @@ -137,7 +141,7 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject try (JDBCResultSet dbResult = stmt.executeQuery(sql)) { dbResult.next(); - this.hasDistKey = JDBCUtils.safeGetBoolean(dbResult, "TABLE_HAS_DISTRIBUTION_KEY"); + this.hasDistKey = JDBCUtils.safeGetBoolean(dbResult, "TABLE_HAS_DISTRIBUTION_KEY"); this.lastCommit = JDBCUtils.safeGetTimestamp(dbResult, "LAST_COMMIT"); this.sizeRaw = JDBCUtils.safeGetLong(dbResult, "RAW_OBJECT_SIZE"); this.sizeCompressed = JDBCUtils.safeGetLong(dbResult, "MEM_OBJECT_SIZE"); @@ -178,49 +182,49 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject // ----------------- // Properties // ----------------- - @Property(viewable = false, expensive = true, editable = false, order = 90, category = ExasolConstants.CAT_BASEOBJECT) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 100, category = ExasolConstants.CAT_BASEOBJECT) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 100, category = ExasolConstants.CAT_DATETIME) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 150, category = ExasolConstants.CAT_STATS) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 200, category = ExasolConstants.CAT_STATS) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 250, category = ExasolConstants.CAT_STATS) + @Property(viewable = true, expensive = false, 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 = true, editable = false, order = 300, category = ExasolConstants.CAT_STATS) + @Property(viewable = true, expensive = false, 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 getDistributionKey(DBRProgressMonitor monitor) throws DBException + { + ArrayList distKeyCols = new ArrayList(); + + for(ExasolTableColumn c : getAttributes(monitor)) + { + if (c.isDistKey()) + { + distKeyCols.add(c); + } + } + return distKeyCols; + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java index 0b339bbf9ac6e902237680fa7bd56d7859ae4d9a..6093c8e03b4ffdddc28bbc0b0f5ed6fdbffd4555 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java +++ b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolTableBase.java @@ -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 this.remarks = remarks; } - @Property(viewable = false, order = 121) + @Property(viewable = true, editable = true, updatable = true, order = 121) public Boolean isDistKey() { return isInDistKey; } + + public void setDistKey(Boolean distKey) + { + this.isInDistKey = distKey; + } // no hidden columns supported in exasol @@ -316,5 +321,4 @@ public class ExasolTableColumn extends JDBCTableColumn return false; } - } diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java index c20cb7b0ea22c684d88bb357dced62cbe5f30911..edc2adedfe3e7e067f1f91faa61343dab340bbdc 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java +++ b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/cache/ExasolTableCache.java @@ -44,6 +44,8 @@ public final class ExasolTableCache + " \"$ODBCJDBC\".\"ALL_COLUMNS\" c " + "where " + " 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() { @@ -56,9 +58,15 @@ public final class ExasolTableCache throws SQLException { JDBCDatabaseMetaData meta = session.getMetaData(); + + String sql = String.format(SQL_TABLES, exasolSchema.getName()); + + JDBCStatement dbstat = session.createStatement(); + + ((JDBCStatementImpl) dbstat).setQueryString(sql); + + return dbstat; - return meta.getTables("EXA_DB", exasolSchema.getName(), null, - new String[] { "TABLE" }).getSourceStatement(); } @SuppressWarnings("rawtypes")