Queries

  • Tier: Premium, Ultimate
  • Offering: GitLab.com
  • Status: Experiment

The availability of this feature is controlled by a feature flag. For more information, see the history. This feature is available for testing, but not ready for production use.

Orbit queries are JSON objects that describe graph work. A query can fetch one kind of object, traverse relationships between objects, count matching objects, find a path, or ask for the neighbors of a node.

Queries run through GitLab authorization. The response contains only data the current user can read in GitLab.

Choose a query shape

Use caseQuery shape
Fetch matching nodes of one entity typeSingle-node traversal
Follow relationships between known entity typesMulti-node traversal
Count, sum, average, or group graph resultsaggregation
Find a path between two bounded endpointspath_finding
Ask what is connected to one bounded nodeneighbors

Single-node traversal is the search shape. Orbit does not have a separate search query type.

Example: fetch a merge request diff

Use the diff column on MergeRequest to fetch the full unified diff for a merge request. Request virtual columns explicitly by name.

{
  "query_type": "traversal",
  "node": {
    "id": "mr",
    "entity": "MergeRequest",
    "node_ids": [12345],
    "columns": ["iid", "title", "state", "diff"]
  },
  "limit": 1
}

Merge request diff content has a few different shapes:

EntityColumnWhat it returns
MergeRequestdiffFull unified diff for the merge request
MergeRequestDiffpatchFull patch for one diff snapshot
MergeRequestDiffFilediffPer-file unified diff text
FilecontentRaw source file text
DefinitioncontentSource text for one indexed definition

The content column is for source code nodes. For merge request diff text, use diff or patch, depending on the entity.

Example: fetch diff snapshots and changed files

Use HAS_DIFF to move from a merge request to its diff snapshots, then HAS_FILE to fetch the files in those snapshots.

{
  "query_type": "traversal",
  "nodes": [
    {
      "id": "mr",
      "entity": "MergeRequest",
      "node_ids": [12345],
      "columns": ["iid", "title", "state"]
    },
    {
      "id": "snapshot",
      "entity": "MergeRequestDiff",
      "columns": ["id", "state", "patch"]
    },
    {
      "id": "file",
      "entity": "MergeRequestDiffFile",
      "columns": ["new_path", "old_path", "too_large", "diff"]
    }
  ],
  "relationships": [
    {"type": "HAS_DIFF", "from": "mr", "to": "snapshot"},
    {"type": "HAS_FILE", "from": "snapshot", "to": "file"}
  ],
  "limit": 20
}

MergeRequestDiffFile.diff is null when too_large is true.

Example: fetch source file content

Use content on source code entities. This example searches indexed files by path and returns the raw file text.

{
  "query_type": "traversal",
  "node": {
    "id": "file",
    "entity": "File",
    "filters": {
      "path": {"op": "ends_with", "value": "app/models/project.rb"}
    },
    "columns": ["path", "language", "content"]
  },
  "limit": 5
}

For the full syntax, available fields, and validation rules, see Orbit query language.