Skip to content

Operators

Nat Van Gulck edited this page Jun 13, 2025 · 20 revisions

JSONLogic operators

For a list of built-in JSONLogic operators see https://jsonlogic.com/operations.html.

PBI Inspector operators

PBI Inspector adds additional operators beyond those provided by the JSONLogic library. Here they are in alphabetical order.

count

Counts the number of items in an array.

Example:

    {
      "id": "CHECK_FOR_LOCAL_MEASURES",
      "name": "Check for locally defined measures",
      "description": "Returns an array of report-level measure definitions",
      "part": "ReportExtensions",
      "test": [
        {
          "filter": [
            {
              "var": "entities"
            },
            {
              ">": [
                {
                  "count": [
                    {
                      "var": "measures"
                    }
                  ]
                },
                0
              ]
            }
          ]
        },
        {
          "entities": "/entities"
        },
        []
      ]
    }

diff

Venn diagram

Accepts two JSON array parameters, treats them as non-ordered sets, and returns a JSON array representing the set difference between the first and the second parameter.

Example:

{
  "id": "REMOVE_UNUSED_CUSTOM_VISUALS",
  "name": "Remove custom visuals which are not used in the report.",
  "description": "Returns an array of custom visual names to be removed if any. To disable this rule, mark it as disabled in the base rules file.",
  "disabled": false,
  "part": "Report",
  "test": [
    {
      "diff": [
        {
          "var": "customvis"
        },
        {
          "map": [
            { "part": "Visuals" },
            { "var": "visual.visualType" }
          ]
        }
      ]
    },
    {
      "customvis": "/publicCustomVisuals"
    },
    []
  ]
}

drillvar

Accepts a json pointer string and parses stringified JSON on the right of a '>' character. The drillvar operator was needed in V1 of PBI Inspector due to the large amount the escaped json in the report.json file. It is less relevant for PBI Inspector V2 but still useful for querying escaped json such as in the Deneb custom visual definition.

filesize

PBI Inspector uses JSONLogic to inspect query json report definition files. However the report definition can also include other files such as image files within the StaticResources folder for example. For each non-json file, PBI Inspector creates in-memory json annotation key-value pairs containing the full file path and file name (at positions 0 and 1 respectively). The fileSize custom operator returns the file size of non-Json files in bytes as shown in this example:

{
      "id": "LIST_STATICRESOURCES_FILESIZE",
      "name": "List staticresources file sizes.",
      "description": "list sizes of png files only",
      "disabled": false,
      "part": "StaticResources",
      "test": [
        {
          "map": [
            {
              "filter": [
                {
                  "part": "Files"
                },
                {
                  "strcontains": [
                    {
                      "var": "annotations.1.value"
                    },
                    "png"
                  ]
                }
              ]
            },
            {
              "filesize": [
                {
                  "var": "annotations.0.value"
                }
              ]
            }
          ]
        },
        []
      ]
}

equalsets

Accepts two JSON array parameters, treats them as non-ordered sets, and determines if they are equal.

filesize

Accepts one parameter with a file path string. Returns the size of the file on disk. This can be used to check that size of static resources files such as images does not exceed a given threshold.

{
  "id": "LIST_STATICRESOURCES_FILESIZE",
  "name": "List staticresources file sizes.",
  "description": "list sizes of png files only",
  "disabled": false,
  "part": "StaticResources",
  "test": [
    {
      "map": [
        {
          "filter": [
            {
              "part": "Files"
            },
            {
              "strcontains": [
                {
                  "var": "annotations.1.value"
                },
                "png"
              ]
            }
          ]
        },
        {
          "filesize": [
            {
              "var": "annotations.0.value"
            }
          ]
        }
      ]
    },
    []
  ]
},

intersection

Venn diagram

Accepts two JSON array parameters, treats them as non-ordered sets, and returns a JSON array representing the intersection of both sets.

part

The part operator returns a part corresponding to a PBIR file path within the report definition folder.

