提交 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; ...@@ -24,11 +24,16 @@ import org.jkiss.dbeaver.ext.generic.model.GenericTable;
import org.jkiss.dbeaver.ext.generic.model.GenericTableColumn; import org.jkiss.dbeaver.ext.generic.model.GenericTableColumn;
import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPDataKind; 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.DBECommandContext;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.impl.DBSObjectCache; import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract; 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.impl.sql.edit.struct.SQLTableColumnManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; 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.DBSDataType;
import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.UITask; import org.jkiss.dbeaver.ui.UITask;
...@@ -36,6 +41,7 @@ import org.jkiss.dbeaver.ui.editors.object.struct.AttributeEditPage; ...@@ -36,6 +41,7 @@ import org.jkiss.dbeaver.ui.editors.object.struct.AttributeEditPage;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.sql.Types; import java.sql.Types;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -45,8 +51,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl ...@@ -45,8 +51,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
@Nullable @Nullable
@Override @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()); return object.getParentObject().getContainer().getTableCache().getChildrenCache(object.getParentObject());
} }
...@@ -56,23 +61,23 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl ...@@ -56,23 +61,23 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
int columnSize = columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0; int columnSize = columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0;
GenericTableColumn column = parent.getDataSource().getMetaModel().createTableColumnImpl( GenericTableColumn column = parent.getDataSource().getMetaModel().createTableColumnImpl(
monitor, monitor,
parent, parent,
getNewColumnName(monitor, context, parent), getNewColumnName(monitor, context, parent),
columnType == null ? "INTEGER" : columnType.getName(), columnType == null ? "INTEGER" : columnType.getName(),
columnType == null ? Types.INTEGER : columnType.getTypeID(), columnType == null ? Types.INTEGER : columnType.getTypeID(),
columnType == null ? Types.INTEGER : columnType.getTypeID(), columnType == null ? Types.INTEGER : columnType.getTypeID(),
-1, -1,
columnSize, columnSize,
columnSize, columnSize,
null, null,
null, null,
10, 10,
false, false,
null, null,
null, null,
false, false,
false false
); );
column.setPersisted(false); column.setPersisted(false);
return new UITask<GenericTableColumn>() { return new UITask<GenericTableColumn>() {
...@@ -88,8 +93,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl ...@@ -88,8 +93,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
} }
@Override @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); StringBuilder decl = super.getNestedDeclaration(monitor, owner, command, options);
final GenericTableColumn column = command.getObject(); final GenericTableColumn column = command.getObject();
if (column.isAutoIncrement()) { if (column.isAutoIncrement()) {
...@@ -104,7 +108,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl ...@@ -104,7 +108,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
@Override @Override
protected ColumnModifier[] getSupportedModifiers(GenericTableColumn column, Map<String, Object> options) { protected ColumnModifier[] getSupportedModifiers(GenericTableColumn column, Map<String, Object> options) {
// According to SQL92 DEFAULT comes before constraints // According to SQL92 DEFAULT comes before constraints
return new ColumnModifier[] {DataTypeModifier, DefaultModifier, NotNullModifier}; return new ColumnModifier[]{DataTypeModifier, DefaultModifier, NotNullModifier};
} }
@Override @Override
...@@ -117,4 +121,15 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl ...@@ -117,4 +121,15 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
return features; 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; ...@@ -20,17 +20,24 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.generic.model.*; 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.DBPObject;
import org.jkiss.dbeaver.model.edit.DBECommandContext; 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.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableManager; import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; 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.DBSEntityConstraint;
import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex; import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map;
/** /**
* Generic table manager * Generic table manager
...@@ -89,4 +96,14 @@ public class GenericTableManager extends SQLTableManager<GenericTable, GenericSt ...@@ -89,4 +96,14 @@ public class GenericTableManager extends SQLTableManager<GenericTable, GenericSt
return false; 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 ...@@ -221,7 +221,7 @@ public class GenericTable extends JDBCTable<GenericDataSource, GenericStructCont
@Nullable @Nullable
@Override @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() public String getDescription()
{ {
return description; return description;
......
...@@ -164,7 +164,7 @@ public class GenericTableColumn extends JDBCTableColumn<GenericTable> implements ...@@ -164,7 +164,7 @@ public class GenericTableColumn extends JDBCTableColumn<GenericTable> implements
@Nullable @Nullable
@Override @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() public String getDescription()
{ {
return remarks; return remarks;
......
...@@ -504,5 +504,14 @@ public class GenericMetaModel { ...@@ -504,5 +504,14 @@ public class GenericMetaModel {
return "-- Source code not available"; 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 ...@@ -73,4 +73,13 @@ public class SnowflakeMetaModel extends GenericMetaModel
return getTableDDL(monitor, sourceObject, options); 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 { ...@@ -104,11 +104,7 @@ public class VerticaTableColumnManager extends GenericTableColumnManager {
actionList.add(new SQLDatabasePersistAction("Set column default", prefix + "SET DEFAULT " + column.getDefaultValue())); actionList.add(new SQLDatabasePersistAction("Set column default", prefix + "SET DEFAULT " + column.getDefaultValue()));
} }
} }
if (command.getProperty(DBConstants.PROP_ID_DESCRIPTION) != null) { super.addObjectModifyActions(monitor, actionList, command, options);
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()))));
}
} }
} }
...@@ -61,6 +61,42 @@ public abstract class AbstractDescriptor { ...@@ -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 { public class ObjectType {
private static final String ATTR_NAME = "name"; private static final String ATTR_NAME = "name";
private static final String ATTR_IF = "if"; private static final String ATTR_IF = "if";
...@@ -173,32 +209,6 @@ public abstract class AbstractDescriptor { ...@@ -173,32 +209,6 @@ public abstract class AbstractDescriptor {
return implClass != null && implClass.isAssignableFrom(clazz); 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 @Override
public String toString() { public String toString() {
return implName; return implName;
......
...@@ -64,12 +64,16 @@ public @interface Property ...@@ -64,12 +64,16 @@ public @interface Property
*/ */
boolean editable() default false; boolean editable() default false;
String editableExpr() default "";
/** /**
* Updatable flag. If set to true then property can be changed on any object * Updatable flag. If set to true then property can be changed on any object
* @return updatable flag * @return updatable flag
*/ */
boolean updatable() default false; boolean updatable() default false;
String updatableExpr() default "";
/** /**
* Viewable flag. Viewable properties are displayed in lists. * Viewable flag. Viewable properties are displayed in lists.
* Note that property editor contains all properties (except hidden). * Note that property editor contains all properties (except hidden).
......
...@@ -16,10 +16,13 @@ ...@@ -16,10 +16,13 @@
*/ */
package org.jkiss.dbeaver.runtime.properties; package org.jkiss.dbeaver.runtime.properties;
import org.apache.commons.jexl2.Expression;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.jkiss.code.NotNull; import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPPersistedObject; 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.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer; import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer;
import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.meta.Property;
...@@ -173,7 +176,22 @@ public class ObjectPropertyDescriptor extends ObjectAttributeDescriptor implemen ...@@ -173,7 +176,22 @@ public class ObjectPropertyDescriptor extends ObjectAttributeDescriptor implemen
return false; return false;
} }
// Read-only or non-updatable property for non-new object // 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() public boolean isEditPossible()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册