فهرست منبع

fix(chain): scope chain sort in free layout (#689)

* fix(chain): scope chain sort in free layout

* fix: variable free sort
Yiwei Mao 4 ماه پیش
والد
کامیت
b08237cbab

+ 39 - 39
packages/variable-engine/variable-layout/__tests__/__snapshots__/variable-free-enable-global-scope.test.ts.snap

@@ -112,11 +112,11 @@ Map {
   ],
   "end_0" => [
     "GlobalScope",
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1" => [
     "GlobalScope",
@@ -124,36 +124,36 @@ Map {
   ],
   "base_2" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_2" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_3" => [
     "GlobalScope",
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3" => [
     "GlobalScope",
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
   ],
 }
 `;
@@ -166,11 +166,11 @@ Map {
   ],
   "end_0" => [
     "GlobalScope",
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
     "end_0_private",
   ],
   "base_1" => [
@@ -180,44 +180,44 @@ Map {
   ],
   "base_2" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
     "base_2_private",
   ],
   "loop_1" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_1" => [
     "GlobalScope",
-    "base_in_loop_1_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_1_private",
   ],
   "base_in_loop_2" => [
     "GlobalScope",
-    "base_in_loop_2_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2_private",
   ],
   "base_in_loop_3" => [
     "GlobalScope",
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_in_loop_3_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
+    "base_in_loop_3_private",
   ],
   "base_3" => [
     "GlobalScope",
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
     "base_3_private",
   ],
 }
@@ -268,11 +268,11 @@ Map {
   ],
   "end_0_private" => [
     "GlobalScope",
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1_private" => [
     "GlobalScope",
@@ -280,39 +280,39 @@ Map {
   ],
   "base_2_private" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1_private" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1_private" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_2_private" => [
     "GlobalScope",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_3_private" => [
     "GlobalScope",
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3_private" => [
     "GlobalScope",
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
   ],
 }
 `;

+ 39 - 39
packages/variable-engine/variable-layout/__tests__/__snapshots__/variable-free-is-node-children-private.test.ts.snap

@@ -129,44 +129,44 @@ exports[`Variable Free Layout Is Node Children Private > test get Deps 1`] = `
 Map {
   "start_0" => [],
   "end_0" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1" => [
     "start_0",
   ],
   "base_2" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_2" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_3" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",
@@ -180,14 +180,14 @@ Map {
     "start_0_private",
   ],
   "end_0" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",
+    "base_1",
+    "base_3",
+    "base_2",
     "end_0_private",
   ],
   "base_1" => [
@@ -195,39 +195,39 @@ Map {
     "base_1_private",
   ],
   "base_2" => [
-    "base_1",
     "start_0",
+    "base_1",
     "base_2_private",
   ],
   "loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_1" => [
-    "base_in_loop_1_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_1_private",
   ],
   "base_in_loop_2" => [
-    "base_in_loop_2_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2_private",
   ],
   "base_in_loop_3" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_in_loop_3_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
+    "base_in_loop_3_private",
   ],
   "base_3" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",
@@ -278,47 +278,47 @@ exports[`Variable Free Layout Is Node Children Private > test get private scope
 Map {
   "start_0_private" => [],
   "end_0_private" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1_private" => [
     "start_0",
   ],
   "base_2_private" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1_private" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1_private" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_2_private" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_3_private" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3_private" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
     "base_in_loop_1",
     "base_in_loop_2",
     "base_in_loop_3",

+ 39 - 39
packages/variable-engine/variable-layout/__tests__/__snapshots__/variable-free-layout.test.ts.snap

@@ -109,41 +109,41 @@ exports[`Variable Free Layout > test get Deps 1`] = `
 Map {
   "start_0" => [],
   "end_0" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1" => [
     "start_0",
   ],
   "base_2" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_2" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_3" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
   ],
 }
 `;
@@ -154,11 +154,11 @@ Map {
     "start_0_private",
   ],
   "end_0" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
     "end_0_private",
   ],
   "base_1" => [
@@ -166,39 +166,39 @@ Map {
     "base_1_private",
   ],
   "base_2" => [
-    "base_1",
     "start_0",
+    "base_1",
     "base_2_private",
   ],
   "loop_1" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_1" => [
-    "base_in_loop_1_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_1_private",
   ],
   "base_in_loop_2" => [
-    "base_in_loop_2_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2_private",
   ],
   "base_in_loop_3" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_in_loop_3_private",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
