On Sun, Nov 07, 2021 at 04:39:34PM -0300, Rafael Azevedo wrote:

> This is the kind of knowledge that comes from Mars...

The `jq` interpreter is a rather handy tool.  It is is worth learning if
you spend enough time working with JSON data.  No Martian passport
required, just enough incentive and curiousity to make the effort.

> > jq -nr --argjson days "$days" '         # Bind $days via command line
> >     (now - 86400 * $days) as $too_old   # Bind $too_old to cutoff time
> >   | $ARGS.positional as $qs             # Bind argv ("$@") as $qs
> >   | inputs                              # Input stream
> >   | select(.arrival_time < $too_old)    # Prune young messages
> >   | first(select($qs == []              # Prune unless queue match
> >     or { ( .queue_name , "all" ): true  # queue_name, all -> true
> >        }[$qs[]]))                       # indexed with each of $qs
> >   | .queue_id                           # Grab just the queue_id
> >   | select(test("^\\w+$"))              # Make sure it is safe
> >   ' --args -- "$@"                      # Set $ARGS.positional to "$@"

The only subtle bits above are:

0. `jq` streams are analogous to Python generators, but they're much
   more central in the design of `jq`, everything works on streams,
   what isn't a stream is merely a stream with one element.

1. `{ (stream): val }` creates an object in which each of the keys
   generated by `stream` takes the value `val`.

2. `object[stream]` yields a stream of values obtained by using
   each element of `stream` as a key into that object.

3. `expr | select(stream)` yields each value `expr` for each
   value of `stream` that is neither `null` nor `false`.

4. `expr | first(select(stream))` outputs each value of `expr`
   at most once (when at least value in `stream` was not
   null or false).

The rest is just `jq` dialect for features you find in many other
languages.  The novelty is using "|" for function composition, and
having streams as a fundamental abstraction.

[ And now, back to your regularly scheduled stream of Postfix topics ]

-- 
    Viktor.

Reply via email to