The following part or parts can be returned (note that the part names are case-sensitive):

  • Report: returns the part with the report.json file path
  • ReportExtensions: returns the part with the "reportExtensions.json" file path
  • Version: returns the part with the version.json file path
  • PagesHeader: returns the part with the pages.json file path depending on the parent part context
  • Pages: returns a list of all parts with *.page.json file paths
  • AllVisuals: returns a list of all parts with *.visual.json file paths
  • Visuals: returns a list of parts with *.visual.json file paths in the context of the rule's own "part" iterator.
  • AllMobileVisuals: returns a list of all parts with *.mobile.json file paths regardless of parent context
  • MobileVisuals: returns a list of parts with *.mobile.json file paths in the context of the rule's own "part" iterator.
  • BookmarksHeader: returns the part with the bookmarks.json file path depending on the parent part context
  • AllBookmarks: returns a list of all parts with *.bookmark.json file paths.
  • Bookmarks: returns a list of parts with *.bookmark.json file paths in the context of the rule's own "part" iterator.
  • Files: returns a list of parts for each file within the parent part context

part matching by file name

If the part operator is used to reference a part that is not included in the list above then it will attempt to match the file by name. For example, returning a theme file part might look like this: "part":"CY23SU04.json"

See below for an example using the "Visuals" part operator within the rule's test definition. The part operator in this example returns visual definitions for each page as an array.

{
  "id": "DISABLE_DROP_SHADOWS_ON_VISUALS",
  "name": "Disable drop shadows on visuals",
  "description": "Drop shadows are not suitable for everyone, this rule returns an array of visuals with drop shadows enabled.",
  "part": "Pages",
  "test": [
    {
      "map": [
        {
          "filter": [
            {
              "part": "Visuals"
            },
            {
              "some": [
                {
                  "var": "visual.visualContainerObjects.dropShadow"
                },
                {
                  "==": [
                    { "var": "properties.show.expr.Literal.Value" },
                    "true"
                  ]
                }
              ]
            }
          ]
        },
        {
          "var": "name"
        }
      ]
    },
    {},
    []
  ]
}

path

The path operator provides the ability to define a JSONPath to query the context json. PBI Inspector V2 uses the JsonPath.Net implementation. For details about JSONPath syntax with examples see https://docs.json-everything.net/path/basics/ and https://www.rfc-editor.org/rfc/rfc9535.html.

Example:

    {
      "id": "REDUCE_OBJECTS_WITHIN_VISUALS",
      "name": "Reduce the number of objects within visuals",
      "part": "Pages",
      "test": [
        {
          "map": [
            {
              "filter": [
                {
                  "part": "Visuals"
                },
                {
                  ">": [
                    {
                      "count": [
                        {
                          "path": "$..projections[*]"
                        }
                      ]
                    },
                    6
                  ]
                }
              ]
            },
            {
              "var": "name"
            }
          ]
        },
        {},
        []
      ]
    }

query

[documentation in progress]

rectoverlap

Accepts a JSON array of rectangle ids, x and y coordinates and width, height and optional margin width. Returns an array of overlapping rectangle ids (inflated by the margin width).

strcontains

Accepts a search string and regular expression as parameters. Returns the count of regular expression matches in the search string.

{
  "id": "GIVE_VISIBLE_PAGES_MEANINGFUL_NAMES",
  "name": "Give visible pages meaningful names",
  "description": "Returns an array of visible page names with a default 'Page x' display name.",
  "test": [
    {
      "map": [
        {
          "filter": [
            {
              "part": "Pages"
            },
            {
              "and": [
                {
                  "strcontains": [
                    {
                      "var": "displayName"
                    },
                    "^Page [1-9]+$"
                  ]
                },
                {
                  "!=": [
                    {
                      "var": "visibility"
                    },
                    "HiddenInViewMode"
                  ]
                }
              ]
            }
          ]
        },
        {
          "var": "displayName"
        }
      ]
    },
    {},
    []
  ]
}

symdiff

Venn diagram

Accepts two JSON array parameters, treats them as non-ordered sets, and returns a JSON array representing the symmetric difference of both sets.

torecord

Accepts an array of key/value pairs as parameter. Return a JSON record.

tostring

Accepts a JSON node as parameter and returns the equivalent stringified JSON.

union

Venn diagram

Accepts two JSON array parameters, treats them as non-ordered sets, and returns a JSON array representing the union of both sets.

Clone this wiki locally