@@ -17,75 +17,35 @@ export class UnconnectedElement extends RuleCommon implements core.IRuleDefiniti
1717
1818 public execute ( flow : core . Flow ) : core . RuleResult {
1919
20+ const connectedElements : Set < string > = new Set < string > ( ) ;
21+
22+ // Callback function to log connected elements
23+ const logConnected = ( element : core . FlowNode ) => {
24+ connectedElements . add ( element . name ) ;
25+ } ;
26+
27+ // Get Traversable Nodes
2028 const flowElements : core . FlowNode [ ] = flow . elements . filter ( node => node instanceof core . FlowNode ) as core . FlowNode [ ] ;
21- let indexesToProcess = [ this . findStart ( flowElements ) ] ;
22- const processedElementIndexes : number [ ] = [ ] ;
23- const unconnectedElementIndexes : number [ ] = [ ] ;
24- if ( indexesToProcess [ 0 ] && indexesToProcess [ 0 ] === - 1 && ! flow . startElementReference ) {
25- throw 'Can not find starting element' ;
26- }
27- if ( indexesToProcess [ 0 ] && indexesToProcess [ 0 ] === - 1 && flow . startElementReference ) {
28- indexesToProcess = [
29- flowElements . findIndex ( n => {
30- return n . name == flow . startElementReference [ 0 ] ;
31- } )
32- ] ;
33- }
34- do {
35- indexesToProcess = indexesToProcess . filter ( index => ! processedElementIndexes . includes ( index ) ) ;
36- if ( indexesToProcess . length > 0 ) {
37- for ( const [ index , element ] of flowElements . entries ( ) ) {
38- if ( indexesToProcess . includes ( index ) ) {
39- const references : string [ ] = [ ] ;
40- if ( element . connectors && element . connectors . length > 0 ) {
41- for ( const connector of element . connectors ) {
42- if ( connector . reference ) {
43- references . push ( connector . reference ) ;
44- }
45- }
46- }
47- if ( references . length > 0 ) {
48- const elementsByReferences = flowElements . filter ( anElement => references . includes ( anElement . name ) ) ;
49- for ( const nextElement of elementsByReferences ) {
50- const nextIndex = flowElements . findIndex ( anElement => nextElement . name === anElement . name ) ;
51- if ( ! processedElementIndexes . includes ( nextIndex ) ) {
52- indexesToProcess . push ( nextIndex ) ;
53- }
54- }
55- }
56- processedElementIndexes . push ( index ) ;
57- }
58- }
59- } else {
60- for ( const index of flowElements . keys ( ) ) {
61- if ( ! processedElementIndexes . includes ( index ) ) {
62- unconnectedElementIndexes . push ( index ) ;
63- }
64- }
65- }
66- } while ( ( processedElementIndexes . length + unconnectedElementIndexes . length ) < flowElements . length ) ;
6729
68- const processedElements = [ ] ;
69- const unconnectedElements = [ ] ;
70- for ( const [ index , element ] of flowElements . entries ( ) ) {
71- if ( processedElementIndexes . includes ( index ) ) {
72- processedElements . push ( element ) ;
73- } else if ( unconnectedElementIndexes . includes ( index ) ) {
74- unconnectedElements . push ( element ) ;
75- }
76- }
77- let results = [ ] ;
78- for ( const det of unconnectedElements ) {
79- results . push ( new core . ResultDetails ( det ) ) ;
30+ // Find start of Flow
31+ const startIndex = this . findStart ( flowElements ) ;
32+
33+ // Start traversal from the start node
34+ if ( startIndex !== - 1 ) {
35+ new core . Compiler ( ) . traverseFlow ( flow , flowElements [ startIndex ] . name , logConnected ) ;
8036 }
37+
38+ const unconnectedElements : core . FlowNode [ ] = flowElements . filter ( element => ! connectedElements . has ( element . name ) ) ;
39+
40+ // Create result details
41+ const results = unconnectedElements . map ( det => new core . ResultDetails ( det ) ) ;
42+
8143 return new core . RuleResult ( this , results ) ;
8244 }
8345
84- private findStart ( nodes : core . FlowElement [ ] ) {
46+ private findStart ( nodes : core . FlowNode [ ] ) {
8547 return nodes . findIndex ( n => {
8648 return n . subtype === 'start' ;
8749 } ) ;
8850 }
89-
90-
9151}
0 commit comments