Querying IPs in the system

Helix IPLM provides a powerful query language to search for objects in the system. You can use the streamlined Query Builder for simple searches and create your own queries for customized searches. Queries can be run from PiCLI, IPLM Web, or the API. IPLM Web queries are run from the Advanced search page. This section describes example queries used within the Helix IPLM platform in both the PiCLI and IPLM Web interfaces.

Advanced search in IPLM Web

Open Query Builder

The Advanced search page provides a single UI for building custom queries and accessing Saved queries. To access Query Builder, open the Advanced search page using the navigation menu at the top of the screen.

Select search criteria

Start by selecting one or more search criteria from the More... menu. You can customize the searchable fields by changing QUERY_BUILDER_FIELDS and QUERY_BUILDER_FIELDS_FEATURED in the piweb.conf file. See IPLM Web configuration for more information.

Refine the search

Each search criteria selection presents its own search sub-menu. For example, selecting IP Author displays a username selection menu.

Selecting IP Created Date displays Start and End date pickers. A single click provides a start date and clicking two dates enters a date range.

For string query and string Property Type fields, there is an additional selector that allows you to choose to include and exclude search terms with the following options:

  • Equals

  • Contains (preselected as default)

  • Starts with

  • Ends with

  • Does not equal

  • Does not contain

  • Does not start with

  • Does not end with

Preview and save the search

Once the search criteria has been selected, click Preview to display the results. The search criteria can be further refined if necessary by adding additional query fields.

To save the query, provide a name and click save. The query will then appear on the left side navigation. The query can be exported to CSV, which can take a few minutes. See Saved queries for more information, including how to share queries and organize them into folders.

Note:  By default any query saved this way will not be shared (it will only be available to the user that saved it). Administrators can share useful queries with the entire user base as needed.

Optional: modify the query syntax

For users who want to refine their search to add more advanced search criteria not natively supported in Query Builder, the query syntax can be directly modified in the resulting query string.

Use the three lines menu to display or hide columns of properties defined in property sets. For more information on customizing the view, see Creating column templates.

IP related fields for use in queries

IP

  • attributes (list of attributes)

  • creation_timestamp (integer)

  • creator (user)

  • description (string)

  • dm_type (string)

  • dmtype: see dm_type

  • fqn (string): the FQN of the IP, e.g. chipsets.gpu456

  • hook_post_load (string)

  • hook_post_release (string)

  • hook_post_update (string)

  • hook_pre_release (string)

  • host (string)

  • ipls (list of IPLs)

  • labels (list of labels)

  • lib: see library

  • library (library)

  • lines: see ipls

  • name (string): the name of the IP, e.g. cpu123

  • properties (object with custom properties)

Any other field is checked to see whether it represents a property attached to the IP.

IPL

  • aliases (list of aliases)

  • attributes (list of attributes)

  • creation_timestamp (integer)

  • creator (user)

  • fqn (string): the FQN of the line, e.g. chipsets.cpu123@.TRUNK

  • ip (IP)

  • ipvs (list of IPVs)

  • labels (list of labels)

  • name (string): the name of the line, e.g. TRUNK

IPV

  • aliases (list of aliases): the aliases currently referencing the IPV

  • all_resources (list of IPV resources)

  • attributes (list of attributes)

  • creation_timestamp (integer)

  • creator (user)

  • fqn (string): the FQN of the IPV, e.g. chipsets.gpu456@5.TRUNK

  • ip (IP)

  • ipl (IPL)

  • labels (list of labels)

  • line: see ipl

  • message: see version_message

  • old_aliases (list of aliases): the aliases previously referencing the IPV

  • private_resources (list of IPV resources)

  • project_props (string)

  • properties (object with custom properties)

  • repo_path (string)

  • resources (list of IPV resources)

  • version (integer)

  • version_message (string)

Any other field is checked against the custom properties.

IPV resources

  • alias (alias): the alias of the IPV resource, if any

All other fields are the same as the IPV of the IPV resource.

Aliases

  • creation_timestamp (integer)

  • creator (user)

  • fqn (string): the FQN of the alias, e.g. chipsets.gpu123@LATEST

  • ipl (line)

  • ipv (IPV): the IPV currently referenced by the alias

  • line: see ipl

  • locked (boolean)

  • name (string): the name of the alias, e.g. LATEST

Searching IPs in PiCLI 

Listing with search

'pi ip list' output can be filtered with searches:

Command Option Description
--label LABEL [LABEL ..] Filter the output by the one or more LABELs. If more the one LABELs are provided the IPs that have ALL the LABELs are returned (AND of the LABELs)
--match-substring, -m Search the fields of the IP objects returned by the specified MATCH_SUBSTRING. This option offers superior performance to running a full list of IPs and then piping through grep ( | grep). The substring match can be performed on server and so generates smaller set of results.
--query, -q QUERY Search IPs using a query defined on the command line (not a Saved query). See the Helix IPLM query language section for more details.
--squery , -sq SQUERY Search IPs using a Saved query. See the Helix IPLM query language section for more details on Saved queries.

The 'pi ip list' command is actually returning IPV (IP Versions or releases) rather than IPs directly. This is normally not a noteworthy fact, but it must be understood in order to understand query language construction around the 'pi ip list' command.

When searching IPs with a query such as:

Searching IPs with a Query
pi ip ls -q 'any(ip.attributes, {it.name ~= "FAQ"})'
The 'ip.attributes' element is referring to the attributes of the IP that is the parent of the IPV that the pi ip list command has returned. In running a similar search on Library attributes the query would be:
ip attributes Element
pi lib ls -q 'any(attributes, {it.name ~= "FAQ"})'

In this case the 'pi lib list' command returns Libraries directly, and we are asking for attributes attached to the Libraries that 'pi lib list' has returned.

