Topological sort code problem

Chris Wallace <[email protected]>
Newsgroups gmane.text.xml.exist
Message-ID <CAH0WD3qEYZc4Hgzh28dB+vhhqV=3JtoiJSq5Aeb7dT_zdR=mcA@mail.gmail.com>
Back in the day (2008) , I wrote an algorithm for a topological sort and
put it in the wikibook

  https://en.wikibooks.org/wiki/XQuery/Topological_Sort

It's been there for 14 years  and is unchanged but it doesn't now on my 3.0
version nor on 5.3.1
<sorted> <graph> <node id="b"> <ref id="c"/> </node> <node id="c"/> <node
id="a"> <ref id="b"/> <ref id="c"/> </node> </graph> </sorted>

It returns all nodes but they are not in the right order and even more
puzzling the condition for the nodes to be in order evaluates true for both
the expected value and the erroneous result.

Has it always been wrong - I'm sure it worked on the then current version.
It seems to be transparently correct or has something changed?

The problem seems to be that in constructing the
expression ($ordered,$nodes), the ordering of of the $ordered nodes  is lost

Here is the test script

declare function local:topological-sorted($nodes) as xs:boolean {
    every $n in $nodes satisfies
          every $id in $n/ref/@id
                 satisfies $id = $n/preceding::node/@id
};

declare function local:topological-sort($unordered, $ordered)   {
    if (empty($unordered))
    then $ordered
    else
        let $nodes := $unordered [ every $id in ref/@id satisfies $id =
$ordered/@id]
        return
          if ($nodes)
          then local:topological-sort( $unordered except $nodes, ($ordered,
$nodes ))
          else ()  (: cycles so no order possible :)
};

let $graph :=
 <graph>
    <node id="a">
       <ref id="b"/>
       <ref id="c"/>
    </node>
    <node id="b">
       <ref  id="c"/>
    </node>
    <node id="c"/>
 </graph>

let $expected :=
  <graph>
     <node id="c"/>
     <node id="b">
       <ref  id="c"/>
     </node>
     <node id="a">
       <ref id="b"/>
       <ref id="c"/>
     </node>
  </graph>

let $sortedNodes := <graph>{local:topological-sort($graph/node,())}</graph>
let $issorted := local:topological-sorted($sortedNodes)
let $expectedsorted := local:topological-sorted($expected/node)
return
   element result {
       element input {$graph},
       element expected {$expected},
       element sorted {$sortedNodes},
       element issorted {$issorted},
       element expected-sorted {$expectedsorted}
   }

_______________________________________________
Exist-open mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/exist-open
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.