From eaa314b891dbee06184cf278fe95d8a0cceee967 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Tue, 19 Jun 2018 11:43:37 +0200
Subject: [PATCH] =?UTF-8?q?=20#45=20Nub=20:=20m=C3=A9thode=20getLinkablePa?=
 =?UTF-8?q?rameters=20remplac=C3=A9e=20par=20getLinkableValues=20qui=20ret?=
 =?UTF-8?q?ourne=20=C3=A9galement=20les=20r=C3=A9sultats=20et=20r=C3=A9sul?=
 =?UTF-8?q?tats=20compl=C3=A9mentaires?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/mock_jasmine.ts                          | 10 +++
 .../value_ref_variable_extraresult.spec.ts    | 10 ++-
 src/nub.ts                                    | 64 +++++++++++++++++--
 src/remous.ts                                 |  2 +
 src/session_nub.ts                            | 13 +++-
 src/structure/parallel_structure.ts           | 12 ++++
 6 files changed, 101 insertions(+), 10 deletions(-)

diff --git a/spec/mock_jasmine.ts b/spec/mock_jasmine.ts
index cfb6a397..e459c917 100644
--- a/spec/mock_jasmine.ts
+++ b/spec/mock_jasmine.ts
@@ -116,6 +116,16 @@ class Expect {
         }
     }
 
+    public toBeDefined(message?: string) {
+        if (this.actual === undefined) {
+            if (message !== undefined) {
+                console.error(message);
+            } else {
+                console.error(`${this.actual} should be defined`);
+            }
+        }
+    }
+
     public toBeUndefined(message?: string) {
         if (this.actual !== undefined) {
             if (message !== undefined) {
diff --git a/spec/value_ref/value_ref_variable_extraresult.spec.ts b/spec/value_ref/value_ref_variable_extraresult.spec.ts
index a5c7f5ee..52449b53 100644
--- a/spec/value_ref/value_ref_variable_extraresult.spec.ts
+++ b/spec/value_ref/value_ref_variable_extraresult.spec.ts
@@ -46,8 +46,16 @@ describe("référence d'un paramètre à un résultat complémentaire multivalu
             0.9962500000000004, 0.9970000000000003, 0.9977500000000002,
             0.9985000000000002, 0.9992500000000001, 1];
 
+        const vs = rem.getLinkableValues("flu");
+        expect(Object.keys(vs).length).toEqual(1);
+
+        const vs2 = vs[0]["value"];
+        expect(vs2.name).toEqual("flu");
+
         let i = 0;
-        for (const v of res.getExtraResultValuesIterator("flu"))
+        for (const v of vs2.valuesIterator) {
+            expect(f[i]).toBeDefined();
             expect(Math.abs(v - f[i++]) < 0.01).toBeTruthy();
+        }
     });
 });
