/* * DBeaver - Universal Database Manager * Copyright (C) 2016-2016 Karl Griesser (fullref@gmail.com) * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed 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.jkiss.dbeaver.ext.exasol.model; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.exasol.ExasolConstants; import org.jkiss.dbeaver.ext.exasol.tools.ExasolUtils; import org.jkiss.dbeaver.model.DBPNamedObject2; import org.jkiss.dbeaver.model.DBPRefreshableObject; import org.jkiss.dbeaver.model.DBPScriptObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; 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.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectState; import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Collection; /** * @author Karl */ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject, DBPNamedObject2, DBPScriptObject { private Boolean hasDistKey; private Timestamp lastCommit; private long sizeRaw; private long sizeCompressed; private float deletePercentage; private Timestamp createTime; private Boolean hasRead; 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"; public ExasolTable(DBRProgressMonitor monitor, ExasolSchema schema, ResultSet dbResult) { super(monitor, schema, dbResult); hasRead=false; } public ExasolTable(ExasolSchema schema, String name) { super(schema, name, false); hasRead=false; } private void read(DBRProgressMonitor monitor) throws DBCException { JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read Table Details"); 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()), ExasolUtils.quoteString(this.getSchema().getName()), ExasolUtils.quoteString(this.getName()) ); try (JDBCResultSet dbResult = stmt.executeQuery(sql)) { dbResult.next(); 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"); this.deletePercentage = JDBCUtils.safeGetFloat(dbResult, "DELETE_PERCENTAGE"); this.createTime = JDBCUtils.safeGetTimestamp(dbResult, "CREATED"); this.hasRead = true; } } catch (SQLException e) { throw new DBCException(e,getDataSource()); } } @Override public void refreshObjectState(DBRProgressMonitor monitor) throws DBCException { this.read(monitor); super.refreshObjectState(monitor); } // ----------------- // Properties // ----------------- @Property(viewable = false, expensive = true, 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) 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) 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) 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) 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) public float getDeletePercentage(DBRProgressMonitor monitor) throws DBCException { if (! hasRead) read(monitor); return this.deletePercentage; } // ----------------- // Associations // ----------------- @Nullable @Override @Association public Collection<ExasolTableUniqueKey> getConstraints(@NotNull DBRProgressMonitor monitor) throws DBException { return getContainer().getConstraintCache().getObjects(monitor, getContainer(), this); } public ExasolTableUniqueKey getConstraint(DBRProgressMonitor monitor, String ukName) throws DBException { return getContainer().getConstraintCache().getObject(monitor, getContainer(), this, ukName); } @Override @Association public Collection<ExasolTableForeignKey> getAssociations(@NotNull DBRProgressMonitor monitor) throws DBException { return getContainer().getAssociationCache().getObjects(monitor, getContainer(), this); } public DBSTableForeignKey getAssociation(DBRProgressMonitor monitor, String ukName) throws DBException { return getContainer().getAssociationCache().getObject(monitor, getContainer(), this, ukName); } // ----------------- // Business Contract // ----------------- @Override public boolean isView() { return false; } @Override public JDBCStructCache<ExasolSchema, ExasolTable, ExasolTableColumn> getCache() { return getContainer().getTableCache(); } @Override public DBSObject refreshObject(@NotNull DBRProgressMonitor monitor) throws DBException { super.refreshObject(monitor); getContainer().getTableCache().clearChildrenCache(this); getContainer().getConstraintCache().clearObjectCache(this); getContainer().getAssociationCache().clearObjectCache(this); return this; } @Override public String getObjectDefinitionText(DBRProgressMonitor monitor) throws DBException { return ExasolUtils.generateDDLforTable(monitor, this.getDataSource(), this); } @Override public DBSObjectState getObjectState() { // table can only be in state normal return DBSObjectState.NORMAL; } }