{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Item selection filter - single",
  "type": "object",
  "definitions": {
    "operand": {
      "type": "string"
    },
    "operandList": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/operand"
      }
    },
    "instantOperand": {
      "type": "string",
      "format": "date-time"
    },
    "valueOperators": {
      "type": "object",
      "properties": {
        "$eq": {
          "$ref": "#/definitions/operand"
        },
        "$ne": {
          "$ref": "#/definitions/operand"
        },
        "$in": {
          "$ref": "#/definitions/operandList"
        },
        "$nin": {
          "$ref": "#/definitions/operandList"
        },
        "$regex": {
          "type": "string"
        },
        "$exists": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "minProperties": 1
    },
    "setOperators": {
      "type": "object",
      "properties": {
        "$in": {
          "$ref": "#/definitions/operandList"
        },
        "$nin": {
          "$ref": "#/definitions/operandList"
        },
        "$regex": {
          "type": "string"
        },
        "$exists": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "minProperties": 1
    },
    "instantOperators": {
      "type": "object",
      "properties": {
        "$eq": {
          "$ref": "#/definitions/instantOperand"
        },
        "$ne": {
          "$ref": "#/definitions/instantOperand"
        },
        "$lt": {
          "$ref": "#/definitions/instantOperand"
        },
        "$lte": {
          "$ref": "#/definitions/instantOperand"
        },
        "$gt": {
          "$ref": "#/definitions/instantOperand"
        },
        "$gte": {
          "$ref": "#/definitions/instantOperand"
        },
        "$exists": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "minProperties": 1
    },
    "valueCondition": {
      "oneOf": [
        {
          "$ref": "#/definitions/valueOperators"
        },
        {
          "$ref": "#/definitions/operand"
        },
        {
          "$ref": "#/definitions/operandList"
        }
      ]
    },
    "setCondition": {
      "oneOf": [
        {
          "$ref": "#/definitions/setOperators"
        },
        {
          "$ref": "#/definitions/operandList"
        }
      ]
    },
    "instantCondition": {
      "oneOf": [
        {
          "$ref": "#/definitions/instantOperators"
        },
        {
          "$ref": "#/definitions/instantOperand"
        }
      ]
    },
    "group": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/definitions/filter"
      }
    },
    "filter": {
      "type": "object",
      "properties": {
        "$and": {
          "$ref": "#/definitions/group"
        },
        "$or": {
          "$ref": "#/definitions/group"
        },
        "createdAt": {
          "$ref": "#/definitions/instantCondition"
        },
        "updatedAt": {
          "$ref": "#/definitions/instantCondition"
        }
      },
      "patternProperties": {
        "^labels\\.": {
          "$ref": "#/definitions/setCondition"
        }
      },
      "additionalProperties": {
        "$ref": "#/definitions/valueCondition"
      },
      "not": {
        "required": [
          "$version"
        ]
      }
    },
    "rootFilter": {
      "type": "object",
      "properties": {
        "$version": {
          "description": "Schema/version for this filter document",
          "type": "integer",
          "enum": [
            1
          ]
        },
        "$and": {
          "$ref": "#/definitions/group"
        },
        "$or": {
          "$ref": "#/definitions/group"
        },
        "createdAt": {
          "$ref": "#/definitions/instantCondition"
        },
        "updatedAt": {
          "$ref": "#/definitions/instantCondition"
        }
      },
      "patternProperties": {
        "^labels\\.": {
          "$ref": "#/definitions/setCondition"
        }
      },
      "additionalProperties": {
        "$ref": "#/definitions/valueCondition"
      },
      "required": [
        "$version"
      ]
    }
  },
  "allOf": [
    {
      "$ref": "#/definitions/rootFilter"
    }
  ]
}
