提交 5beb4b6c 编写于 作者: S serge-rider

#5800 Orphan virtual entities model


Former-commit-id: dde9cec6
上级 04553d20
......@@ -124,7 +124,7 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
@Override
public DBPDataSource getDataSource()
{
return container.getDataSource();
return container == null ? null : container.getDataSource();
}
public void setDescription(String description)
......@@ -464,4 +464,10 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
return name;
}
public void persistConfiguration() {
DBPDataSource dataSource = getDataSource();
if (dataSource != null) {
dataSource.getContainer().persistConfiguration();
}
}
}
......@@ -28,6 +28,7 @@ import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCResultSet;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
......@@ -38,35 +39,42 @@ import java.util.*;
*/
public abstract class DBVUtils {
// Transform settings for unmapped attributes (custom queries, pseudo attributes, etc)
private static final Map<String, DBVTransformSettings> orphanTransformSettings = new HashMap<>();
// Entities for unmapped attributes (custom queries, pseudo attributes, etc)
private static final Map<String, DBVEntity> orphanVirtualEntities = new HashMap<>();
@Nullable
public static DBVTransformSettings getTransformSettings(@NotNull DBDAttributeBinding binding, boolean create) {
DBVEntity vEntity = getVirtualEntity(binding, create);
if (vEntity != null) {
DBVEntityAttribute vAttr = vEntity.getVirtualAttribute(binding, create);
if (vAttr != null) {
return getTransformSettings(vAttr, create);
}
}
return null;
}
public static DBVEntity getVirtualEntity(@NotNull DBDAttributeBinding binding, boolean create) {
DBSEntityAttribute entityAttribute = binding.getEntityAttribute();
DBVEntity vEntity;
if (entityAttribute != null) {
DBVEntity vEntity = findVirtualEntity(entityAttribute.getParentObject(), create);
if (vEntity != null) {
DBVEntityAttribute vAttr = vEntity.getVirtualAttribute(binding, create);
if (vAttr != null) {
return getTransformSettings(vAttr, create);
}
}
vEntity = findVirtualEntity(entityAttribute.getParentObject(), create);
} else {
// Not an entity. Most likely a custom query. Use local cache for such attributes.
// There shouldn't be too many such settings as they are defined by user manually
// so we shouldn't eay too much memory for that
String attrKey = DBUtils.getObjectFullId(binding.getDataContainer()) + ":" + binding.getName();
synchronized (orphanTransformSettings) {
DBVTransformSettings settings = orphanTransformSettings.get(attrKey);
if (settings == null && create) {
settings = new DBVTransformSettings();
orphanTransformSettings.put(attrKey, settings);
String attrKey = DBUtils.getObjectFullId(binding.getDataContainer());
synchronized (orphanVirtualEntities) {
vEntity = orphanVirtualEntities.get(attrKey);
if (vEntity == null && create) {
vEntity = new DBVEntity(
binding.getDataContainer().getDataSource().getContainer().getVirtualModel(),
binding.getDataContainer().getName(), "");
orphanVirtualEntities.put(attrKey, vEntity);
}
return settings;
}
}
return null;
return vEntity;
}
@Nullable
......
......@@ -580,20 +580,36 @@ public class ResultSetModel {
void updateColorMapping() {
colorMapping.clear();
DBSEntity entity = getSingleSource();
if (entity == null) {
return;
}
DBVEntity virtualEntity = DBVUtils.findVirtualEntity(entity, false);
if (virtualEntity != null) {
List<DBVColorOverride> coList = virtualEntity.getColorOverrides();
if (!CommonUtils.isEmpty(coList)) {
for (DBVColorOverride co : coList) {
DBDAttributeBinding binding = getAttributeBinding(entity, co.getAttributeName());
if (binding != null) {
List<AttributeColorSettings> cmList =
colorMapping.computeIfAbsent(binding, k -> new ArrayList<>());
cmList.add(new AttributeColorSettings(co));
if (entity != null) {
DBVEntity virtualEntity = DBVUtils.findVirtualEntity(entity, false);
if (virtualEntity != null) {
List<DBVColorOverride> coList = virtualEntity.getColorOverrides();
if (!CommonUtils.isEmpty(coList)) {
for (DBVColorOverride co : coList) {
DBDAttributeBinding binding = getAttributeBinding(entity, co.getAttributeName());
if (binding != null) {
List<AttributeColorSettings> cmList =
colorMapping.computeIfAbsent(binding, k -> new ArrayList<>());
cmList.add(new AttributeColorSettings(co));
}
}
}
}
} else {
for (DBDAttributeBinding attr : attributes) {
DBVEntity virtualEntity = DBVUtils.getVirtualEntity(attr, false);
if (virtualEntity != null) {
List<DBVColorOverride> coList = virtualEntity.getColorOverrides();
if (!CommonUtils.isEmpty(coList)) {
for (DBVColorOverride co : coList) {
if (CommonUtils.equalObjects(attr.getName(), co.getAttributeName())) {
List<AttributeColorSettings> cmList =
colorMapping.computeIfAbsent(attr, k -> new ArrayList<>());
cmList.add(new AttributeColorSettings(co));
}
}
}
}
}
......
......@@ -2208,7 +2208,7 @@ public class ResultSetViewer extends Viewer
}
viewMenu.add(new TransformComplexTypesToggleAction());
viewMenu.add(new ColorizeDataTypesToggleAction());
if (getModel().isSingleSource()) {
{
if (valueController != null) {
viewMenu.add(new SetRowColorAction(attr, valueController.getValue()));
if (getModel().hasColorMapping(attr)) {
......@@ -4132,19 +4132,13 @@ public class ResultSetViewer extends Viewer
DBVEntity getVirtualEntity(DBDAttributeBinding binding)
throws IllegalStateException
{
final DBSEntity entity = getModel().getSingleSource();
if (entity == null) {
throw new IllegalStateException("No virtual entity for multi-source query");
}
final DBVEntity vEntity = DBVUtils.findVirtualEntity(entity, true);
assert vEntity != null;
return vEntity;
return DBVUtils.getVirtualEntity(binding, true);
}
void updateColors(DBVEntity entity) {
model.updateColorMapping();
redrawData(false, false);
entity.getDataSource().getContainer().persistConfiguration();
entity.persistConfiguration();
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册