Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes")

Subject: Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes")
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 28 Dec 2021 23:54:41 -0000
On Tue, Dec 28, 2021 at 3:47 PM Michael Kay mike@xxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> For a solution that delivers distinct nodes in order of first appearance,
my preference would be
>
> nodes => fold-left((), function($all, $this) {if ($all intersect $this)
then $all else ($all, $this)})

   $nodes[index-of($nodes ! generate-id(.), generate-id(.))[1]]

This seems a candidate for "the shortest solution" and it shouldn't be
inefficient, given a good optimizer:

Cheers,
Dimitre

On Tue, Dec 28, 2021 at 3:47 PM Michael Kay mike@xxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> For a solution that delivers distinct nodes in order of first appearance,
> my preference would be
>
> $nodes => fold-left((), function($all, $this) {if ($all intersect $this)
> then $all else ($all, $this)})
>
> It's likely to be O(n^2) in most implementations, whereas Martin Honnen's
> solution is probably O(n log n) -- but this one is XPath rather than
> XQuery, and feels more elegant.
>
> Michael Kay
> Saxonica
>
> On 28 Dec 2021, at 21:56, Michael Kay mike@xxxxxxxxxxxx <
> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> You might consider
>
> $nodes | ()
>
> a bit more intuitive.
>
> Michael Kay
> Saxonica
>
> On 28 Dec 2021, at 19:23, Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx <
> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hmph.
>
> That is certainly much more efficient p
 but is not necessarily obvious
> (at least not to me).
>
> Thanks!
>
> E.
>
> _____________________________________________
> *Eliot Kimber*
> Sr Staff Content Engineer
> O: 512 554 9368
>
> M: 512 554 9368
> servicenow.com <https://www.servicenow.com/>
> LinkedIn <https://www.linkedin.com/company/servicenow> | Twitter
> <https://twitter.com/servicenow> | YouTube
> <https://www.youtube.com/user/servicenowinc> | Facebook
> <https://www.facebook.com/servicenow>
>
>
> *From: *Martin Honnen martin.honnen@xxxxxx <
> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
> *Date: *Tuesday, December 28, 2021 at 1:15 PM
> *To: *xsl-list@xxxxxxxxxxxxxxxxxxxxxx <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> *Subject: *Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct
> nodes")
>
> [External Email]
>
>
> On 28.12.2021 20:10, Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx wrote:
> > I couldnbt find an answer in my google and markmail searching so I
> > thought Ibd ask here:
> >
> > Given an arbitrary list of nodes that may contain duplicates, what is
> > the most efficient way to reduce the node list to a set?
> >
> > The solution I came up with is a recursive function:
> >
> > (:
> >
> > Get the unique nodes from the supplied sequence
> >
> > @param nodes The sequence of nodes to evaluate
> >
> > @return A sequence of nodes such that each node in $nodes exists exactly
> > once.
> >
> > :)
> >
> > declare function dutils:distinctNodes($nodes as node()*) as node()* {
> >
> >    dutils:_getDistinctNodes($nodes, ())
> >
> > };
> >
> > declare function dutils:_getDistinctNodes($nodes as node()*, $resultList
> > as node()*) as node()* {
> >
> >    if (exists($nodes))
> >
> >    then
> >
> >    let $node := head($nodes)
> >
> >    return dutils:_getDistinctNodes(tail($nodes), ($resultList | $node))
> >
> >    else $resultList
> >
> > };
> >
> > Which works but I feel like Ibm missing some obvious way to do this
more
> > directly, but Ibm not seeing it.
> >
> > Am I missing a better solution?
>
> $nodes/.
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by
> email)
>
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by
> email)
>
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/782854> (by
> email <>)
>


--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread