I need help building a data structure for a state diagram

Tim Chase python.list at tim.thechases.com
Sun May 24 15:20:04 EDT 2009


> I'm working on a really simple workflow for my bug tracker.  I want
> filed bugs to start in an UNSTARTED status.  From there, they can go to
> STARTED.
> 
>>From STARTED, bugs can go to FINISHED or ABANDONED.
> 
> I know I can easily hard-code this stuff into some if-clauses, but I
> expect to need to add a lot more statuses over time and a lot more
> relationships.
> 
> This seems like a crude state diagram.  So, has anyone on this list done
> similar work?

I've got a similar workflow in one of my applications at work.  I 
use a database to persist the available states along with their 
transitions.  Both the states themselves and the transitions have 
various attributes to them to facilitate my workflows.  The 
following schema should work in most databases such as sqlite 
(included with Python2.5+) with minor syntactic tweaks (such as 
auto-increment)

   CREATE TABLE States (
    id INT PRIMARY KEY AUTOINCREMENT,
    description VARCHAR(50),
    other_attributes ...
   );

   CREATE TABLE Transitions (
    id INT PRIMARY KEY AUTOINCREMENT,
    from_state INT NOT NULL REFERENCES States(id),
    to_state INT NOT NULL REFERENCES States(id),
    other_attributes ...
   );
   INSERT INTO States (description) VALUES
    ('Started'),
    ('Finished'),
    ('Abandoned');
   INSERT INTO Transitions (from_state, to_state) VALUES
    (1, 2), -- Started -> Finished
    (1, 3), -- Started -> Abandoned
    (3, 2);  -- Abandoned -> Finished

You can then query states you can transition to:

   SELECT s1.description, s2.description, t.other_attributes
   FROM Transitions t
   INNER JOIN States s1
   ON s1.id = t.from_id
   INNER JOIN States s2
   ON s2.id = t.to_id
   -- WHERE t.from_id = @current_id
   ORDER BY s1.description, s2.description


You can easily add more state rows as well as transition rows to 
the tables.  Then use the other_attributes of either the 
transition or the state to control the workflows (we have 
transition attributes for things like "notifies account-manager", 
"notifies customer", "number of days that must pass from initial 
workflow-start", "number of days that must pass from most recent 
status change", "does this transition happen manually or 
automatically via an overnight script", etc.)  The workflow 
processing code then looks at these attributes for the transition 
that's being attempted, and behaves accordingly.

Hope this gives you some ideas.  If you want to read more, the 
magic google-words are "finite state automaton" (FSA) or "finite 
state machine" (FSM)[1]

-tkc

[1]
http://en.wikipedia.org/wiki/Finite_state_machine









More information about the Python-list mailing list