IPs by Library Name and IP Name With a Wildcard
> pi ip list -q 'lib="ARM" && ip *= "cor*"'
┌─────────────────────┬────┬──────────────────┬────────────┬───────────────────────────────┬──────────────────────────┐
│ NAME                │ DM │ ALIASES          │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE          │
╞═════════════════════╪════╪══════════════════╪════════════╪═══════════════════════════════╪══════════════════════════╡
│ ARM.cortex@1.L1     │ P4 │ HEAD LATEST      │ admin      │ 2019-06-27 14:14:09 -0400 EDT │ releasing ARM.cortex@.L1 │
│ ARM.cortex@1.L2     │ P4 │ HEAD LATEST      │ admin      │ 2019-06-27 14:14:11 -0400 EDT │ releasing ARM.cortex@.L2 │
│ ARM.cortex@1.L3     │ P4 │ HEAD LATEST      │ admin      │ 2019-06-27 14:14:12 -0400 EDT │ releasing ARM.cortex@.L3 │
│ ARM.cortex@1.L4     │ P4 │ HEAD LATEST      │ admin      │ 2019-06-27 14:14:13 -0400 EDT │ releasing ARM.cortex@.L4 │
│ ARM.cortex@6.TRUNK  │ P4 │ HEAD LATEST      │ admin      │ 2019-06-27 14:14:03 -0400 EDT │ releasing ARM.cortex     │
│ ARM.cortex2@5.TRUNK │ P4 │ GOLD HEAD LATEST │ admin      │ 2019-06-27 14:14:05 -0400 EDT │ Initial version          │
└─────────────────────┴────┴──────────────────┴────────────┴───────────────────────────────┴──────────────────────────┘
Found 6 matching object(s).
IPs by Property Value
> pi ip ls -q 'prop1="test1"'
┌──────────────────────┬────┬─────────────┬────────────┬────────────┬─────────────────┐
│ NAME                 │ DM │ ALIASES     │ CREATED BY │ CREATED ON │ VERSION MESSAGE │
╞══════════════════════╪════╪═════════════╪════════════╪════════════╪═════════════════╡
│ drinks.beer@1.TRUNK  │ P4 │ HEAD LATEST │            │            │ Version one     │
│ drinks.vodka@1.TRUNK │ P4 │ HEAD LATEST │            │            │ Version one     │
└──────────────────────┴────┴─────────────┴────────────┴────────────┴─────────────────┘
IPs by Creator Name
> pi ip list -q 'creator=="admin"'
┌────────────────────────────────────┬──────┬──────────────────┬────────────┬───────────────────────────────┬───────────────────────┐
│ NAME                               │ DM   │ ALIASES          │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE       │
╞════════════════════════════════════╪══════╪══════════════════╪════════════╪═══════════════════════════════╪═══════════════════════╡
│ ARM.cortex@1.TRUNK                 │ CONT │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:25 -0400 EDT │ Initial version       │
│ ARM.cpu@1.TRUNK                    │ P4   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:38 -0400 EDT │ copied tutorial cpu   │
└────────────────────────────────────┴──────┴──────────────────┴────────────┴───────────────────────────────┴───────────────────────┘
IPs by Property Name and Value
> pi ip ls -q 'prop1="test1" && power>3'
┌─────────────────────┬────┬─────────────┬────────────┬────────────┬─────────────────┐
│ NAME                │ DM │ ALIASES     │ CREATED BY │ CREATED ON │ VERSION MESSAGE │
╞═════════════════════╪════╪═════════════╪════════════╪════════════╪═════════════════╡
│ drinks.beer@1.TRUNK │ P4 │ HEAD LATEST │            │            │ Version one     │
└─────────────────────┴────┴─────────────┴────────────┴────────────┴─────────────────┘
IPs by Type and Library
> pi ip list -q 'dm_type="CONT" && lib="ARM"'
┌────────────────────┬──────┬─────────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME               │ DM   │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞════════════════════╪══════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ ARM.cortex@1.TRUNK │ CONT │ HEAD LATEST │ admin      │ 2017-06-15 15:15:25 -0400 EDT │ Initial version │
└────────────────────┴──────┴─────────────┴────────────┴───────────────────────────────┴─────────────────┘
IPs by Absolute Creation Time
> pi ip ls -q 'ip.creation_timestamp < datetime(2017,5,24) && ip.creation_timestamp > datetime(2017,5,1)'
┌───────────────────────────────┬──────┬─────────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                          │ DM   │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞═══════════════════════════════╪══════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ tutorial.adc_top@1.TRUNK      │ CONT │ HEAD LATEST │ admin      │ 2017-05-22 13:36:00 -0700 PDT │ First version   │
└───────────────────────────────┴──────┴─────────────┴────────────┴───────────────────────────────┴─────────────────┘
IPs by Relative Creation Time
> pi ip ls -q 'ip.creation_timestamp > now()-weeks(2)'
┌────────────────────────────────────┬──────┬──────────────────┬────────────┬───────────────────────────────┬───────────────────────┐
│ NAME                               │ DM   │ ALIASES          │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE       │
╞════════════════════════════════════╪══════╪══════════════════╪════════════╪═══════════════════════════════╪═══════════════════════╡
│ ARM.cortex@1.TRUNK                 │ CONT │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:25 -0400 EDT │ Initial version       │
│ ARM.cpu@1.TRUNK                    │ P4   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:38 -0400 EDT │ copied tutorial cpu   │
│ Data-Converter.adc@1.TRUNK         │ P4   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:37 -0400 EDT │ copied tutorial adc   │
│ Mem.flash@1.TRUNK                  │ P4   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:36 -0400 EDT │ copied tutorial flash │
│ PDK.MS90G@1.TRUNK                  │ FS   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:15 -0400 EDT │ Initial version       │
│ PDK.fab1_09@1.TRUNK                │ FS   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:14 -0400 EDT │ Initial version       │
│ PDK.gpdk090@1.TRUNK                │ FS   │ HEAD LATEST      │ admin      │ 2017-06-15 15:15:14 -0400 EDT │ Initial version       │
└────────────────────────────────────┴──────┴──────────────────┴────────────┴───────────────────────────────┴───────────────────────┘


IPs with an Alias by a Regex Search of their Name Fields with a Property that is Unset
>  pi ip ls @GOLD -a -q 'ip.name ~= ".*_top" & power is NULL'
┌─────────────────────────────────────────┬────┬──────────────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                                    │ DM │ ALIASES          │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞═════════════════════════════════════════╪════╪══════════════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ tutorial.analog_top@GOLD.TRUNK [@2]     │ P4 │ GOLD HEAD LATEST │ admin      │ 2017-06-12 14:57:42 -0700 PDT │ another release │
└─────────────────────────────────────────┴────┴──────────────────┴────────────┴───────────────────────────────┴─────────────────┘
IPVs by Relative Creation Time
> pi ip ls -a -q 'creation_timestamp > now()-weeks(2)'
┌──────────────────────┬────┬─────────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                 │ DM │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞══════════════════════╪════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ drinks.vodka@3.TRUNK │ P4 │ HEAD LATEST │ admin      │ 2018-01-08 2:57:19 -0800 PST  │ test            │
│ drinks.vodka@2.TRUNK │ P4 │             │ admin      │ 2018-01-08 2:53:12 -0800 PST  │ test            │
└──────────────────────┴────┴─────────────┴────────────┴───────────────────────────────┴─────────────────┘


