Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recursive schema evaluation - stop evaluating initial value for empty array #1282

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

Monteth
Copy link
Member

@Monteth Monteth commented Aug 11, 2023

Uniforms go through the schema to get starting values for the following fields. Therefore, during the initial load, it must go through all the 'leaves' of the schema tree. This eager approach prevents us from processing recursive schemas. However, this doesn't have to be the case.

When we think about different types of recursive schemas, they only make sense when they can be completed in a finite amount of time. This requires specific points where the evaluation can stop. An array has a built-in mechanism for this. It can contain one or multiple values to continue expanding the tree, or it can have 0 elements to close off a branch. This enables us to evaluate a recursive schema and create a finite model. In this model, the 'leaves' can consist of empty arrays.

Consider this schema, where we can add multiple children on different levels, and it will only evaluate the next tree level when we add a new value to the model (+ button).
So the schema of the family tree is potentially infinite, but the model is finite.

{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "children": {
      "type": "array",
      "items": { "$ref": "#" }
    }
  }
}
const model = {
  "children": [
    {
      "name": "Emma",
      "children": [
        {
          "name": "Olivia"
        },
        {
          "name": "Sophia",
          "children": [
            {
              "name": "Zoe"
            }
          ]
        }
      ]
    }
  ],
  "name": "Alice"
};

@github-actions github-actions bot added Area: Bridge Affects some of the bridge packages Bridge: JSON Schema Affects the uniforms-bridge-json-schema package labels Aug 11, 2023
@Monteth Monteth added this to the v4.0 milestone Aug 18, 2023
@kestarumper kestarumper self-requested a review September 1, 2023 10:13
@kestarumper kestarumper linked an issue Sep 29, 2023 that may be closed by this pull request
@Monteth Monteth marked this pull request as ready for review April 19, 2024 14:13
@Monteth Monteth requested a review from wadamek65 as a code owner April 19, 2024 14:13
Copy link

codecov bot commented Apr 26, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 94.50%. Comparing base (49715f4) to head (124e714).
Report is 2 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1282      +/-   ##
==========================================
- Coverage   94.61%   94.50%   -0.11%     
==========================================
  Files         231      231              
  Lines        3823     3824       +1     
  Branches     1030     1030              
==========================================
- Hits         3617     3614       -3     
- Misses         82       83       +1     
- Partials      124      127       +3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@kestarumper
Copy link
Member

We talked internally with @Monteth, and we also want to include a basic cycle detection mechanism to prevent freezing the browser tab (prevent infinite loops).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: Bridge Affects some of the bridge packages Bridge: JSON Schema Affects the uniforms-bridge-json-schema package
Projects
Status: In progress
Development

Successfully merging this pull request may close these issues.

Support for lazy recursive JSON schemas
2 participants