Re: [netmod] false() vs 'false' in 'when' statements

Andy Bierman <andy@yumaworks.com> Wed, 08 August 2018 15:13 UTC

Return-Path: <andy@yumaworks.com>
X-Original-To: netmod@ietfa.amsl.com
Delivered-To: netmod@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 06649130E13 for <netmod@ietfa.amsl.com>; Wed, 8 Aug 2018 08:13:44 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.91
X-Spam-Level:
X-Spam-Status: No, score=-1.91 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, T_DKIMWL_WL_MED=-0.01] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=yumaworks-com.20150623.gappssmtp.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Vd8SeZKy_4Jw for <netmod@ietfa.amsl.com>; Wed, 8 Aug 2018 08:13:36 -0700 (PDT)
Received: from mail-lj1-x244.google.com (mail-lj1-x244.google.com [IPv6:2a00:1450:4864:20::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 9CBE01292AD for <netmod@ietf.org>; Wed, 8 Aug 2018 08:13:35 -0700 (PDT)
Received: by mail-lj1-x244.google.com with SMTP id j19-v6so2004403ljc.7 for <netmod@ietf.org>; Wed, 08 Aug 2018 08:13:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yumaworks-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=B2O9XzwppyV8Pg6r6bWKodxLOJ3Trbb7Rg7whwIgm0Q=; b=ewJI6B2YJftkP6NZTxX5oMKkX+4UfuQgyGTsvEOcOUGr7+Jjk3YupooeXj4TtIBrmD mDRZJm/6XUJ85AUOYRWZ2StHVZ/ms/yhG9mRnPVIUzLyXOTeYiYFF9aZV3ccXuIlEKZG 6Pl1iCp/zJkt75Cm9TZsxYkVHSou/GsKJYv0PW5BkjTr9tcOqUx5J6R9z5PofmRL4ePN gdnEpQv54iJ1q1HhOneznW98iOiz053FpmCNunpF5xU2350Yidq9HdRv7GAIfY+xEHi+ ZKKoUzltrnZR1L3VJF9ijRMrrM4nXbeDmFpQl957/KV0Hs5qQKflw1DnBlfeOBe4Pcpw KSfw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=B2O9XzwppyV8Pg6r6bWKodxLOJ3Trbb7Rg7whwIgm0Q=; b=NntVnKe3vbr7FY/NjHJ8sEFx7ZVroBbRO5TQrUaaRZJ16XYVOoNiKMeSK20Z2p6C6U zIMep+TQI0KS9+NzJ+Cw3txOyu/wCE9Ib2s08XhrdTf+SKLS4KR0ACBWSrteg51YKm5G goy2N5cQGFF2WOnVnrKuKk3AqzoIxI0mGwgNyjzNCX95ENhf6izgrXgkmSZ5K/vaj4j+ ksk29DKcl3D/mAzdUCt39FcRd9IB2M9+OzCUE+gm3sQ0bzXTPit9h+caGMNDgu7QW+rg Z4J95zz/j7AoozrbzDH/I3tSVu4TLCLcDvs2/HPmw/2LF/O2w/C+DagB/qMzhqQs5jng Cq+Q==
X-Gm-Message-State: AOUpUlHrSSgQv+ZrFZQLDa4vO2lNfYuDYPQcg3MptC5YJcSSZTi8JsKy RX6c6U6KwuczaGl/WGQJIMGyUMD+8Op+3Qki2BkOGQ==
X-Google-Smtp-Source: AA+uWPwtXcybFID6WS9pI8/yYeiPkJlSaICE60CzZvO9DRQLms7fxDRtQrv9/DmSzbx/ZRdd3TZ7kW5r2i0TIb98e50=
X-Received: by 2002:a2e:9f4d:: with SMTP id v13-v6mr2313105ljk.42.1533741213753; Wed, 08 Aug 2018 08:13:33 -0700 (PDT)
MIME-Version: 1.0
Received: by 2002:a19:aa46:0:0:0:0:0 with HTTP; Wed, 8 Aug 2018 08:13:32 -0700 (PDT)
In-Reply-To: <20180808.155048.1116801606990172501.mbj@tail-f.com>
References: <VI1PR07MB3981A0DC1F7069AFC5BE72AD9B270@VI1PR07MB3981.eurprd07.prod.outlook.com> <E3378E0605547F4E854DEE0CB1116AB03A8BA8@gbcdcmbx03.intl.att.com> <VI1PR07MB39813DB16C1AF2314EBD14EE9B260@VI1PR07MB3981.eurprd07.prod.outlook.com> <20180808.155048.1116801606990172501.mbj@tail-f.com>
From: Andy Bierman <andy@yumaworks.com>
Date: Wed, 08 Aug 2018 08:13:32 -0700
Message-ID: <CABCOCHTUEedds_164G7cF=T6=9-Jd4HJG=bc7JyBGTpKf0-4Mg@mail.gmail.com>
To: Martin Bjorklund <mbj@tail-f.com>
Cc: "Sterne, Jason (Nokia - CA)" <jason.sterne@nokia.com>, NetMod WG <netmod@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000393bf10572edf4af"
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod/wBDKdh6dzc008fwcU4UNitYO1zY>
Subject: Re: [netmod] false() vs 'false' in 'when' statements
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.27
Precedence: list
List-Id: NETMOD WG list <netmod.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/netmod>, <mailto:netmod-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/netmod/>
List-Post: <mailto:netmod@ietf.org>
List-Help: <mailto:netmod-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/netmod>, <mailto:netmod-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 08 Aug 2018 15:13:44 -0000

On Wed, Aug 8, 2018 at 6:50 AM, Martin Bjorklund <mbj@tail-f.com> wrote:

> Hi,
>
> "Sterne, Jason (Nokia - CA/Ottawa)" <jason.sterne@nokia.com> wrote:
> > Thanks William.
> > Please see below.
> > Regards,
> > Jason
> >
> > > -----Original Message-----
> > > From: Ivory, William <william.ivory@intl.att.com>
> > > Sent: Wednesday, August 8, 2018 3:27 AM
> > > To: Sterne, Jason (Nokia - CA/Ottawa) <jason.sterne@nokia.com>;
> > > netmod@ietf.org
> > > Subject: Re: [netmod] false() vs 'false' in 'when' statements
> > >
> > > On 07/08/18 18:37, Sterne, Jason (Nokia - CA/Ottawa) wrote:
> > > Hi all,
> > >
> > > When comparing the value of a boolean leaf in a 'when' statement (or a
> > > 'must'
> > > statement), is an equality comparison to 'true' or 'false' the same as
> > > a check
> > > against true() or false() ?
> > >
> > > For example:
> > >
> > > leaf a {
> > >     type boolean;
> > > }
> > > leaf b {
> > >     type uint32;
> > >     when ".../a = 'true'";
> > > }
> > > leaf c {
> > >     type uint32;
> > >     when ".../a = 'false'";
> > > }
> > > (note that neither b nor c can be configured if leaf a isn't
> > > explicitly configured
> > > with a value since there is no default)
> > >
> > > If I replace the two 'when' statements above with the following
> > > instead, is the
> > > behavior the same ?
> > >     ...
> > >     when ".../a = true()";
> > >     ...
> > >     when ".../a = false()";
> > >     ...
> > >
> > > Or does "../a = true()" behave as an existence check on leaf a and
> > > would be
> > > enabled whether a is configured as true or false ?
> > >
> > > Regards,
> > > Jason
> > >
> > >
> > >
> > > See https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans
> > >
> > > (a) "../a = 'true'"
> > >
> > > Compares 'string-value' (same as value of node if a leaf, rather more
> > > interesting if a list / container!) of each node in nodeset generated
> > > by '../a' and
> > > if any node in the nodeset matches 'true', expression is true.
> >
> > [>>JTS: ] In my specific example, leaf a is a single Boolean leaf.  In
> > that case, are these equivalent ?
> >     when ".../a = 'true'";
> >     when ".../a = true()";
>
> No...
>
> > and are these also equivalent ?
> >     when ".../a = 'false'";
> >     when ".../a = false()";
>
> .... and no.
>
> What you probably want is ".../a = 'true'" (or 'false').
>
> The expression:
>
>     ".../a = true()";
>
> will first take the string value of ".../a", which e.g. is "false".
> This string value is then converted to a boolean, resulting in the
> boolean value True (b/c the string is non-empty).
>
> This means that if "a" is set at all (to true or false), the
> expression ".../a = true()" returns true.  The expression ".../a =
> false()" will only return true if "a" is unset.
>
>

I suggest reading the XPath definition of boolean comparisons:
https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans

It is a bit complicated, but generally, a node-set is converted
to a boolean (==false for empty, ==true for not empty) when
compared to a boolean for equality/inequality.

 false is a boolean
 'false' is a string
 false() is a function that return a boolean


Andy


> (sorry if I'm being dense here, but I'm not 100% positive if I'm
> > interpreting your explanations correctly and getting the right
> > conclusion.  I've never seen must or when statements that use =
> > false() or = true()).
> >
> > [>>JTS: ] Are the strings 'true' and 'false' the "string-value" (that
> > you mention above) for a Boolean leaf ?
>
> Yes, according to 9.5.1 in RFC 7950.
>
> > 'a' is a single Boolean leaf so the nodeset is that single leaf and
> > the value is 'true' or 'false'.
> >
> > >
> > > (b) "../a = true()"
> > >
> > > Similar to above but after getting the string-value, this is converted
> > > to a
> > > boolean before comparing with the boolean true.
> >
> > [>>JTS: ] I'm a bit confused here.  Are you saying that the
> > string-value of leaf a is converted to a Boolean ?
> > Do the string-values of a convert to something that is equal to true()
> > or false() ?
>
> See above.
>
>
> /martin
>
>
> >
> > >
> > > (c) '../a'
> > >
> > > True if the nodeset generated by this expression is not empty.
> > >
> > > ---
> > >
> > > Caveats alluded to above are that if '../a' matches multiple nodes,
> > > then only
> > > one of these nodes needs to pass the test for the test to be true.
> > > Separately, if
> > > any of the nodes are not leaves, the 'string-value' is a concatenated
> > > string of
> > > the values of the node's child / grandchild leaves.
> > >
> > > Hope that helps.  You wouldn't believe the number of unit tests I have
> > > to make
> > > sure we get this logic right!  Using '!=' when comparing a nodeset
> > > with >1 node
> > > with other values is very likely not to give the answer you expect (-:
> > >
> > > Regards,
> > >
> > > William
> > >
> >
> > _______________________________________________
> > netmod mailing list
> > netmod@ietf.org
> > https://www.ietf.org/mailman/listinfo/netmod
> >
>
> _______________________________________________
> netmod mailing list
> netmod@ietf.org
> https://www.ietf.org/mailman/listinfo/netmod
>