IPVs that Exceed a Target Property Value
> pi ip ls -a tutorial. -q 'power > target_power'
┌───────────────────────────────┬────┬─────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                          │ DM │ ALIASES │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞═══════════════════════════════╪════╪═════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ tutorial.tutorial@2.TRUNK     │ P4 │         │ admin      │ 2017-06-16 09:31:44 -0700 PDT │ Initial version │
└───────────────────────────────┴────┴─────────┴────────────┴───────────────────────────────┴─────────────────┘
All the Versions of an IP with a Given Alias Applied
> pi ip list tutorial.padring -a -q 'contains( aliases, "GOLD") || contains(old_aliases, "GOLD")'
┌──────────────────────────┬────┬─────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                     │ DM │ ALIASES │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞══════════════════════════╪════╪═════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ tutorial.padring@2.TRUNK │ P4 │ GOLD    │ admin      │ 2018-03-16 07:13:10 -0700 PDT │ hier release    │
│ tutorial.padring@1.TRUNK │ P4 │ GOLD    │ admin      │ 2018-03-16 07:13:04 -0700 PDT │ hier release    │

Aliases are returned in list format, so we use the query language's list processing capabilities to work with the results.

pi ip list tutorial.padring -a -q 'contains( aliases, "GOLD") || contains(old_aliases, "GOLD")'