+    "base_in_loop_3_private",
   ],
   "base_3" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
     "base_3_private",
   ],
 }
@@ -246,44 +246,44 @@ exports[`Variable Free Layout > test get private scope Deps 1`] = `
 Map {
   "start_0_private" => [],
   "end_0_private" => [
-    "base_2",
-    "base_1",
     "start_0",
-    "base_3",
     "loop_1",
+    "base_1",
+    "base_3",
+    "base_2",
   ],
   "base_1_private" => [
     "start_0",
   ],
   "base_2_private" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "loop_1_private" => [
-    "base_1",
     "start_0",
+    "base_1",
   ],
   "base_in_loop_1_private" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_2_private" => [
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
   ],
   "base_in_loop_3_private" => [
-    "base_in_loop_1",
-    "base_in_loop_2",
-    "base_1",
     "start_0",
+    "base_1",
     "loop_1_private",
+    "base_in_loop_2",
+    "base_in_loop_1",
   ],
   "base_3_private" => [
-    "loop_1",
-    "base_1",
     "start_0",
+    "base_1",
+    "loop_1",
   ],
 }
 `;

+ 35 - 18
packages/variable-engine/variable-layout/src/chains/free-layout-scope-chain.ts

@@ -56,13 +56,27 @@ export class FreeLayoutScopeChain extends ScopeChain {
     ]);
   }
 
-  // 获取同一层级所有输入节点
-  protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {
-    const currParent = this.getNodeParent(curr);
+  // 获取同一层级所有输入节点, 按照由近到远的顺序
+  protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {
+    const currParent = this.getNodeParent(node);
 
-    return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(
-      (_node) => this.getNodeParent(_node) === currParent
-    );
+    const result = new Set<FlowNodeEntity>();
+
+    // add by bfs
+    const queue: FlowNodeEntity[] = [node];
+
+    while (queue.length) {
+      const curr = queue.shift()!;
+
+      (curr.getData(WorkflowNodeLinesData)?.inputNodes || []).forEach((inputNode) => {
+        if (this.getNodeParent(inputNode) === currParent) {
+          result.add(inputNode);
+          queue.push(inputNode);
+        }
+      });
+    }
+
+    return Array.from(result).reverse();
   }
 
   // 获取同一层级所有输出节点
@@ -86,22 +100,25 @@ export class FreeLayoutScopeChain extends ScopeChain {
     let curr: FlowNodeEntity | undefined = node;
 
     while (curr) {
-      const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);
-
-      // 2. all public scopes of inputNodes
-      deps.push(
-        ...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)
-      );
-
-      // 3. all public children of inputNodes
-      deps.push(...allInputNodes.map((_node) => this.getAllPublicChildScopes(_node)).flat());
-
-      // 4. private scope of parent node can be access
+      // 2. private scope of parent node can be access
       const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);
       if (currVarData?.private && scope !== currVarData.private) {
-        deps.push(currVarData.private);
+        deps.unshift(currVarData.private);
       }
 
+      // 3. all public scopes of inputNodes
+      const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);
+      deps.unshift(
+        ...allInputNodes
+          .map((_node) => [
+            _node.getData(FlowNodeVariableData).public,
+            // 4. all public children of inputNodes
+            ...this.getAllPublicChildScopes(_node),
+          ])
+          .flat()
+          .filter(Boolean)
+      );
+
       curr = this.getNodeParent(curr);
     }