From 9178a5eb40aa68424b21615f8a6bf5f1aeb1e052 Mon Sep 17 00:00:00 2001
From: Tuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Date: Wed, 5 Mar 2025 22:59:04 +0000
Subject: [PATCH] Support resolving components referenced by chart items from
 experiment

Previously all RVI -> Variable resolution was performed through the
configuration context which naturally doesn't work for entities that
only exist in an experiment context.

The editor still performs the default action on the first parent
variable's resource representation that has one.

gitlab #1250

(cherry picked from commit 61450d357063abd027db92e765c4f5c5248dd058)

Co-authored-by: Tuukka Lehtonen <tuukka.lehtonen@semantum.fi>
---
 .../charts/editor/TimeSeriesEditor.java       | 28 ++++++++++++++++---
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/bundles/org.simantics.charts/src/org/simantics/charts/editor/TimeSeriesEditor.java b/bundles/org.simantics.charts/src/org/simantics/charts/editor/TimeSeriesEditor.java
index a36f10f0c..946693d25 100644
--- a/bundles/org.simantics.charts/src/org/simantics/charts/editor/TimeSeriesEditor.java
+++ b/bundles/org.simantics.charts/src/org/simantics/charts/editor/TimeSeriesEditor.java
@@ -59,16 +59,17 @@ import org.simantics.charts.query.TrendSpecQuery;
 import org.simantics.charts.ui.ChartLinkData;
 import org.simantics.charts.ui.LinkTimeHandler;
 import org.simantics.databoard.Bindings;
-import org.simantics.databoard.binding.error.BindingException;
 import org.simantics.databoard.util.ObjectUtils;
 import org.simantics.db.AsyncReadGraph;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.Session;
 import org.simantics.db.common.request.ParametrizedRead;
+import org.simantics.db.common.request.PossibleIndexRoot;
 import org.simantics.db.common.request.UniqueRead;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.layer0.request.Model;
+import org.simantics.db.layer0.request.PossibleActiveExperiment;
 import org.simantics.db.layer0.request.combinations.Combinators;
 import org.simantics.db.layer0.variable.RVI;
 import org.simantics.db.layer0.variable.RVIBuilder;
@@ -699,15 +700,34 @@ public class TimeSeriesEditor extends ResourceEditorPart {
     protected Resource resolveReferencedComponent(IResourceEditorInput resourceInput, final String variableId) {
         try {
             return getSession().sync(new UniqueRead<Resource>() {
+                private Resource findFirstParentRepresentation(ReadGraph graph, Variable var) throws DatabaseException {
+                    while (var != null) {
+                        Resource rep = var.getPossibleRepresents(graph);
+                        if (rep != null)
+                            return rep;
+                        var = var.getParent(graph);
+                    }
+                    return null;
+                }
+
                 @Override
                 public Resource perform(ReadGraph graph) throws DatabaseException {
-                    Variable configuration = Variables.getConfigurationContext(graph, getInputResource());
+                    Resource input = getInputResource();
+                    Resource root = graph.syncRequest(new PossibleIndexRoot(input));
+                    if (root == null)
+                        return null;
+
+                    Variable configuration = Variables.getConfigurationContext(graph, root);
+                    Resource run = graph.sync(new PossibleActiveExperiment(model));
+                    Variable experimentContext = run != null ? Variables.getPossibleVariable(graph, run) : null;
+
                     RVI rvi = RVI.fromResourceFormat(graph, variableId);
                     rvi = new RVIBuilder(rvi).removeFromFirstRole(Role.PROPERTY).toRVI();
                     if (rvi.isEmpty())
                         return null;
-                    Variable var = rvi.resolve(graph, configuration);
-                    return var.getPossibleRepresents(graph);
+
+                    Variable var = rvi.resolve(graph, experimentContext != null ? experimentContext : configuration);
+                    return findFirstParentRepresentation(graph, var);
                 }
             });
         } catch (DatabaseException e) {
-- 
GitLab