11"use strict" ;
22
3+ var extend = require ( "util" ) . _extend ;
4+
35var lineage_hunter = function ( ) {
46
57 var pa = require ( './pattern_assembler' ) ;
68
79 function findlineage ( pattern , patternlab ) {
10+ // As we are adding edges from pattern to ancestor patterns, ensure it is known to the graph
11+ patternlab . graph . add ( pattern ) ;
812
913 var pattern_assembler = new pa ( ) ;
1014
@@ -28,6 +32,11 @@ var lineage_hunter = function () {
2832 l . lineageState = ancestorPattern . patternState ;
2933 }
3034
35+ patternlab . graph . add ( ancestorPattern ) ;
36+
37+ // Confusing: pattern includes "ancestorPattern", not the other way round
38+ patternlab . graph . link ( pattern , ancestorPattern ) ;
39+
3140 pattern . lineage . push ( l ) ;
3241
3342 //also, add the lineageR entry if it doesn't exist
@@ -44,62 +53,71 @@ var lineage_hunter = function () {
4453 }
4554
4655 ancestorPattern . lineageR . push ( lr ) ;
56+ extend ( patternlab . graph . node ( ancestorPattern ) , lr ) ;
4757 }
4858 }
4959 } ) ;
5060 }
5161 }
5262
53- function setPatternState ( direction , pattern , targetPattern ) {
54- // if the request came from the past, apply target pattern state to current pattern lineage
63+ /**
64+ * Apply the target pattern state either to any predecessors or successors of the given
65+ * pattern in the pattern graph.
66+ * @param direction Either 'fromPast' or 'fromFuture'
67+ * @param pattern {Pattern}
68+ * @param targetPattern {Pattern}
69+ * @param graph {PatternGraph}
70+ */
71+ function setPatternState ( direction , pattern , targetPattern , graph ) {
72+ var index = null ;
5573 if ( direction === 'fromPast' ) {
56- for ( var i = 0 ; i < pattern . lineageIndex . length ; i ++ ) {
57- if ( pattern . lineageIndex [ i ] === targetPattern . patternPartial ) {
58- pattern . lineage [ i ] . lineageState = targetPattern . patternState ;
59- }
60- }
74+ index = graph . lineage ( pattern ) ;
6175 } else {
62- //the request came from the future, apply target pattern state to current pattern reverse lineage
63- for ( var i = 0 ; i < pattern . lineageRIndex . length ; i ++ ) {
64- if ( pattern . lineageRIndex [ i ] === targetPattern . patternPartial ) {
65- pattern . lineageR [ i ] . lineageState = targetPattern . patternState ;
66- }
76+ index = graph . lineageR ( pattern ) ;
77+ }
78+
79+ // if the request came from the past, apply target pattern state to current pattern lineage
80+ for ( var i = 0 ; i < index . length ; i ++ ) {
81+ if ( index [ i ] . patternPartial === targetPattern . patternPartial ) {
82+ index [ i ] . lineageState = targetPattern . patternState ;
6783 }
6884 }
6985 }
7086
7187
7288 function cascadePatternStates ( patternlab ) {
7389
74- var pattern_assembler = new pa ( ) ;
75-
7690 for ( var i = 0 ; i < patternlab . patterns . length ; i ++ ) {
7791 var pattern = patternlab . patterns [ i ] ;
7892
7993 //for each pattern with a defined state
8094 if ( pattern . patternState ) {
95+ var lineage = patternlab . graph . lineage ( pattern ) ;
8196
82- if ( pattern . lineageIndex && pattern . lineageIndex . length > 0 ) {
97+ if ( lineage && lineage . length > 0 ) {
8398
8499 //find all lineage - patterns being consumed by this one
85- for ( var h = 0 ; h < pattern . lineageIndex . length ; h ++ ) {
86- var lineagePattern = pattern_assembler . getPartial ( pattern . lineageIndex [ h ] , patternlab ) ;
87- setPatternState ( 'fromFuture' , lineagePattern , pattern ) ;
100+ for ( var h = 0 ; h < lineage . length ; h ++ ) {
101+ // Not needed, the graph already knows the concrete pattern
102+ // var lineagePattern = pattern_assembler.getPartial(lineageIndex[h], patternlab);
103+ setPatternState ( 'fromFuture' , lineage [ h ] , pattern , patternlab . graph ) ;
88104 }
89105 }
90-
91- if ( pattern . lineageRIndex && pattern . lineageRIndex . length > 0 ) {
106+ var lineageR = patternlab . graph . lineageR ( pattern ) ;
107+ if ( lineageR && lineageR . length > 0 ) {
92108
93109 //find all reverse lineage - that is, patterns consuming this one
94- for ( var j = 0 ; j < pattern . lineageRIndex . length ; j ++ ) {
110+ for ( var j = 0 ; j < lineageR . length ; j ++ ) {
95111
96- var lineageRPattern = pattern_assembler . getPartial ( pattern . lineageRIndex [ j ] , patternlab ) ;
112+ var lineageRPattern = lineageR [ j ] ;
97113
98114 //only set patternState if pattern.patternState "is less than" the lineageRPattern.patternstate
99115 //or if lineageRPattern.patternstate (the consuming pattern) does not have a state
100116 //this makes patternlab apply the lowest common ancestor denominator
101- if ( lineageRPattern . patternState === '' || ( patternlab . config . patternStateCascade . indexOf ( pattern . patternState )
102- < patternlab . config . patternStateCascade . indexOf ( lineageRPattern . patternState ) ) ) {
117+ let patternStateCascade = patternlab . config . patternStateCascade ;
118+ let patternStateIndex = patternStateCascade . indexOf ( pattern . patternState ) ;
119+ let patternReverseStateIndex = patternStateCascade . indexOf ( lineageRPattern . patternState ) ;
120+ if ( lineageRPattern . patternState === '' || ( patternStateIndex < patternReverseStateIndex ) ) {
103121
104122 if ( patternlab . config . debug ) {
105123 console . log ( 'Found a lower common denominator pattern state: ' + pattern . patternState + ' on ' + pattern . patternPartial + '. Setting reverse lineage pattern ' + lineageRPattern . patternPartial + ' from ' + ( lineageRPattern . patternState === '' ? '<<blank>>' : lineageRPattern . patternState ) ) ;
@@ -108,9 +126,9 @@ var lineage_hunter = function () {
108126 lineageRPattern . patternState = pattern . patternState ;
109127
110128 //take this opportunity to overwrite the lineageRPattern's lineage state too
111- setPatternState ( 'fromPast' , lineageRPattern , pattern ) ;
129+ setPatternState ( 'fromPast' , lineageRPattern , pattern , patternlab . graph ) ;
112130 } else {
113- setPatternState ( 'fromPast' , pattern , lineageRPattern ) ;
131+ setPatternState ( 'fromPast' , pattern , lineageRPattern , patternlab . graph ) ;
114132 }
115133 }
116134 }
0 commit comments