09:22,
August 10, 2018

At work, I've built a command-line client program for a number of microservices,
which mostly do CRUD operations. I am looking to add search capabilities, but
this is not as easy a task as I'd thought.

Possibilites

Let's call this client program boxer, because that's what it's actually
named.

So using boxer, one can query a service to return an item in a database.
Let's call this a thingy (not what it's really called). Getting
a thingy is simple:

boxer get thingy [thing name]

And if we want a list of thingies:

boxer list thingies

With me so far? This is easy stuff. But what if we want to filter that list of
thingies? Maybe it looks like this:

boxer list thingies where name = 'monkey'
boxer list thingies where name = 'goat' and version = 1

But then the client program would have to know the structure of the data
at the time it builds the argument parser - this is either really difficult, or
involves querying the API for information. Probably not worth doing.

Or if there isn't a whole lot of data, the list call could return everything
as JSON, and we could filter it using jq:

boxer list thingies | jq '.|(select(.name=="monkey"))'

This of course gets messy, and when you have a LOT of data, it's expensive to
fetch ALL of it each time you only want a subset. Better to do the filtering
at the back-end.

Common searches

Some things I figure people will commonly search for:

string 'like' or pattern in a string

item with an integer field max, as in "the thingy with the highest version"

item with the most recent date

Prior Art

I've been searching for any sort of "standard" for doing this, but so far I've
come up empty. Lots of programs do this kind of thing, but it seems that
everyone just re-invents the wheel each time, and there's no consistency.