提交 758a3f61 编写于 作者: S serge@jkiss.org

#5553 Properties flags dynamic eval. Generic table/column base action...

#5553 Properties flags dynamic eval. Generic table/column base action (comments) introduced. Snowflake comments support added
上级 c97742ba
......@@ -24,11 +24,16 @@ import org.jkiss.dbeaver.ext.generic.model.GenericTable;
import org.jkiss.dbeaver.ext.generic.model.GenericTableColumn;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract;
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.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSDataType;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.UITask;
......@@ -36,6 +41,7 @@ import org.jkiss.dbeaver.ui.editors.object.struct.AttributeEditPage;
import org.jkiss.utils.CommonUtils;
import java.sql.Types;
import java.util.List;
import java.util.Map;
/**
......@@ -45,8 +51,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
@Nullable
@Override
public DBSObjectCache<? extends DBSObject, GenericTableColumn> getObjectsCache(GenericTableColumn object)
{
public DBSObjectCache<? extends DBSObject, GenericTableColumn> getObjectsCache(GenericTableColumn object) {
return object.getParentObject().getContainer().getTableCache().getChildrenCache(object.getParentObject());
}
......@@ -56,23 +61,23 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
int columnSize = columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0;
GenericTableColumn column = parent.getDataSource().getMetaModel().createTableColumnImpl(
monitor,
parent,
getNewColumnName(monitor, context, parent),
columnType == null ? "INTEGER" : columnType.getName(),
columnType == null ? Types.INTEGER : columnType.getTypeID(),
columnType == null ? Types.INTEGER : columnType.getTypeID(),
-1,
columnSize,
columnSize,
null,
null,
10,
false,
null,
null,
false,
false
monitor,
parent,
getNewColumnName(monitor, context, parent),
columnType == null ? "INTEGER" : columnType.getName(),
columnType == null ? Types.INTEGER : columnType.getTypeID(),
columnType == null ? Types.INTEGER : columnType.getTypeID(),
-1,
columnSize,
columnSize,
null,
null,
10,
false,
null,
null,
false,
false
);
column.setPersisted(false);
return new UITask<GenericTableColumn>() {
......@@ -88,8 +93,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
}
@Override
public StringBuilder getNestedDeclaration(DBRProgressMonitor monitor, GenericTable owner, DBECommandAbstract<GenericTableColumn> command, Map<String, Object> options)
{
public StringBuilder getNestedDeclaration(DBRProgressMonitor monitor, GenericTable owner, DBECommandAbstract<GenericTableColumn> command, Map<String, Object> options) {
StringBuilder decl = super.getNestedDeclaration(monitor, owner, command, options);
final GenericTableColumn column = command.getObject();
if (column.isAutoIncrement()) {
......@@ -104,7 +108,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
@Override
protected ColumnModifier[] getSupportedModifiers(GenericTableColumn column, Map<String, Object> options) {
// According to SQL92 DEFAULT comes before constraints
return new ColumnModifier[] {DataTypeModifier, DefaultModifier, NotNullModifier};
return new ColumnModifier[]{DataTypeModifier, DefaultModifier, NotNullModifier};
}
@Override
......@@ -117,4 +121,15 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
return features;
}
@Override
protected void addObjectModifyActions(DBRProgressMonitor monitor, List<DBEPersistAction> actionList, ObjectChangeCommand command, Map<String, Object> options) {
GenericTableColumn column = command.getObject();
// Add more or less standard COMMENT ON if comment was actualy edited (i.e. it is editable at least).
if (command.getProperty(DBConstants.PROP_ID_DESCRIPTION) != null) {
actionList.add(new SQLDatabasePersistAction("Set column comment", "COMMENT ON COLUMN " +
DBUtils.getObjectFullName(column.getTable(), DBPEvaluationContext.DDL) + "." + DBUtils.getQuotedIdentifier(column) +
" IS " + SQLUtils.quoteString(column, CommonUtils.notEmpty(column.getDescription()))));
}
}
}
......@@ -20,17 +20,24 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.generic.model.*;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraint;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex;
import org.jkiss.utils.CommonUtils;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Generic table manager
......@@ -89,4 +96,14 @@ public class GenericTableManager extends SQLTableManager<GenericTable, GenericSt
return false;
}
@Override
protected void addObjectExtraActions(DBRProgressMonitor monitor, List<DBEPersistAction> actions, NestedObjectCommand<GenericTable, PropertyHandler> command, Map<String, Object> options) {
if (command.getProperty(DBConstants.PROP_ID_DESCRIPTION) != null) {
actions.add(new SQLDatabasePersistAction(
"Comment table",
"COMMENT ON TABLE " + command.getObject().getFullyQualifiedName(DBPEvaluationContext.DDL) +
" IS " + SQLUtils.quoteString(command.getObject(), command.getObject().getDescription())));
}
}
}
......@@ -221,7 +221,7 @@ public class GenericTable extends JDBCTable<GenericDataSource, GenericStructCont
@Nullable
@Override
@Property(viewable = true, multiline = true, order = 100)
@Property(viewable = true, editableExpr = "object.dataSource.metaModel.tableCommentEditable", updatableExpr = "object.dataSource.metaModel.tableCommentEditable", multiline = true, order = 100)
public String getDescription()
{
return description;
......
......@@ -164,7 +164,7 @@ public class GenericTableColumn extends JDBCTableColumn<GenericTable> implements
@Nullable
@Override
@Property(viewable = true, multiline = true, order = 100)
@Property(viewable = true, editableExpr = "object.dataSource.metaModel.tableColumnCommentEditable", updatableExpr = "object.dataSource.metaModel.tableColumnCommentEditable", multiline = true, order = 100)
public String getDescription()
{
return remarks;
......
......@@ -504,5 +504,14 @@ public class GenericMetaModel {
return "-- Source code not available";
}
// Comments
public boolean isTableCommentEditable() {
return false;
}
public boolean isTableColumnCommentEditable() {
return false;
}
}
......@@ -73,4 +73,13 @@ public class SnowflakeMetaModel extends GenericMetaModel
return getTableDDL(monitor, sourceObject, options);
}
@Override
public boolean isTableCommentEditable() {
return true;
}
@Override
public boolean isTableColumnCommentEditable() {
return true;
}
}
......@@ -104,11 +104,7 @@ public class VerticaTableColumnManager extends GenericTableColumnManager {
actionList.add(new SQLDatabasePersistAction("Set column default", prefix + "SET DEFAULT " + column.getDefaultValue()));
}
}
if (command.getProperty(DBConstants.PROP_ID_DESCRIPTION) != null) {
actionList.add(new SQLDatabasePersistAction("Set column comment", "COMMENT ON COLUMN " +
DBUtils.getObjectFullName(column.getTable(), DBPEvaluationContext.DDL) + "." + DBUtils.getQuotedIdentifier(column) +
" IS " + SQLUtils.quoteString(column, CommonUtils.notEmpty(column.getDescription()))));
}
super.addObjectModifyActions(monitor, actionList, command, options);
}
}
......@@ -61,6 +61,42 @@ public abstract class AbstractDescriptor {
}
}
public static JexlContext makeContext(final Object object, final Object context)
{
return new JexlContext() {
@Override
public Object get(String name)
{
return name.equals(VAR_OBJECT) ? object :
(name.equals(VAR_CONTEXT) ? context : null); //$NON-NLS-1$
}
@Override
public void set(String name, Object value)
{
log.warn("Set is not implemented"); //$NON-NLS-1$
}
@Override
public boolean has(String name)
{
return
name.equals(VAR_OBJECT) && object != null || //$NON-NLS-1$
name.equals(VAR_CONTEXT) && context != null; //$NON-NLS-1$
}
};
}
public static Object evalExpression(String exprString, Object object, Object context) {
try {
Expression expression = AbstractDescriptor.parseExpression(exprString);
return expression.evaluate(AbstractDescriptor.makeContext(object, context));
} catch (DBException e) {
log.error("Bad expression: " + exprString, e);
return null;
}
}
public class ObjectType {
private static final String ATTR_NAME = "name";
private static final String ATTR_IF = "if";
......@@ -173,32 +209,6 @@ public abstract class AbstractDescriptor {
return implClass != null && implClass.isAssignableFrom(clazz);
}
private JexlContext makeContext(final Object object, final Object context)
{
return new JexlContext() {
@Override
public Object get(String name)
{
return name.equals(VAR_OBJECT) ? object :
(name.equals(VAR_CONTEXT) ? context : null); //$NON-NLS-1$
}
@Override
public void set(String name, Object value)
{
log.warn("Set is not implemented"); //$NON-NLS-1$
}
@Override
public boolean has(String name)
{
return
name.equals(VAR_OBJECT) && object != null || //$NON-NLS-1$
name.equals(VAR_CONTEXT) && context != null; //$NON-NLS-1$
}
};
}
@Override
public String toString() {
return implName;
......
......@@ -64,12 +64,16 @@ public @interface Property
*/
boolean editable() default false;
String editableExpr() default "";
/**
* Updatable flag. If set to true then property can be changed on any object
* @return updatable flag
*/
boolean updatable() default false;
String updatableExpr() default "";
/**
* Viewable flag. Viewable properties are displayed in lists.
* Note that property editor contains all properties (except hidden).
......
......@@ -16,10 +16,13 @@
*/
package org.jkiss.dbeaver.runtime.properties;
import org.apache.commons.jexl2.Expression;
import org.eclipse.core.runtime.Platform;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPPersistedObject;
import org.jkiss.dbeaver.model.impl.AbstractDescriptor;
import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer;
import org.jkiss.dbeaver.model.meta.Property;
......@@ -173,7 +176,22 @@ public class ObjectPropertyDescriptor extends ObjectAttributeDescriptor implemen
return false;
}
// Read-only or non-updatable property for non-new object
return isNewObject(object) ? propInfo.editable() : propInfo.updatable();
return getEditableValue(object);
}
private boolean getEditableValue(Object object)
{
boolean isNew = isNewObject(object);
String expr = isNew ? propInfo.editableExpr() : propInfo.updatableExpr();
if (!expr.isEmpty()) {
return Boolean.TRUE.equals(evaluateExpression(object, expr));
} else {
return isNew ? propInfo.editable() : propInfo.updatable();
}
}
private Object evaluateExpression(Object object, String exprString) {
return AbstractDescriptor.evalExpression(exprString, object, this);
}
public boolean isEditPossible()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册