Command Option Definition
contains( A list function (see Helix IPLM query language) which evaluates to true if the expression is true for any of the items in the list
aliases All the current aliases applied to the IPVs
"GOLD" The current alias to look for
|| Apply the previous filter or the subsequent filter
contains( A list function (see Helix IPLM query language) which evaluates to true if the expression is true for any of the items in the list
old_aliases All the non-current aliases applied to the IPVs
"GOLD" The non-current alias to look for


All IPs with Label1 or Label2 Attached
> pi ip ls -q 'any(ip.labels, {it = "3rd_party" or it = "MS90G_LP"})'
┌───────────────────────────────┬────┬─────────────┬────────────┬───────────────────────────────┬─────────────────────────────────┐
│ NAME                          │ DM │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE                 │
╞═══════════════════════════════╪════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════════════════════╡
│ ARM.cortex@6.TRUNK            │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:43 -0800 PST │ releasing ARM.cortex            │
│ Data-Converter.sd_adc@1.TRUNK │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:35 -0800 PST │ releasing Data-Converter.sd_adc │
│ Mem.nand_flash@1.TRUNK        │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:18 -0800 PST │ releasing Mem.nand_flash        │
│ Mem.nor_flash@1.TRUNK         │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:13 -0800 PST │ releasing Mem.nor_flash         │
│ PDK.MS90G_LP@1.TRUNK          │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:22 -0800 PST │ releasing PDK.MS90G_LP          │
│ PLL.cyclone_pll@1.TRUNK       │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:30 -0800 PST │ releasing PLL.cyclone_pll       │
│ PLL.tms_pll@1.TRUNK           │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:39 -0800 PST │ releasing PLL.tms_pll           │
└───────────────────────────────┴────┴─────────────┴────────────┴───────────────────────────────┴─────────────────────────────────┘
Found 7 matching object(s).

All IPs with Label1 and Label2 Attached
> pi ip ls -q 'any(ip.labels, {it = "3rd_party"}) and any(ip.labels, {it = "MS90G_LP"})'
┌───────────────────────────────┬────┬─────────────┬────────────┬───────────────────────────────┬─────────────────────────────────┐
│ NAME                          │ DM │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE                 │
╞═══════════════════════════════╪════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════════════════════╡
│ Data-Converter.sd_adc@1.TRUNK │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:35 -0800 PST │ releasing Data-Converter.sd_adc │
│ PDK.MS90G_LP@1.TRUNK          │ P4 │ HEAD LATEST │ admin      │ 2018-01-23 11:07:22 -0800 PST │ releasing PDK.MS90G_LP          │
└───────────────────────────────┴────┴─────────────┴────────────┴───────────────────────────────┴─────────────────────────────────┘
Found 2 matching object(s).

Locked Aliases on an IP
> pi ip ls tutorial.tutorial -q 'any(it.aliases, {it.locked = True  and it = "GOLD"} )'
┌───────────────────────────┬────┬─────────┬────────────┬───────────────────────────────┬──────────────────┐
│ NAME                      │ DM │ ALIASES │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE  │
╞═══════════════════════════╪════╪═════════╪════════════╪═══════════════════════════════╪══════════════════╡
│ tutorial.tutorial@4.TRUNK │ P4 │ GOLD    │ admin      │ 2018-07-24 12:36:47 -0700 PDT │ tutorial release │
└───────────────────────────┴────┴─────────┴────────────┴───────────────────────────────┴──────────────────┘
Found 1 matching object(s).

Find All IPVs with an unlocked alias
> pi ip ls -a -q 'any(it.aliases, {it.locked!=True && it.name!="HEAD" && it.name!="LATEST"})'
┌───────────────────────────┬────┬─────────┬────────────┬───────────────────────────────┬──────────────────────┐
│ NAME                      │ DM │ ALIASES │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE      │
╞═══════════════════════════╪════╪═════════╪════════════╪═══════════════════════════════╪══════════════════════╡
│ ARM.cortex@5.TRUNK        │ P4 │ GOLD    │ admin      │ 2018-10-30 18:17:22 -0500 CDT │ releasing ARM.cortex │
│ ARM.cortex2@3.TRUNK       │ P4 │ GOLD    │ admin      │ 2018-10-30 18:17:27 -0500 CDT │ Initial version      │
│ tutorial.CADenv@1.TRUNK   │ P4 │ GOLD    │ admin      │ 2018-10-30 08:49:25 -0500 CDT │ hier release         │
│ tutorial.padring@2.TRUNK  │ P4 │ GOLD    │ admin      │ 2018-10-30 08:50:00 -0500 CDT │ hier release         │
│ tutorial.tutorial@4.TRUNK │ P4 │ GOLD    │ admin      │ 2018-10-30 08:50:36 -0500 CDT │ hier release         │
└───────────────────────────┴────┴─────────┴────────────┴───────────────────────────────┴──────────────────────┘

Find all IPV with a Partial Matching Alias
> pi ip ls -a -q 'any(aliases, {it*="RC1_*"})||any(aliases, {it*="RC2_*"})'
┌────────────────────────────┬────┬────────────────────────────┬────────────┬───────────────────────────────┬─────────────────┐
│ NAME                       │ DM │ ALIASES                    │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE │
╞════════════════════════════╪════╪════════════════════════════╪════════════╪═══════════════════════════════╪═════════════════╡
│ tutorial.CADenv@3.TRUNK    │ P4 │ HEAD LATEST RC1_2018_08_12 │ admin      │ 2018-10-30 08:49:27 -0500 CDT │ hier release    │
│ tutorial.gen_dig@2.TRUNK   │ P4 │ HEAD LATEST RC2_2019_01_02 │ admin      │ 2018-10-30 08:50:08 -0500 CDT │ hier release    │
│ tutorial.proj_tech@1.TRUNK │ P4 │ HEAD LATEST RC1_2019_01_21 │ admin      │ 2018-10-30 08:48:04 -0500 CDT │ hier release    │
└────────────────────────────┴────┴────────────────────────────┴────────────┴───────────────────────────────┴─────────────────┘

Find All IPs with a Particular Attribute Name
> pi ip ls -q 'any(ip.attributes, {it.name ~= "FAQ"})'
┌──────────────────────────────────┬──────┬─────────────┬────────────┬───────────────────────────────┬─────────────────────┐
│ NAME                             │ DM   │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE     │
╞══════════════════════════════════╪══════╪═════════════╪════════════╪═══════════════════════════════╪═════════════════════╡
│ tutorial.adc@1.TRUNK             │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:31:02 -0800 PST │ hier release        │
│ tutorial.analog_top@1.TRUNK      │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:35:09 -0800 PST │ analog_top release  │
│ tutorial.dac@0.TRUNK             │ CONT │ HEAD LATEST │ admin      │ 2019-11-08 17:30:48 -0800 PST │ Initial version     │
│ tutorial.digital_top@1.TRUNK     │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:35:42 -0800 PST │ tutorial release    │
│ tutorial.padring_renamed@1.L1    │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:36:23 -0800 PST │ padring L1 release  │
│ tutorial.padring_renamed@1.L2    │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:36:35 -0800 PST │ padring L2 release  │
│ tutorial.padring_renamed@1.L3    │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:36:49 -0800 PST │ padring L3 release  │
│ tutorial.padring_renamed@1.L4    │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:37:01 -0800 PST │ padring L4 release  │
│ tutorial.padring_renamed@5.TRUNK │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:36:01 -0800 PST │ tutorial release    │
│ tutorial.tutorial@1.L1           │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:37:42 -0800 PST │ tutorial L1 release │
│ tutorial.tutorial@1.L2           │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:38:13 -0800 PST │ tutorial L2 release │
│ tutorial.tutorial@1.L3           │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:38:41 -0800 PST │ tutorial L3 release │
│ tutorial.tutorial@1.L4           │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:39:12 -0800 PST │ tutorial L4 release │
│ tutorial.tutorial@5.TRUNK        │ P4   │ HEAD LATEST │ admin      │ 2019-11-08 17:37:10 -0800 PST │ tutorial release    │
└──────────────────────────────────┴──────┴─────────────┴────────────┴───────────────────────────────┴─────────────────────┘
Found 14 matching object(s).

The 'pi ip list' command returns IPVs, so the 'ip.attributes' construct refers to the list of attributes attached to the 'ip' of the IPVs returned by the pi ip list command. Note that providing the '-a' (all IPV) option here just prints all IPVs of the IPs returned, whether or not they match the query. See next example for how to look for attributes across IPVs. The listed output is in IPV format, but in this context they should be understood to refer to the IP objects rather than any specific IPV.

Find All IPVs with a Particular Attribute Name
> pi ip ls -a -q  'any(attributes, {name ~= "FAQ"})'
┌───────────────────────────┬────┬───────────────────────────┬────────────┬───────────────────────────────┬──────────────────┐
│ NAME                      │ DM │ ALIASES                   │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE  │
╞═══════════════════════════╪════╪═══════════════════════════╪════════════╪═══════════════════════════════╪══════════════════╡
│ tutorial.padring@1.TRUNK  │ P4 │ GOLD                      │ admin      │ 2020-01-27 06:52:50 -0800 PST │ tutorial release │
│ tutorial.tutorial@6.TRUNK │ P4 │ GOLD HEAD ISO26262 LATEST │ admin      │ 2020-01-27 07:19:25 -0800 PST │ adding fusa ip   │
│ tutorial.tutorial@5.TRUNK │ P4 │                           │ admin      │ 2020-01-27 06:53:17 -0800 PST │ tutorial release │
│ tutorial.tutorial@4.TRUNK │ P4 │ GOLD                      │ admin      │ 2020-01-27 06:53:17 -0800 PST │ tutorial release │
│ tutorial.tutorial@3.TRUNK │ P4 │                           │ admin      │ 2020-01-27 06:53:16 -0800 PST │ tutorial release │
│ tutorial.tutorial@2.TRUNK │ P4 │ GOLD                      │ admin      │ 2020-01-27 06:53:15 -0800 PST │ tutorial release │
│ tutorial.tutorial@1.TRUNK │ P4 │ GOLD                      │ admin      │ 2020-01-27 06:52:50 -0800 PST │ tutorial release │
│ tutorial.tutorial@0.TRUNK │ P4 │                           │ admin      │ 2020-01-27 06:52:44 -0800 PST │ Initial version  │
└───────────────────────────┴────┴───────────────────────────┴────────────┴───────────────────────────────┴──────────────────┘
Found 8 matching object(s).

Find All IPVs with the unix_group Project Property set to group 'mdx'
> pi ip ls -a -q 'project_props*="*unix_group\":\"mdx*"'
┌──────────────────────────┬────┬─────────────┬────────────┬───────────────────────────────┬──────────────────┐
│ NAME                     │ DM │ ALIASES     │ CREATED BY │ CREATED ON                    │ VERSION MESSAGE  │
╞══════════════════════════╪════╪═════════════╪════════════╪═══════════════════════════════╪══════════════════╡
│ tutorial.padring@6.TRUNK │ P4 │ HEAD LATEST │ admin      │ 2020-02-18 10:52:38 -0500 EST │ tutorial release │
└──────────────────────────┴────┴─────────────┴────────────┴───────────────────────────────┴──────────────────┘
Found 1 matching object(s).