diff --git a/src/nub.ts b/src/nub.ts
index 6524312f..83e54f4b 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -229,27 +229,77 @@ export abstract class Nub extends ComputeNode implements IReferencedNub {
      * @returns liste des paramètres liables à un paramètre
      * @param p paramètre qui sert de clé de recherche des paramètres liables
      */
-    public getLinkableParameters(param: ParamDefinition): any[] {
+    // public getLinkableParameters(param: ParamDefinition): any[] {
+    //     const res: any[] = [];
+
+    //     for (const p of this._prms)
+    //         if (p.uid !== param.uid)
+    //             switch (p.valueMode) {
+    //                 case ParamValueMode.SINGLE:
+    //                 case ParamValueMode.MINMAX:
+    //                 case ParamValueMode.LISTE:
+    //                     switch (param.symbol) {
+    //                         case "Z1":
+    //                         case "Z2":
+    //                             if (p.symbol === "Z1" || p.symbol === "Z2")
+    //                                 res.push({ "param": p, "nub": this });
+    //                             break;
+
+    //                         default:
+    //                             if (p.symbol === param.symbol)
+    //                                 res.push({ "param": p, "nub": this });
+    //                     }
+    //             }
+
+    //     return res;
+    // }
+
+    /**
+     * liste des valeurs (paramètre, résultat, résultat complémentaire) liables à un paramètre
+     * @param src objet qui sert de clé de recherche des paramètres liables, de type INamedObject | string
+     * @returns tableau d'objets de la forme { "name":string, "value":NamedIterableValues, "nub":Nub}, nub=Nub d'origine de la "value"
+     */
+    public getLinkableValues(src: any): any[] {
         const res: any[] = [];
 
-        for (const p of this._prms)
-            if (p.uid !== param.uid)
+        const isStr = typeof (src) === "string";
+        const name = isStr ? src : src.name;
+        const hasUid = isStr ? false : "uid" in src;
+
+        // paramètres
+
+        for (const p of this._prms) {
+            const cond = hasUid ? p.uid !== src.uid : true; // pour éviter d'ajouter le paramètre d'entrée dans le tableau résultat
+            if (cond)
                 switch (p.valueMode) {
                     case ParamValueMode.SINGLE:
                     case ParamValueMode.MINMAX:
                     case ParamValueMode.LISTE:
-                        switch (param.symbol) {
+                        switch (name) {
                             case "Z1":
                             case "Z2":
                                 if (p.symbol === "Z1" || p.symbol === "Z2")
-                                    res.push({ "param": p, "nub": this });
+                                    res.push({ "name": p.symbol, "value": p, "nub": this });
                                 break;
 
                             default:
-                                if (p.symbol === param.symbol)
-                                    res.push({ "param": p, "nub": this });
+                                if (p.symbol === name)
+                                    res.push({ "name": name, "value": p, "nub": this });
                         }
                 }
+        }
+
+        // résultat
+        if (this._result !== undefined) {
+            if (this._result.name === name)
+                res.push({ "name": `${name}.`, "value": this._result, "nub": this });
+
+            // résultats complémentaires
+
+            const erIter = this._result.getIterableExtraResults(name)
+            if (erIter !== undefined)
+                res.push({ "name": `${this._result.name}.${name}`, "value": erIter, "nub": this });
+        }
 
         return res;
     }
diff --git a/src/remous.ts b/src/remous.ts
index 1b0075fa..519eef15 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -473,6 +473,8 @@ export class CourbeRemous extends Nub {
             }
         }
 
+        this._result = res;
+
         return res;
     }
 
diff --git a/src/session_nub.ts b/src/session_nub.ts
index 49176561..a18dad28 100644
--- a/src/session_nub.ts
+++ b/src/session_nub.ts
@@ -193,7 +193,16 @@ export class SessionNub {
      * @returns liste des paramètres liables à un paramètre
      * @param p paramètre qui sert de clé de recherche des paramètres liables
      */
-    public getLinkableParameters(p: ParamDefinition): any[] {
-        return this._nub.getLinkableParameters(p);
+    // public getLinkableParameters(p: ParamDefinition): any[] {
+    //     return this._nub.getLinkableParameters(p);
+    // }
+
+    /**
+     * liste des valeurs(paramètre, résultat, résultat complémentaire) liables à un paramètre
+     * @param src objet qui sert de clé de recherche des paramètres liables, de type INamedObject | string
+     * @returns tableau d'objets de la forme { "value":NamedIterableValues, "nub":Nub}, nub=Nub d'origine de la "value"
+     */
+    public getLinkableValues(src: any): any[] {
+        return this._nub.getLinkableValues(src);
     }
 }
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index 7a712fc5..7a2d0a9b 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -293,4 +293,16 @@ export class ParallelStructure extends Nub {
     public getReferencedExtraResult(desc: string): any {
         return this._result.getExtraResult(desc);
     }
+
+    /**
+ * liste des valeurs (paramètre, résultat, résultat complémentaire) liables à un paramètre
+ * @param src objet qui sert de clé de recherche des paramètres liables, de type INamedObject | string
+ * @returns tableau d'objets de la forme { "name":string, "value":NamedIterableValues, "nub":Nub}, nub=Nub d'origine de la "value"
+ */
+    public getLinkableValues(src: any): any[] {
+        let res = super.getLinkableValues(src);
+        for (const s of this.structures)
+            res = res.concat(s.getLinkableValues(src));
+        return res;
+    }
 }
-- 
GitLab