FUNCTION get_characterized_column_headers
(input : Characteristic_data_table_header) : LIST [1:?] OF Independent_property;
LOCAL middle : SET [1:?] OF Independent_property; result : LIST [1:?] OF Independent_property; links : SET [1:?] OF Characteristic_data_table_header_link; temp : Independent_property; precedent : SET [0:?] OF Characteristic_data_table_header_link; subsequent : SET [0:?] OF Characteristic_data_table_header_link; END_LOCAL; -- Collect all headers links := bag_to_set(USEDIN(input, 'CHARACTERISTIC_ARM.' + 'CHARACTERISTIC_DATA_TABLE_HEADER_LINK.TABLE')); -- Collect all Independent_properties REPEAT i := 1 TO HIINDEX(links); middle := middle + links[i]\Characteristic_data_table_header_link.precedent; middle := middle + links[i]\Characteristic_data_table_header_link.subsequent; END_REPEAT; result[1] := ?; -- Now need TO construct the resulting list REPEAT i := 1 TO HIINDEX(middle); precedent := bag_to_set(QUERY (l <* (USEDIN(middle[i], 'CHARACTERISTIC_ARM.' + 'CHARACTERISTIC_DATA_TABLE_HEADER_LINK.PRECEDENT')) | l.table = input)); -- illegal chain IF (SIZEOF(precedent) > 1) THEN RETURN(?); END_IF; -- check IF this is NOT last member IF (SIZEOF(precedent) = 1) THEN subsequent := bag_to_set(QUERY (l <* (USEDIN(middle[i], 'CHARACTERISTIC_ARM.' + 'CHARACTERISTIC_DATA_TABLE_HEADER_LINK.SUBSEQUENT')) | l.table = input)); -- we found first member IF (SIZEOF(subsequent) = 0) THEN result[1] := middle[i]; ESCAPE; END_IF; END_IF; END_REPEAT; -- IF there is no first member found yet - chain is broken IF (result[1] = ?) THEN RETURN (?); END_IF; temp := result[1]; REPEAT i := 2 TO HIINDEX(middle); result[i] := precedent[1]\Characteristic_data_table_header_link.subsequent; precedent := bag_to_set(QUERY (l <* (USEDIN(result[i], 'CHARACTERISTIC_ARM.' + 'CHARACTERISTIC_DATA_TABLE_HEADER_LINK.PRECEDENT')) | l.table = input)); IF (HIINDEX(middle) = i) THEN ESCAPE; END_IF; -- illegal chain IF (SIZEOF(precedent) <> 1) THEN RETURN(?); END_IF; END_REPEAT; RETURN (result); END_FUNCTION; -- get_characterized_column_headers
|