<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Folks,
    <div class="moz-forward-container">
      <p>I have a topology built from two business tables containing
        linestrings (pipes) and a table containing points (pits).<br>
      </p>
      <p>The business requirement means we need the topology to clean
        and form common topological primitives for these lines and their
        nodes.<br>
      </p>
      <p>The topology will never contain polygons (faces) - should I use
        pgRouting instead?<br>
      </p>
      <p>While fairly static, both tables are subject to occasional DML.
        <br>
      </p>
      <p><b>Insert Trigger:</b></p>
      <p>A before insert trigger (trigger function - tf) handles any
        additions (uses toTopoGeom).<br>
        <br>
        <font face="monospace">DECLARE </font><font face="monospace"><font
            face="monospace">-- pseudo code<br>
              </font>v_layer_id integer := 1;<br>
            v_geom     geometry;<br>
            v_topogeom topology.TopoGeometry;<br>
          BEGIN<br>
            IF ( TG_OP = 'INSERT') THEN<br>
              -- Create topology primitives for new linestring<br>
          <b>    v_topogeom := topology.toTopoGeom(NEW.path_line,'path',
            v_layer_id, 0.1);</b><br>
              -- The action of adding the linestring to the topology may
          see it become slightly different from the original
          NEW.path_line<br>
          <b>    v_geom := v_topogeom::geometry;</b><b><br>
          </b><b> </b>    -- Then conduct the insert to the business
          table<br>
              INSERT <table> (geom,topogeom) VALUES
          (v_geom,v_topoGeom);<br>
              RETURN NEW;<br>
            END IF;<br>
          END;</font><br>
      </p>
      <p>QUESTION: If the new linestring that is added to the existing
        topology causes an existing underlying edge to change (eg
        split),<br>
        what happens to any other topogeom objects in the table that
        reference the edge before it is changed? <br>
        Should the affected topogeoms be found and updated to reflect
        any splits to edges?<br>
      </p>
      <p>I am not sure what are the best topology methods to handle
        updates and/or deletes.<br>
      </p>
      <p><b>Update Trigger.</b></p>
      <p>Here I want to construct an UPDATE trigger (tf) to handle
        situations where points are moved or linestrings are reshaped.</p>
      <p>In both situations the existing topogeoms point to existing
        topological primitives. To handle a change should I first delete
        the existing topogeom using clearTopoGeom() which modifies the
        underlying topology, and then use toTopoGeom to construct the
        new topological primitives and the topogeom value?<br>
        <br>
        <font face="monospace">BEGIN -- pseudo code<br>
            IF ( TG_OP = 'UPDATE' ) THEN<br>
              -- clear any topology primitives the old topogeom uniquely
          referenced<br>
              v_topogeom := topology.clearTopoGeom(OLD.topogeom);<br>
              -- Construct new topology primitives for new linestring.<br>
              v_topogeom := topology.toTopoGeom(NEW.path_line,'path',
          v_layer_id, 0.1);<br>
        </font><font face="monospace"><font face="monospace"><b>   
              v_geom := v_topogeom::geometry;</b><b><br>
            </b><b> </b></font>    -- Then update the underlying
          topology<br>
              UPDATE <</font><font face="monospace"><font
            face="monospace">table</font>> SET topogeom = v_topogeom,
          geom = v_geom WHERE id = OLD.id;<br>
              RETURN NEW;<br>
            END IF;<br>
          END;</font><br>
      </p>
      <p><b>Delete Trigger</b></p>
      <p>Here I want to construct an DELETE trigger (tf). Is this all I
        need to do?</p>
      <p><font face="monospace">BEGIN -- pseudo code<br>
            IF ( TG_OP = 'DELETE' ) THEN<br>
              -- Synchronize delete with underlying topology<br>
              v_topogeom := topology.clearTopoGeom(NEW.topogeom);<br>
              -- Then delete the record<br>
              DELETE FROM <table> </font><font face="monospace"><font
            face="monospace">WHERE id = OLD.id;</font> <br>
              RETURN OLD;<br>
            END IF;<br>
          END;</font><br>
      </p>
      <p>Any help/pointers greatly appreciated.</p>
      <p>Simon<br>
      </p>
      <p><br>
      </p>
    </div>
  </body>
</html>