diff --git a/Cargo.lock b/Cargo.lock index 79d686d22b..ea8552c9f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -992,7 +992,7 @@ dependencies = [ [[package]] name = "common" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "anyhow", "base64 0.21.4", @@ -3238,7 +3238,7 @@ dependencies = [ [[package]] name = "macros" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "proc-macro2", "quote", @@ -3331,7 +3331,7 @@ dependencies = [ [[package]] name = "meta-cli" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "anyhow", "assert_cmd", @@ -3741,7 +3741,7 @@ dependencies = [ [[package]] name = "native" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "anyhow", "base64 0.21.4", @@ -7594,7 +7594,7 @@ dependencies = [ [[package]] name = "typegraph_core" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "common", "enum_dispatch", @@ -7621,7 +7621,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "typescript" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "anyhow", "dprint-plugin-typescript", @@ -8469,7 +8469,7 @@ dependencies = [ [[package]] name = "xtask" -version = "0.2.3-0+dev" +version = "0.2.3" dependencies = [ "anyhow", "clap", diff --git a/dev/lock.yml b/dev/lock.yml index 4666bccf8e..a29376de25 100644 --- a/dev/lock.yml +++ b/dev/lock.yml @@ -68,7 +68,7 @@ dev: WASMEDGE_VERSION: 0.12.1 TYPEGRAPH_VERSION: 0.0.3 PRISMA_VERSION: 5.4.2 - METATYPE_VERSION: 0.2.3-0+dev + METATYPE_VERSION: 0.2.3 WASM_OPT_VERSION: 0.114.1 TAGLINE: >- Declarative API development platform. Build serverless backends with diff --git a/examples/templates/python/compose.yml b/examples/templates/python/compose.yml index ed19118517..441594b8ac 100644 --- a/examples/templates/python/compose.yml +++ b/examples/templates/python/compose.yml @@ -1,6 +1,6 @@ services: typegate: - image: ghcr.io/metatypedev/typegate:v0.2.3-0+dev + image: ghcr.io/metatypedev/typegate:v0.2.3 restart: always ports: - "7890:7890" diff --git a/examples/templates/python/pyproject.toml b/examples/templates/python/pyproject.toml index 389c757bcc..266c19931f 100644 --- a/examples/templates/python/pyproject.toml +++ b/examples/templates/python/pyproject.toml @@ -1,13 +1,13 @@ [tool.poetry] name = "example" -version = "0.2.3-0+dev" +version = "0.2.3" description = "" authors = [] readme = "README.md" [tool.poetry.dependencies] python = ">=3.8,<4.0" -typegraph = "0.2.3-0+dev" +typegraph = "0.2.3" [build-system] requires = ["poetry-core"] diff --git a/libs/common/Cargo.toml b/libs/common/Cargo.toml index a2a00bd146..a2fab263cc 100644 --- a/libs/common/Cargo.toml +++ b/libs/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "common" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [dependencies] diff --git a/libs/common/src/typegraph/runtimes/prisma.rs b/libs/common/src/typegraph/runtimes/prisma.rs index c1344317e7..1e2edc3a78 100644 --- a/libs/common/src/typegraph/runtimes/prisma.rs +++ b/libs/common/src/typegraph/runtimes/prisma.rs @@ -44,6 +44,93 @@ pub struct Relationship { pub right: RelationshipModel, } +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +pub enum Injection { + DateNow, + // TODO other dynamic injection? +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct ManagedInjection { + pub create: Option, + pub update: Option, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +pub enum StringType { + Plain, + Uuid, + DateTime, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(tag = "type")] +pub enum ScalarType { + Boolean, + #[serde(rename = "Int")] + Integer, + Float, + String { + format: StringType, + }, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub struct ScalarProperty { + pub key: String, + pub prop_type: ScalarType, + pub cardinality: Cardinality, + pub type_idx: u32, + pub injection: Option, + pub unique: bool, + pub auto: bool, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "lowercase")] +pub enum Side { + Left, + Right, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub struct RelationshipProperty { + pub key: String, + pub cardinality: Cardinality, + pub type_idx: u32, + pub model_name: String, + pub unique: bool, + pub relationship_name: String, + pub relationship_side: Side, +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(tag = "type", rename_all = "lowercase")] +pub enum Property { + Scalar(ScalarProperty), + Relationship(RelationshipProperty), +} + +#[cfg_attr(feature = "codegen", derive(JsonSchema))] +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub struct Model { + pub type_idx: u32, + pub type_name: String, + pub props: Vec, + pub id_fields: Vec, +} + #[cfg_attr(feature = "codegen", derive(JsonSchema))] #[skip_serializing_none] #[derive(Serialize, Deserialize, Clone, Debug)] @@ -51,7 +138,7 @@ pub struct Relationship { pub struct PrismaRuntimeData { pub name: String, pub connection_string_secret: String, - pub models: Vec, + pub models: Vec, pub relationships: Vec, // if migration_options is not None: migrations will be applied on push #[serde(default)] diff --git a/libs/macros/Cargo.toml b/libs/macros/Cargo.toml index ac84fce025..3296deb9d1 100644 --- a/libs/macros/Cargo.toml +++ b/libs/macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "macros" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [lib] diff --git a/libs/typescript/Cargo.toml b/libs/typescript/Cargo.toml index 874c5a851b..5667d3d13a 100644 --- a/libs/typescript/Cargo.toml +++ b/libs/typescript/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "typescript" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [dependencies] diff --git a/libs/xtask/Cargo.toml b/libs/xtask/Cargo.toml index f35eb46836..294c8f4808 100644 --- a/libs/xtask/Cargo.toml +++ b/libs/xtask/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xtask" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [dependencies] diff --git a/meta-cli/Cargo.toml b/meta-cli/Cargo.toml index 125bf4b114..87258fb96f 100644 --- a/meta-cli/Cargo.toml +++ b/meta-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "meta-cli" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" description = "Declarative API development platform. Build serverless backends with zero-trust and less code, no matter where and how your (legacy) systems are." diff --git a/poetry.lock b/poetry.lock index 85402984c9..0a69090dd7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "anyio" version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -25,6 +26,7 @@ trio = ["trio (>=0.22)"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -38,33 +40,30 @@ wheel = ">=0.23.0,<1.0" [[package]] name = "black" -version = "23.9.1" +version = "23.10.0" description = "The uncompromising code formatter." +category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, - {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, - {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, - {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, - {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, - {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, - {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, - {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, - {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, - {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, - {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, + {file = "black-23.10.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:f8dc7d50d94063cdfd13c82368afd8588bac4ce360e4224ac399e769d6704e98"}, + {file = "black-23.10.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:f20ff03f3fdd2fd4460b4f631663813e57dc277e37fb216463f3b907aa5a9bdd"}, + {file = "black-23.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3d9129ce05b0829730323bdcb00f928a448a124af5acf90aa94d9aba6969604"}, + {file = "black-23.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:960c21555be135c4b37b7018d63d6248bdae8514e5c55b71e994ad37407f45b8"}, + {file = "black-23.10.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:30b78ac9b54cf87bcb9910ee3d499d2bc893afd52495066c49d9ee6b21eee06e"}, + {file = "black-23.10.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:0e232f24a337fed7a82c1185ae46c56c4a6167fb0fe37411b43e876892c76699"}, + {file = "black-23.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31946ec6f9c54ed7ba431c38bc81d758970dd734b96b8e8c2b17a367d7908171"}, + {file = "black-23.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:c870bee76ad5f7a5ea7bd01dc646028d05568d33b0b09b7ecfc8ec0da3f3f39c"}, + {file = "black-23.10.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:6901631b937acbee93c75537e74f69463adaf34379a04eef32425b88aca88a23"}, + {file = "black-23.10.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:481167c60cd3e6b1cb8ef2aac0f76165843a374346aeeaa9d86765fe0dd0318b"}, + {file = "black-23.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74892b4b836e5162aa0452393112a574dac85e13902c57dfbaaf388e4eda37c"}, + {file = "black-23.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:47c4510f70ec2e8f9135ba490811c071419c115e46f143e4dce2ac45afdcf4c9"}, + {file = "black-23.10.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:76baba9281e5e5b230c9b7f83a96daf67a95e919c2dfc240d9e6295eab7b9204"}, + {file = "black-23.10.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:a3c2ddb35f71976a4cfeca558848c2f2f89abc86b06e8dd89b5a65c1e6c0f22a"}, + {file = "black-23.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db451a3363b1e765c172c3fd86213a4ce63fb8524c938ebd82919bf2a6e28c6a"}, + {file = "black-23.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:7fb5fc36bb65160df21498d5a3dd330af8b6401be3f25af60c6ebfe23753f747"}, + {file = "black-23.10.0-py3-none-any.whl", hash = "sha256:e223b731a0e025f8ef427dd79d8cd69c167da807f5710add30cdf131f13dd62e"}, + {file = "black-23.10.0.tar.gz", hash = "sha256:31b9f87b277a68d0e99d2905edae08807c007973eaa609da5f0c62def6b7c0bd"}, ] [package.dependencies] @@ -86,6 +85,7 @@ uvloop = ["uvloop (>=0.15.2)"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -97,6 +97,7 @@ files = [ name = "charset-normalizer" version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -196,6 +197,7 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -210,6 +212,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -221,6 +224,7 @@ files = [ name = "databind" version = "1.5.3" description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.7 and newer." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -236,6 +240,7 @@ files = [ name = "databind-core" version = "1.5.3" description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.7 and newer." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -252,6 +257,7 @@ typing-extensions = ">=3.10.0" name = "databind-json" version = "1.5.3" description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.7 and newer." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -268,6 +274,7 @@ typing-extensions = ">=3.10.0" name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -285,6 +292,7 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] name = "docspec" version = "2.1.2" description = "Docspec is a JSON object specification for representing API documentation of programming languages." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -300,6 +308,7 @@ Deprecated = ">=1.2.12,<2.0.0" name = "docspec-python" version = "2.1.2" description = "A parser based on lib2to3 producing docspec data from Python source code." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -316,6 +325,7 @@ docspec = ">=2.1.2,<3.0.0" name = "docstring-parser" version = "0.11" description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -329,6 +339,7 @@ test = ["black", "pytest"] name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -343,6 +354,7 @@ test = ["pytest (>=6)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -354,6 +366,7 @@ files = [ name = "httpcore" version = "0.18.0" description = "A minimal low-level HTTP client." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -365,16 +378,17 @@ files = [ anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = "==1.*" +sniffio = ">=1.0.0,<2.0.0" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "httpx" version = "0.25.0" description = "The next generation HTTP client." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -390,14 +404,15 @@ sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -409,6 +424,7 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -428,6 +444,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -445,6 +462,7 @@ i18n = ["Babel (>=2.7)"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -468,16 +486,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -514,6 +522,7 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -525,6 +534,7 @@ files = [ name = "nr-util" version = "0.8.12" description = "General purpose Python utility library." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -540,6 +550,7 @@ typing-extensions = ">=3.0.0" name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -551,6 +562,7 @@ files = [ name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -562,6 +574,7 @@ files = [ name = "platformdirs" version = "3.11.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -577,6 +590,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pydoc-markdown" version = "4.6.4" description = "Create Python API documentation in Markdown format." +category = "dev" optional = false python-versions = "^3.8" files = [] @@ -611,6 +625,7 @@ resolved_reference = "994c941a41cdd5fe747801f0b4cf18f490fcd23a" name = "python-box" version = "7.1.1" description = "Advanced Python dictionaries with dot notation access" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -643,6 +658,7 @@ yaml = ["ruamel.yaml (>=0.17)"] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -651,7 +667,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -659,15 +674,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -684,7 +692,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -692,7 +699,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -702,6 +708,7 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -723,6 +730,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "respx" version = "0.20.2" description = "A utility for mocking out the Python HTTPX and HTTP Core libraries." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -737,6 +745,7 @@ httpx = ">=0.21.0" name = "ruff" version = "0.0.291" description = "An extremely fast Python linter, written in Rust." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -763,6 +772,7 @@ files = [ name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -774,6 +784,7 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -785,6 +796,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -796,6 +808,7 @@ files = [ name = "tomli-w" version = "1.0.0" description = "A lil' TOML writer" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -805,8 +818,9 @@ files = [ [[package]] name = "typegraph" -version = "0.2.2" +version = "0.2.3" description = "Declarative API development platform. Build serverless backends with zero-trust and less code, no matter where and how your (legacy) systems are." +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [] @@ -826,6 +840,7 @@ url = "typegraph/python" name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -837,6 +852,7 @@ files = [ name = "urllib3" version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -854,6 +870,7 @@ zstd = ["zstandard (>=0.18.0)"] name = "wasmtime" version = "13.0.2" description = "A WebAssembly runtime powered by Wasmtime" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -872,6 +889,7 @@ testing = ["coverage", "flake8 (==4.0.1)", "pycparser", "pytest", "pytest-flake8 name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -911,6 +929,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wheel" version = "0.41.2" description = "A built-package format for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -925,6 +944,7 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -1009,6 +1029,7 @@ files = [ name = "yapf" version = "0.40.2" description = "A formatter for Python code" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1025,6 +1046,7 @@ tomli = ">=2.0.1" name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" optional = false python-versions = ">=3.8" files = [ diff --git a/pyproject.toml b/pyproject.toml index 8b850cf01b..9fee1cced7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metatype" -version = "0.2.3-0+dev" +version = "0.2.3" description = "" authors = [] diff --git a/typegate/deno.lock b/typegate/deno.lock index cede9f651c..89332f52a3 100644 --- a/typegate/deno.lock +++ b/typegate/deno.lock @@ -12,8 +12,8 @@ "npm:validator": "npm:validator@13.11.0" }, "npm": { - "@babel/runtime@7.23.1": { - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "@babel/runtime@7.23.2": { + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "regenerator-runtime@0.14.0" } @@ -169,7 +169,7 @@ "mathjs@11.11.1": { "integrity": "sha512-uWrwMrhU31TCqHKmm1yFz0C352njGUVr/I1UnpMOxI/VBTTbCktx/mREUXx5Vyg11xrFdg/F3wnMM7Ql/csVsQ==", "dependencies": { - "@babel/runtime": "@babel/runtime@7.23.1", + "@babel/runtime": "@babel/runtime@7.23.2", "complex.js": "complex.js@2.1.1", "decimal.js": "decimal.js@10.4.3", "escape-latex": "escape-latex@1.2.0", @@ -525,7 +525,6 @@ "https://deno.land/std@0.202.0/streams/write_all.ts": "4cdd36256f892fe7aead46338054f6ea813a63765e87bda4c60e8c5a57d1c5c1", "https://deno.land/std@0.202.0/streams/writer_from_stream_writer.ts": "7188ce589d6179693b488b478c05137d4d15b93735ca26ec01e6e44aed8cb0c6", "https://deno.land/std@0.202.0/streams/zip_readable_streams.ts": "5639c8fea8c21d7dab6f34edcf3d08218b7e548a197f7fd79a3a995305a81e9f", - "https://deno.land/std@0.202.0/testing/asserts.ts": "b4e4b1359393aeff09e853e27901a982c685cb630df30426ed75496961931946", "https://deno.land/std@0.202.0/testing/snapshot.ts": "d53cc4ad3250e3a826df9a1a90bc19c9a92c8faa8fd508d16b5e6ce8699310ca", "https://deno.land/std@0.202.0/uuid/_common.ts": "cb1441f4df460571fc0919e1c5c217f3e7006189b703caf946604b3f791ae34d", "https://deno.land/std@0.202.0/uuid/constants.ts": "0d0e95561343da44adb4a4edbc1f04cef48b0d75288c4d1704f58743f4a50d88", diff --git a/typegate/native/Cargo.toml b/typegate/native/Cargo.toml index f931456952..1b3d894baf 100644 --- a/typegate/native/Cargo.toml +++ b/typegate/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "native" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [lib] diff --git a/typegate/src/engine/planner/args.ts b/typegate/src/engine/planner/args.ts index 3a6bae19d5..fe8496cd2f 100644 --- a/typegate/src/engine/planner/args.ts +++ b/typegate/src/engine/planner/args.ts @@ -572,9 +572,7 @@ class ArgumentCollector { // fallthrough } if (typ.type != Type.OPTIONAL) { - throw new Error( - `Expected value for non-optional type argument ${this.currentNodeDetails}`, - ); + throw new MandatoryArgumentError(this.currentNodeDetails); } else { this.addPoliciesFrom(typ.item); } diff --git a/typegate/src/runtimes/prisma/hooks/generate_schema.ts b/typegate/src/runtimes/prisma/hooks/generate_schema.ts index 37488c4d1e..04e73fcd62 100644 --- a/typegate/src/runtimes/prisma/hooks/generate_schema.ts +++ b/typegate/src/runtimes/prisma/hooks/generate_schema.ts @@ -1,14 +1,19 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 -import { ObjectNode, Type, TypeNode } from "../../../typegraph/type_node.ts"; +import { Type, TypeNode } from "../../../typegraph/type_node.ts"; import { PushHandler } from "../../../typegate/hooks.ts"; import { SecretManager, TypeGraphDS } from "../../../typegraph/mod.ts"; -import { Relationship, StringNode } from "../../../typegraph/types.ts"; -import { ensure, ensureNonNullable } from "../../../utils.ts"; +import { + Cardinality, + Model, + Property, + Relationship, + StringNode, +} from "../../../typegraph/types.ts"; +import { ensureNonNullable } from "../../../utils.ts"; import { PrismaRT } from "../mod.ts"; import { validate_prisma_runtime_data } from "native"; -import { isUuid } from "../../../typegraph/type_node.ts"; type QuantifierSuffix = "" | "?" | "[]"; @@ -52,67 +57,145 @@ class ModelField { } class FieldBuilder { + static #quantifier(cardinality: Cardinality) { + switch (cardinality) { + case "optional": + return "?"; + case "one": + return ""; + case "many": + return "[]"; + } + } + constructor( private typegraph: TypeGraphDS, private relationships: Relationship[], + private models: Model[], private provider: Provider, private source = "db", // datasource name in the .prisma file ) {} - build(field: string, parentTypeIdx: number): ModelField { - const parentType = this.#type(parentTypeIdx); - if (parentType.type !== Type.OBJECT) { - throw new Error("parent type must be object"); - } - - const [typeIdx, quant] = this.#unwrapQuantifier( - parentType.properties[field], - ); - const typeNode = this.#type(typeIdx); - - ensure( - typeNode.type !== Type.OPTIONAL && typeNode.type !== Type.ARRAY, - "nested quantifier not supported", - ); - - const fromScalarType = this.fieldFromScalarType(field, typeNode, quant); - const modelField: ModelField = fromScalarType ?? this.fieldFromObjectType( - field, - typeIdx, - typeNode as ObjectNode, - parentTypeIdx, - parentType, - quant, - ); - - modelField.tags.push(...this.#getAdditionalTags(typeNode)); + build(prop: Property): ModelField { + switch (prop.type) { + case "scalar": { + const quant = FieldBuilder.#quantifier(prop.cardinality); + let typeName: string = prop.propType.type; + let tags: string[] = []; + if (prop.propType.type === "String") { + const [typeIdx, _] = this.#unwrapQuantifier(prop.typeIdx); + const typeNode = this.typegraph.types[typeIdx]; + + if (typeNode.type !== Type.STRING) { + throw new Error("expected string type"); + } + [typeName, tags] = this.#getStringTypeAndTags(typeNode); + } - return modelField; - } + if (prop.unique) { + tags.push("@unique"); + } - #getAdditionalTags(typeNode: TypeNode): string[] { - const tags: string[] = []; + if (prop.auto) { + switch (prop.propType.type) { + case "String": + switch (prop.propType.format) { + case "DateTime": + tags.push("@default(now())"); + break; + case "Uuid": + tags.push("@default(uuid())"); + break; + default: + throw new Error( + "unsupported auto attribute on type string", + ); + } + break; + case "Int": + tags.push("@default(autoincrement())"); + break; + default: + throw new Error( + `unsupported auto attribute on type ${prop.propType.type}}`, + ); + } + } - if (typeNode.as_id) { - tags.push("@id"); - } + const field = new ModelField(prop.key, typeName + quant, tags); + return field; + } - if (typeNode.config?.unique) { - tags.push("@unique"); - } + case "relationship": { + const quant = FieldBuilder.#quantifier(prop.cardinality); + const rel = this.relationships.find((r) => + r.name === prop.relationshipName + ); + const tags: string[] = []; + if (rel == null) { + throw new Error(`relationship not found: ${prop.relationshipName}`); + } + switch (prop.relationshipSide) { + case "right": { + tags.push( + `@relation(name: ${toPrismaString(prop.relationshipName)})`, + ); + const field = new ModelField( + prop.key, + prop.modelName + quant, + tags, + ); + return field; + } + + case "left": { + const toPascalCase = (s: string) => s[0].toUpperCase() + s.slice(1); + const leftModel = this.models.find((m) => + m.typeIdx === rel.left.type_idx + ); + if (leftModel == null) { + throw new Error("left model not found"); + } + const fields = leftModel.idFields.map((key) => + `${prop.key}${toPascalCase(key)}` + ); + const fkeys = leftModel.idFields.map((key) => { + const idProp = leftModel.props.find((p) => p.key === key)!; + const modelField = this.build( + { ...idProp, cardinality: prop.cardinality }, + ); + modelField.name = `${prop.key}${toPascalCase(modelField.name)}`; + modelField.tags = modelField.tags.filter( + (t) => !t.startsWith("@default"), + ); + return modelField; + }); + + const name = toPrismaString(prop.relationshipName); + const formattedFields = toPrismaList(fields); + const references = toPrismaList(leftModel.idFields); + + tags.push( + `@relation(name: ${name}, fields: ${formattedFields}, references: ${references})`, + ); + const field = new ModelField( + prop.key, + prop.modelName + quant, + tags, + ); + field.fkeys = fkeys; + field.fkeysUnique = rel.right.cardinality !== "many"; + return field; + } - if (typeNode.config?.auto) { - // TODO check database support - if (typeNode.type === Type.INTEGER) { - tags.push("@default(autoincrement())"); - } else if (isUuid(typeNode)) { - tags.push("@default(uuid())"); - } else { - throw new Error("auto not supported for this type"); + default: + throw new Error(""); + } } - } - return tags; + default: + throw new Error(""); + } } fieldFromScalarType( @@ -157,13 +240,34 @@ class FieldBuilder { const src = this.source; switch (this.provider) { case "postgresql": + // deno-lint-ignore no-fallthrough case "mysql": switch (typeNode.format) { case "uuid": tags.push(`@${src}.Uuid`); return ["String", [`@${src}.Uuid`]]; - // TODO date-time + case "date": + case "date-time": { + const injection = typeNode.injection; + const tags = []; + if (injection) { + if (injection.source === "dynamic") { + if ("value" in injection.data) { + throw new Error(""); + } + const onCreate = injection.data.create; + if (onCreate === "now") { + tags.push("@default(now())"); + } + const onUpdate = injection.data.update; + if (onUpdate === "now") { + tags.push("@updatedAt"); + } + } + } + return ["DateTime", tags]; + } // TODO json -- needs a dedicated ticket @@ -188,132 +292,8 @@ class FieldBuilder { } } - fieldFromObjectType( - name: string, - typeIdx: number, - typeNode: ObjectNode, - parentIdx: number, - _parentNode: ObjectNode, - quant: QuantifierSuffix, - ): ModelField { - // TODO might be more than one, or less - const found = this.#findRelationship(typeIdx, parentIdx, name); - if (found == null) { - throw new Error(`relationship not found: ${name}`); - } - const [rel, side] = found; - switch (side) { - case "left": - return new ModelField(name, typeNode.title + quant, [ - `@relation(name: ${toPrismaString(rel.name)})`, - ]); - - case "right": { - const [tag, fkeys] = this.#getRelationTagAndFkeys( - name, - typeNode, - rel, - quant === "?", - ); - const modelField = new ModelField(name, typeNode.title + quant, [tag]); - // additional tags?? - modelField.fkeys = fkeys; - modelField.fkeysUnique = rel.right.cardinality !== "many"; - return modelField; - } - - default: - throw new Error(`invalid side: ${side}`); - } - } - - #getRelationTagAndFkeys( - field: string, - type: TypeNode, - relationship: Relationship, - optional: boolean, - ): [string, ModelField[]] { - const toPascalCase = (s: string) => s[0].toUpperCase() + s.slice(1); - - if (type.type !== Type.OBJECT) { - throw new Error("type must be object"); - } - const ids = Object.entries(type.properties).flatMap(([name, idx]) => { - const t = this.#type(idx); - return t.as_id ? [name] : []; - }); - const fields = ids.map((id) => `${field}${toPascalCase(id)}`); - - const typeNameSuffix = optional ? "?" : ""; - - const fkeys = fields.map((field, i) => { - const [typeIdx, _quant] = this.#unwrapQuantifier( - type.properties[ids[i]], - ); - const typeNode = this.#type(typeIdx); - const r = this.#getScalarTypeNameAndTags(typeNode); - ensureNonNullable(r, "invalid scalar type"); - const [typeName, tags] = r; - const modelField = new ModelField(field, typeName + typeNameSuffix, tags); - modelField.tags = modelField.tags.filter((tag) => - tag !== "@id" && !tag.startsWith("@default") - ); - return modelField; - }); - - const name = toPrismaString(relationship.name); - const formattedFields = toPrismaList(fields); - const references = toPrismaList(ids); - - return [ - `@relation(name: ${name}, fields: ${formattedFields}, references: ${references})`, - fkeys, - ]; - } - - #findRelationship( - idx: number, - parentIdx: number, - parentField: string, - ): [rel: Relationship, parentSide: "left" | "right"] | null { - type T = [Relationship, "left" | "right"]; - - const relationships = this - .relationships.flatMap((rel) => { - if ( - rel.left.type_idx === idx && rel.right.type_idx === parentIdx && - rel.right.field === parentField - ) { - return [[rel, "right"]] as T[]; - } - if ( - rel.right.type_idx === idx && rel.left.type_idx === parentIdx && - rel.left.field === parentField - ) { - return [[rel, "left"]] as T[]; - } - return [] as T[]; - }); - - if (relationships.length === 0) { - const typeName = this.#type(idx).title; - const parentName = this.#type(parentIdx).title; - const types = `${typeName} and ${parentName}`; - throw new Error(`relationship not found between types ${types}`); - } - - if (relationships.length > 1) { - const typeName = this.#type(idx).title; - const parentName = this.#type(parentIdx).title; - const types = `${typeName} and ${parentName}`; - throw new Error(`multiple relationships found between types ${types}`); - } - - return relationships[0]; - } - #unwrapQuantifier(typeIdx: number): [number, QuantifierSuffix] { - const typeNode = this.#type(typeIdx); + const typeNode = this.typegraph.types[typeIdx]; switch (typeNode.type) { case Type.OPTIONAL: return [typeNode.item, "?"]; @@ -323,12 +303,6 @@ class FieldBuilder { return [typeIdx, ""]; } } - - #type(idx: number): TypeNode { - const typeNode = this.typegraph.types[idx]; - ensureNonNullable(typeNode, `type not found, idx=${idx}`); - return typeNode; - } } const SUPPORTED_PROVIDERS = ["postgresql", "mysql", "mongodb"] as const; @@ -337,7 +311,7 @@ type Provider = typeof SUPPORTED_PROVIDERS[number]; export class SchemaGenerator { #provider: Provider; #fieldBuilder: FieldBuilder; - #models: number[]; + #models: Model[]; constructor( private readonly typegraph: TypeGraphDS, @@ -356,6 +330,7 @@ export class SchemaGenerator { this.#fieldBuilder = new FieldBuilder( typegraph, runtimeData.relationships, + runtimeData.models, this.#provider, ); this.#models = runtimeData.models; @@ -367,27 +342,13 @@ export class SchemaGenerator { return typeNode; } - generateModel(typeIdx: number): string { - const typeNode = this.#type(typeIdx); - if (typeNode.type !== Type.OBJECT) { - throw new Error("type must be object"); - } - + generateModel(model: Model): string { const tags: string[] = []; const modelFields: ModelField[] = []; - for (const [name, idx] of Object.entries(typeNode.properties)) { - // TODO check runtime - - const fieldNode = this.#type(idx); - switch (fieldNode.type) { - case Type.FUNCTION: - continue; - default: - } - const field = this.#fieldBuilder.build(name, typeIdx); + for (const prop of model.props) { + const field = this.#fieldBuilder.build(prop); modelFields.push(field); - modelFields.push(...field.fkeys); if (field.fkeysUnique) { const fieldNames = field.fkeys.map((fkey) => fkey.name); @@ -395,15 +356,17 @@ export class SchemaGenerator { } } - const idFields = modelFields.filter((field) => field.tags.includes("@id")); - ensure(idFields.length > 0, "no @id field found"); - - if (idFields.length > 1) { - const names = idFields.map((field) => field.name).join(", "); + // set @id tag + const ids = model.idFields; + if (ids.length === 0) { + // unreachable + throw new Error("no @id field found"); + } else if (ids.length === 1) { + const id = ids[0]; + modelFields.find((field) => field.name === id)!.tags.push("@id"); + } else { + const names = ids.join(", "); tags.push(`@@id([${names}])`); - for (const field of idFields) { - field.tags = field.tags.filter((tag) => tag !== "@id"); - } } const formattedFields = modelFields.map((field) => @@ -414,11 +377,11 @@ export class SchemaGenerator { ? "\n" + tags.map((tag) => ` ${tag}\n`).join("") : ""; - return `model ${typeNode.title} {\n${formattedFields}${formattedTags}}`; + return `model ${model.typeName} {\n${formattedFields}${formattedTags}}`; } generate() { - return this.#models.map((modelIdx) => this.generateModel(modelIdx)).join( + return this.#models.map((model) => this.generateModel(model)).join( "\n\n", ); } diff --git a/typegate/src/typegraph/types.ts b/typegate/src/typegraph/types.ts index bb1fbde1bb..1886cac19a 100644 --- a/typegate/src/typegraph/types.ts +++ b/typegate/src/typegraph/types.ts @@ -278,7 +278,39 @@ export type KnownRuntime = { name: "typegraph"; data: TypegraphRuntimeData; }; +export type Property = { + type: "scalar"; + key: string; + propType: ScalarType; + cardinality: Cardinality; + typeIdx: number; + injection?: ManagedInjection | null; + unique: boolean; + auto: boolean; +} | { + type: "relationship"; + key: string; + cardinality: Cardinality; + typeIdx: number; + modelName: string; + unique: boolean; + relationshipName: string; + relationshipSide: Side; +}; +export type ScalarType = { + type: "Boolean"; +} | { + type: "Int"; +} | { + type: "Float"; +} | { + type: "String"; + format: StringType; +}; +export type StringType = "Plain" | "Uuid" | "DateTime"; export type Cardinality = "optional" | "one" | "many"; +export type Injection2 = "DateNow"; +export type Side = "left" | "right"; export type AuthProtocol = "oauth2" | "jwt" | "basic"; export type S3Materializer = { name: "presign_get"; @@ -365,10 +397,20 @@ export interface RandomRuntimeData { export interface PrismaRuntimeData { name: string; connection_string_secret: string; - models: number[]; + models: Model[]; relationships: Relationship[]; migration_options?: MigrationOptions | null; } +export interface Model { + typeIdx: number; + typeName: string; + props: Property[]; + idFields: string[]; +} +export interface ManagedInjection { + create?: Injection2 | null; + update?: Injection2 | null; +} export interface Relationship { name: string; left: RelationshipModel; diff --git a/typegate/tests/auto/__snapshots__/auto_test.ts.snap b/typegate/tests/auto/__snapshots__/auto_test.ts.snap index 07e9349b18..60638bc2f2 100644 --- a/typegate/tests/auto/__snapshots__/auto_test.ts.snap +++ b/typegate/tests/auto/__snapshots__/auto_test.ts.snap @@ -327,40 +327,40 @@ snapshot[`Auto-tests for database 3`] = ` }, { description: "union type -_integer_filter, object_22", +_integer_filter, object_18", fields: null, inputFields: null, - name: "union_23In", + name: "union_19In", }, { description: "either type -integer_13, object_16, object_17, object_18, object_19, object_20", +integer_9, object_12, object_13, object_14, object_15, object_16", fields: null, inputFields: null, name: "_integer_filterIn", }, { - description: "object_16 input type", + description: "object_12 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_16Inp", + name: "object_12Inp", }, { - description: "object_17 input type", + description: "object_13 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_17Inp", + name: "object_13Inp", }, { - description: "object_18 input type", + description: "object_14 input type", fields: null, inputFields: [ { @@ -376,94 +376,94 @@ integer_13, object_16, object_17, object_18, object_19, object_20", name: "gte", }, ], - name: "object_18Inp", + name: "object_14Inp", }, { - description: "object_19 input type", + description: "object_15 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_19Inp", + name: "object_15Inp", }, { - description: "object_20 input type", + description: "object_16 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_20Inp", + name: "object_16Inp", }, { - description: "object_22 input type", + description: "object_18 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_22Inp", + name: "object_18Inp", }, { description: "union type -_string_filter, object_39", +_string_filter, object_35", fields: null, inputFields: null, - name: "union_40In", + name: "union_36In", }, { description: "union type -string_26, object_29, object_30, object_31, object_32, object_35, object_36, object_37", +string_22, object_25, object_26, object_27, object_28, object_31, object_32, object_33", fields: null, inputFields: null, name: "_string_filterIn", }, { - description: "object_29 input type", + description: "object_25 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_29Inp", + name: "object_25Inp", }, { - description: "object_30 input type", + description: "object_26 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_30Inp", + name: "object_26Inp", }, { - description: "object_31 input type", + description: "object_27 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_31Inp", + name: "object_27Inp", }, { - description: "object_32 input type", + description: "object_28 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_32Inp", + name: "object_28Inp", }, { - description: "object_35 input type", + description: "object_31 input type", fields: null, inputFields: [ { @@ -473,20 +473,20 @@ string_26, object_29, object_30, object_31, object_32, object_35, object_36, obj name: "mode", }, ], - name: "object_35Inp", + name: "object_31Inp", }, { - description: "object_36 input type", + description: "object_32 input type", fields: null, inputFields: [ { name: "search", }, ], - name: "object_36Inp", + name: "object_32Inp", }, { - description: "object_37 input type", + description: "object_33 input type", fields: null, inputFields: [ { @@ -496,20 +496,20 @@ string_26, object_29, object_30, object_31, object_32, object_35, object_36, obj name: "endsWith", }, ], - name: "object_37Inp", + name: "object_33Inp", }, { - description: "object_39 input type", + description: "object_35 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_39Inp", + name: "object_35Inp", }, { - description: "object_56 input type", + description: "object_52 input type", fields: null, inputFields: [ { @@ -522,24 +522,24 @@ string_26, object_29, object_30, object_31, object_32, object_35, object_36, obj name: "body", }, ], - name: "object_56Inp", + name: "object_52Inp", }, { description: "union type -object_53, _SortOrder", +object_49, _SortOrder", fields: null, inputFields: null, - name: "union_54In", + name: "union_50In", }, { - description: "object_53 input type", + description: "object_49 input type", fields: null, inputFields: [ { name: "sort", }, ], - name: "object_53Inp", + name: "object_49Inp", }, { description: "_message_CreateInput input type", @@ -722,14 +722,14 @@ snapshot[`Auto-tests for graphql 4`] = ` name: "object_2", }, { - description: "object_81 type", + description: "object_77 type", fields: [ { name: "data", }, ], inputFields: null, - name: "object_81", + name: "object_77", }, { description: "Mutation type", @@ -744,6 +744,9 @@ snapshot[`Auto-tests for graphql 4`] = ` { description: "_messageOutputType type", fields: [ + { + name: "user", + }, { name: "user_id", }, @@ -784,40 +787,40 @@ snapshot[`Auto-tests for graphql 4`] = ` }, { description: "union type -_integer_filter, object_31", +_integer_filter, object_27", fields: null, inputFields: null, - name: "union_32In", + name: "union_28In", }, { description: "either type -integer_22, object_25, object_26, object_27, object_28, object_29", +integer_18, object_21, object_22, object_23, object_24, object_25", fields: null, inputFields: null, name: "_integer_filterIn", }, { - description: "object_25 input type", + description: "object_21 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_25Inp", + name: "object_21Inp", }, { - description: "object_26 input type", + description: "object_22 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_26Inp", + name: "object_22Inp", }, { - description: "object_27 input type", + description: "object_23 input type", fields: null, inputFields: [ { @@ -833,94 +836,94 @@ integer_22, object_25, object_26, object_27, object_28, object_29", name: "gte", }, ], - name: "object_27Inp", + name: "object_23Inp", }, { - description: "object_28 input type", + description: "object_24 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_28Inp", + name: "object_24Inp", }, { - description: "object_29 input type", + description: "object_25 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_29Inp", + name: "object_25Inp", }, { - description: "object_31 input type", + description: "object_27 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_31Inp", + name: "object_27Inp", }, { description: "union type -_string_filter, object_48", +_string_filter, object_44", fields: null, inputFields: null, - name: "union_49In", + name: "union_45In", }, { description: "union type -string_35, object_38, object_39, object_40, object_41, object_44, object_45, object_46", +string_31, object_34, object_35, object_36, object_37, object_40, object_41, object_42", fields: null, inputFields: null, name: "_string_filterIn", }, { - description: "object_38 input type", + description: "object_34 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_38Inp", + name: "object_34Inp", }, { - description: "object_39 input type", + description: "object_35 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_39Inp", + name: "object_35Inp", }, { - description: "object_40 input type", + description: "object_36 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_40Inp", + name: "object_36Inp", }, { - description: "object_41 input type", + description: "object_37 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_41Inp", + name: "object_37Inp", }, { - description: "object_44 input type", + description: "object_40 input type", fields: null, inputFields: [ { @@ -930,20 +933,20 @@ string_35, object_38, object_39, object_40, object_41, object_44, object_45, obj name: "mode", }, ], - name: "object_44Inp", + name: "object_40Inp", }, { - description: "object_45 input type", + description: "object_41 input type", fields: null, inputFields: [ { name: "search", }, ], - name: "object_45Inp", + name: "object_41Inp", }, { - description: "object_46 input type", + description: "object_42 input type", fields: null, inputFields: [ { @@ -953,20 +956,20 @@ string_35, object_38, object_39, object_40, object_41, object_44, object_45, obj name: "endsWith", }, ], - name: "object_46Inp", + name: "object_42Inp", }, { - description: "object_48 input type", + description: "object_44 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_48Inp", + name: "object_44Inp", }, { - description: "object_65 input type", + description: "object_61 input type", fields: null, inputFields: [ { @@ -979,24 +982,24 @@ string_35, object_38, object_39, object_40, object_41, object_44, object_45, obj name: "user_id", }, ], - name: "object_65Inp", + name: "object_61Inp", }, { description: "union type -object_62, _SortOrder", +object_58, _SortOrder", fields: null, inputFields: null, - name: "union_63In", + name: "union_59In", }, { - description: "object_62 input type", + description: "object_58 input type", fields: null, inputFields: [ { name: "sort", }, ], - name: "object_62Inp", + name: "object_58Inp", }, { description: "_message_CreateInput input type", @@ -1516,60 +1519,60 @@ snapshot[`Auto-tests for index 4`] = ` }, { description: "union type -_string_filter, object_45", +_string_filter, object_41", fields: null, inputFields: null, - name: "union_46In", + name: "union_42In", }, { description: "union type -string_32, object_35, object_36, object_37, object_38, object_41, object_42, object_43", +string_28, object_31, object_32, object_33, object_34, object_37, object_38, object_39", fields: null, inputFields: null, name: "_string_filterIn", }, { - description: "object_35 input type", + description: "object_31 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_35Inp", + name: "object_31Inp", }, { - description: "object_36 input type", + description: "object_32 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_36Inp", + name: "object_32Inp", }, { - description: "object_37 input type", + description: "object_33 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_37Inp", + name: "object_33Inp", }, { - description: "object_38 input type", + description: "object_34 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_38Inp", + name: "object_34Inp", }, { - description: "object_41 input type", + description: "object_37 input type", fields: null, inputFields: [ { @@ -1579,20 +1582,20 @@ string_32, object_35, object_36, object_37, object_38, object_41, object_42, obj name: "mode", }, ], - name: "object_41Inp", + name: "object_37Inp", }, { - description: "object_42 input type", + description: "object_38 input type", fields: null, inputFields: [ { name: "search", }, ], - name: "object_42Inp", + name: "object_38Inp", }, { - description: "object_43 input type", + description: "object_39 input type", fields: null, inputFields: [ { @@ -1602,47 +1605,50 @@ string_32, object_35, object_36, object_37, object_38, object_41, object_42, obj name: "endsWith", }, ], - name: "object_43Inp", + name: "object_39Inp", }, { - description: "object_45 input type", + description: "object_41 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_45Inp", + name: "object_41Inp", }, { - description: "object_63 input type", + description: "object_59 input type", fields: null, inputFields: [ { name: "id", }, + { + name: "email", + }, { name: "message", }, ], - name: "object_63Inp", + name: "object_59Inp", }, { description: "union type -object_60, _SortOrder", +object_56, _SortOrder", fields: null, inputFields: null, - name: "union_61In", + name: "union_57In", }, { - description: "object_60 input type", + description: "object_56 input type", fields: null, inputFields: [ { name: "sort", }, ], - name: "object_60Inp", + name: "object_56Inp", }, { description: "_feedback_CreateInput input type", @@ -1825,60 +1831,60 @@ snapshot[`Auto-tests for prisma 3`] = ` }, { description: "union type -_string_filter, object_26", +_string_filter, object_22", fields: null, inputFields: null, - name: "union_27In", + name: "union_23In", }, { description: "union type -string_13, object_16, object_17, object_18, object_19, object_22, object_23, object_24", +string_9, object_12, object_13, object_14, object_15, object_18, object_19, object_20", fields: null, inputFields: null, name: "_string_filterIn", }, { - description: "object_16 input type", + description: "object_12 input type", fields: null, inputFields: [ { name: "equals", }, ], - name: "object_16Inp", + name: "object_12Inp", }, { - description: "object_17 input type", + description: "object_13 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_17Inp", + name: "object_13Inp", }, { - description: "object_18 input type", + description: "object_14 input type", fields: null, inputFields: [ { name: "in", }, ], - name: "object_18Inp", + name: "object_14Inp", }, { - description: "object_19 input type", + description: "object_15 input type", fields: null, inputFields: [ { name: "notIn", }, ], - name: "object_19Inp", + name: "object_15Inp", }, { - description: "object_22 input type", + description: "object_18 input type", fields: null, inputFields: [ { @@ -1888,20 +1894,20 @@ string_13, object_16, object_17, object_18, object_19, object_22, object_23, obj name: "mode", }, ], - name: "object_22Inp", + name: "object_18Inp", }, { - description: "object_23 input type", + description: "object_19 input type", fields: null, inputFields: [ { name: "search", }, ], - name: "object_23Inp", + name: "object_19Inp", }, { - description: "object_24 input type", + description: "object_20 input type", fields: null, inputFields: [ { @@ -1911,20 +1917,20 @@ string_13, object_16, object_17, object_18, object_19, object_22, object_23, obj name: "endsWith", }, ], - name: "object_24Inp", + name: "object_20Inp", }, { - description: "object_26 input type", + description: "object_22 input type", fields: null, inputFields: [ { name: "not", }, ], - name: "object_26Inp", + name: "object_22Inp", }, { - description: "object_44 input type", + description: "object_40 input type", fields: null, inputFields: [ { @@ -1937,24 +1943,24 @@ string_13, object_16, object_17, object_18, object_19, object_22, object_23, obj name: "firstname", }, ], - name: "object_44Inp", + name: "object_40Inp", }, { description: "union type -object_41, _SortOrder", +object_37, _SortOrder", fields: null, inputFields: null, - name: "union_42In", + name: "union_38In", }, { - description: "object_41 input type", + description: "object_37 input type", fields: null, inputFields: [ { name: "sort", }, ], - name: "object_41Inp", + name: "object_37Inp", }, { description: "_user_CreateInput input type", diff --git a/typegate/tests/runtimes/prisma/full_prisma_mapping.py b/typegate/tests/runtimes/prisma/full_prisma_mapping.py index deda95e2bd..539d9f6bf9 100644 --- a/typegate/tests/runtimes/prisma/full_prisma_mapping.py +++ b/typegate/tests/runtimes/prisma/full_prisma_mapping.py @@ -62,6 +62,7 @@ def prisma(g: Graph): findFirstUser=db.find_first(user), createOneUser=db.create(user), createManyUsers=db.create_many(user), + updateUser=db.update(user), upsertOneUser=db.upsert(user), findManyPosts=db.find_many(post), findFirstPost=db.find_first(post), diff --git a/typegate/tests/runtimes/prisma/full_prisma_mapping_test.ts b/typegate/tests/runtimes/prisma/full_prisma_mapping_test.ts index 5f5fe5f6f6..78c0d0fcd9 100644 --- a/typegate/tests/runtimes/prisma/full_prisma_mapping_test.ts +++ b/typegate/tests/runtimes/prisma/full_prisma_mapping_test.ts @@ -460,6 +460,72 @@ Meta.test("prisma full mapping", async (t) => { }, ); + await t.should("accept nested relationship filters", async () => { + await gql` + query { + findManyPosts ( + where: { + author: { + posts: { + some: { + id: 10001 + } + } + } + } + ) { + id + title + } + } + `.expectData({ + findManyPosts: [ + { id: 10001, title: "Some Title 1" }, + { id: 10002, title: "Some Title 2" }, + { id: 10003, title: "Some Title 3" }, + { id: 10004, title: "Some Title 4" }, + { id: 10005, title: "Some Title 4" }, + { id: 10006, title: "Some Title 5" }, + { id: 10007, title: "Some title" }, + { id: 10008, title: "Yet another" }, + ], + }) + .on(e); + + await gql` + query { + findManyPosts ( + where: { + author: { + posts: { + some: { + author: { + id: 1 + } + } + } + } + } + ) { + id + title + } + } + `.expectData({ + findManyPosts: [ + { id: 10001, title: "Some Title 1" }, + { id: 10002, title: "Some Title 2" }, + { id: 10003, title: "Some Title 3" }, + { id: 10004, title: "Some Title 4" }, + { id: 10005, title: "Some Title 4" }, + { id: 10006, title: "Some Title 5" }, + { id: 10007, title: "Some title" }, + { id: 10008, title: "Yet another" }, + ], + }) + .on(e); + }); + await t.should( "update matching rows and return the count affected", async () => { @@ -649,6 +715,34 @@ Meta.test("prisma full mapping", async (t) => { .on(e); }); + await t.should("delete extended profile", async () => { + await gql` + mutation { + updateUser( + where: { id: 1 }, + data: { + extended_profile: { + delete: true + } + } + ) { + id + extended_profile { + id + bio + } + } + } + ` + .expectData({ + updateUser: { + id: 1, + extended_profile: null, + }, + }) + .on(e); + }); + await t.should( "do a nested count with findUniqueUser", async () => { diff --git a/typegate/tests/runtimes/prisma/schema_generation.py b/typegate/tests/runtimes/prisma/schema_generation.py index 9cd03d170d..dd450eecbb 100644 --- a/typegate/tests/runtimes/prisma/schema_generation.py +++ b/typegate/tests/runtimes/prisma/schema_generation.py @@ -1,5 +1,7 @@ from typegraph import typegraph, t, Graph -from typegraph.providers.prisma import PrismaRuntime +from typegraph.providers import PrismaRuntime +from typegraph.runtimes import DenoRuntime +from typegraph.effects import CREATE, UPDATE @typegraph() @@ -416,3 +418,30 @@ def multiple_self_relationships(g: Graph): g.expose( createPerson=db.create(person), ) + + +@typegraph() +def injection(g: Graph): + db = PrismaRuntime("test", "POSTGRES") + deno = DenoRuntime() + + user = t.struct( + { + "id": t.uuid(as_id=True, config=["auto"]), + "email": t.email(config=["unique"]), + "date_of_birth": t.date().optional().rename("DOB"), + "age": deno.func( + t.struct({"dob": t.date().optional().from_parent("DOB")}), + t.integer(min=0), + code="() => 0", + ), + # TODO how to make this not updatable? + "createAt": t.datetime().inject({CREATE: "now"}), + "updatedAt": t.datetime().inject({UPDATE: "now"}), + }, + name="User", + ) + + g.expose( + createUser=db.create(user), + ) diff --git a/typegate/tests/runtimes/prisma/schema_generation_test.ts b/typegate/tests/runtimes/prisma/schema_generation_test.ts index 26ab8b8513..2591f506f4 100644 --- a/typegate/tests/runtimes/prisma/schema_generation_test.ts +++ b/typegate/tests/runtimes/prisma/schema_generation_test.ts @@ -8,6 +8,7 @@ import * as PrismaRT from "../../../src/runtimes/prisma/types.ts"; import { assertEquals } from "std/assert/mod.ts"; import outdent from "outdent"; import { SecretManager, TypeGraph } from "../../../src/typegraph/mod.ts"; +import { Model } from "../../../src/typegraph/types.ts"; interface Permutation { (arr: T[]): T[]; @@ -16,7 +17,7 @@ interface Permutation { async function assertGeneratedSchema( tgName: string, schema: string, - reorderModels?: Permutation, + reorderModels?: Permutation, ) { const tg = await TypeGraph.parseJson( await serialize("runtimes/prisma/schema_generation.py", { @@ -57,7 +58,7 @@ Meta.test("schema generation", async (t) => { "simple-model", outdent` model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id name String @db.Text } `, @@ -87,12 +88,12 @@ Meta.test("schema generation", async (t) => { "implicit-one-to-many", outdent` model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id posts Post[] @relation(name: "__rel_Post_User_1") } model Post { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id author User @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) authorId Int } @@ -103,13 +104,13 @@ Meta.test("schema generation", async (t) => { "implicit-one-to-many", outdent` model Post { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id author User @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) authorId Int } model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id posts Post[] @relation(name: "__rel_Post_User_1") } `, @@ -125,12 +126,12 @@ Meta.test("schema generation", async (t) => { "optional-one-to-many", outdent` model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id posts Post[] @relation(name: "__rel_Post_User_1") } model Post { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id author User? @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) authorId Int? } @@ -141,13 +142,13 @@ Meta.test("schema generation", async (t) => { "optional-one-to-many", outdent` model Post { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id author User? @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) authorId Int? } model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id posts Post[] @relation(name: "__rel_Post_User_1") } `, @@ -168,7 +169,7 @@ Meta.test("schema generation", async (t) => { } model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "userProfile", fields: [userId], references: [id]) userId Int @@ -181,12 +182,12 @@ Meta.test("schema generation", async (t) => { "implicit-one-to-one", outdent` model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id profile Profile? @relation(name: "__rel_Profile_User_1") } model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "__rel_Profile_User_1", fields: [userId], references: [id]) userId Int @@ -199,7 +200,7 @@ Meta.test("schema generation", async (t) => { "implicit-one-to-one", outdent` model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "__rel_Profile_User_1", fields: [userId], references: [id]) userId Int @@ -207,7 +208,7 @@ Meta.test("schema generation", async (t) => { } model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id profile Profile? @relation(name: "__rel_Profile_User_1") } `, @@ -223,12 +224,12 @@ Meta.test("schema generation", async (t) => { "optional-one-to-one", outdent` model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id profile Profile? @relation(name: "__rel_Profile_User_1") } model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User? @relation(name: "__rel_Profile_User_1", fields: [userId], references: [id]) userId Int? @@ -241,7 +242,7 @@ Meta.test("schema generation", async (t) => { "optional-one-to-one", outdent` model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User? @relation(name: "__rel_Profile_User_1", fields: [userId], references: [id]) userId Int? @@ -249,7 +250,7 @@ Meta.test("schema generation", async (t) => { } model User { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id profile Profile? @relation(name: "__rel_Profile_User_1") } `, @@ -270,7 +271,7 @@ Meta.test("schema generation", async (t) => { } model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "userProfile", fields: [userId], references: [id]) userId Int @@ -288,7 +289,7 @@ Meta.test("schema generation", async (t) => { } model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "userProfile", fields: [userId], references: [id]) userId Int @@ -301,7 +302,7 @@ Meta.test("schema generation", async (t) => { "semi-implicit-one-to-one-2", outdent` model Profile { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id user User @relation(name: "userProfile", fields: [userId], references: [id]) userId Int @@ -325,7 +326,7 @@ Meta.test("schema generation", async (t) => { "one-to-many-self", outdent` model TreeNode { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id children TreeNode[] @relation(name: "__rel_TreeNode_TreeNode_1") parent TreeNode @relation(name: "__rel_TreeNode_TreeNode_1", fields: [parentId], references: [id]) parentId Int @@ -337,7 +338,7 @@ Meta.test("schema generation", async (t) => { "explicit-one-to-many-self", outdent` model TreeNode { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id children TreeNode[] @relation(name: "__rel_TreeNode_TreeNode_1") parent TreeNode @relation(name: "__rel_TreeNode_TreeNode_1", fields: [parentId], references: [id]) parentId Int @@ -349,7 +350,7 @@ Meta.test("schema generation", async (t) => { "one-to-many-self-2", outdent` model TreeNode { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id parent TreeNode @relation(name: "__rel_TreeNode_TreeNode_1", fields: [parentId], references: [id]) parentId Int children TreeNode[] @relation(name: "__rel_TreeNode_TreeNode_1") @@ -361,7 +362,7 @@ Meta.test("schema generation", async (t) => { "explicit-one-to-many-self-2", outdent` model TreeNode { - id Int @id @default(autoincrement()) + id Int @default(autoincrement()) @id parent TreeNode @relation(name: "__rel_TreeNode_TreeNode_1", fields: [parentId], references: [id]) parentId Int children TreeNode[] @relation(name: "__rel_TreeNode_TreeNode_1") @@ -376,7 +377,7 @@ Meta.test("schema generation", async (t) => { "one-to-one-self", outdent` model ListNode { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id next ListNode? @relation(name: "__rel_ListNode_ListNode_1", fields: [nextId], references: [id]) nextId String? @db.Uuid prev ListNode? @relation(name: "__rel_ListNode_ListNode_1") @@ -390,7 +391,7 @@ Meta.test("schema generation", async (t) => { "one-to-one-self-2", outdent` model ListNode { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id prev ListNode? @relation(name: "__rel_ListNode_ListNode_1") next ListNode? @relation(name: "__rel_ListNode_ListNode_1", fields: [nextId], references: [id]) nextId String? @db.Uuid @@ -408,7 +409,7 @@ Meta.test("schema generation", async (t) => { "multiple-relationships", outdent` model User { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id email String @db.Text @unique posts Post[] @relation(name: "__rel_Post_User_1") favorite_post Post? @relation(name: "__rel_User_Post_2", fields: [favorite_postId], references: [id]) @@ -416,7 +417,7 @@ Meta.test("schema generation", async (t) => { } model Post { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id title String @db.VarChar(256) content String @db.Text author User @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) @@ -430,7 +431,7 @@ Meta.test("schema generation", async (t) => { "multiple-relationships-2", outdent` model User { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id email String @db.Text @unique posts Post[] @relation(name: "__rel_Post_User_1") published_posts Post[] @relation(name: "PostPublisher") @@ -439,7 +440,7 @@ Meta.test("schema generation", async (t) => { } model Post { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id title String @db.VarChar(256) content String @db.Text author User @relation(name: "__rel_Post_User_1", fields: [authorId], references: [id]) @@ -455,7 +456,7 @@ Meta.test("schema generation", async (t) => { "multiple-self-relationships", outdent` model Person { - id String @db.Uuid @id @default(uuid()) + id String @db.Uuid @default(uuid()) @id personal_hero Person? @relation(name: "__rel_Person_Person_1", fields: [personal_heroId], references: [id]) personal_heroId String? @db.Uuid hero_of Person? @relation(name: "__rel_Person_Person_1") @@ -469,4 +470,22 @@ Meta.test("schema generation", async (t) => { ); }, ); + + await t.should( + "typegraph with injections and nested function", + async () => { + await assertGeneratedSchema( + "injection", + outdent` + model User { + id String @db.Uuid @default(uuid()) @id + email String @db.Text @unique + date_of_birth DateTime? + createAt DateTime @default(now()) + updatedAt DateTime @updatedAt + } + `, + ); + }, + ); }); diff --git a/typegate/tests/runtimes/wasmedge/rust/Cargo.toml b/typegate/tests/runtimes/wasmedge/rust/Cargo.toml index 66857d5662..cc64f44024 100644 --- a/typegate/tests/runtimes/wasmedge/rust/Cargo.toml +++ b/typegate/tests/runtimes/wasmedge/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [lib] diff --git a/typegraph/core/Cargo.toml b/typegraph/core/Cargo.toml index aa0314bddd..b50e1bbbf7 100644 --- a/typegraph/core/Cargo.toml +++ b/typegraph/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "typegraph_core" -version = "0.2.3-0+dev" +version = "0.2.3" edition = "2021" [lib] diff --git a/typegraph/core/src/conversion/runtimes.rs b/typegraph/core/src/conversion/runtimes.rs index 540c4cba1e..6a137785f0 100644 --- a/typegraph/core/src/conversion/runtimes.rs +++ b/typegraph/core/src/conversion/runtimes.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; use std::rc::Rc; use crate::errors::Result; -use crate::runtimes::prisma::{with_prisma_runtime, ConversionContext}; +use crate::runtimes::prisma::get_prisma_context; use crate::runtimes::{ DenoMaterializer, Materializer as RawMaterializer, PythonMaterializer, RandomMaterializer, Runtime, TemporalMaterializer, WasiMaterializer, @@ -17,7 +17,6 @@ use crate::{typegraph::TypegraphContext, wit::runtimes::Effect as WitEffect}; use common::typegraph::runtimes::deno::DenoRuntimeData; use common::typegraph::runtimes::graphql::GraphQLRuntimeData; use common::typegraph::runtimes::http::HTTPRuntimeData; -use common::typegraph::runtimes::prisma::PrismaRuntimeData; use common::typegraph::runtimes::python::PythonRuntimeData; use common::typegraph::runtimes::random::RandomRuntimeData; use common::typegraph::runtimes::s3::S3RuntimeData; @@ -411,36 +410,15 @@ pub fn convert_runtime(_c: &mut TypegraphContext, runtime: Runtime) -> Result Ok(ConvertedRuntime::Lazy(Box::new( - move |runtime_id, runtime_idx, tg| { - with_prisma_runtime(runtime_id, |ctx| { - let reg = &ctx.registry; - let models: Vec<_> = reg.models.keys().cloned().collect(); - let relationships = reg.relationships.clone(); - let mut conversion_context = ConversionContext { - runtime_id, - tg_context: tg, - }; - Ok(TGRuntime::Known(Rt::Prisma(PrismaRuntimeData { - name: d.name.clone(), - connection_string_secret: d.connection_string_secret.clone(), - models: models - .into_iter() - .map(|id| { - Ok(conversion_context - .tg_context - .register_type(id, Some(runtime_idx))? - .into()) - }) - .collect::>>()?, - relationships: relationships - .into_values() - .map(|rel| -> Result<_> { - conversion_context.convert_relationship(&rel) - }) - .collect::>>()?, - migration_options: None, - }))) - }) + move |runtime_id, runtime_idx, tg| -> Result<_> { + let ctx = get_prisma_context(runtime_id); + let ctx = ctx.borrow(); + + Ok(TGRuntime::Known(Rt::Prisma(ctx.convert( + tg, + runtime_idx, + d, + )?))) }, ))), Runtime::PrismaMigration => { diff --git a/typegraph/core/src/runtimes/mod.rs b/typegraph/core/src/runtimes/mod.rs index ac0bc00d1b..3d7ba6bab2 100644 --- a/typegraph/core/src/runtimes/mod.rs +++ b/typegraph/core/src/runtimes/mod.rs @@ -12,6 +12,7 @@ pub mod typegate; pub mod typegraph; pub mod wasi; +use std::cell::RefCell; use std::rc::Rc; use crate::conversion::runtimes::MaterializerConverter; @@ -19,7 +20,6 @@ use crate::global_store::Store; use crate::runtimes::prisma::migration::{ prisma_apply, prisma_create, prisma_deploy, prisma_diff, prisma_reset, }; -use crate::runtimes::prisma::with_prisma_runtime; use crate::runtimes::typegraph::TypegraphOperation; use crate::t::TypeBuilder; use crate::validation::types::validate_value; @@ -36,9 +36,11 @@ use enum_dispatch::enum_dispatch; use self::aws::S3Materializer; pub use self::deno::{DenoMaterializer, MaterializerDenoImport, MaterializerDenoModule}; pub use self::graphql::GraphqlMaterializer; +use self::prisma::context::PrismaContext; +use self::prisma::get_prisma_context; use self::prisma::relationship::prisma_link; use self::prisma::type_generation::replace_variables_to_indices; -use self::prisma::{PrismaMaterializer, PrismaRuntimeContext}; +use self::prisma::PrismaMaterializer; pub use self::python::PythonMaterializer; pub use self::random::RandomMaterializer; use self::temporal::temporal_operation; @@ -56,7 +58,7 @@ pub enum Runtime { Python, Random(Rc), WasmEdge, - Prisma(Rc, Rc), + Prisma(Rc, Rc>), PrismaMigration, Temporal(Rc), Typegate, @@ -183,8 +185,15 @@ pub enum MaterializerData { } macro_rules! prisma_op { - ( $rt:expr, $model:expr, $fn:ident, $name:expr, $effect:expr ) => {{ - let types = with_prisma_runtime($rt, |ctx| ctx.$fn($model.into()))?; + ( $rt:expr, $model:expr, $op:ident, $name:expr, $effect:expr ) => {{ + let types = { + let ctx = get_prisma_context($rt); + let mut ctx = ctx.borrow_mut(); + ctx.generate_types( + $crate::runtimes::prisma::type_generation::$op, + $model.into(), + )? + }; let mat = PrismaMaterializer { table: $crate::types::TypeId($model) @@ -366,34 +375,34 @@ impl crate::wit::runtimes::Guest for crate::Lib { } fn prisma_find_unique(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, find_unique, "findUnique") + prisma_op!(runtime, model, FindUnique, "findUnique") } fn prisma_find_many(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, find_many, "findMany") + prisma_op!(runtime, model, FindMany, "findMany") } fn prisma_find_first(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, find_first, "findFirst") + prisma_op!(runtime, model, FindFirst, "findFirst") } fn prisma_aggregate(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, aggregate, "aggregate") + prisma_op!(runtime, model, Aggregate, "aggregate") } fn prisma_group_by(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, group_by, "groupBy") + prisma_op!(runtime, model, GroupBy, "groupBy") } fn prisma_count(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, count, "count") + prisma_op!(runtime, model, Count, "count") } fn prisma_create_one(runtime: RuntimeId, model: CoreTypeId) -> Result { prisma_op!( runtime, model, - create_one, + CreateOne, "createOne", WitEffect::Create(false) ) @@ -403,7 +412,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - create_many, + CreateMany, "createMany", WitEffect::Create(false) ) @@ -413,7 +422,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - update_one, + UpdateOne, "updateOne", WitEffect::Update(false) ) @@ -423,7 +432,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - update_many, + UpdateMany, "updateMany", WitEffect::Update(false) ) @@ -433,7 +442,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - upsert_one, + UpsertOne, "upsertOne", WitEffect::Update(true) ) @@ -443,7 +452,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - delete_one, + DeleteOne, "deleteOne", WitEffect::Delete(true) ) @@ -453,7 +462,7 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!( runtime, model, - delete_many, + DeleteMany, "deleteMany", WitEffect::Delete(true) ) @@ -465,7 +474,11 @@ impl crate::wit::runtimes::Guest for crate::Lib { param: CoreTypeId, effect: WitEffect, ) -> Result { - let types = with_prisma_runtime(runtime, |ctx| ctx.execute_raw(param.into()))?; + let types = { + let ctx = get_prisma_context(runtime); + let mut ctx = ctx.borrow_mut(); + ctx.execute_raw(param.into())? + }; let proc = replace_variables_to_indices(query, types.input)?; let mat = PrismaMaterializer { table: proc.query, @@ -486,9 +499,11 @@ impl crate::wit::runtimes::Guest for crate::Lib { param: Option, out: CoreTypeId, ) -> Result { - let types = with_prisma_runtime(runtime, |ctx| { - ctx.query_raw(param.map(|v| v.into()), out.into()) - })?; + let types = { + let ctx = get_prisma_context(runtime); + let mut ctx = ctx.borrow_mut(); + ctx.query_raw(param.map(|v| v.into()), out.into())? + }; let proc = replace_variables_to_indices(query, types.input)?; let mat = PrismaMaterializer { table: proc.query, diff --git a/typegraph/core/src/runtimes/prisma/context.rs b/typegraph/core/src/runtimes/prisma/context.rs new file mode 100644 index 0000000000..ab4b23e186 --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/context.rs @@ -0,0 +1,415 @@ +// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. +// SPDX-License-Identifier: MPL-2.0 + +use std::{ + cell::{Cell, OnceCell, Ref, RefCell, RefMut}, + collections::HashMap, + rc::{Rc, Weak}, +}; + +use crate::{typegraph::TypegraphContext, wit::runtimes as wit}; +use common::typegraph::runtimes::prisma as cm; +use indexmap::{map::Entry, IndexMap, IndexSet}; + +use super::model::{InjectionHandler, Property, RelationshipProperty, ScalarProperty}; +use super::relationship::discovery::CandidatePair; +use super::relationship::RelationshipModel; +use crate::errors::Result; +use crate::types::TypeId; + +use super::{errors, model::Model, relationship::Relationship}; + +#[derive(Debug, Clone)] +pub struct ModelRef(Rc>); + +impl ModelRef { + pub fn borrow(&self) -> Ref { + self.0.borrow() + } + + pub fn borrow_mut(&self) -> RefMut { + self.0.borrow_mut() + } + + pub fn type_name(&self) -> String { + self.0.borrow().type_name.clone() + } + + pub fn type_id(&self) -> TypeId { + self.0.borrow().type_id + } +} + +impl From>> for ModelRef { + fn from(model: Rc>) -> Self { + Self(model) + } +} + +#[derive(Default, Debug)] +pub struct PrismaContext { + models: IndexMap, + pub models_by_name: IndexMap, + pub relationships: IndexMap, + pub typegen_cache: OnceCell>>>, // shared + complete_registrations: IndexSet, + counter: Cell, +} + +impl PrismaContext { + pub fn model(&self, type_id: TypeId) -> Result { + let model = self + .models + .get(&type_id) + .ok_or_else(|| errors::unregistered_model(type_id)) + .unwrap(); // TODO ? + + Ok(model.clone()) + } + + pub fn is_registered(&self, pair: &CandidatePair) -> Result { + let left_model = pair.0.model.borrow(); + let right_model = pair.1.model.borrow(); + + let left = self.models.contains_key(&left_model.type_id) + && self.models_by_name.contains_key(&left_model.type_name) + && left_model.relationships.contains_key(&pair.1.field_name); + + let right = self.models.contains_key(&right_model.type_id) + && self.models_by_name.contains_key(&right_model.type_name) + && right_model.relationships.contains_key(&pair.0.field_name); + + match (left, right) { + (true, true) => Ok(true), + (true, false) | (false, true) => { + Err(format!("Pair partially registered: pair={pair:?}").into()) + } + (false, false) => Ok(false), + } + } + + pub fn register_pair(&mut self, pair: CandidatePair) -> Result { + if !self.is_registered(&pair)? { + println!("registering"); + let id = self.next_id(); + let pair = pair.ordered()?; + + let rel_name = pair.rel_name(id)?; + let CandidatePair(left, right) = pair; + + let relationship = Relationship { + name: rel_name.clone(), + left: RelationshipModel { + model_type: left.model.type_id(), + model_name: left.model.type_name(), + wrapper_type: left.property.wrapper_type_id, + cardinality: left.property.quantifier, + field: right.field_name.clone(), + }, + right: RelationshipModel { + model_type: right.model.type_id(), + model_name: right.model.type_name(), + wrapper_type: right.property.wrapper_type_id, + cardinality: right.property.quantifier, + field: left.field_name.clone(), + }, + }; + + self.relationships.insert(rel_name.clone(), relationship); + + { + let mut left_model = left.model.borrow_mut(); + left_model + .relationships + .insert(right.field_name.clone(), rel_name.clone()); + } + + { + let mut right_model = right.model.borrow_mut(); + right_model + .relationships + .insert(left.field_name.clone(), rel_name.clone()); + } + + Ok(true) + } else { + Ok(false) + } + } + + pub fn manage(&mut self, model_id: TypeId) -> Result<()> { + if self.complete_registrations.contains(&model_id) { + return Ok(()); + } + + let models = self.register_models(model_id)?; + + if models.is_empty() { + // model already registered + // relationship registration left + let model = self.model(model_id)?; + for pair in self.scan_model(model)? { + self.register_pair(pair)?; + } + self.complete_registrations.insert(model_id); + } else { + for model_id in models.into_iter() { + self.manage(model_id)?; + } + } + + Ok(()) + } + + /// register the model, and related models (recursively) + /// returns the registered models + /// returns empty if the given root model is already registered + fn register_models(&mut self, root_model_id: TypeId) -> Result> { + let model_id = root_model_id; + if let Entry::Vacant(e) = self.models.entry(model_id) { + let model: ModelRef = Rc::new(RefCell::new(model_id.try_into()?)).into(); + e.insert(model.clone()); + self.models_by_name + .insert(model.borrow().type_name.clone(), model_id); + + let mut res = vec![model_id]; + + // register related models + { + let model = model.borrow(); + for model_id in model.iter_related_models() { + res.extend(self.register_models(model_id)?); + } + } + + Ok(res) + } else { + Ok(vec![]) + } + } + + fn next_id(&self) -> usize { + let id = self.counter.get() + 1; + self.counter.set(id); + id + } + + fn convert_scalar_prop( + &self, + ctx: &mut TypegraphContext, + key: &str, + prop: &ScalarProperty, + runtime_idx: u32, + ) -> Result { + Ok(cm::ScalarProperty { + key: key.to_string(), + cardinality: prop.quantifier.into(), + type_idx: ctx + .register_type(prop.wrapper_type_id, Some(runtime_idx))? + .into(), + prop_type: prop.prop_type.clone(), + injection: prop.injection.as_ref().map(|inj| cm::ManagedInjection { + create: inj.create.as_ref().and_then(|handler| match handler { + InjectionHandler::Typegate => None, + InjectionHandler::PrismaDateNow => Some(cm::Injection::DateNow), + }), + update: inj.update.as_ref().and_then(|handler| match handler { + InjectionHandler::Typegate => None, + InjectionHandler::PrismaDateNow => Some(cm::Injection::DateNow), + }), + }), + unique: prop.unique, + auto: prop.auto, + }) + } + + fn convert_relationship_prop( + &self, + ctx: &mut TypegraphContext, + key: &str, + prop: &RelationshipProperty, + rel_name: String, + runtime_idx: u32, + ) -> Result { + let model = self.model(prop.model_id)?; + let model = model.borrow(); + + Ok(cm::RelationshipProperty { + key: key.to_string(), + cardinality: prop.quantifier.into(), + type_idx: ctx + .register_type(prop.wrapper_type_id, Some(runtime_idx))? + .into(), + model_name: model.type_name.clone(), + unique: prop.unique, + relationship_name: rel_name.clone(), + relationship_side: { + let rel = self.relationships.get(&rel_name).unwrap(); + if rel.left.wrapper_type == prop.wrapper_type_id { + cm::Side::Left + } else if rel.right.wrapper_type == prop.wrapper_type_id { + cm::Side::Right + } else { + unreachable!() + } + }, + }) + } + + fn convert_model( + &self, + ctx: &mut TypegraphContext, + model: &Model, + type_id: TypeId, + runtime_idx: u32, + ) -> Result { + Ok(cm::Model { + type_idx: ctx.register_type(type_id, Some(runtime_idx))?.into(), + type_name: model.type_name.clone(), + props: model + .props + .iter() + .map(|(key, prop): (&String, &Property)| -> Result<_> { + Ok(match prop { + Property::Scalar(prop) => Some(cm::Property::Scalar( + self.convert_scalar_prop(ctx, key, prop, runtime_idx)?, + )), + + Property::Model(prop) => { + let rel_name = { + let model = self.model(type_id)?; + let model = model.borrow(); + model.relationships.get(key).unwrap().clone() + }; + + Some(cm::Property::Relationship(self.convert_relationship_prop( + ctx, + key, + prop, + rel_name, + runtime_idx, + )?)) + } + + Property::Unmanaged(_) => { + // skip + None + } + }) + }) + .filter_map(|r| r.transpose()) + .collect::>>()?, + id_fields: vec![model.id_field.clone()], + }) + } + + pub fn convert( + &self, + ctx: &mut TypegraphContext, + runtime_idx: u32, + data: Rc, + ) -> Result { + Ok(cm::PrismaRuntimeData { + name: data.name.clone(), + connection_string_secret: data.connection_string_secret.clone(), + models: self + .models + .iter() + .map(|(type_id, model)| -> Result<_> { + let model = model.borrow(); + self.convert_model(ctx, &model, *type_id, runtime_idx) + }) + .collect::>>()?, + + relationships: { + self.relationships + .iter() + .map(|(_, rel)| { + let left = + self.convert_relationship_model(ctx, rel.left.clone(), runtime_idx)?; + let right = + self.convert_relationship_model(ctx, rel.right.clone(), runtime_idx)?; + Ok(cm::Relationship { + name: rel.name.clone(), + left, + right, + }) + }) + .collect::>>()? + }, + migration_options: None, + }) + } + + fn convert_relationship_model( + &self, + ctx: &mut TypegraphContext, + model: RelationshipModel, + runtime_idx: u32, + ) -> Result { + Ok(cm::RelationshipModel { + type_idx: ctx + .register_type(model.model_type, Some(runtime_idx))? + .into(), + field: model.field.clone(), + cardinality: model.cardinality.into(), + }) + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::test_utils::*; + + #[test] + fn test_recursive_model_registration() -> Result<()> { + let mut ctx = PrismaContext::default(); + let (user, profile) = models::simple_relationship()?; + + let models: Vec<_> = ctx + .register_models(user)? + .into_iter() + .map(|model_id| { + let model = ctx.model(model_id).unwrap(); + let model = model.borrow(); + (model.type_id, model.type_name.clone()) + }) + .collect(); + + assert_eq!( + models, + vec![ + (user, user.type_name()?.unwrap()), + (profile, profile.type_name()?.unwrap()) + ] + ); + + Ok(()) + } + + #[test] + fn test_relationship_registration() -> Result<()> { + let mut ctx = PrismaContext::default(); + let (user, post) = models::simple_relationship()?; + + ctx.manage(user)?; + + assert_eq!(ctx.models.len(), 2); + let user = ctx.model(user)?; + let user = user.borrow(); + assert_eq!(user.relationships.len(), 1); + + let post = ctx.model(post)?; + let post = post.borrow(); + assert_eq!(post.relationships.len(), 1); + + assert!(user.relationships.get("posts").is_some()); + assert_eq!( + user.relationships.get("posts"), + post.relationships.get("author") + ); + + Ok(()) + } +} diff --git a/typegraph/core/src/runtimes/prisma/errors.rs b/typegraph/core/src/runtimes/prisma/errors.rs index ffe9343936..d7602dcaee 100644 --- a/typegraph/core/src/runtimes/prisma/errors.rs +++ b/typegraph/core/src/runtimes/prisma/errors.rs @@ -1,7 +1,7 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 -use crate::wit::core::Error; +use crate::{types::TypeId, wit::core::Error}; // pub fn relationship_not_found(source_model: &str, field: &str) -> Error { // format!("relationship target not found for {source_model}::{field}") @@ -46,3 +46,28 @@ pub fn no_relationship_target(model: &str, field: &str, target_model: &str) -> E format!(r#"Relationship target field not found for "{model}::{field}" on {target_model:?}."#) .into() } + +pub fn unnamed_model(repr: &str) -> Error { + format!("Prisma model must have a name: {repr}").into() +} + +pub fn multiple_id_fields(model: &str) -> Error { + format!("Multiple id fields are not yet supported: model {model}").into() +} + +pub fn id_field_not_found(model: &str) -> Error { + format!("Id field not found: model {model}").into() +} + +pub fn unregistered_model(type_id: TypeId) -> Error { + format!("Model not registered: {}", type_id.repr().unwrap()).into() +} + +#[allow(dead_code)] +pub(crate) fn unregistered_prop(key: &str, type_name: &str) -> Error { + format!("Property not registered: {}.{}", type_name, key).into() +} + +pub fn unregistered_relationship(type_name: &str, prop_name: &str) -> Error { + format!("Relationship not registered: {}::{}", type_name, prop_name).into() +} diff --git a/typegraph/core/src/runtimes/prisma/mod.rs b/typegraph/core/src/runtimes/prisma/mod.rs index ba6c904851..96669e81f2 100644 --- a/typegraph/core/src/runtimes/prisma/mod.rs +++ b/typegraph/core/src/runtimes/prisma/mod.rs @@ -1,13 +1,17 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +pub mod context; pub mod errors; pub mod migration; +mod model; pub mod relationship; pub mod type_generation; mod type_utils; +use std::cell::RefCell; use std::fmt::Debug; +use std::rc::Rc; use common::typegraph::runtimes::prisma as cm; use common::typegraph::Materializer; @@ -19,47 +23,16 @@ use crate::global_store::Store; use crate::typegraph::TypegraphContext; use crate::wit::runtimes::{self as wit, RuntimeId}; -use self::relationship::{Cardinality, Relationship, RelationshipModel}; -use self::type_generation::TypeGenContext; +use self::context::PrismaContext; +use self::relationship::Cardinality; use super::Runtime; -pub struct PrismaRuntimeContext(std::cell::RefCell>); - -impl Debug for PrismaRuntimeContext { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let inner = self.0.borrow(); - f.debug_tuple("PrismaRuntimeContext").field(&inner).finish() - } -} - -impl Default for PrismaRuntimeContext { - fn default() -> Self { - Self(std::cell::RefCell::new(Some(TypeGenContext::default()))) - } -} - -pub fn with_prisma_runtime( - runtime_id: RuntimeId, - f: impl FnOnce(&mut TypeGenContext) -> Result, -) -> Result { - let mut ctx = match Store::get_runtime(runtime_id)? { - Runtime::Prisma(_, ctx) => Ok(ctx - .0 - .borrow_mut() - .take() - .ok_or_else(|| "prisma runtime context already borrowed".to_string())?), - _ => Err("not a prisma runtime".to_string()), - }?; - - let res = f(&mut ctx)?; - +pub fn get_prisma_context(runtime_id: RuntimeId) -> Rc> { match Store::get_runtime(runtime_id).unwrap() { - Runtime::Prisma(_, c) => c.0.borrow_mut().replace(ctx), + Runtime::Prisma(_, ctx) => ctx, _ => unreachable!(), - }; - - Ok(res) + } } #[derive(Debug)] @@ -99,37 +72,6 @@ impl MaterializerConverter for PrismaMaterializer { } } -pub struct ConversionContext<'a> { - pub runtime_id: u32, - pub tg_context: &'a mut TypegraphContext, -} - -impl<'a> ConversionContext<'a> { - pub fn convert_relationship(&mut self, rel: &Relationship) -> Result { - let left = self.convert_relationship_model(&rel.left)?; - let right = self.convert_relationship_model(&rel.right)?; - Ok(cm::Relationship { - name: rel.name.clone(), - left, - right, - }) - } - - pub fn convert_relationship_model( - &mut self, - model: &RelationshipModel, - ) -> Result { - Ok(cm::RelationshipModel { - type_idx: self - .tg_context - .register_type(model.model_type, Some(self.runtime_id))? - .into(), - field: model.field.clone(), - cardinality: model.cardinality.into(), - }) - } -} - impl From for cm::Cardinality { fn from(cardinality: Cardinality) -> Self { match cardinality { diff --git a/typegraph/core/src/runtimes/prisma/model.rs b/typegraph/core/src/runtimes/prisma/model.rs new file mode 100644 index 0000000000..03f9bbae71 --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/model.rs @@ -0,0 +1,319 @@ +// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. +// SPDX-License-Identifier: MPL-2.0 + +pub use common::typegraph::runtimes::prisma::{ScalarType, StringType}; +use common::typegraph::{EffectType, InjectionData}; +use indexmap::IndexMap; + +use crate::errors::Result; +use crate::runtimes::prisma::errors; +use crate::runtimes::prisma::type_utils::RuntimeConfig; +use crate::types::{Type, TypeAttributes, TypeFun}; +use crate::{runtimes::prisma::relationship::Cardinality, types::TypeId}; + +#[derive(Debug)] +pub struct Model { + pub type_id: TypeId, + pub type_name: String, + pub props: IndexMap, + // TODO Vec + pub id_field: String, + // property -> relationship name + pub relationships: IndexMap, +} + +impl TryFrom for Model { + type Error = crate::wit::core::Error; + + fn try_from(type_id: TypeId) -> Result { + let typ = type_id.as_struct()?; + + let props = typ + .iter_props() + .map(|(k, type_id)| Property::new(type_id).map(|p| (k.to_string(), p))) + .collect::>>()?; + + let type_name = type_id + .type_name()? + .ok_or_else(|| errors::unnamed_model(&type_id.repr().unwrap()))?; + + let id_field = Self::find_id_field(&type_name, &props)?; + + Ok(Self { + type_id, + type_name, + props, + id_field, + relationships: Default::default(), // populated later + }) + } +} + +impl Model { + fn find_id_field(type_name: &str, props: &IndexMap) -> Result { + let id_fields = props + .iter() + .filter_map(|(k, p)| match p { + Property::Scalar(prop) => match prop.quantifier { + Cardinality::One => prop + .type_id + .as_type() + .unwrap() + .get_base() + .unwrap() + .as_id + .then(|| k.clone()), + _ => None, + }, + _ => None, + }) + .collect::>(); + + match id_fields.len() { + 0 => Err(errors::id_field_not_found(type_name)), + 1 => Ok(id_fields.into_iter().next().unwrap()), + _ => Err(errors::multiple_id_fields(type_name)), + } + } + + pub fn iter_props(&self) -> impl Iterator { + self.props.iter() + } + + pub fn iter_relationship_props(&self) -> impl Iterator { + self.props.iter().filter_map(|(k, p)| match p { + Property::Model(p) => Some((k.as_str(), p)), + _ => None, + }) + } + + pub fn iter_related_models(&self) -> impl Iterator + '_ { + self.props.iter().filter_map(|(_, p)| match p { + Property::Model(p) => Some(p.model_id), + _ => None, + }) + } + + pub fn get_prop(&self, key: &str) -> Option<&Property> { + self.props.get(key) + } +} + +#[derive(Debug, Clone, Default)] +pub struct RelationshipAttributes { + pub name: Option, + pub target_field: Option, + pub fkey: Option, +} + +impl TryFrom for RelationshipAttributes { + type Error = crate::wit::core::Error; + + fn try_from(attrs: TypeAttributes) -> Result { + let proxy_data = attrs.proxy_data; + Ok(Self { + name: proxy_data.get("rel_name").cloned(), + target_field: proxy_data.get("target_field").cloned(), + fkey: proxy_data + .get("fkey") + .map(|v| serde_json::from_str(v).map_err(|e| e.to_string())) + .transpose()?, + }) + } +} + +#[derive(Debug, Clone)] +pub enum Property { + Scalar(ScalarProperty), + Model(RelationshipProperty), + Unmanaged(TypeId), +} + +#[derive(Debug, Clone)] +pub struct RelationshipProperty { + pub wrapper_type_id: TypeId, + pub model_id: TypeId, + pub quantifier: Cardinality, + pub relationship_attributes: RelationshipAttributes, + pub unique: bool, +} + +impl Property { + fn new(wrapper_type_id: TypeId) -> Result { + let attrs = wrapper_type_id.attrs()?; + let typ = attrs.concrete_type.as_type()?; + let runtime_config = RuntimeConfig::new(typ.get_base().unwrap().runtime_config.as_ref()); + let unique = runtime_config.get("unique")?.unwrap_or(false); + let auto = runtime_config.get("auto")?.unwrap_or(false); + let (type_id, card) = match typ { + Type::Optional(inner) => ( + TypeId(inner.data.of).attrs()?.concrete_type, + Cardinality::Optional, + ), + Type::Array(inner) => ( + TypeId(inner.data.of).attrs()?.concrete_type, + Cardinality::Many, + ), + _ => (attrs.concrete_type, Cardinality::One), + }; + + let scalar = |typ, injection| { + Self::Scalar(ScalarProperty { + wrapper_type_id, + type_id, + prop_type: typ, + injection, + quantifier: card, + unique, + auto, + }) + }; + + match attrs + .injection + .as_ref() + .map(Injection::try_from) + .transpose() + { + Ok(injection) => match type_id.as_type()? { + Type::Struct(_) => { + if injection.is_some() { + return Err("injection not supported for models".to_string().into()); + } + Ok(Self::Model(RelationshipProperty { + wrapper_type_id, + model_id: type_id, + quantifier: card, + relationship_attributes: RelationshipAttributes::try_from(attrs)?, + unique, + })) + } + Type::Optional(_) | Type::Array(_) => { + Err("nested optional/list not supported".into()) + } + Type::Integer(_) => Ok(scalar(ScalarType::Integer, injection)), + Type::Float(_) => Ok(scalar(ScalarType::Float, injection)), + Type::Boolean(_) => Ok(scalar(ScalarType::Boolean, injection)), + Type::String(inner) => Ok(scalar( + ScalarType::String { + format: match inner.data.format.as_deref() { + Some("uuid") => StringType::Uuid, + Some("date-time") => StringType::DateTime, + _ => StringType::Plain, + }, + }, + injection, + )), + Type::Func(_) => { + if injection.is_some() { + Err("injection not supported for function type".into()) + } else { + Ok(Self::Unmanaged(wrapper_type_id)) + } + } + _ => Err("unsupported property type".into()), + }, + Err(_) => match type_id.as_type()? { + Type::Func(_) => Err("injection not supported on t::struct()".into()), + Type::Optional(_) | Type::Array(_) => { + Err("nested optional/list not supported".into()) + } + Type::Struct(_) + | Type::String(_) + | Type::Integer(_) + | Type::Float(_) + | Type::Boolean(_) => Ok(Self::Unmanaged(wrapper_type_id)), + _ => Err("unsupported property type".into()), + }, + } + } +} + +#[derive(Debug, Clone)] +pub enum InjectionHandler { + Typegate, + PrismaDateNow, +} + +#[derive(Debug, Clone)] +pub struct Injection { + pub create: Option, + pub update: Option, +} + +impl Injection { + /// return None if the injection implies that the property is unmanaged. + /// Unmanaged properties are properties that will not be present in the + /// prisma model. + fn convert_injection(data: &InjectionData) -> Option { + match data { + InjectionData::SingleValue(_) => None, // unmanaged + InjectionData::ValueByEffect(map) => { + if map.contains_key(&EffectType::Read) { + // TODO check if other effects are present?? + None + } else { + Some(Self { + create: map + .get(&EffectType::Create) + .map(|_| InjectionHandler::Typegate), + update: map + .get(&EffectType::Update) + .map(|_| InjectionHandler::Typegate), + }) + } + } + } + } + + fn convert_dynamic_injection(data: &InjectionData) -> Option { + match data { + InjectionData::SingleValue(_) => None, // unmanaged + InjectionData::ValueByEffect(map) => { + if map.contains_key(&EffectType::Read) { + // TODO check if other effects are present?? + None + } else { + Some(Self { + create: map.get(&EffectType::Create).and_then(|i| match i.as_str() { + "now" => Some(InjectionHandler::PrismaDateNow), + _ => None, + }), + update: map.get(&EffectType::Update).and_then(|i| match i.as_str() { + "now" => Some(InjectionHandler::PrismaDateNow), + _ => None, + }), + }) + } + } + } + } +} + +impl TryFrom<&common::typegraph::Injection> for Injection { + // unmanaged property + type Error = (); + + fn try_from(injection: &common::typegraph::Injection) -> Result { + use common::typegraph::Injection as I; + + match injection { + I::Static(inj) | I::Secret(inj) | I::Context(inj) => { + Self::convert_injection(inj).ok_or(()) + } + I::Parent(inj) => Self::convert_injection(inj).ok_or(()), + I::Dynamic(inj) => Self::convert_dynamic_injection(inj).ok_or(()), + } + } +} + +#[derive(Debug, Clone)] +pub struct ScalarProperty { + pub wrapper_type_id: TypeId, + pub type_id: TypeId, + pub prop_type: ScalarType, + pub injection: Option, + pub quantifier: Cardinality, + pub unique: bool, + pub auto: bool, +} diff --git a/typegraph/core/src/runtimes/prisma/relationship/discovery.rs b/typegraph/core/src/runtimes/prisma/relationship/discovery.rs index 9612934cd2..8427b0a988 100644 --- a/typegraph/core/src/runtimes/prisma/relationship/discovery.rs +++ b/typegraph/core/src/runtimes/prisma/relationship/discovery.rs @@ -1,113 +1,144 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +use crate::errors::Result; +use crate::runtimes::prisma::context::{ModelRef, PrismaContext}; use crate::runtimes::prisma::errors; -use crate::runtimes::prisma::type_utils::as_relationship_target; -use crate::types::{TypeFun, TypeId}; -use crate::{errors::Result, types::Struct}; +use crate::runtimes::prisma::model::{Property, RelationshipProperty}; use super::Cardinality; -use super::RelationshipRegistry; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Candidate { - pub source_model: TypeId, - pub source_model_name: String, + pub source_model: ModelRef, pub field_name: String, - pub wrapper_type: TypeId, - pub model_type: TypeId, - pub model_name: String, - pub cardinality: Cardinality, - fkey: Option, - unique: bool, - relationship_name: Option, - target_field: Option, + pub property: RelationshipProperty, + pub model: ModelRef, } -impl Candidate { - fn new( - source_model: TypeId, - field: String, - type_id: TypeId, +impl PrismaContext { + fn create_candidate( + &self, + source_model: ModelRef, + prop_name: String, source_candidate: Option<&Candidate>, ) -> Result> { - let attrs = type_id.attrs()?; + let model = source_model.borrow(); + let prop = { + let prop = model.get_prop(&prop_name).ok_or_else(|| { + format!( + "Property {} not found on model {}", + prop_name, model.type_name + ) + })?; + let Property::Model(prop) = prop else { + return Ok(None); + }; + prop + }; + + if let Some(source_candidate) = source_candidate { + if source_candidate.source_model.type_id() != prop.model_id { + return Ok(None); + } - as_relationship_target(attrs.concrete_type, None)? - .map(|(target_type, cardinality)| -> Result<_> { - if let Some(source_candidate) = source_candidate { - if source_candidate.source_model != target_type { - return Ok(None); - } - if source_candidate.model_type == target_type { - // self reference - if field == source_candidate.field_name { - return Ok(None); - } - } + if source_candidate.model.type_id() == prop.model_id { + // self reference + if prop_name == source_candidate.field_name { + return Ok(None); } + } + } - let source_model_name = source_model - .type_name()? - .ok_or_else(|| String::from("model must have name"))?; + let target_model = self.model(prop.model_id)?; - let model_name = target_type - .type_name()? - .ok_or_else(|| String::from("model must have name"))?; + Ok(Some(Candidate { + source_model: source_model.clone(), + field_name: prop_name, + property: prop.clone(), + model: target_model, + })) + } - let fkey = attrs - .proxy_data - .iter() - .find_map(|(k, v)| { - (k == "fkey").then(|| { - serde_json::from_str::(v).map_err(|_| { - format!("invalid 'fkey' field: expected bool, got {}", v) - }) - }) - }) - .transpose()?; + /// get potential targets for candidate + fn get_potential_targets(&self, candidate: Candidate) -> Result> { + let model = candidate.model.borrow(); + let mut candidates = model + .iter_relationship_props() + .filter_map(|(k, _prop)| { + self.create_candidate(candidate.model.clone(), k.to_string(), Some(&candidate)) + .transpose() + }) + .collect::>>()?; - let target_field = attrs - .proxy_data - .iter() - .find_map(|(k, v)| (k == "target_field").then(|| v.clone())); + let match_by_name = candidates + .iter() + .enumerate() + .filter_map(|(i, c)| { + match ( + &c.property.relationship_attributes.name, + &candidate.property.relationship_attributes.name, + ) { + (Some(a), Some(b)) if a == b => Some(i), + _ => None, + } + }) + .collect::>(); - let unique = attrs.is_unique_ref()?; - let relationship_name = attrs - .proxy_data - .iter() - .find_map(|(k, v)| (k == "rel_name").then(|| v.clone())); + match match_by_name.len() { + 0 => {} + 1 => { + let i = match_by_name[0]; + return Ok(vec![candidates.swap_remove(i)]); + } + _ => return Err("multiple matching relationships found".into()), // TODO + } - Ok(Some(Candidate { - source_model, - source_model_name, - field_name: field, - wrapper_type: type_id, - model_type: target_type, - model_name, - cardinality, - fkey, - unique, - relationship_name, - target_field, - })) + let match_by_target_field = candidates + .iter() + .enumerate() + .filter(|(_i, c)| { + c.property + .relationship_attributes + .target_field + .as_ref() + .map(|n| n == &candidate.field_name) + .unwrap_or(false) + || candidate + .property + .relationship_attributes + .target_field + .as_ref() + .map(|n| n == &c.field_name) + .unwrap_or(false) }) - .transpose() - .map(|r| r.flatten()) + .map(|(i, _)| i) + .collect::>(); + + match match_by_target_field.len() { + 0 => {} + 1 => { + let i = match_by_target_field[0]; + return Ok(vec![candidates.swap_remove(i)]); + } + _ => return Err("multiple matching relationships found".into()), // TODO + } + + Ok(candidates) } - fn into_pair(self, registry: &RelationshipRegistry) -> Result { - let alternatives = self.get_alternatives(registry)?; + fn create_candidate_pair_from(&self, candidate: Candidate) -> Result { + let alternatives = self.get_potential_targets(candidate.clone())?; match alternatives.len() { 0 => Err(errors::no_relationship_target( - &self.source_model_name, - &self.field_name, - &self.model_name, + &candidate.source_model.type_name(), + &candidate.field_name, + &candidate.model.type_name(), + )), + 1 => Ok(CandidatePair( + candidate, + alternatives.into_iter().next().unwrap(), )), - 1 => { - let target = alternatives.into_iter().next().unwrap(); - Ok(CandidatePair(self, target)) - } _ => { let details = alternatives .into_iter() @@ -115,67 +146,28 @@ impl Candidate { .collect::>() .join(""); Err(format!( - "multiple alternative targets found for {:?}:{details}", - self + "multiple alternative targets found for {:?}: {}", + candidate, details ) .into()) } } } - /// get potential targets for this candidate - fn get_alternatives(&self, registry: &RelationshipRegistry) -> Result> { - let candidates = self - .model_type - .as_struct()? - .iter_props() - .filter_map(|(k, ty)| { - Candidate::new(self.model_type, k.to_string(), ty, Some(self)) - .map(|maybe_candidate| { - maybe_candidate.filter(|c| !registry.has(c.model_type, &c.field_name)) - }) + pub fn scan_model(&self, model: ModelRef) -> Result> { + let candidates = model + .borrow() + .iter_relationship_props() + .filter_map(|(k, _prop)| { + self.create_candidate(model.clone(), k.to_string(), None) .transpose() }) .collect::>>()?; - // match by relationship name - let matched = candidates - .iter() - .enumerate() - .find( - |(_, c)| match (&c.relationship_name, &self.relationship_name) { - (Some(a), Some(b)) => a == b, - _ => false, - }, - ) - .map(|(i, _)| i); - if let Some(i) = matched { - let mut candidates = candidates; - return Ok(vec![candidates.swap_remove(i)]); - } - - // match by target field - let matched = candidates - .iter() - .enumerate() - .find(|(_, c)| { - c.target_field - .as_ref() - .map(|f| f == &self.field_name) - .unwrap_or(false) - || self - .target_field - .as_ref() - .map(|f| f == &c.field_name) - .unwrap_or(false) - }) - .map(|(i, _)| i); - if let Some(i) = matched { - let mut candidates = candidates; - return Ok(vec![candidates.swap_remove(i)]); - } - - Ok(candidates) + candidates + .into_iter() + .map(|c| self.create_candidate_pair_from(c)) + .collect::>>() } } @@ -184,10 +176,14 @@ pub struct CandidatePair(pub Candidate, pub Candidate); impl CandidatePair { pub fn rel_name(&self, id: usize) -> Result { - match (&self.0.relationship_name, &self.1.relationship_name) { + match ( + &self.0.property.relationship_attributes.name, + &self.1.property.relationship_attributes.name, + ) { (None, None) => Ok(format!( "__rel_{}_{}_{id}", - self.1.model_name, self.0.model_name + self.1.model.type_name(), + self.0.model.type_name() )), (Some(a), None) => Ok(a.clone()), (None, Some(b)) => Ok(b.clone()), @@ -206,26 +202,27 @@ impl CandidatePair { let CandidatePair(first, second) = self; // right will be the model that has the foreign key use Cardinality as C; - match (first.cardinality, second.cardinality) { + match (first.property.quantifier, second.property.quantifier) { (C::One, C::One) | (C::Optional, C::Optional) => { - match (first.fkey, second.fkey) { + let (first_attrs, second_attrs) = (&first.property.relationship_attributes, &second.property.relationship_attributes); + match (first_attrs.fkey, second_attrs.fkey) { (Some(true), Some(false)) => Ok(Self(first, second)), (Some(false), Some(true)) => Ok(Self(second, first)), (Some(true), Some(true)) => { - Err(errors::conflicting_attributes("fkey", &first.model_name, &second.field_name, &second.model_name, &first.field_name)) + Err(errors::conflicting_attributes("fkey", &first.model.type_name(), &second.field_name, &second.model.type_name(), &first.field_name)) } - (Some(false), Some(false)) => Err(errors::conflicting_attributes("fkey", &first.model_name, &second.field_name, &second.model_name, &first.field_name)), + (Some(false), Some(false)) => Err(errors::conflicting_attributes("fkey", &first.model.type_name(), &second.field_name, &second.model.type_name(), &first.field_name)), (Some(true), None) => Ok(Self(first, second)), (Some(false), None) => Ok(Self(second, first)), (None, Some(true)) => Ok(Self(second, first)), (None, Some(false)) => Ok(Self(first, second)), (None, None) => { // choose by unique attribute - match (first.unique, second.unique) { + match (first.property.unique, second.property.unique) { (true, false) => Ok(Self(first, second)), (false, true) => Ok(Self(second, first)), - (true, true) => Err(errors::conflicting_attributes("unique", &first.model_name, &second.field_name, &second.model_name, &first.field_name)), - (false, false) => Err(errors::ambiguous_side(&first.model_name, &second.field_name, &second.model_name, &first.field_name)), + (true, true) => Err(errors::conflicting_attributes("unique", &first.model.type_name(), &second.field_name, &second.model.type_name(), &first.field_name)), + (false, false) => Err(errors::ambiguous_side(&first.model.type_name(), &second.field_name, &second.model.type_name(), &first.field_name)), } } } @@ -243,44 +240,9 @@ impl CandidatePair { (C::Many, C::Many) => { Err(format!( "many-to-many relationship not supported: use explicit join table between {} and {}", - first.model_name, second.model_name + first.model.type_name(), second.model.type_name() ).into()) } } } - - /// get the model related to the given one in this pair. - /// Returns an error if the given model is not in this pair. - /// Returns None if the given model is in this pair in a self-referencing relationship - pub fn get_related(&self, model_id: TypeId) -> Result> { - let (first, second) = (self.0.model_type, self.1.model_type); - if first == model_id { - if first == second { - Ok(None) - } else { - Ok(Some(second)) - } - } else if second == model_id { - Ok(Some(first)) - } else { - Err(format!( - "model {:?} is not in relationship {}", - model_id, - self.rel_name(0)? - ) - .into()) - } - } -} - -pub fn scan_model(model: &Struct, registry: &RelationshipRegistry) -> Result> { - let candidates = model - .iter_props() - .filter_map(|(k, ty)| Candidate::new(model.get_id(), k.to_string(), ty, None).transpose()) - .collect::>>()?; - - candidates - .into_iter() - .map(|c| c.into_pair(registry)) - .collect() } diff --git a/typegraph/core/src/runtimes/prisma/relationship/mod.rs b/typegraph/core/src/runtimes/prisma/relationship/mod.rs index f6b5d46068..246a8e4830 100644 --- a/typegraph/core/src/runtimes/prisma/relationship/mod.rs +++ b/typegraph/core/src/runtimes/prisma/relationship/mod.rs @@ -6,8 +6,7 @@ use crate::t; use crate::t::TypeBuilder; use crate::types::TypeId; -mod discovery; -pub mod registry; +pub mod discovery; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Cardinality { @@ -54,67 +53,6 @@ pub struct Relationship { pub right: RelationshipModel, } -pub enum SideOfModel { - Left, - Right, - Both, - None, -} - -impl Relationship { - pub fn get_opposite_of(&self, model_id: TypeId, field: &str) -> Option<&RelationshipModel> { - use SideOfModel as S; - match self.side_of_model(model_id) { - S::Both => { - if self.left.field == field { - Some(&self.right) - } else if self.right.field == field { - Some(&self.left) - } else { - unreachable!() - } - } - S::Left => Some(&self.right), - S::Right => Some(&self.left), - S::None => None, - } - } - - fn side_of_model(&self, model_type: TypeId) -> SideOfModel { - use SideOfModel as S; - if self.left.model_type == self.right.model_type { - if self.left.model_type == model_type { - S::Both - } else { - S::None - } - } else if self.left.model_type == model_type { - S::Left - } else if self.right.model_type == model_type { - S::Right - } else { - S::None - } - } - - pub fn side_of_type(&self, type_id: TypeId) -> Option { - if self.left.wrapper_type == type_id { - Some(Side::Left) - } else if self.right.wrapper_type == type_id { - Some(Side::Right) - } else { - None - } - } - - pub fn get(&self, side: Side) -> &RelationshipModel { - match side { - Side::Left => &self.left, - Side::Right => &self.right, - } - } -} - #[derive(Default, Clone)] pub struct PrismaLink { type_name: String, @@ -187,15 +125,13 @@ pub fn prisma_linkn(name: impl Into) -> PrismaLink { } } -use registry::RelationshipRegistry; - #[cfg(test)] mod test { use super::{prisma_linkn, prisma_linkx}; use crate::errors::Result; use crate::global_store::Store; + use crate::runtimes::prisma::context::PrismaContext; use crate::runtimes::prisma::errors; - use crate::runtimes::prisma::relationship::registry::RelationshipRegistry; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; use crate::test_utils::*; @@ -203,10 +139,14 @@ mod test { fn test_implicit_relationships() -> Result<()> { let (user, _post) = models::simple_relationship()?; - let mut reg = RelationshipRegistry::default(); - reg.manage(user)?; + let mut ctx = PrismaContext::default(); + ctx.manage(user)?; - insta::assert_debug_snapshot!("implicit relationship", reg); + assert_eq!(ctx.relationships.len(), 1); + let (name, rel) = ctx.relationships.iter().next().unwrap(); + assert_eq!(name, "__rel_Post_User_1"); + assert_eq!(rel.left.model_name, "User"); + assert_eq!(rel.right.model_name, "Post"); Ok(()) } @@ -228,11 +168,16 @@ mod test { .named("Post") .build()?; - let mut reg = RelationshipRegistry::default(); - reg.manage(user)?; - reg.manage(post)?; + let mut ctx = PrismaContext::default(); + ctx.manage(user)?; + ctx.manage(post)?; - insta::assert_debug_snapshot!("explicitly named relationship", reg); + let relationships = ctx.relationships; + assert_eq!(relationships.len(), 1); + let (name, rel) = relationships.iter().next().unwrap(); + assert_eq!(name, "PostAuthor"); + assert_eq!(rel.left.model_name, "User"); + assert_eq!(rel.right.model_name, "Post"); Ok(()) } @@ -255,11 +200,16 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - reg.manage(user)?; - reg.manage(profile)?; + let mut ctx = PrismaContext::default(); + ctx.manage(user)?; + ctx.manage(profile)?; - insta::assert_debug_snapshot!("fkey attribute", reg); + let relationships = ctx.relationships; + assert_eq!(relationships.len(), 1); + let (name, rel) = relationships.iter().next().unwrap(); + assert_eq!(name, "__rel_User_Profile_1"); + assert_eq!(rel.left.model_name, "Profile"); + assert_eq!(rel.right.model_name, "User"); Ok(()) } @@ -282,11 +232,15 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - reg.manage(user)?; - reg.manage(profile)?; + let mut ctx = PrismaContext::default(); + ctx.manage(user)?; + ctx.manage(profile)?; - insta::assert_debug_snapshot!("unique attribute", reg); + assert_eq!(ctx.relationships.len(), 1); + let (name, rel) = ctx.relationships.iter().next().unwrap(); + assert_eq!(name, "__rel_User_Profile_1"); + assert_eq!(rel.left.model_name, "Profile"); + assert_eq!(rel.right.model_name, "User"); Ok(()) } @@ -301,10 +255,14 @@ mod test { .named("Node") .build()?; - let mut reg = RelationshipRegistry::default(); - reg.manage(node)?; + let mut ctx = PrismaContext::default(); + ctx.manage(node)?; - insta::assert_debug_snapshot!("self relationship", reg); + assert_eq!(ctx.relationships.len(), 1); + let (name, rel) = ctx.relationships.iter().next().unwrap(); + assert_eq!(name, "__rel_Node_Node_1"); + assert_eq!(rel.left.model_name, "Node"); + assert_eq!(rel.right.model_name, "Node"); Ok(()) } @@ -324,13 +282,13 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - let res = reg.manage(user); + let mut ctx = PrismaContext::default(); + let res = ctx.manage(user); assert_eq!( res, Err(errors::ambiguous_side("Profile", "user", "User", "profile")) ); - let res = reg.manage(profile); + let res = ctx.manage(profile); assert_eq!( res, Err(errors::ambiguous_side("User", "profile", "Profile", "user")) @@ -349,13 +307,13 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - let res = reg.manage(user); + let mut ctx = PrismaContext::default(); + let res = ctx.manage(user); assert_eq!( res, Err(errors::ambiguous_side("Profile", "user", "User", "profile")) ); - let res = reg.manage(profile); + let res = ctx.manage(profile); assert_eq!( res, Err(errors::ambiguous_side("User", "profile", "Profile", "user")) @@ -379,15 +337,15 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - let res = reg.manage(user); + let mut ctx = PrismaContext::default(); + let res = ctx.manage(user); assert_eq!( res, Err(errors::conflicting_attributes( "fkey", "Profile", "user", "User", "profile" )) ); - let res = reg.manage(profile); + let res = ctx.manage(profile); assert_eq!( res, Err(errors::conflicting_attributes( @@ -408,15 +366,15 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - let res = reg.manage(user); + let mut ctx = PrismaContext::default(); + let res = ctx.manage(user); assert_eq!( res, Err(errors::conflicting_attributes( "fkey", "Profile", "user", "User", "profile" )) ); - let res = reg.manage(profile); + let res = ctx.manage(profile); assert_eq!( res, Err(errors::conflicting_attributes( @@ -441,8 +399,8 @@ mod test { .named("Profile") .build()?; - let mut reg = RelationshipRegistry::default(); - let res = reg.manage(user); + let mut ctx = PrismaContext::default(); + let res = ctx.manage(user); assert_eq!( res, Err(errors::no_relationship_target("User", "profile", "Profile")) diff --git a/typegraph/core/src/runtimes/prisma/relationship/registry.rs b/typegraph/core/src/runtimes/prisma/relationship/registry.rs deleted file mode 100644 index 24d0af159e..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/registry.rs +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. -// SPDX-License-Identifier: MPL-2.0 - -use crate::errors::Result; -use crate::runtimes::prisma::type_utils::get_id_field; -use crate::types::TypeId; -#[cfg(test)] -use indexmap::IndexMap as HashMap; -#[cfg(test)] -use indexmap::IndexSet as HashSet; -use indexmap::{map::Entry, IndexMap}; -#[cfg(not(test))] -use std::collections::HashMap; -#[cfg(not(test))] -use std::collections::HashSet; - -use std::cell::RefCell; -use std::rc::Rc; - -use super::{ - discovery::{scan_model, Candidate, CandidatePair}, - Relationship, RelationshipModel, -}; - -#[derive(Debug)] -pub struct RegisteredModel { - // property => relationship_name - pub relationships: IndexMap, - pub name: String, - pub id_field: String, // TODO support multiple id fields -} - -#[derive(Default, Debug)] -pub struct RelationshipRegistry { - pub models: IndexMap, - pub models_by_name: HashMap, - // relationship_name => relationship - pub relationships: HashMap>, - complete_registrations: HashSet, - counter: RefCell, -} - -impl RelationshipRegistry { - fn is_registered(&self, candidate: &Candidate) -> bool { - let entry = self.models.get(&candidate.source_model); - match entry { - Some(entry) => entry.relationships.contains_key(&candidate.field_name), - None => false, - } - } - - fn add_relationship_field( - &mut self, - candidate: &Candidate, - field_name: String, - rel_name: String, - ) -> Result<()> { - let entry = match self.models.entry(candidate.model_type) { - Entry::Vacant(e) => e.insert(RegisteredModel { - relationships: IndexMap::new(), - name: candidate.model_name.clone(), - id_field: get_id_field(candidate.model_type)?, - }), - Entry::Occupied(e) => e.into_mut(), - }; - match entry.relationships.entry(field_name) { - Entry::Vacant(e) => { - e.insert(rel_name); - Ok(()) - } - Entry::Occupied(_e) => Err("cannot readd relationship".into()), - } - } - - fn register_pair(&mut self, pair: CandidatePair) -> Result { - match (self.is_registered(&pair.0), self.is_registered(&pair.1)) { - (true, true) => return Ok(false), - (true, false) | (false, true) => { - return Err(format!( - "Pair partially registered: pair={pair:?}, registry={:#?}", - self - ) - .into()) - } - (false, false) => {} - } - - let id = self.next_id(); - let pair = pair.ordered()?; - - let rel_name = pair.rel_name(id)?; - let CandidatePair(left, right) = pair; - - self.add_relationship_field(&left, right.field_name.clone(), rel_name.clone())?; - self.add_relationship_field(&right, left.field_name.clone(), rel_name.clone())?; - - let relationship = Relationship { - name: rel_name, - left: RelationshipModel { - model_type: left.model_type, - model_name: left.model_name, - wrapper_type: left.wrapper_type, - field: right.field_name, - cardinality: left.cardinality, - }, - right: RelationshipModel { - model_type: right.model_type, - model_name: right.model_name, - wrapper_type: right.wrapper_type, - field: left.field_name, - cardinality: right.cardinality, - }, - }; - - self.relationships - .insert(relationship.name.clone(), relationship.into()); - - Ok(true) - } - - pub fn manage(&mut self, model_id: TypeId) -> Result<()> { - if self.complete_registrations.contains(&model_id) { - Ok(()) - } else { - let related_models = { - let mut related_models = vec![]; - - let model = model_id.as_struct()?; - - if let Entry::Vacant(e) = self.models.entry(model_id) { - e.insert(RegisteredModel { - relationships: IndexMap::new(), - name: model - .base - .name - .clone() - .ok_or_else(|| "prisma model requires a name".to_string())?, - id_field: get_id_field(model_id)?, - }); - } - - for pair in scan_model(&model, self)?.into_iter() { - let related = pair.get_related(model_id)?; - if self.register_pair(pair)? { - if let Some(related) = related { - related_models.push(related); - } - } - } - - related_models - }; - - self.complete_registrations.insert(model_id); - - for related_model in related_models { - self.manage(related_model)?; - } - - Ok(()) - } - } - - pub fn has(&self, model: TypeId, prop: &str) -> bool { - self.models - .get(&model) - .map_or(false, |entry| entry.relationships.contains_key(prop)) - } - - pub fn find_relationship_on(&self, model: TypeId, field: &str) -> Option> { - self.models - .get(&model) - .unwrap() - .relationships - .get(field) - .map(|n| self.relationships.get(n).cloned().unwrap()) - } - - pub fn next_id(&self) -> usize { - let mut counter = self.counter.borrow_mut(); - // panic!("hum"); - eprintln!(">> counter: {}", *counter); - *counter += 1; - *counter - } -} diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__explicitly named relationship.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__explicitly named relationship.snap deleted file mode 100644 index f1fe557718..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__explicitly named relationship.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: reg ---- -RelationshipRegistry { - models: { - Type#4: RegisteredModel { - relationships: { - "posts": "PostAuthor", - }, - name: "User", - id_field: "id", - }, - Type#8: RegisteredModel { - relationships: { - "author": "PostAuthor", - }, - name: "Post", - id_field: "id", - }, - }, - models_by_name: {}, - relationships: { - "PostAuthor": Relationship { - name: "PostAuthor", - left: RelationshipModel { - model_type: Type#4, - model_name: "User", - wrapper_type: Type#7, - cardinality: One, - field: "posts", - }, - right: RelationshipModel { - model_type: Type#8, - model_name: "Post", - wrapper_type: Type#3, - cardinality: Many, - field: "author", - }, - }, - }, - complete_registrations: { - Type#4, - Type#8, - }, - counter: RefCell { - value: 1, - }, -} diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__fkey attribute.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__fkey attribute.snap deleted file mode 100644 index e472b80cbc..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__fkey attribute.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: reg ---- -RelationshipRegistry { - models: { - Type#4: RegisteredModel { - relationships: { - "profile": "__rel_User_Profile_1", - }, - name: "User", - id_field: "id", - }, - Type#8: RegisteredModel { - relationships: { - "user": "__rel_User_Profile_1", - }, - name: "Profile", - id_field: "id", - }, - }, - models_by_name: {}, - relationships: { - "__rel_User_Profile_1": Relationship { - name: "__rel_User_Profile_1", - left: RelationshipModel { - model_type: Type#8, - model_name: "Profile", - wrapper_type: Type#3, - cardinality: Optional, - field: "user", - }, - right: RelationshipModel { - model_type: Type#4, - model_name: "User", - wrapper_type: Type#7, - cardinality: Optional, - field: "profile", - }, - }, - }, - complete_registrations: { - Type#4, - Type#8, - }, - counter: RefCell { - value: 1, - }, -} diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__implicit relationship.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__implicit relationship.snap deleted file mode 100644 index 20c5453e87..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__implicit relationship.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: reg ---- -RelationshipRegistry { - models: { - Type#4: RegisteredModel { - relationships: { - "posts": "__rel_Post_User_1", - }, - name: "User", - id_field: "id", - }, - Type#8: RegisteredModel { - relationships: { - "author": "__rel_Post_User_1", - }, - name: "Post", - id_field: "id", - }, - }, - models_by_name: {}, - relationships: { - "__rel_Post_User_1": Relationship { - name: "__rel_Post_User_1", - left: RelationshipModel { - model_type: Type#4, - model_name: "User", - wrapper_type: Type#7, - cardinality: One, - field: "posts", - }, - right: RelationshipModel { - model_type: Type#8, - model_name: "Post", - wrapper_type: Type#3, - cardinality: Many, - field: "author", - }, - }, - }, - complete_registrations: { - Type#4, - Type#8, - }, - counter: RefCell { - value: 1, - }, -} diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__relationship_discovery.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__relationship_discovery.snap deleted file mode 100644 index d1d48b8ddc..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__relationship_discovery.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: registry ---- -Ok( - RelationshipRegistry { - models: { - 4: { - "posts": "UserToPost", - }, - 7: { - "author": "UserToPost", - }, - }, - relationships: { - "UserToPost": Relationship { - name: "UserToPost", - left: RelationshipModel { - model_type: 4, - wrapper_type: 4, - cardinality: One, - field: "posts", - }, - right: RelationshipModel { - model_type: 7, - wrapper_type: 3, - cardinality: Many, - field: "author", - }, - }, - }, - }, -) diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__self relationship.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__self relationship.snap deleted file mode 100644 index 67ab7c3f36..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__self relationship.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: reg ---- -RelationshipRegistry { - models: { - Type#4: RegisteredModel { - relationships: { - "children": "__rel_Node_Node_1", - "parent": "__rel_Node_Node_1", - }, - name: "Node", - id_field: "id", - }, - }, - models_by_name: {}, - relationships: { - "__rel_Node_Node_1": Relationship { - name: "__rel_Node_Node_1", - left: RelationshipModel { - model_type: Type#4, - model_name: "Node", - wrapper_type: Type#3, - cardinality: One, - field: "children", - }, - right: RelationshipModel { - model_type: Type#4, - model_name: "Node", - wrapper_type: Type#2, - cardinality: Many, - field: "parent", - }, - }, - }, - complete_registrations: { - Type#4, - }, - counter: RefCell { - value: 1, - }, -} diff --git a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__unique attribute.snap b/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__unique attribute.snap deleted file mode 100644 index 49ea3c31fb..0000000000 --- a/typegraph/core/src/runtimes/prisma/relationship/snapshots/typegraph_core__runtimes__prisma__relationship__test__unique attribute.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: typegraph/core/src/runtimes/prisma/relationship/mod.rs -expression: reg ---- -RelationshipRegistry { - models: { - Type#3: RegisteredModel { - relationships: { - "profile": "__rel_User_Profile_1", - }, - name: "User", - id_field: "id", - }, - Type#7: RegisteredModel { - relationships: { - "user": "__rel_User_Profile_1", - }, - name: "Profile", - id_field: "id", - }, - }, - models_by_name: {}, - relationships: { - "__rel_User_Profile_1": Relationship { - name: "__rel_User_Profile_1", - left: RelationshipModel { - model_type: Type#7, - model_name: "Profile", - wrapper_type: Type#2, - cardinality: Optional, - field: "user", - }, - right: RelationshipModel { - model_type: Type#3, - model_name: "User", - wrapper_type: Type#6, - cardinality: Optional, - field: "profile", - }, - }, - }, - complete_registrations: { - Type#3, - Type#7, - }, - counter: RefCell { - value: 1, - }, -} diff --git a/typegraph/core/src/runtimes/prisma/type_generation/additional_filters.rs b/typegraph/core/src/runtimes/prisma/type_generation/additional_filters.rs index 3d7d30dbc9..5ea119142e 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/additional_filters.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/additional_filters.rs @@ -1,15 +1,17 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::Property; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; use crate::{errors::Result, types::TypeId}; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct Take; impl TypeGen for Take { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::integer().x_min(0).named(self.name()).build() } @@ -21,7 +23,7 @@ impl TypeGen for Take { pub struct Skip; impl TypeGen for Skip { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::integer().x_min(0).named(self.name()).build() } @@ -33,13 +35,17 @@ impl TypeGen for Skip { pub struct Distinct(pub TypeId); impl TypeGen for Distinct { - fn generate(&self, _context: &mut TypeGenContext) -> Result { - let cols = self - .0 - .as_struct()? + fn generate(&self, context: &PrismaContext) -> Result { + let model = context.model(self.0)?; + let model = model.borrow(); + + let cols: Vec<_> = model .iter_props() - .map(|(k, _)| k.to_string()) - .collect::>(); + .filter_map(|(k, prop)| match prop { + Property::Scalar(_) | Property::Model(_) => Some(k.to_string()), + Property::Unmanaged(_) => None, + }) + .collect(); t::arrayx(t::string().enum_(cols))? .named(self.name()) diff --git a/typegraph/core/src/runtimes/prisma/type_generation/aggregate.rs b/typegraph/core/src/runtimes/prisma/type_generation/aggregate.rs index 3d2be9f7e0..bb4cecd423 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/aggregate.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/aggregate.rs @@ -1,13 +1,13 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 -use crate::{ - errors::Result, - t::{self, ConcreteTypeBuilder, TypeBuilder}, - types::{Type, TypeId}, -}; +use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::{Property, ScalarType}; +use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; +use crate::types::TypeId; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct CountOutput { model_id: TypeId, @@ -20,13 +20,21 @@ impl CountOutput { } impl TypeGen for CountOutput { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); let opt_int = t::optionalx(t::integer())?.build()?; builder.prop("_all", opt_int); - for (k, _) in self.model_id.as_struct()?.iter_props() { - builder.prop(k, opt_int); + let model = context.model(self.model_id)?; + let model = model.borrow(); + + for (k, prop) in model.iter_props() { + match prop { + Property::Scalar(_) | Property::Model(_) => { + builder.prop(k, opt_int); + } + Property::Unmanaged(_) => continue, + } } // TODO union @@ -51,7 +59,7 @@ impl NumberAggregateOutput { } impl TypeGen for NumberAggregateOutput { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); let opt_float = t::optionalx(t::float())?.build()?; @@ -61,17 +69,22 @@ impl TypeGen for NumberAggregateOutput { t::optionalx(t::integer())?.build()? }; - for (k, type_id) in self.model_id.as_struct()?.iter_props() { - let type_id = type_id.non_optional_concrete_type()?; - match type_id.as_type()? { - Type::Integer(_) => { - builder.prop(k, for_int); - } - Type::Float(_) => { - builder.prop(k, opt_float); - } - Type::Optional(_) => unreachable!(), - _ => {} + let model = context.model(self.model_id)?; + let model = model.borrow(); + + for (k, prop) in model.iter_props() { + match prop { + Property::Scalar(prop) => match prop.prop_type { + ScalarType::Integer => { + builder.prop(k, for_int); + } + ScalarType::Float => { + builder.prop(k, opt_float); + } + _ => continue, + }, + Property::Model(_) => continue, + Property::Unmanaged(_) => continue, } } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/count.rs b/typegraph/core/src/runtimes/prisma/type_generation/count.rs index 0023670bd7..c3bae7dfc8 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/count.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/count.rs @@ -3,16 +3,17 @@ use crate::{ errors::Result, + runtimes::prisma::context::PrismaContext, t::{self, ConcreteTypeBuilder, TypeBuilder}, types::TypeId, }; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct Count; impl TypeGen for Count { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::optionalx(t::integer())?.named(self.name()).build() } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/with_filters.rs b/typegraph/core/src/runtimes/prisma/type_generation/filters.rs similarity index 68% rename from typegraph/core/src/runtimes/prisma/type_generation/with_filters.rs rename to typegraph/core/src/runtimes/prisma/type_generation/filters.rs index e0ba0bbbbb..2a8ff9c66b 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/with_filters.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/filters.rs @@ -2,105 +2,16 @@ // SPDX-License-Identifier: MPL-2.0 use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::{Type, TypeFun, TypeId}; +use crate::types::{Type, TypeId}; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; -pub struct WithFilters { - type_id: TypeId, - model_id: TypeId, - skip_rel: bool, // TODO list?? - with_aggregates: bool, -} - -impl WithFilters { - pub fn new(type_id: TypeId, model_id: TypeId, skip_rel: bool) -> Self { - Self { - type_id, - model_id, - skip_rel, - with_aggregates: false, - } - } - - pub fn with_aggregates(mut self) -> Self { - self.with_aggregates = true; - self - } -} - -impl TypeGen for WithFilters { - fn generate(&self, context: &mut TypeGenContext) -> Result { - let mut builder = t::struct_(); - - for (key, id) in self.type_id.as_struct().unwrap().iter_props() { - let mut id = id; - let mut ty = id.attrs()?.concrete_type.as_type()?; - // let mut ty = id.as_type()?; - if let Type::Optional(opt) = ty { - id = opt.item(); - ty = id.attrs()?.concrete_type.as_type()?; - } - - let rel = context.registry.find_relationship_on(self.model_id, key); - let generated = - if let Some(rel) = rel { - if self.skip_rel { - continue; - } - - let target_model = rel.get_opposite_of(self.model_id, key).unwrap(); - context.generate(&WithFilters { - type_id: target_model.model_type, - model_id: target_model.model_type, - skip_rel: true, - with_aggregates: false, - })? - } else { - match ty { - Type::Optional(_) => return Err("optional of optional!?".into()), - Type::Boolean(_) => context.generate(&CompleteFilter(BooleanFilter))?, - Type::Integer(_) => context.generate(&CompleteFilter( - NumberFilter::new(NumberType::Integer, self.with_aggregates), - ))?, - Type::Float(_) => context.generate(&CompleteFilter(NumberFilter::new( - NumberType::Float, - self.with_aggregates, - )))?, - Type::String(_) => context.generate(&CompleteFilter(StringFilter))?, - Type::Array(inner) => context - .generate(&CompleteFilter(ScalarListFilter(inner.data.of.into())))?, - _ => { - return Err(format!( - "type '{}' not supported by prisma", - ty.get_data().variant_name() - ) - .into()); - } - } - }; - builder.propx(key, t::optional(generated))?; - } - - builder.named(self.name()).build() - } - - fn name(&self) -> String { - let suffix = if self.skip_rel { "_norel" } else { "" }; - let suffix2 = if self.with_aggregates { - "_with_aggregates" - } else { - "" - }; - format!("_{}WithFilters{}{}", self.type_id.0, suffix, suffix2) - } -} - -struct CompleteFilter(T); +pub(super) struct CompleteFilter(pub T); impl TypeGen for CompleteFilter { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let inner = context.generate(&self.0)?; // TODO and, or ??? t::optionalx(t::unionx![inner, t::struct_().prop("not", inner)])? @@ -113,10 +24,10 @@ impl TypeGen for CompleteFilter { } } -struct BooleanFilter; +pub(super) struct BooleanFilter; impl TypeGen for BooleanFilter { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::unionx![ t::boolean().build()?, t::struct_().propx("equals", t::boolean())?, @@ -152,7 +63,7 @@ impl NumberFilter { } impl TypeGen for NumberFilter { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { if self.with_aggregates { let base = context.generate(&NumberFilter::new(self.number_type, false))?; let float_base = context.generate(&NumberFilter::new(NumberType::Float, false))?; @@ -205,10 +116,10 @@ impl TypeGen for NumberFilter { } } -struct StringFilter; +pub(super) struct StringFilter; impl TypeGen for StringFilter { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { let type_id = t::string().build()?; let opt_type_id = t::optional(type_id).build()?; let array_type_id = t::array(type_id).build()?; @@ -239,10 +150,10 @@ impl TypeGen for StringFilter { } } -struct ScalarListFilter(TypeId); +pub(super) struct ScalarListFilter(pub TypeId); impl TypeGen for ScalarListFilter { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { if let Type::Optional(_) = self.0.as_type()? { return Err("array of optional not supported".into()); } @@ -273,7 +184,7 @@ pub struct WithAggregateFilters { } impl TypeGen for WithAggregateFilters { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { t::struct_extends(self.type_id)? .prop( "_count", @@ -304,7 +215,7 @@ impl CountFilter { } impl TypeGen for CountFilter { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let keys = self .model_id .as_struct()? @@ -332,7 +243,7 @@ impl AvgFilter { } impl TypeGen for AvgFilter { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let keys = self .model_id .as_struct() @@ -371,7 +282,7 @@ impl SumFilter { } impl TypeGen for SumFilter { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let props = self .model_id .as_struct() @@ -401,7 +312,7 @@ impl TypeGen for SumFilter { } fn gen_aggregate_filter (String, NumberType)>( - context: &mut TypeGenContext, + context: &PrismaContext, props: Vec

, map: F, name: String, diff --git a/typegraph/core/src/runtimes/prisma/type_generation/group_by.rs b/typegraph/core/src/runtimes/prisma/type_generation/group_by.rs index 46d64b58c2..f08c301e36 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/group_by.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/group_by.rs @@ -1,14 +1,14 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 -use crate::{ - errors::Result, - runtimes::prisma::type_generation::{where_::Where, with_filters::WithFilters}, - t::{self, ConcreteTypeBuilder, TypeBuilder}, - types::{Type, TypeId}, -}; +use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::{Property, ScalarType}; +use crate::runtimes::prisma::type_generation::where_::Where; +use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; +use crate::types::TypeId; -use super::{aggregate::CountOutput, TypeGen, TypeGenContext}; +use super::{aggregate::CountOutput, TypeGen}; pub struct GroupingFields { model_id: TypeId, @@ -21,26 +21,17 @@ impl GroupingFields { } impl TypeGen for GroupingFields { - fn generate(&self, context: &mut TypeGenContext) -> Result { - let mut fields = vec![]; - for (k, type_id) in self.model_id.as_struct()?.iter_props() { - if context - .registry - .find_relationship_on(self.model_id, k) - .is_some() - { - continue; - } - - match type_id.non_optional_concrete_type()?.as_type()? { - Type::Boolean(_) - | Type::Integer(_) - | Type::Float(_) - | Type::String(_) - | Type::Array(_) => fields.push(k.to_string()), - _ => {} - } - } + fn generate(&self, context: &PrismaContext) -> Result { + let model = context.model(self.model_id)?; + let model = model.borrow(); + + let fields = model + .iter_props() + .filter_map(|(k, prop)| match prop { + Property::Scalar(_) => Some(k.to_string()), + _ => None, + }) + .collect(); t::arrayx(t::string().enum_(fields))? .named(self.name()) @@ -64,17 +55,15 @@ impl Having { } impl TypeGen for Having { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { // TODO relations?? - let where_type = context.generate(&Where::new(self.model_id, false))?; - let extended_type = context - .generate(&WithFilters::new(where_type, self.model_id, true).with_aggregates())?; + let where_type = context.generate(&Where::new(self.model_id).with_aggregates())?; let name = self.name(); let self_ref = t::proxy(&name).build()?; t::unionx![ - extended_type, + where_type, t::struct_().propx("AND", t::array(self_ref))?, t::struct_().propx("OR", t::array(self_ref))?, t::struct_().prop("NOT", self_ref) @@ -100,7 +89,7 @@ impl GroupByResult { } impl TypeGen for GroupByResult { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let model_id = self.model_id; t::array( t::struct_extends(model_id)? @@ -151,7 +140,7 @@ impl SelectNumbers { } impl TypeGen for SelectNumbers { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); let opt_float = t::optional(t::float().build()?).build()?; let for_int = if self.promote_to_float { @@ -159,16 +148,23 @@ impl TypeGen for SelectNumbers { } else { t::optional(t::integer().build()?).build()? }; - for (k, type_id) in self.model_id.as_struct()?.iter_props() { - let type_id = type_id.non_optional_concrete_type()?; - match type_id.as_type()? { - Type::Integer(_) => { - builder.prop(k, for_int); - } - Type::Float(_) => { - builder.prop(k, opt_float); - } - _ => {} + + let model = context.model(self.model_id)?; + let model = model.borrow(); + + for (k, prop) in model.iter_props() { + match prop { + Property::Scalar(prop) => match prop.prop_type { + ScalarType::Integer => { + builder.prop(k, for_int); + } + ScalarType::Float => { + builder.prop(k, opt_float); + } + _ => {} + }, + Property::Model(_) => {} + Property::Unmanaged(_) => {} } } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/input_type.rs b/typegraph/core/src/runtimes/prisma/type_generation/input_type.rs index 83cba52ae6..21477e1825 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/input_type.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/input_type.rs @@ -1,29 +1,23 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +use common::typegraph::runtimes::prisma::ScalarType; + use crate::errors::Result; -use crate::runtimes::prisma::type_utils::RuntimeConfig; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::{InjectionHandler, Property}; use crate::runtimes::prisma::{relationship::Cardinality, type_generation::where_::Where}; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::{Type, TypeId}; +use crate::types::TypeId; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] enum Operation { Create, Update, } -impl Operation { - fn is_update(&self) -> bool { - match self { - Operation::Create => false, - Operation::Update => true, - } - } -} - pub struct InputType { model_id: TypeId, skip_rel: Vec, @@ -49,61 +43,156 @@ impl InputType { } impl TypeGen for InputType { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); + let model = context.model(self.model_id)?; + let model = model.borrow(); - for (k, type_id) in self.model_id.as_struct()?.iter_props() { - let rel = context.registry.find_relationship_on(self.model_id, k); - if let Some(rel) = rel { - if self.skip_rel.contains(&rel.name) { - continue; - } + for (k, prop) in model.iter_props() { + match prop { + Property::Model(prop) => { + let rel_name = model.relationships.get(k).ok_or_else(|| { + format!("relationship not registered: {}::{}", model.type_name, k) + })?; + if self.skip_rel.contains(rel_name) { + continue; + } + + let create = context.generate(&InputType { + model_id: prop.model_id, + skip_rel: { + let mut skip_rel = self.skip_rel.clone(); + skip_rel.push(rel_name.to_string()); + skip_rel + }, + operation: Operation::Create, + })?; + let connect = context.generate(&Where::new(prop.model_id))?; + let connect_or_create = t::struct_() + .prop("create", create) + .prop("where", connect) + .build()?; + + let mut inner = t::unionx!( + t::struct_().prop("create", create), + t::struct_().prop("connect", connect), + t::struct_().prop("connectOrCreate", connect_or_create), + ); + + if let Operation::Update = self.operation { + let update = context.generate(&InputType { + model_id: prop.model_id, + skip_rel: { + let mut skip_rel = self.skip_rel.clone(); + skip_rel.push(rel_name.to_string()); + skip_rel + }, + operation: Operation::Update, + })?; + inner.addx(t::struct_().prop("update", update))?; + + match prop.quantifier { + Cardinality::Optional => { + inner.addx(t::struct_().propx("disconnect", t::boolean())?)?; + inner.addx(t::struct_().propx("delete", t::boolean())?)?; + + let upsert = t::struct_() + .prop("create", create) + .prop("update", update) + .build()?; + inner.addx(t::struct_().prop("upsert", upsert))?; + } + Cardinality::Many => { + inner.addx( + t::struct_().propx( + "updateMany", + t::struct_() + .propx("where", t::optional(connect))? + .prop("data", update), + )?, + )?; + + inner.addx(t::struct_().propx( + "deleteMany", + t::struct_().propx("where", t::optional(connect))?, + )?)?; + } + _ => (), + } + } - let entry = rel.get(rel.side_of_type(type_id).unwrap()); - // model - let create = context.generate(&InputType { - model_id: entry.model_type, - skip_rel: { - let mut skip_rel = self.skip_rel.clone(); - skip_rel.push(rel.name.clone()); - skip_rel - }, - operation: Operation::Create, - })?; - // TODO unique where - let connect = context.generate(&Where::new(entry.model_type, false))?; - - let mut inner = t::struct_(); - inner.propx("create", t::optional(create))?; - inner.propx("connect", t::optional(connect))?; - - if let Cardinality::Many = entry.cardinality { - inner.propx( - "createMany", - t::optionalx(t::struct_().propx("data", t::array(create))?)?, - )?; + if let Cardinality::Many = prop.quantifier { + inner.addx(t::struct_().propx( + "createMany", + t::optionalx(t::struct_().propx("data", t::array(create))?)?, + )?)?; + } + + if let (Operation::Create, Cardinality::One) = (self.operation, prop.quantifier) + { + builder.propx(k, inner)?; + } else { + builder.propx(k, t::optionalx(inner)?)?; + } } - // TODO what if cardinality is Cardinality::One ?? - builder.propx(k, t::optionalx(inner.min(1).max(1))?)?; - } else { - let attrs = type_id.attrs()?; - match attrs.concrete_type.as_type()? { - Type::Func(_) => continue, - typ => { - let is_auto = || -> Result<_> { - Ok(RuntimeConfig::try_from(&typ)?.get("auto")?.unwrap_or(false)) - }; - builder.prop( - k, - if self.operation.is_update() || is_auto()? { - t::optional(type_id).build()? + Property::Scalar(prop) => { + match self.operation { + Operation::Create => { + if let Some(inj) = &prop.injection { + if let Some(InjectionHandler::Typegate) = &inj.create { + // value inserted by the prisma engine + continue; + } + } + builder.prop( + k, + if prop.auto { + t::optional(prop.type_id).build()? + } else { + prop.wrapper_type_id + }, + ); + } + Operation::Update => { + if let Some(inj) = &prop.injection { + if let Some(InjectionHandler::Typegate) = &inj.update { + // value inserted by the prisma engine + continue; + } + } + let mutation_type = if prop.quantifier == Cardinality::Many { + t::unionx![ + prop.wrapper_type_id, + t::struct_().prop("set", prop.wrapper_type_id), + t::struct_().prop("push", prop.type_id), + // "unset": mongo only + ] + .build()? } else { - type_id - }, - ); + let wrapper_type_id = prop.wrapper_type_id; + match prop.prop_type { + ScalarType::Boolean | ScalarType::String { .. } => t::unionx![ + wrapper_type_id, + t::struct_().prop("set", wrapper_type_id) + ] + .build()?, + ScalarType::Integer | ScalarType::Float => t::unionx![ + wrapper_type_id, + t::struct_().prop("set", wrapper_type_id), + t::struct_().prop("multiply", prop.type_id), + t::struct_().prop("decrement", prop.type_id), + t::struct_().prop("increment", prop.type_id), + ] + .build()?, + } + }; + builder.propx(k, t::optional(mutation_type))?; + } } } + + Property::Unmanaged(_) => continue, } } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/mod.rs b/typegraph/core/src/runtimes/prisma/type_generation/mod.rs index e737966308..674e476600 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/mod.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/mod.rs @@ -8,9 +8,7 @@ //! Type generation should always be done through the `TypeGenContext` to enable //! the cache. Do not call `TypeGen::generate` directly. -use std::cell::RefCell; -use std::collections::HashMap; -use std::rc::{Rc, Weak}; +use std::rc::Rc; use regex::Regex; @@ -21,19 +19,19 @@ use self::out_type::OutType; use self::query_input_type::QueryInputType; use self::query_unique_where_expr::QueryUniqueWhereExpr; use self::query_where_expr::QueryWhereExpr; -use self::update_input::UpdateInput; use self::with_nested_count::WithNestedCount; -use super::relationship::registry::RelationshipRegistry; +use super::context::PrismaContext; use crate::errors::Result; use crate::runtimes::prisma::relationship::Cardinality; use crate::t::{self, TypeBuilder}; -use crate::typegraph::with_tg_mut; +use crate::typegraph::with_tg; use crate::types::{TypeFun, TypeId}; mod additional_filters; mod aggregate; mod count; +mod filters; pub mod group_by; mod input_type; mod order_by; @@ -41,19 +39,11 @@ mod out_type; pub mod query_input_type; mod query_unique_where_expr; mod query_where_expr; -mod update_input; mod where_; -mod with_filters; mod with_nested_count; -#[derive(Default, Debug)] -pub struct TypeGenContext { - pub registry: RelationshipRegistry, - cache: Weak>>, -} - trait TypeGen { - fn generate(&self, context: &mut TypeGenContext) -> Result; + fn generate(&self, context: &PrismaContext) -> Result; fn name(&self) -> String; } @@ -99,196 +89,274 @@ pub fn replace_variables_to_indices(query: String, input_id: TypeId) -> Result Result { - self.registry.manage(model_id)?; +impl PrismaContext { + fn generate(&self, generator: &impl TypeGen) -> Result { + let type_name = generator.name(); - Ok(OperationTypes { - input: t::struct_() - .propx( - "where", - t::optional(self.generate(&QueryUniqueWhereExpr::new(model_id))?), - )? - .build()?, - output: t::optional(self.generate(&WithNestedCount::new(model_id))?).build()?, - }) - } + let cached = { + let cache = self.typegen_cache.get_or_init(|| { + let cache = with_tg(|tg| tg.get_prisma_typegen_cache()).unwrap(); + Rc::downgrade(&cache) + }); + let cache = cache + .upgrade() + .ok_or_else(|| "Typegen cache not available".to_string())?; + let cache = cache.borrow(); + cache.get(&type_name).cloned() + }; - pub fn find_many(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; + if let Some(type_id) = cached { + Ok(type_id) + } else { + let type_id = generator.generate(self)?; - Ok(OperationTypes { - input: self.generate(&QueryInputType::new(model_id, false))?, - output: t::array(self.generate(&WithNestedCount::new(model_id))?).build()?, - }) + // name validation + let typ = type_id.as_type()?; + let name = typ + .get_base() + .ok_or_else(|| "Generated type must be a concrete type".to_string())? + .name + .as_ref() + .ok_or_else(|| format!("Generated type must have name: {type_name}"))?; + if name != &type_name { + return Err(format!( + "Generated type name mismatch: expected {}, got {}", + type_name, name + ) + .into()); + } + + // insert new entry into cache + let cache = self.typegen_cache.get().unwrap(); + let cache = cache + .upgrade() + .ok_or_else(|| "Typegen cache not available".to_string())?; + let mut cache = cache.borrow_mut(); + cache.insert(type_name, type_id); + Ok(type_id) + } } - pub fn find_first(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; + pub fn generate_types( + &mut self, + op: impl PrismaOperation, + model_id: TypeId, + ) -> Result { + self.manage(model_id)?; Ok(OperationTypes { - input: self.generate(&QueryInputType::new(model_id, false))?, - output: t::optional(self.generate(&OutType::new(model_id))?).build()?, + input: op.generate_input_type(self, model_id)?, + output: op.generate_output_type(self, model_id)?, }) } +} - pub fn aggregate(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +pub trait PrismaOperation { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result; + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result; +} - Ok(OperationTypes { - input: self.generate(&QueryInputType::new(model_id, false))?, - // TODO typegen - output: t::struct_() - .prop("_count", self.generate(&CountOutput::new(model_id))?) - .prop( - "_avg", - self.generate(&NumberAggregateOutput::new(model_id, true))?, - ) - .prop( - "_sum", - self.generate(&NumberAggregateOutput::new(model_id, false))?, - ) - .prop( - "_min", - self.generate(&NumberAggregateOutput::new(model_id, false))?, - ) - .prop( - "_max", - self.generate(&NumberAggregateOutput::new(model_id, false))?, - ) - .min(1) - .build()?, - }) +pub struct FindUnique; +pub struct FindMany; +pub struct FindFirst; +pub struct Aggregate; +pub struct GroupBy; +pub struct CreateOne; +pub struct CreateMany; +pub struct UpdateOne; +pub struct UpdateMany; +pub struct UpsertOne; +pub struct DeleteOne; +pub struct DeleteMany; + +impl PrismaOperation for FindUnique { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .propx( + "where", + t::optional(context.generate(&QueryUniqueWhereExpr::new(model_id))?), + )? + .build() } - pub fn count(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; - - Ok(OperationTypes { - input: self.generate(&QueryInputType::new(model_id, false))?, - output: self.generate(&CountOutput::new(model_id))?, - }) + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::optional(context.generate(&WithNestedCount::new(model_id))?).build() } +} - pub fn group_by(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +impl PrismaOperation for FindMany { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&QueryInputType::new(model_id, false)) + } - Ok(OperationTypes { - input: self.generate(&QueryInputType::new(model_id, true))?, - output: self.generate(&GroupByResult::new(model_id))?, - }) + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::array(context.generate(&WithNestedCount::new(model_id))?).build() } +} - pub fn create_one(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +impl PrismaOperation for FindFirst { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&QueryInputType::new(model_id, false)) + } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::optional(context.generate(&OutType::new(model_id))?).build() + } +} - Ok(OperationTypes { - input: t::struct_() - .prop("data", self.generate(&InputType::for_create(model_id))?) - .build()?, - output: self.generate(&OutType::new(model_id))?, - }) +impl PrismaOperation for Aggregate { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&QueryInputType::new(model_id, false)) + } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop("_count", context.generate(&CountOutput::new(model_id))?) + .prop( + "_avg", + context.generate(&NumberAggregateOutput::new(model_id, true))?, + ) + .prop( + "_sum", + context.generate(&NumberAggregateOutput::new(model_id, false))?, + ) + .prop( + "_min", + context.generate(&NumberAggregateOutput::new(model_id, false))?, + ) + .prop( + "_max", + context.generate(&NumberAggregateOutput::new(model_id, false))?, + ) + .min(1) + .build() } +} - pub fn create_many(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +pub struct Count; - Ok(OperationTypes { - input: t::struct_() - .propx( - "data", - t::array(self.generate(&InputType::for_create(model_id))?), - )? - .build()?, - // TODO typegen: BatchOutput - output: t::struct_().propx("count", t::integer())?.build()?, - }) +impl PrismaOperation for Count { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&QueryInputType::new(model_id, false)) } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&CountOutput::new(model_id)) + } +} - pub fn update_one(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; - - Ok(OperationTypes { - input: t::struct_() - .prop("data", self.generate(&InputType::for_update(model_id))?) - .prop( - "where", - self.generate(&QueryUniqueWhereExpr::new(model_id))?, - ) - .build()?, - output: self.generate(&OutType::new(model_id))?, - }) +impl PrismaOperation for GroupBy { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&QueryInputType::new(model_id, true)) } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&GroupByResult::new(model_id)) + } +} - pub fn update_many(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +impl PrismaOperation for CreateOne { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop("data", context.generate(&InputType::for_create(model_id))?) + .build() + } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&OutType::new(model_id)) + } +} - Ok(OperationTypes { - input: t::struct_() - .prop("data", self.generate(&UpdateInput::new(model_id))?) - .prop( - "where", - t::optional(self.generate(&QueryWhereExpr::new(model_id))?).build()?, - ) - .build()?, - output: t::struct_().propx("count", t::integer())?.build()?, - }) +impl PrismaOperation for CreateMany { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .propx( + "data", + t::array(context.generate(&InputType::for_create(model_id))?), + )? + .build() } + fn generate_output_type(&self, _context: &PrismaContext, _model_id: TypeId) -> Result { + t::struct_().propx("count", t::integer())?.build() + } +} - pub fn upsert_one(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; +impl PrismaOperation for UpdateOne { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop("data", context.generate(&InputType::for_update(model_id))?) + .prop( + "where", + context.generate(&QueryUniqueWhereExpr::new(model_id))?, + ) + .build() + } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&OutType::new(model_id)) + } +} - Ok(OperationTypes { - input: t::struct_() - .prop( - "where", - self.generate(&QueryUniqueWhereExpr::new(model_id))?, - ) - .prop("create", self.generate(&InputType::for_create(model_id))?) - .prop("update", self.generate(&UpdateInput::new(model_id))?) - // .prop("update", self.generate(&InputType::for_update(model_id))?) - .build()?, - output: self.generate(&OutType::new(model_id))?, - }) +impl PrismaOperation for UpdateMany { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop("data", context.generate(&InputType::for_update(model_id))?) + .prop( + "where", + t::optional(context.generate(&QueryWhereExpr::new(model_id))?).build()?, + ) + .build() } + fn generate_output_type(&self, _context: &PrismaContext, _model_id: TypeId) -> Result { + t::struct_().propx("count", t::integer())?.build() + } +} - pub fn delete_one(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; - Ok(OperationTypes { - input: t::struct_() - .prop( - "where", - self.generate(&QueryUniqueWhereExpr::new(model_id))?, - ) - .build()?, - output: self.generate(&OutType::new(model_id))?, - }) +impl PrismaOperation for UpsertOne { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop( + "where", + context.generate(&QueryUniqueWhereExpr::new(model_id))?, + ) + .prop( + "create", + context.generate(&InputType::for_create(model_id))?, + ) + .prop( + "update", + context.generate(&InputType::for_update(model_id))?, + ) + .build() } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&OutType::new(model_id)) + } +} - pub fn delete_many(&mut self, model_id: TypeId) -> Result { - self.registry.manage(model_id)?; - Ok(OperationTypes { - input: t::struct_() - .prop( - "where", - t::optional(self.generate(&QueryWhereExpr::new(model_id))?).build()?, - ) - .build()?, - output: t::struct_().propx("count", t::integer())?.build()?, - }) +impl PrismaOperation for DeleteOne { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop( + "where", + context.generate(&QueryUniqueWhereExpr::new(model_id))?, + ) + .build() } + fn generate_output_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + context.generate(&OutType::new(model_id)) + } +} - fn get_cache(&mut self) -> Result>>> { - match self.cache.upgrade() { - Some(cache) => Ok(cache), - None => with_tg_mut(|tg| { - let cache = tg.get_prisma_typegen_cache(); - self.cache = Rc::downgrade(&cache); - cache - }), - } +impl PrismaOperation for DeleteMany { + fn generate_input_type(&self, context: &PrismaContext, model_id: TypeId) -> Result { + t::struct_() + .prop( + "where", + t::optional(context.generate(&QueryWhereExpr::new(model_id))?).build()?, + ) + .build() } + fn generate_output_type(&self, _context: &PrismaContext, _model_id: TypeId) -> Result { + t::struct_().propx("count", t::integer())?.build() + } +} +impl PrismaContext { pub fn execute_raw(&mut self, param: TypeId) -> Result { let param = param.as_struct()?; Ok(OperationTypes { @@ -304,40 +372,6 @@ impl TypeGenContext { output: out, }) } - - fn generate(&mut self, generator: &impl TypeGen) -> Result { - //! Generates a type and caches it, or returns the cached type if it - //! already exists. - - let cache = self.get_cache()?; - - let type_name = generator.name(); - let cached_type = { - let cache = cache.borrow(); - cache.get(&type_name).copied() - }; - if let Some(type_id) = cached_type { - Ok(type_id) - } else { - let type_id = generator.generate(self)?; - let typ = type_id.as_type()?; - let name = typ - .get_base() - .ok_or_else(|| "Generated type must be a concrete type".to_string())? - .name - .as_ref() - .ok_or_else(|| format!("Generated type must have name: {type_name}"))?; - if name != &type_name { - return Err(format!( - "Generated type name mismatch: expected {}, got {}", - type_name, name - ) - .into()); - } - cache.borrow_mut().insert(type_name, type_id); - Ok(type_id) - } - } } #[cfg(test)] @@ -346,11 +380,13 @@ mod test { use crate::test_utils::*; use paste::paste; + /// generate a test for the operation: + /// snapshot for the input type and/or the output type as specified macro_rules! test_op { ( $op_name:ident, $test_inp:expr, $test_out:expr ) => { paste! { #[test] - fn []() -> Result<()> { + fn []() -> Result<()> { test_op_body!($op_name, $test_inp, $test_out) } } @@ -372,53 +408,56 @@ mod test { macro_rules! test_op_body { ( $op_name:ident, $test_inp:expr, $test_out:expr ) => {{ setup(None)?; - let mut context = TypeGenContext::default(); + let mut context = PrismaContext::default(); let record = models::simple_record()?; - context.registry.manage(record)?; - let types = context.$op_name(record)?; + context.manage(record)?; if $test_inp { + let inp = $op_name.generate_input_type(&context, record)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " Record inp"), - tree::print(types.input) + paste! { concat!(stringify!([<$op_name:snake>]), " Record inp") }, + tree::print(inp) ); } if $test_out { + let out = $op_name.generate_output_type(&context, record)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " Record out"), - tree::print(types.output) + paste! { concat!(stringify!([<$op_name:snake>]), " Record out") }, + tree::print(out) ); } let (user, post) = models::simple_relationship()?; - context.registry.manage(user)?; + context.manage(user)?; - let types = context.$op_name(user)?; if $test_inp { + let inp = $op_name.generate_input_type(&context, user)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " User inp"), - tree::print(types.input) + paste! { concat!(stringify!([<$op_name:snake>]), " User inp") }, + tree::print(inp) ); } if $test_out { + let out = $op_name.generate_output_type(&context, user)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " User out"), - tree::print(types.output) + paste! { concat!(stringify!([<$op_name:snake>]), " User out") }, + tree::print(out) ); } - let types = context.$op_name(post)?; if $test_inp { + let inp = $op_name.generate_input_type(&context, post)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " Post inp"), - tree::print(types.input) + paste! { concat!(stringify!([<$op_name:snake>]), " Post inp") }, + tree::print(inp) ); } if $test_out { + let out = $op_name.generate_output_type(&context, post)?; insta::assert_snapshot!( - concat!(stringify!($op_name), " Post out"), - tree::print(types.output) + paste! { concat!(stringify!([<$op_name:snake>]), " Post out") }, + tree::print(out) ); } @@ -426,18 +465,18 @@ mod test { }}; } - test_op!(find_unique); - test_op!(find_many); - test_op!(find_first, output_only); - test_op!(aggregate, output_only); - test_op!(group_by); - test_op!(create_one, input_only); - test_op!(create_many); - test_op!(update_one, input_only); - test_op!(update_many, input_only); + test_op!(FindUnique); + test_op!(FindMany); + test_op!(FindFirst, output_only); + test_op!(Aggregate, output_only); + test_op!(GroupBy); + test_op!(CreateOne, input_only); + test_op!(CreateMany); + test_op!(UpdateOne, input_only); + test_op!(UpdateMany, input_only); // the following operations reuse already tests types, so no need to test them - // test_op!(count); - // test_op!(upsert_one); - // test_op!(delete_one); - // test_op!(delete_many); + // test_op!(Count); + // test_op!(UpsertOne); + // test_op!(DeleteOne); + // test_op!(DeleteMany); } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/order_by.rs b/typegraph/core/src/runtimes/prisma/type_generation/order_by.rs index 671c6abbfb..29595750cc 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/order_by.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/order_by.rs @@ -2,12 +2,14 @@ // SPDX-License-Identifier: MPL-2.0 use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::errors; +use crate::runtimes::prisma::model::{Property, ScalarType}; use crate::runtimes::prisma::relationship::Cardinality; use crate::t::{ConcreteTypeBuilder, TypeBuilder}; -use crate::types::Type; use crate::{t, types::TypeId}; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct OrderBy { model_id: TypeId, @@ -38,57 +40,55 @@ impl OrderBy { } impl TypeGen for OrderBy { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = if self.aggregates { t::struct_extends(context.generate(&AggregateSorting::new(self.model_id))?)? } else { t::struct_() }; - for (k, type_id) in self.model_id.as_struct()?.iter_props() { - let registry_entry = context.registry.models.get(&self.model_id).unwrap(); - let rel = registry_entry.relationships.get(k); - if let Some(rel_name) = rel { - if self.skip_rel.contains(rel_name) { - continue; - } + let model = context.model(self.model_id)?; + let model = model.borrow(); + + for (k, prop) in model.iter_props() { + match prop { + Property::Model(prop) => { + let rel_name = model + .relationships + .get(k) + .ok_or_else(|| errors::unregistered_relationship(&model.type_name, k))?; - let rel = context - .registry - .relationships - .get(rel_name) - .cloned() - .unwrap(); - - // TODO does this work for self relationship? - let relationship_model = rel.get_opposite_of(self.model_id, k).unwrap(); - match relationship_model.cardinality { - Cardinality::Many => { - builder.prop(k, context.generate(&SortByAggregates)?); + if self.skip_rel.contains(rel_name) { + continue; } - Cardinality::Optional | Cardinality::One => { - let mut skip_rel = self.skip_rel.clone(); - skip_rel.push(rel_name.clone()); - let inner = context.generate( - &OrderBy::new(relationship_model.model_type).skip(skip_rel), - )?; - builder.propx(k, t::optional(inner))?; + + // TODO does this work for self relationship? + match prop.quantifier { + Cardinality::Many => { + builder.prop(k, context.generate(&SortByAggregates)?); + } + Cardinality::Optional | Cardinality::One => { + let mut skip_rel = self.skip_rel.clone(); + skip_rel.push(rel_name.clone()); + let inner = + context.generate(&OrderBy::new(prop.model_id).skip(skip_rel))?; + builder.propx(k, t::optional(inner))?; + } } } - } else { - let typ = type_id.as_type()?; - let (typ, nullable) = if let Type::Optional(inner) = typ { - (inner.item().as_type()?, true) - } else { - (typ, false) - }; - match typ { - Type::Boolean(_) | Type::Integer(_) | Type::Float(_) | Type::String(_) => { - builder.prop(k, context.generate(&Sort { nullable })?); + + Property::Scalar(prop) => { + if prop.quantifier != Cardinality::Many { + builder.prop( + k, + context.generate(&Sort { + nullable: prop.quantifier == Cardinality::Optional, + })?, + ); } - Type::Array(_) => {} - _ => {} } + + Property::Unmanaged(_) => {} } } @@ -114,7 +114,7 @@ impl TypeGen for OrderBy { struct SortOrder; impl TypeGen for SortOrder { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::string() .enum_(vec!["asc".to_string(), "desc".to_string()]) .named(self.name()) @@ -129,7 +129,7 @@ impl TypeGen for SortOrder { struct NullsOrder; impl TypeGen for NullsOrder { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, _context: &PrismaContext) -> Result { t::string() .enum_(vec!["first".to_string(), "last".to_string()]) .named(self.name()) @@ -146,7 +146,7 @@ struct Sort { } impl TypeGen for Sort { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let sort_order = context.generate(&SortOrder)?; let nulls_order = context.generate(&NullsOrder)?; let mut builder = t::struct_(); @@ -169,7 +169,7 @@ impl TypeGen for Sort { struct SortByAggregates; impl TypeGen for SortByAggregates { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); let sort = context.generate(&Sort { nullable: false })?; builder.prop("_count", sort); @@ -197,51 +197,51 @@ impl AggregateSorting { } impl TypeGen for AggregateSorting { - fn generate(&self, context: &mut TypeGenContext) -> Result { - use AggregateSortingProp as Prop; - - let props = self - .model_id - .as_struct()? - .iter_props() - .map(|(k, type_id)| -> Result<_> { - let attrs = type_id.attrs()?; - let typ = attrs.concrete_type.as_type()?; - let (typ, is_optional) = match typ { - Type::Optional(inner) => ( - TypeId(inner.data.of).attrs()?.concrete_type.as_type()?, - true, - ), - _ => (typ, false), - }; - match typ { - Type::Integer(_) | Type::Float(_) => Ok(Prop { - key: k.to_string(), - number_type: true, - optional: is_optional, - }), - _ => Ok(Prop { - key: k.to_string(), - number_type: false, - optional: is_optional, - }), + fn generate(&self, context: &PrismaContext) -> Result { + let model = context.model(self.model_id)?; + let model = model.borrow(); + + let mut agg_builder = t::struct_(); + let mut count_builder = t::struct_(); + + for (k, prop) in model.iter_props() { + match prop { + Property::Scalar(prop) => { + count_builder.prop( + k, + context.generate(&Sort { + nullable: prop.quantifier == Cardinality::Optional, + })?, + ); + match prop.prop_type { + ScalarType::Integer | ScalarType::Float => { + agg_builder.prop( + k, + context.generate(&Sort { + nullable: prop.quantifier == Cardinality::Optional, + })?, + ); + } + // skip + _ => {} + } + } + Property::Model(prop) => { + count_builder.prop( + k, + context.generate(&Sort { + nullable: prop.quantifier == Cardinality::Optional, + })?, + ); } - }) - .collect::>>()?; + + Property::Unmanaged(_) => {} + } + } let mut builder = t::struct_(); - let count = t::optionalx(t::struct_from(props.iter().filter_map(|p| { - p.generate(context, true) - .unwrap() - .map(|ty| (p.key.clone(), ty)) - })))? - .build()?; - let others = t::optionalx(t::struct_from(props.iter().filter_map(|p| { - p.generate(context, false) - .unwrap() - .map(|ty| (p.key.clone(), ty)) - })))? - .build()?; + let count = t::optionalx(count_builder)?.build()?; + let others = t::optionalx(agg_builder)?.build()?; builder .prop("_count", count) .prop("_avg", others) @@ -257,28 +257,3 @@ impl TypeGen for AggregateSorting { format!("_{model_name}_AggregateSorting") } } - -struct AggregateSortingProp { - key: String, - number_type: bool, - optional: bool, -} - -impl AggregateSortingProp { - fn generate(&self, context: &mut TypeGenContext, count: bool) -> Result> { - Ok(match count { - true => Some(context.generate(&Sort { - nullable: self.optional, - })?), - false => { - if self.number_type { - Some(context.generate(&Sort { - nullable: self.optional, - })?) - } else { - None - } - } - }) - } -} diff --git a/typegraph/core/src/runtimes/prisma/type_generation/out_type.rs b/typegraph/core/src/runtimes/prisma/type_generation/out_type.rs index e1f3d231c8..bb84b4a026 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/out_type.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/out_type.rs @@ -1,8 +1,12 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::errors; +use crate::runtimes::prisma::model::Property; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::{Type, TypeId}; +use crate::types::TypeId; use super::{Cardinality, TypeGen}; @@ -21,45 +25,48 @@ impl OutType { } impl TypeGen for OutType { - fn generate( - &self, - context: &mut super::TypeGenContext, - ) -> crate::errors::Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); - for (key, type_id) in self.model_id.as_struct()?.iter_props() { - let rel = context.registry.find_relationship_on(self.model_id, key); + let model = context.model(self.model_id)?; + let model = model.borrow(); - if let Some(rel) = rel { - if self.skip_rel.contains(&rel.name) || rel.left.model_type == rel.right.model_type - { - continue; - } - let entry = rel.get(rel.side_of_type(type_id).unwrap()); - let mut skip_rel = self.skip_rel.clone(); - skip_rel.push(rel.name.clone()); + for (key, prop) in model.iter_props() { + match prop { + Property::Model(prop) => { + let rel_name = model + .relationships + .get(key) + .ok_or_else(|| errors::unregistered_relationship(&model.type_name, key))?; + let rel = context.relationships.get(rel_name).unwrap(); + if self.skip_rel.contains(rel_name) + || rel.left.model_type == rel.right.model_type + { + continue; + } - let out_type = context.generate(&OutType { - model_id: entry.model_type, - skip_rel, - })?; + let mut skip_rel = self.skip_rel.clone(); + skip_rel.push(rel_name.clone()); - let out_type = match entry.cardinality { - Cardinality::Optional => t::optional(out_type).build()?, - Cardinality::One => out_type, - Cardinality::Many => t::array(out_type).build()?, - }; + let out_type = context.generate(&OutType { + model_id: prop.model_id, + skip_rel, + })?; - builder.prop(key, out_type); - } else { - match type_id.attrs()?.concrete_type.as_type()? { - Type::Func(_) => { - // skip, other runtime - continue; - } - _ => { - builder.prop(key, type_id); - } + let out_type = match prop.quantifier { + Cardinality::Optional => t::optional(out_type).build()?, + Cardinality::One => out_type, + Cardinality::Many => t::array(out_type).build()?, + }; + + builder.prop(key, out_type); + } + Property::Scalar(prop) => { + builder.prop(key, prop.wrapper_type_id); + } + Property::Unmanaged(type_id) => { + // just forward the original type + builder.prop(key, *type_id); } } } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/query_input_type.rs b/typegraph/core/src/runtimes/prisma/type_generation/query_input_type.rs index 9bca176152..63fbb7dedd 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/query_input_type.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/query_input_type.rs @@ -3,6 +3,7 @@ use crate::{ errors::Result, + runtimes::prisma::context::PrismaContext, t::{self, ConcreteTypeBuilder, TypeBuilder}, types::TypeId, }; @@ -12,7 +13,7 @@ use super::{ group_by::{GroupingFields, Having}, order_by::OrderBy, query_where_expr::QueryWhereExpr, - TypeGen, TypeGenContext, + TypeGen, }; pub struct QueryInputType { @@ -30,7 +31,7 @@ impl QueryInputType { } impl TypeGen for QueryInputType { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut builder = t::struct_(); let order_by = { let order_by = OrderBy::new(self.model_id); diff --git a/typegraph/core/src/runtimes/prisma/type_generation/query_unique_where_expr.rs b/typegraph/core/src/runtimes/prisma/type_generation/query_unique_where_expr.rs index df65808f70..80b7c832f4 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/query_unique_where_expr.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/query_unique_where_expr.rs @@ -2,11 +2,12 @@ // SPDX-License-Identifier: MPL-2.0 use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::Property; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::TypeFun; use crate::types::TypeId; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct QueryUniqueWhereExpr { model_id: TypeId, @@ -19,31 +20,21 @@ impl QueryUniqueWhereExpr { } impl TypeGen for QueryUniqueWhereExpr { - fn generate(&self, _context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { + let model = context.model(self.model_id)?; + let model = model.borrow(); let mut builder = t::struct_(); - let model = self.model_id.as_struct().unwrap(); - - for (key, type_id) in model.iter_props() { - let attrs = type_id.attrs()?; - let is_id = attrs - .concrete_type - .as_type()? - .get_base() - .ok_or_else(|| "expected a concrete type".to_string())? - .as_id; - let is_unique = type_id.as_type()?.get_base().map_or(false, |base| { - base.runtime_config - .iter() - .flatten() - .find_map(|(k, v)| (k == "unique").then(|| v.clone())) - .map_or(false, |v| v == "true") - }); - - if attrs.concrete_type.is_func()? || (!is_id && !is_unique) { - continue; + + for (k, prop) in model.iter_props() { + match prop { + Property::Scalar(prop) => { + if &model.id_field == k || prop.unique { + builder.propx(k, t::optional(prop.type_id))?; + } + } + Property::Model(_) => {} + Property::Unmanaged(_) => {} } - let inner = attrs.concrete_type.resolve_quant()?; - builder.propx(key, t::optional(inner))?; } builder.named(self.name()).build() diff --git a/typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs b/typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs index e7268f0549..6e7ae66501 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs @@ -1,10 +1,11 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +use crate::runtimes::prisma::context::PrismaContext; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; use crate::{errors::Result, types::TypeId}; -use super::{where_::Where, with_filters::WithFilters, TypeGen}; +use super::{where_::Where, TypeGen}; pub struct QueryWhereExpr { model_id: TypeId, @@ -17,12 +18,10 @@ impl QueryWhereExpr { } impl TypeGen for QueryWhereExpr { - fn generate(&self, context: &mut super::TypeGenContext) -> Result { - let where_type = context.generate(&Where::new(self.model_id, true))?; - let extended_type = - context.generate(&WithFilters::new(where_type, self.model_id, false))?; + fn generate(&self, context: &PrismaContext) -> Result { + let where_type = context.generate(&Where::new(self.model_id))?; - let props = extended_type.as_struct().unwrap().data.props.to_vec(); + let props = where_type.as_struct().unwrap().data.props.to_vec(); let name = self.name(); let self_ref = t::proxy(&name).build()?; @@ -47,3 +46,26 @@ impl TypeGen for QueryWhereExpr { ) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_utils::*; + #[test] + fn test_query_where_expr() -> Result<()> { + setup(None)?; + + let mut ctx = PrismaContext::default(); + + let (user, post) = models::simple_relationship()?; + + ctx.manage(user)?; + let user_where_expr = ctx.generate(&QueryWhereExpr::new(user))?; + insta::assert_snapshot!("User/QueryWhereExpr", tree::print(user_where_expr)); + + let post_where_expr = ctx.generate(&QueryWhereExpr::new(post))?; + insta::assert_snapshot!("Post/QueryWhereExpr", tree::print(post_where_expr)); + + Ok(()) + } +} diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__Post__QueryWhereExpr.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__Post__QueryWhereExpr.snap new file mode 100644 index 0000000000..b9a3ce3164 --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__Post__QueryWhereExpr.snap @@ -0,0 +1,219 @@ +--- +source: typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs +expression: "tree::print(post_where_expr)" +--- +root: struct 'QueryPostWhereInput' #78 +├─ [id]: optional '_58__integer_filter_c?' #58 +│ └─ item: optional '_integer_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: either '_integer_filter' #17 +│ │ ├─ variant_0: integer #9 +│ │ ├─ variant_1: struct #12 +│ │ │ └─ [equals]: integer #9 +│ │ ├─ variant_2: struct #13 +│ │ │ └─ [not]: integer #9 +│ │ ├─ variant_3: struct #14 +│ │ │ ├─ [lt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [gt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [lte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ [gte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ variant_4: struct #15 +│ │ │ └─ [in]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_5: struct #16 +│ │ └─ [notIn]: array #11 +│ │ └─ item: integer #9 +│ └─ variant_1: struct #18 +│ └─ [not]: either '_integer_filter' #17 +│ ├─ variant_0: integer #9 +│ ├─ variant_1: struct #12 +│ │ └─ [equals]: integer #9 +│ ├─ variant_2: struct #13 +│ │ └─ [not]: integer #9 +│ ├─ variant_3: struct #14 +│ │ ├─ [lt]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ [gt]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ [lte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ └─ [gte]: optional #10 +│ │ └─ item: integer #9 +│ ├─ variant_4: struct #15 +│ │ └─ [in]: array #11 +│ │ └─ item: integer #9 +│ └─ variant_5: struct #16 +│ └─ [notIn]: array #11 +│ └─ item: integer #9 +├─ [title]: optional '_59__string_filter_c?' #59 +│ └─ item: optional '_string_filter_c' #37 +│ └─ item: union #36 +│ ├─ variant_0: union '_string_filter' #34 +│ │ ├─ variant_0: string #22 +│ │ ├─ variant_1: struct #25 +│ │ │ └─ [equals]: string #22 +│ │ ├─ variant_2: struct #26 +│ │ │ └─ [not]: string #22 +│ │ ├─ variant_3: struct #27 +│ │ │ └─ [in]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_4: struct #28 +│ │ │ └─ [notIn]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_5: struct #31 +│ │ │ ├─ [contains]: string #22 +│ │ │ └─ [mode]: optional #30 +│ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #32 +│ │ │ └─ [search]: string #22 +│ │ └─ variant_7: struct #33 +│ │ ├─ [startsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [endsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ variant_1: struct #35 +│ └─ [not]: union '_string_filter' #34 +│ ├─ variant_0: string #22 +│ ├─ variant_1: struct #25 +│ │ └─ [equals]: string #22 +│ ├─ variant_2: struct #26 +│ │ └─ [not]: string #22 +│ ├─ variant_3: struct #27 +│ │ └─ [in]: array #24 +│ │ └─ item: string #22 +│ ├─ variant_4: struct #28 +│ │ └─ [notIn]: array #24 +│ │ └─ item: string #22 +│ ├─ variant_5: struct #31 +│ │ ├─ [contains]: string #22 +│ │ └─ [mode]: optional #30 +│ │ └─ item: string #29 enum{ '"insensitive"' } +│ ├─ variant_6: struct #32 +│ │ └─ [search]: string #22 +│ └─ variant_7: struct #33 +│ ├─ [startsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ [endsWith]: optional #23 +│ └─ item: string #22 +├─ [author]: optional '_72_UserWhere__skip_8_PostWhere?' #72 +│ └─ item: struct 'UserWhere__skip_8_PostWhere' #71 +│ ├─ [id]: optional '_60__integer_filter_c?' #60 +│ │ └─ item: optional '_integer_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: either '_integer_filter' #17 +│ │ │ ├─ variant_0: integer #9 +│ │ │ ├─ variant_1: struct #12 +│ │ │ │ └─ [equals]: integer #9 +│ │ │ ├─ variant_2: struct #13 +│ │ │ │ └─ [not]: integer #9 +│ │ │ ├─ variant_3: struct #14 +│ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ [gte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ variant_4: struct #15 +│ │ │ │ └─ [in]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_5: struct #16 +│ │ │ └─ [notIn]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: either '_integer_filter' #17 +│ │ ├─ variant_0: integer #9 +│ │ ├─ variant_1: struct #12 +│ │ │ └─ [equals]: integer #9 +│ │ ├─ variant_2: struct #13 +│ │ │ └─ [not]: integer #9 +│ │ ├─ variant_3: struct #14 +│ │ │ ├─ [lt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [gt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [lte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ [gte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ variant_4: struct #15 +│ │ │ └─ [in]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_5: struct #16 +│ │ └─ [notIn]: array #11 +│ │ └─ item: integer #9 +│ ├─ [name]: optional '_61__string_filter_c?' #61 +│ │ └─ item: optional '_string_filter_c' #37 +│ │ └─ item: union #36 +│ │ ├─ variant_0: union '_string_filter' #34 +│ │ │ ├─ variant_0: string #22 +│ │ │ ├─ variant_1: struct #25 +│ │ │ │ └─ [equals]: string #22 +│ │ │ ├─ variant_2: struct #26 +│ │ │ │ └─ [not]: string #22 +│ │ │ ├─ variant_3: struct #27 +│ │ │ │ └─ [in]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_4: struct #28 +│ │ │ │ └─ [notIn]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_5: struct #31 +│ │ │ │ ├─ [contains]: string #22 +│ │ │ │ └─ [mode]: optional #30 +│ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #32 +│ │ │ │ └─ [search]: string #22 +│ │ │ └─ variant_7: struct #33 +│ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ [endsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ variant_1: struct #35 +│ │ └─ [not]: union '_string_filter' #34 +│ │ ├─ variant_0: string #22 +│ │ ├─ variant_1: struct #25 +│ │ │ └─ [equals]: string #22 +│ │ ├─ variant_2: struct #26 +│ │ │ └─ [not]: string #22 +│ │ ├─ variant_3: struct #27 +│ │ │ └─ [in]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_4: struct #28 +│ │ │ └─ [notIn]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_5: struct #31 +│ │ │ ├─ [contains]: string #22 +│ │ │ └─ [mode]: optional #30 +│ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #32 +│ │ │ └─ [search]: string #22 +│ │ └─ variant_7: struct #33 +│ │ ├─ [startsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [endsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ [posts]: optional #70 +│ └─ item: union #69 +│ ├─ variant_0: struct #64 +│ │ └─ [every]: optional '_63_PostWhere?' #63 +│ │ └─ item: &PostWhere #62 +│ ├─ variant_1: struct #66 +│ │ └─ [some]: optional '_65_PostWhere?' #65 +│ │ └─ item: &PostWhere #62 +│ └─ variant_2: struct #68 +│ └─ [none]: optional '_67_PostWhere?' #67 +│ └─ item: &PostWhere #62 +├─ [AND]: optional '_76__75_QueryPostWhereInput[]?' #76 +│ └─ item: array '_75_QueryPostWhereInput[]' #75 +│ └─ item: &QueryPostWhereInput #74 +├─ [OR]: optional '_76__75_QueryPostWhereInput[]?' #76 +│ └─ item: array '_75_QueryPostWhereInput[]' #75 +│ └─ item: &QueryPostWhereInput #74 +└─ [NOT]: optional '_77_QueryPostWhereInput?' #77 + └─ item: &QueryPostWhereInput #74 + diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__User__QueryWhereExpr.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__User__QueryWhereExpr.snap new file mode 100644 index 0000000000..264526ff06 --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__query_where_expr__tests__User__QueryWhereExpr.snap @@ -0,0 +1,415 @@ +--- +source: typegraph/core/src/runtimes/prisma/type_generation/query_where_expr.rs +expression: "tree::print(user_where_expr)" +--- +root: struct 'QueryUserWhereInput' #57 +├─ [id]: optional '_21__integer_filter_c?' #21 +│ └─ item: optional '_integer_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: either '_integer_filter' #17 +│ │ ├─ variant_0: integer #9 +│ │ ├─ variant_1: struct #12 +│ │ │ └─ [equals]: integer #9 +│ │ ├─ variant_2: struct #13 +│ │ │ └─ [not]: integer #9 +│ │ ├─ variant_3: struct #14 +│ │ │ ├─ [lt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [gt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [lte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ [gte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ variant_4: struct #15 +│ │ │ └─ [in]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_5: struct #16 +│ │ └─ [notIn]: array #11 +│ │ └─ item: integer #9 +│ └─ variant_1: struct #18 +│ └─ [not]: either '_integer_filter' #17 +│ ├─ variant_0: integer #9 +│ ├─ variant_1: struct #12 +│ │ └─ [equals]: integer #9 +│ ├─ variant_2: struct #13 +│ │ └─ [not]: integer #9 +│ ├─ variant_3: struct #14 +│ │ ├─ [lt]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ [gt]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ [lte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ └─ [gte]: optional #10 +│ │ └─ item: integer #9 +│ ├─ variant_4: struct #15 +│ │ └─ [in]: array #11 +│ │ └─ item: integer #9 +│ └─ variant_5: struct #16 +│ └─ [notIn]: array #11 +│ └─ item: integer #9 +├─ [name]: optional '_38__string_filter_c?' #38 +│ └─ item: optional '_string_filter_c' #37 +│ └─ item: union #36 +│ ├─ variant_0: union '_string_filter' #34 +│ │ ├─ variant_0: string #22 +│ │ ├─ variant_1: struct #25 +│ │ │ └─ [equals]: string #22 +│ │ ├─ variant_2: struct #26 +│ │ │ └─ [not]: string #22 +│ │ ├─ variant_3: struct #27 +│ │ │ └─ [in]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_4: struct #28 +│ │ │ └─ [notIn]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_5: struct #31 +│ │ │ ├─ [contains]: string #22 +│ │ │ └─ [mode]: optional #30 +│ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #32 +│ │ │ └─ [search]: string #22 +│ │ └─ variant_7: struct #33 +│ │ ├─ [startsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [endsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ variant_1: struct #35 +│ └─ [not]: union '_string_filter' #34 +│ ├─ variant_0: string #22 +│ ├─ variant_1: struct #25 +│ │ └─ [equals]: string #22 +│ ├─ variant_2: struct #26 +│ │ └─ [not]: string #22 +│ ├─ variant_3: struct #27 +│ │ └─ [in]: array #24 +│ │ └─ item: string #22 +│ ├─ variant_4: struct #28 +│ │ └─ [notIn]: array #24 +│ │ └─ item: string #22 +│ ├─ variant_5: struct #31 +│ │ ├─ [contains]: string #22 +│ │ └─ [mode]: optional #30 +│ │ └─ item: string #29 enum{ '"insensitive"' } +│ ├─ variant_6: struct #32 +│ │ └─ [search]: string #22 +│ └─ variant_7: struct #33 +│ ├─ [startsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ [endsWith]: optional #23 +│ └─ item: string #22 +├─ [posts]: optional #51 +│ └─ item: union #50 +│ ├─ variant_0: struct #45 +│ │ └─ [every]: optional '_44_PostWhere__skip_4_UserWhere?' #44 +│ │ └─ item: struct 'PostWhere__skip_4_UserWhere' #43 +│ │ ├─ [id]: optional '_39__integer_filter_c?' #39 +│ │ │ └─ item: optional '_integer_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: either '_integer_filter' #17 +│ │ │ │ ├─ variant_0: integer #9 +│ │ │ │ ├─ variant_1: struct #12 +│ │ │ │ │ └─ [equals]: integer #9 +│ │ │ │ ├─ variant_2: struct #13 +│ │ │ │ │ └─ [not]: integer #9 +│ │ │ │ ├─ variant_3: struct #14 +│ │ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ └─ [gte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ variant_4: struct #15 +│ │ │ │ │ └─ [in]: array #11 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ variant_5: struct #16 +│ │ │ │ └─ [notIn]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: either '_integer_filter' #17 +│ │ │ ├─ variant_0: integer #9 +│ │ │ ├─ variant_1: struct #12 +│ │ │ │ └─ [equals]: integer #9 +│ │ │ ├─ variant_2: struct #13 +│ │ │ │ └─ [not]: integer #9 +│ │ │ ├─ variant_3: struct #14 +│ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ [gte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ variant_4: struct #15 +│ │ │ │ └─ [in]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_5: struct #16 +│ │ │ └─ [notIn]: array #11 +│ │ │ └─ item: integer #9 +│ │ ├─ [title]: optional '_40__string_filter_c?' #40 +│ │ │ └─ item: optional '_string_filter_c' #37 +│ │ │ └─ item: union #36 +│ │ │ ├─ variant_0: union '_string_filter' #34 +│ │ │ │ ├─ variant_0: string #22 +│ │ │ │ ├─ variant_1: struct #25 +│ │ │ │ │ └─ [equals]: string #22 +│ │ │ │ ├─ variant_2: struct #26 +│ │ │ │ │ └─ [not]: string #22 +│ │ │ │ ├─ variant_3: struct #27 +│ │ │ │ │ └─ [in]: array #24 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ ├─ variant_4: struct #28 +│ │ │ │ │ └─ [notIn]: array #24 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ ├─ variant_5: struct #31 +│ │ │ │ │ ├─ [contains]: string #22 +│ │ │ │ │ └─ [mode]: optional #30 +│ │ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #32 +│ │ │ │ │ └─ [search]: string #22 +│ │ │ │ └─ variant_7: struct #33 +│ │ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ └─ [endsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ variant_1: struct #35 +│ │ │ └─ [not]: union '_string_filter' #34 +│ │ │ ├─ variant_0: string #22 +│ │ │ ├─ variant_1: struct #25 +│ │ │ │ └─ [equals]: string #22 +│ │ │ ├─ variant_2: struct #26 +│ │ │ │ └─ [not]: string #22 +│ │ │ ├─ variant_3: struct #27 +│ │ │ │ └─ [in]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_4: struct #28 +│ │ │ │ └─ [notIn]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_5: struct #31 +│ │ │ │ ├─ [contains]: string #22 +│ │ │ │ └─ [mode]: optional #30 +│ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #32 +│ │ │ │ └─ [search]: string #22 +│ │ │ └─ variant_7: struct #33 +│ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ [endsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [author]: optional '_42_UserWhere?' #42 +│ │ └─ item: &UserWhere #41 +│ ├─ variant_1: struct #47 +│ │ └─ [some]: optional '_46_PostWhere__skip_4_UserWhere?' #46 +│ │ └─ item: struct 'PostWhere__skip_4_UserWhere' #43 +│ │ ├─ [id]: optional '_39__integer_filter_c?' #39 +│ │ │ └─ item: optional '_integer_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: either '_integer_filter' #17 +│ │ │ │ ├─ variant_0: integer #9 +│ │ │ │ ├─ variant_1: struct #12 +│ │ │ │ │ └─ [equals]: integer #9 +│ │ │ │ ├─ variant_2: struct #13 +│ │ │ │ │ └─ [not]: integer #9 +│ │ │ │ ├─ variant_3: struct #14 +│ │ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ │ └─ item: integer #9 +│ │ │ │ │ └─ [gte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ variant_4: struct #15 +│ │ │ │ │ └─ [in]: array #11 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ variant_5: struct #16 +│ │ │ │ └─ [notIn]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: either '_integer_filter' #17 +│ │ │ ├─ variant_0: integer #9 +│ │ │ ├─ variant_1: struct #12 +│ │ │ │ └─ [equals]: integer #9 +│ │ │ ├─ variant_2: struct #13 +│ │ │ │ └─ [not]: integer #9 +│ │ │ ├─ variant_3: struct #14 +│ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ [gte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ variant_4: struct #15 +│ │ │ │ └─ [in]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_5: struct #16 +│ │ │ └─ [notIn]: array #11 +│ │ │ └─ item: integer #9 +│ │ ├─ [title]: optional '_40__string_filter_c?' #40 +│ │ │ └─ item: optional '_string_filter_c' #37 +│ │ │ └─ item: union #36 +│ │ │ ├─ variant_0: union '_string_filter' #34 +│ │ │ │ ├─ variant_0: string #22 +│ │ │ │ ├─ variant_1: struct #25 +│ │ │ │ │ └─ [equals]: string #22 +│ │ │ │ ├─ variant_2: struct #26 +│ │ │ │ │ └─ [not]: string #22 +│ │ │ │ ├─ variant_3: struct #27 +│ │ │ │ │ └─ [in]: array #24 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ ├─ variant_4: struct #28 +│ │ │ │ │ └─ [notIn]: array #24 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ ├─ variant_5: struct #31 +│ │ │ │ │ ├─ [contains]: string #22 +│ │ │ │ │ └─ [mode]: optional #30 +│ │ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #32 +│ │ │ │ │ └─ [search]: string #22 +│ │ │ │ └─ variant_7: struct #33 +│ │ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ │ └─ item: string #22 +│ │ │ │ └─ [endsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ variant_1: struct #35 +│ │ │ └─ [not]: union '_string_filter' #34 +│ │ │ ├─ variant_0: string #22 +│ │ │ ├─ variant_1: struct #25 +│ │ │ │ └─ [equals]: string #22 +│ │ │ ├─ variant_2: struct #26 +│ │ │ │ └─ [not]: string #22 +│ │ │ ├─ variant_3: struct #27 +│ │ │ │ └─ [in]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_4: struct #28 +│ │ │ │ └─ [notIn]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_5: struct #31 +│ │ │ │ ├─ [contains]: string #22 +│ │ │ │ └─ [mode]: optional #30 +│ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #32 +│ │ │ │ └─ [search]: string #22 +│ │ │ └─ variant_7: struct #33 +│ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ [endsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [author]: optional '_42_UserWhere?' #42 +│ │ └─ item: &UserWhere #41 +│ └─ variant_2: struct #49 +│ └─ [none]: optional '_48_PostWhere__skip_4_UserWhere?' #48 +│ └─ item: struct 'PostWhere__skip_4_UserWhere' #43 +│ ├─ [id]: optional '_39__integer_filter_c?' #39 +│ │ └─ item: optional '_integer_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: either '_integer_filter' #17 +│ │ │ ├─ variant_0: integer #9 +│ │ │ ├─ variant_1: struct #12 +│ │ │ │ └─ [equals]: integer #9 +│ │ │ ├─ variant_2: struct #13 +│ │ │ │ └─ [not]: integer #9 +│ │ │ ├─ variant_3: struct #14 +│ │ │ │ ├─ [lt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [gt]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ ├─ [lte]: optional #10 +│ │ │ │ │ └─ item: integer #9 +│ │ │ │ └─ [gte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ variant_4: struct #15 +│ │ │ │ └─ [in]: array #11 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ variant_5: struct #16 +│ │ │ └─ [notIn]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: either '_integer_filter' #17 +│ │ ├─ variant_0: integer #9 +│ │ ├─ variant_1: struct #12 +│ │ │ └─ [equals]: integer #9 +│ │ ├─ variant_2: struct #13 +│ │ │ └─ [not]: integer #9 +│ │ ├─ variant_3: struct #14 +│ │ │ ├─ [lt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [gt]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ ├─ [lte]: optional #10 +│ │ │ │ └─ item: integer #9 +│ │ │ └─ [gte]: optional #10 +│ │ │ └─ item: integer #9 +│ │ ├─ variant_4: struct #15 +│ │ │ └─ [in]: array #11 +│ │ │ └─ item: integer #9 +│ │ └─ variant_5: struct #16 +│ │ └─ [notIn]: array #11 +│ │ └─ item: integer #9 +│ ├─ [title]: optional '_40__string_filter_c?' #40 +│ │ └─ item: optional '_string_filter_c' #37 +│ │ └─ item: union #36 +│ │ ├─ variant_0: union '_string_filter' #34 +│ │ │ ├─ variant_0: string #22 +│ │ │ ├─ variant_1: struct #25 +│ │ │ │ └─ [equals]: string #22 +│ │ │ ├─ variant_2: struct #26 +│ │ │ │ └─ [not]: string #22 +│ │ │ ├─ variant_3: struct #27 +│ │ │ │ └─ [in]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_4: struct #28 +│ │ │ │ └─ [notIn]: array #24 +│ │ │ │ └─ item: string #22 +│ │ │ ├─ variant_5: struct #31 +│ │ │ │ ├─ [contains]: string #22 +│ │ │ │ └─ [mode]: optional #30 +│ │ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #32 +│ │ │ │ └─ [search]: string #22 +│ │ │ └─ variant_7: struct #33 +│ │ │ ├─ [startsWith]: optional #23 +│ │ │ │ └─ item: string #22 +│ │ │ └─ [endsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ variant_1: struct #35 +│ │ └─ [not]: union '_string_filter' #34 +│ │ ├─ variant_0: string #22 +│ │ ├─ variant_1: struct #25 +│ │ │ └─ [equals]: string #22 +│ │ ├─ variant_2: struct #26 +│ │ │ └─ [not]: string #22 +│ │ ├─ variant_3: struct #27 +│ │ │ └─ [in]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_4: struct #28 +│ │ │ └─ [notIn]: array #24 +│ │ │ └─ item: string #22 +│ │ ├─ variant_5: struct #31 +│ │ │ ├─ [contains]: string #22 +│ │ │ └─ [mode]: optional #30 +│ │ │ └─ item: string #29 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #32 +│ │ │ └─ [search]: string #22 +│ │ └─ variant_7: struct #33 +│ │ ├─ [startsWith]: optional #23 +│ │ │ └─ item: string #22 +│ │ └─ [endsWith]: optional #23 +│ │ └─ item: string #22 +│ └─ [author]: optional '_42_UserWhere?' #42 +│ └─ item: &UserWhere #41 +├─ [AND]: optional '_55__54_QueryUserWhereInput[]?' #55 +│ └─ item: array '_54_QueryUserWhereInput[]' #54 +│ └─ item: &QueryUserWhereInput #53 +├─ [OR]: optional '_55__54_QueryUserWhereInput[]?' #55 +│ └─ item: array '_54_QueryUserWhereInput[]' #54 +│ └─ item: &QueryUserWhereInput #53 +└─ [NOT]: optional '_56_QueryUserWhereInput?' #56 + └─ item: &QueryUserWhereInput #53 + diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Post out.snap index 4928071196..c5b866843d 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Post out.snap @@ -1,27 +1,27 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: struct #173 -├─ [_count]: struct '_Post_AggrCount' #164 -│ ├─ [_all]: optional #163 -│ │ └─ item: integer #162 -│ ├─ [id]: optional #163 -│ │ └─ item: integer #162 -│ ├─ [title]: optional #163 -│ │ └─ item: integer #162 -│ └─ [author]: optional #163 -│ └─ item: integer #162 -├─ [_avg]: struct '_Post_NumberAgg_avg' #167 -│ └─ [id]: optional #166 -│ └─ item: float #165 -├─ [_sum]: struct '_Post_NumberAgg' #172 -│ └─ [id]: optional #171 -│ └─ item: integer #170 -├─ [_min]: struct '_Post_NumberAgg' #172 -│ └─ [id]: optional #171 -│ └─ item: integer #170 -└─ [_max]: struct '_Post_NumberAgg' #172 - └─ [id]: optional #171 - └─ item: integer #170 +root: struct #49 +├─ [_count]: struct '_Post_AggrCount' #40 +│ ├─ [_all]: optional #39 +│ │ └─ item: integer #38 +│ ├─ [id]: optional #39 +│ │ └─ item: integer #38 +│ ├─ [title]: optional #39 +│ │ └─ item: integer #38 +│ └─ [author]: optional #39 +│ └─ item: integer #38 +├─ [_avg]: struct '_Post_NumberAgg_avg' #43 +│ └─ [id]: optional #42 +│ └─ item: float #41 +├─ [_sum]: struct '_Post_NumberAgg' #48 +│ └─ [id]: optional #47 +│ └─ item: integer #46 +├─ [_min]: struct '_Post_NumberAgg' #48 +│ └─ [id]: optional #47 +│ └─ item: integer #46 +└─ [_max]: struct '_Post_NumberAgg' #48 + └─ [id]: optional #47 + └─ item: integer #46 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Record out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Record out.snap index 3b1f454465..2570926dfa 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Record out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate Record out.snap @@ -1,27 +1,27 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: struct #77 -├─ [_count]: struct '_Record_AggrCount' #68 -│ ├─ [_all]: optional #67 -│ │ └─ item: integer #66 -│ ├─ [id]: optional #67 -│ │ └─ item: integer #66 -│ ├─ [name]: optional #67 -│ │ └─ item: integer #66 -│ └─ [age]: optional #67 -│ └─ item: integer #66 -├─ [_avg]: struct '_Record_NumberAgg_avg' #71 -│ └─ [age]: optional #70 -│ └─ item: float #69 -├─ [_sum]: struct '_Record_NumberAgg' #76 -│ └─ [age]: optional #75 -│ └─ item: integer #74 -├─ [_min]: struct '_Record_NumberAgg' #76 -│ └─ [age]: optional #75 -│ └─ item: integer #74 -└─ [_max]: struct '_Record_NumberAgg' #76 - └─ [age]: optional #75 - └─ item: integer #74 +root: struct #16 +├─ [_count]: struct '_Record_AggrCount' #7 +│ ├─ [_all]: optional #6 +│ │ └─ item: integer #5 +│ ├─ [id]: optional #6 +│ │ └─ item: integer #5 +│ ├─ [name]: optional #6 +│ │ └─ item: integer #5 +│ └─ [age]: optional #6 +│ └─ item: integer #5 +├─ [_avg]: struct '_Record_NumberAgg_avg' #10 +│ └─ [age]: optional #9 +│ └─ item: float #8 +├─ [_sum]: struct '_Record_NumberAgg' #15 +│ └─ [age]: optional #14 +│ └─ item: integer #13 +├─ [_min]: struct '_Record_NumberAgg' #15 +│ └─ [age]: optional #14 +│ └─ item: integer #13 +└─ [_max]: struct '_Record_NumberAgg' #15 + └─ [age]: optional #14 + └─ item: integer #13 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate User out.snap index 2ab3e5c6f7..82f656b38a 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__aggregate User out.snap @@ -1,27 +1,27 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: struct #129 -├─ [_count]: struct '_User_AggrCount' #120 -│ ├─ [_all]: optional #119 -│ │ └─ item: integer #118 -│ ├─ [id]: optional #119 -│ │ └─ item: integer #118 -│ ├─ [name]: optional #119 -│ │ └─ item: integer #118 -│ └─ [posts]: optional #119 -│ └─ item: integer #118 -├─ [_avg]: struct '_User_NumberAgg_avg' #123 -│ └─ [id]: optional #122 -│ └─ item: float #121 -├─ [_sum]: struct '_User_NumberAgg' #128 -│ └─ [id]: optional #127 -│ └─ item: integer #126 -├─ [_min]: struct '_User_NumberAgg' #128 -│ └─ [id]: optional #127 -│ └─ item: integer #126 -└─ [_max]: struct '_User_NumberAgg' #128 - └─ [id]: optional #127 - └─ item: integer #126 +root: struct #37 +├─ [_count]: struct '_User_AggrCount' #28 +│ ├─ [_all]: optional #27 +│ │ └─ item: integer #26 +│ ├─ [id]: optional #27 +│ │ └─ item: integer #26 +│ ├─ [name]: optional #27 +│ │ └─ item: integer #26 +│ └─ [posts]: optional #27 +│ └─ item: integer #26 +├─ [_avg]: struct '_User_NumberAgg_avg' #31 +│ └─ [id]: optional #30 +│ └─ item: float #29 +├─ [_sum]: struct '_User_NumberAgg' #36 +│ └─ [id]: optional #35 +│ └─ item: integer #34 +├─ [_min]: struct '_User_NumberAgg' #36 +│ └─ [id]: optional #35 +│ └─ item: integer #34 +└─ [_max]: struct '_User_NumberAgg' #36 + └─ [id]: optional #35 + └─ item: integer #34 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post inp.snap index b401671285..2d40bef04a 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post inp.snap @@ -1,23 +1,826 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #48 -└─ [data]: array '_47__Post_CreateInput[]' #47 - └─ item: struct '_Post_CreateInput' #46 - ├─ [id]: optional #37 +root: struct #106 +└─ [data]: array '_105__Post_CreateInput[]' #105 + └─ item: struct '_Post_CreateInput' #104 + ├─ [id]: optional #81 │ └─ item: integer #16 ├─ [title]: string #17 - └─ [author]: optional #45 - └─ item: struct #44 - ├─ [create]: optional '_42__User_CreateInput_excluding___rel_Post_User_1?' #42 - │ └─ item: struct '_User_CreateInput_excluding___rel_Post_User_1' #38 - │ ├─ [id]: integer #11 - │ └─ [name]: string #12 - └─ [connect]: optional '_43_UserWhere_norel?' #43 - └─ item: struct 'UserWhere_norel' #41 - ├─ [id]: optional #39 - │ └─ item: integer #11 - └─ [name]: optional #40 - └─ item: string #12 + └─ [author]: union #103 + ├─ variant_0: struct #100 + │ └─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #82 + │ ├─ [id]: integer #11 + │ └─ [name]: string #12 + ├─ variant_1: struct #101 + │ └─ [connect]: struct 'UserWhere' #98 + │ ├─ [id]: optional '_83__integer_filter_c?' #83 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [name]: optional '_84__string_filter_c?' #84 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [posts]: optional #97 + │ └─ item: union #96 + │ ├─ variant_0: struct #91 + │ │ └─ [every]: optional '_90_PostWhere__skip_15_UserWhere?' #90 + │ │ └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + │ │ ├─ [id]: optional '_85__integer_filter_c?' #85 + │ │ │ └─ item: optional '_integer_filter_c' #33 + │ │ │ └─ item: union #32 + │ │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ │ ├─ variant_0: integer #22 + │ │ │ │ ├─ variant_1: struct #25 + │ │ │ │ │ └─ [equals]: integer #22 + │ │ │ │ ├─ variant_2: struct #26 + │ │ │ │ │ └─ [not]: integer #22 + │ │ │ │ ├─ variant_3: struct #27 + │ │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ variant_4: struct #28 + │ │ │ │ │ └─ [in]: array #24 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ variant_5: struct #29 + │ │ │ │ └─ [notIn]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_1: struct #31 + │ │ │ └─ [not]: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ ├─ [title]: optional '_86__string_filter_c?' #86 + │ │ │ └─ item: optional '_string_filter_c' #50 + │ │ │ └─ item: union #49 + │ │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ │ ├─ variant_0: string #35 + │ │ │ │ ├─ variant_1: struct #38 + │ │ │ │ │ └─ [equals]: string #35 + │ │ │ │ ├─ variant_2: struct #39 + │ │ │ │ │ └─ [not]: string #35 + │ │ │ │ ├─ variant_3: struct #40 + │ │ │ │ │ └─ [in]: array #37 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ ├─ variant_4: struct #41 + │ │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ ├─ variant_5: struct #44 + │ │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #45 + │ │ │ │ │ └─ [search]: string #35 + │ │ │ │ └─ variant_7: struct #46 + │ │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ └─ [endsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ variant_1: struct #48 + │ │ │ └─ [not]: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [author]: optional '_88_UserWhere?' #88 + │ │ └─ item: &UserWhere #87 + │ ├─ variant_1: struct #93 + │ │ └─ [some]: optional '_92_PostWhere__skip_15_UserWhere?' #92 + │ │ └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + │ │ ├─ [id]: optional '_85__integer_filter_c?' #85 + │ │ │ └─ item: optional '_integer_filter_c' #33 + │ │ │ └─ item: union #32 + │ │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ │ ├─ variant_0: integer #22 + │ │ │ │ ├─ variant_1: struct #25 + │ │ │ │ │ └─ [equals]: integer #22 + │ │ │ │ ├─ variant_2: struct #26 + │ │ │ │ │ └─ [not]: integer #22 + │ │ │ │ ├─ variant_3: struct #27 + │ │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ │ └─ item: integer #22 + │ │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ variant_4: struct #28 + │ │ │ │ │ └─ [in]: array #24 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ variant_5: struct #29 + │ │ │ │ └─ [notIn]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_1: struct #31 + │ │ │ └─ [not]: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ ├─ [title]: optional '_86__string_filter_c?' #86 + │ │ │ └─ item: optional '_string_filter_c' #50 + │ │ │ └─ item: union #49 + │ │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ │ ├─ variant_0: string #35 + │ │ │ │ ├─ variant_1: struct #38 + │ │ │ │ │ └─ [equals]: string #35 + │ │ │ │ ├─ variant_2: struct #39 + │ │ │ │ │ └─ [not]: string #35 + │ │ │ │ ├─ variant_3: struct #40 + │ │ │ │ │ └─ [in]: array #37 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ ├─ variant_4: struct #41 + │ │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ ├─ variant_5: struct #44 + │ │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #45 + │ │ │ │ │ └─ [search]: string #35 + │ │ │ │ └─ variant_7: struct #46 + │ │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ │ └─ item: string #35 + │ │ │ │ └─ [endsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ variant_1: struct #48 + │ │ │ └─ [not]: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [author]: optional '_88_UserWhere?' #88 + │ │ └─ item: &UserWhere #87 + │ └─ variant_2: struct #95 + │ └─ [none]: optional '_94_PostWhere__skip_15_UserWhere?' #94 + │ └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + │ ├─ [id]: optional '_85__integer_filter_c?' #85 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [title]: optional '_86__string_filter_c?' #86 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [author]: optional '_88_UserWhere?' #88 + │ └─ item: &UserWhere #87 + └─ variant_2: struct #102 + └─ [connectOrCreate]: struct #99 + ├─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #82 + │ ├─ [id]: integer #11 + │ └─ [name]: string #12 + └─ [where]: struct 'UserWhere' #98 + ├─ [id]: optional '_83__integer_filter_c?' #83 + │ └─ item: optional '_integer_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ └─ variant_1: struct #31 + │ └─ [not]: either '_integer_filter' #30 + │ ├─ variant_0: integer #22 + │ ├─ variant_1: struct #25 + │ │ └─ [equals]: integer #22 + │ ├─ variant_2: struct #26 + │ │ └─ [not]: integer #22 + │ ├─ variant_3: struct #27 + │ │ ├─ [lt]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ [gt]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ [lte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ └─ [gte]: optional #23 + │ │ └─ item: integer #22 + │ ├─ variant_4: struct #28 + │ │ └─ [in]: array #24 + │ │ └─ item: integer #22 + │ └─ variant_5: struct #29 + │ └─ [notIn]: array #24 + │ └─ item: integer #22 + ├─ [name]: optional '_84__string_filter_c?' #84 + │ └─ item: optional '_string_filter_c' #50 + │ └─ item: union #49 + │ ├─ variant_0: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ variant_1: struct #48 + │ └─ [not]: union '_string_filter' #47 + │ ├─ variant_0: string #35 + │ ├─ variant_1: struct #38 + │ │ └─ [equals]: string #35 + │ ├─ variant_2: struct #39 + │ │ └─ [not]: string #35 + │ ├─ variant_3: struct #40 + │ │ └─ [in]: array #37 + │ │ └─ item: string #35 + │ ├─ variant_4: struct #41 + │ │ └─ [notIn]: array #37 + │ │ └─ item: string #35 + │ ├─ variant_5: struct #44 + │ │ ├─ [contains]: string #35 + │ │ └─ [mode]: optional #43 + │ │ └─ item: string #42 enum{ '"insensitive"' } + │ ├─ variant_6: struct #45 + │ │ └─ [search]: string #35 + │ └─ variant_7: struct #46 + │ ├─ [startsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [endsWith]: optional #36 + │ └─ item: string #35 + └─ [posts]: optional #97 + └─ item: union #96 + ├─ variant_0: struct #91 + │ └─ [every]: optional '_90_PostWhere__skip_15_UserWhere?' #90 + │ └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + │ ├─ [id]: optional '_85__integer_filter_c?' #85 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [title]: optional '_86__string_filter_c?' #86 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [author]: optional '_88_UserWhere?' #88 + │ └─ item: &UserWhere #87 + ├─ variant_1: struct #93 + │ └─ [some]: optional '_92_PostWhere__skip_15_UserWhere?' #92 + │ └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + │ ├─ [id]: optional '_85__integer_filter_c?' #85 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [title]: optional '_86__string_filter_c?' #86 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [author]: optional '_88_UserWhere?' #88 + │ └─ item: &UserWhere #87 + └─ variant_2: struct #95 + └─ [none]: optional '_94_PostWhere__skip_15_UserWhere?' #94 + └─ item: struct 'PostWhere__skip_15_UserWhere' #89 + ├─ [id]: optional '_85__integer_filter_c?' #85 + │ └─ item: optional '_integer_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ └─ variant_1: struct #31 + │ └─ [not]: either '_integer_filter' #30 + │ ├─ variant_0: integer #22 + │ ├─ variant_1: struct #25 + │ │ └─ [equals]: integer #22 + │ ├─ variant_2: struct #26 + │ │ └─ [not]: integer #22 + │ ├─ variant_3: struct #27 + │ │ ├─ [lt]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ [gt]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ [lte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ └─ [gte]: optional #23 + │ │ └─ item: integer #22 + │ ├─ variant_4: struct #28 + │ │ └─ [in]: array #24 + │ │ └─ item: integer #22 + │ └─ variant_5: struct #29 + │ └─ [notIn]: array #24 + │ └─ item: integer #22 + ├─ [title]: optional '_86__string_filter_c?' #86 + │ └─ item: optional '_string_filter_c' #50 + │ └─ item: union #49 + │ ├─ variant_0: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ variant_1: struct #48 + │ └─ [not]: union '_string_filter' #47 + │ ├─ variant_0: string #35 + │ ├─ variant_1: struct #38 + │ │ └─ [equals]: string #35 + │ ├─ variant_2: struct #39 + │ │ └─ [not]: string #35 + │ ├─ variant_3: struct #40 + │ │ └─ [in]: array #37 + │ │ └─ item: string #35 + │ ├─ variant_4: struct #41 + │ │ └─ [notIn]: array #37 + │ │ └─ item: string #35 + │ ├─ variant_5: struct #44 + │ │ ├─ [contains]: string #35 + │ │ └─ [mode]: optional #43 + │ │ └─ item: string #42 enum{ '"insensitive"' } + │ ├─ variant_6: struct #45 + │ │ └─ [search]: string #35 + │ └─ variant_7: struct #46 + │ ├─ [startsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [endsWith]: optional #36 + │ └─ item: string #35 + └─ [author]: optional '_88_UserWhere?' #88 + └─ item: &UserWhere #87 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post out.snap index fd33eb4cf4..63f9774671 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many Post out.snap @@ -1,7 +1,7 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: struct #50 -└─ [count]: integer #49 +root: struct #108 +└─ [count]: integer #107 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User inp.snap index 387d8a9e3c..0359489e74 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User inp.snap @@ -1,30 +1,444 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #34 -└─ [data]: array '_33__User_CreateInput[]' #33 - └─ item: struct '_User_CreateInput' #32 +root: struct #78 +└─ [data]: array '_77__User_CreateInput[]' #77 + └─ item: struct '_User_CreateInput' #76 ├─ [id]: integer #11 ├─ [name]: string #12 - └─ [posts]: optional #31 - └─ item: struct #30 - ├─ [create]: optional '_25__Post_CreateInput_excluding___rel_Post_User_1?' #25 - │ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #21 + └─ [posts]: optional #75 + └─ item: union #74 + ├─ variant_0: struct #67 + │ └─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #21 │ ├─ [id]: optional #20 │ │ └─ item: integer #16 │ └─ [title]: string #17 - ├─ [connect]: optional '_26_PostWhere_norel?' #26 - │ └─ item: struct 'PostWhere_norel' #24 - │ ├─ [id]: optional #22 - │ │ └─ item: integer #16 - │ └─ [title]: optional #23 - │ └─ item: string #17 - └─ [createMany]: optional #29 - └─ item: struct #28 - └─ [data]: array '_27__Post_CreateInput_excluding___rel_Post_User_1[]' #27 - └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #21 - ├─ [id]: optional #20 - │ └─ item: integer #16 - └─ [title]: string #17 + ├─ variant_1: struct #68 + │ └─ [connect]: struct 'PostWhere' #65 + │ ├─ [id]: optional '_34__integer_filter_c?' #34 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [title]: optional '_51__string_filter_c?' #51 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [author]: optional '_64_UserWhere__skip_19_PostWhere?' #64 + │ └─ item: struct 'UserWhere__skip_19_PostWhere' #63 + │ ├─ [id]: optional '_52__integer_filter_c?' #52 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [name]: optional '_53__string_filter_c?' #53 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [posts]: optional #62 + │ └─ item: union #61 + │ ├─ variant_0: struct #56 + │ │ └─ [every]: optional '_55_PostWhere?' #55 + │ │ └─ item: &PostWhere #54 + │ ├─ variant_1: struct #58 + │ │ └─ [some]: optional '_57_PostWhere?' #57 + │ │ └─ item: &PostWhere #54 + │ └─ variant_2: struct #60 + │ └─ [none]: optional '_59_PostWhere?' #59 + │ └─ item: &PostWhere #54 + ├─ variant_2: struct #69 + │ └─ [connectOrCreate]: struct #66 + │ ├─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #21 + │ │ ├─ [id]: optional #20 + │ │ │ └─ item: integer #16 + │ │ └─ [title]: string #17 + │ └─ [where]: struct 'PostWhere' #65 + │ ├─ [id]: optional '_34__integer_filter_c?' #34 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [title]: optional '_51__string_filter_c?' #51 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [author]: optional '_64_UserWhere__skip_19_PostWhere?' #64 + │ └─ item: struct 'UserWhere__skip_19_PostWhere' #63 + │ ├─ [id]: optional '_52__integer_filter_c?' #52 + │ │ └─ item: optional '_integer_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: either '_integer_filter' #30 + │ │ │ ├─ variant_0: integer #22 + │ │ │ ├─ variant_1: struct #25 + │ │ │ │ └─ [equals]: integer #22 + │ │ │ ├─ variant_2: struct #26 + │ │ │ │ └─ [not]: integer #22 + │ │ │ ├─ variant_3: struct #27 + │ │ │ │ ├─ [lt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [gt]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ ├─ [lte]: optional #23 + │ │ │ │ │ └─ item: integer #22 + │ │ │ │ └─ [gte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ variant_4: struct #28 + │ │ │ │ └─ [in]: array #24 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ variant_5: struct #29 + │ │ │ └─ [notIn]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: either '_integer_filter' #30 + │ │ ├─ variant_0: integer #22 + │ │ ├─ variant_1: struct #25 + │ │ │ └─ [equals]: integer #22 + │ │ ├─ variant_2: struct #26 + │ │ │ └─ [not]: integer #22 + │ │ ├─ variant_3: struct #27 + │ │ │ ├─ [lt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [gt]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ ├─ [lte]: optional #23 + │ │ │ │ └─ item: integer #22 + │ │ │ └─ [gte]: optional #23 + │ │ │ └─ item: integer #22 + │ │ ├─ variant_4: struct #28 + │ │ │ └─ [in]: array #24 + │ │ │ └─ item: integer #22 + │ │ └─ variant_5: struct #29 + │ │ └─ [notIn]: array #24 + │ │ └─ item: integer #22 + │ ├─ [name]: optional '_53__string_filter_c?' #53 + │ │ └─ item: optional '_string_filter_c' #50 + │ │ └─ item: union #49 + │ │ ├─ variant_0: union '_string_filter' #47 + │ │ │ ├─ variant_0: string #35 + │ │ │ ├─ variant_1: struct #38 + │ │ │ │ └─ [equals]: string #35 + │ │ │ ├─ variant_2: struct #39 + │ │ │ │ └─ [not]: string #35 + │ │ │ ├─ variant_3: struct #40 + │ │ │ │ └─ [in]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_4: struct #41 + │ │ │ │ └─ [notIn]: array #37 + │ │ │ │ └─ item: string #35 + │ │ │ ├─ variant_5: struct #44 + │ │ │ │ ├─ [contains]: string #35 + │ │ │ │ └─ [mode]: optional #43 + │ │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #45 + │ │ │ │ └─ [search]: string #35 + │ │ │ └─ variant_7: struct #46 + │ │ │ ├─ [startsWith]: optional #36 + │ │ │ │ └─ item: string #35 + │ │ │ └─ [endsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ variant_1: struct #48 + │ │ └─ [not]: union '_string_filter' #47 + │ │ ├─ variant_0: string #35 + │ │ ├─ variant_1: struct #38 + │ │ │ └─ [equals]: string #35 + │ │ ├─ variant_2: struct #39 + │ │ │ └─ [not]: string #35 + │ │ ├─ variant_3: struct #40 + │ │ │ └─ [in]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_4: struct #41 + │ │ │ └─ [notIn]: array #37 + │ │ │ └─ item: string #35 + │ │ ├─ variant_5: struct #44 + │ │ │ ├─ [contains]: string #35 + │ │ │ └─ [mode]: optional #43 + │ │ │ └─ item: string #42 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #45 + │ │ │ └─ [search]: string #35 + │ │ └─ variant_7: struct #46 + │ │ ├─ [startsWith]: optional #36 + │ │ │ └─ item: string #35 + │ │ └─ [endsWith]: optional #36 + │ │ └─ item: string #35 + │ └─ [posts]: optional #62 + │ └─ item: union #61 + │ ├─ variant_0: struct #56 + │ │ └─ [every]: optional '_55_PostWhere?' #55 + │ │ └─ item: &PostWhere #54 + │ ├─ variant_1: struct #58 + │ │ └─ [some]: optional '_57_PostWhere?' #57 + │ │ └─ item: &PostWhere #54 + │ └─ variant_2: struct #60 + │ └─ [none]: optional '_59_PostWhere?' #59 + │ └─ item: &PostWhere #54 + └─ variant_3: struct #73 + └─ [createMany]: optional #72 + └─ item: struct #71 + └─ [data]: array '_70__Post_CreateInput_excluding___rel_Post_User_1[]' #70 + └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #21 + ├─ [id]: optional #20 + │ └─ item: integer #16 + └─ [title]: string #17 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User out.snap index a775ac0f95..40450af1bc 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_many User out.snap @@ -1,7 +1,7 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: struct #36 -└─ [count]: integer #35 +root: struct #80 +└─ [count]: integer #79 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one Post inp.snap index 3ece377f61..c27b98e188 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one Post inp.snap @@ -1,22 +1,825 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #45 -└─ [data]: struct '_Post_CreateInput' #44 - ├─ [id]: optional #35 - │ └─ item: integer #14 - ├─ [title]: string #15 - └─ [author]: optional #43 - └─ item: struct #42 - ├─ [create]: optional '_40__User_CreateInput_excluding___rel_Post_User_1?' #40 - │ └─ item: struct '_User_CreateInput_excluding___rel_Post_User_1' #36 - │ ├─ [id]: integer #9 - │ └─ [name]: string #10 - └─ [connect]: optional '_41_UserWhere_norel?' #41 - └─ item: struct 'UserWhere_norel' #39 - ├─ [id]: optional #37 - │ └─ item: integer #9 - └─ [name]: optional #38 - └─ item: string #10 +root: struct #99 +└─ [data]: struct '_Post_CreateInput' #98 + ├─ [id]: optional #75 + │ └─ item: integer #13 + ├─ [title]: string #14 + └─ [author]: union #97 + ├─ variant_0: struct #94 + │ └─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #76 + │ ├─ [id]: integer #8 + │ └─ [name]: string #9 + ├─ variant_1: struct #95 + │ └─ [connect]: struct 'UserWhere' #92 + │ ├─ [id]: optional '_77__integer_filter_c?' #77 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [name]: optional '_78__string_filter_c?' #78 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [posts]: optional #91 + │ └─ item: union #90 + │ ├─ variant_0: struct #85 + │ │ └─ [every]: optional '_84_PostWhere__skip_12_UserWhere?' #84 + │ │ └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + │ │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ │ └─ item: optional '_integer_filter_c' #30 + │ │ │ └─ item: union #29 + │ │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ │ ├─ variant_0: integer #19 + │ │ │ │ ├─ variant_1: struct #22 + │ │ │ │ │ └─ [equals]: integer #19 + │ │ │ │ ├─ variant_2: struct #23 + │ │ │ │ │ └─ [not]: integer #19 + │ │ │ │ ├─ variant_3: struct #24 + │ │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ variant_4: struct #25 + │ │ │ │ │ └─ [in]: array #21 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ variant_5: struct #26 + │ │ │ │ └─ [notIn]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_1: struct #28 + │ │ │ └─ [not]: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ ├─ [title]: optional '_80__string_filter_c?' #80 + │ │ │ └─ item: optional '_string_filter_c' #47 + │ │ │ └─ item: union #46 + │ │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ │ ├─ variant_0: string #32 + │ │ │ │ ├─ variant_1: struct #35 + │ │ │ │ │ └─ [equals]: string #32 + │ │ │ │ ├─ variant_2: struct #36 + │ │ │ │ │ └─ [not]: string #32 + │ │ │ │ ├─ variant_3: struct #37 + │ │ │ │ │ └─ [in]: array #34 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ ├─ variant_4: struct #38 + │ │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ ├─ variant_5: struct #41 + │ │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #42 + │ │ │ │ │ └─ [search]: string #32 + │ │ │ │ └─ variant_7: struct #43 + │ │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ └─ [endsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ variant_1: struct #45 + │ │ │ └─ [not]: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [author]: optional '_82_UserWhere?' #82 + │ │ └─ item: &UserWhere #81 + │ ├─ variant_1: struct #87 + │ │ └─ [some]: optional '_86_PostWhere__skip_12_UserWhere?' #86 + │ │ └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + │ │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ │ └─ item: optional '_integer_filter_c' #30 + │ │ │ └─ item: union #29 + │ │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ │ ├─ variant_0: integer #19 + │ │ │ │ ├─ variant_1: struct #22 + │ │ │ │ │ └─ [equals]: integer #19 + │ │ │ │ ├─ variant_2: struct #23 + │ │ │ │ │ └─ [not]: integer #19 + │ │ │ │ ├─ variant_3: struct #24 + │ │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ │ └─ item: integer #19 + │ │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ variant_4: struct #25 + │ │ │ │ │ └─ [in]: array #21 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ variant_5: struct #26 + │ │ │ │ └─ [notIn]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_1: struct #28 + │ │ │ └─ [not]: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ ├─ [title]: optional '_80__string_filter_c?' #80 + │ │ │ └─ item: optional '_string_filter_c' #47 + │ │ │ └─ item: union #46 + │ │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ │ ├─ variant_0: string #32 + │ │ │ │ ├─ variant_1: struct #35 + │ │ │ │ │ └─ [equals]: string #32 + │ │ │ │ ├─ variant_2: struct #36 + │ │ │ │ │ └─ [not]: string #32 + │ │ │ │ ├─ variant_3: struct #37 + │ │ │ │ │ └─ [in]: array #34 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ ├─ variant_4: struct #38 + │ │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ ├─ variant_5: struct #41 + │ │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #42 + │ │ │ │ │ └─ [search]: string #32 + │ │ │ │ └─ variant_7: struct #43 + │ │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ │ └─ item: string #32 + │ │ │ │ └─ [endsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ variant_1: struct #45 + │ │ │ └─ [not]: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [author]: optional '_82_UserWhere?' #82 + │ │ └─ item: &UserWhere #81 + │ └─ variant_2: struct #89 + │ └─ [none]: optional '_88_PostWhere__skip_12_UserWhere?' #88 + │ └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [title]: optional '_80__string_filter_c?' #80 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [author]: optional '_82_UserWhere?' #82 + │ └─ item: &UserWhere #81 + └─ variant_2: struct #96 + └─ [connectOrCreate]: struct #93 + ├─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #76 + │ ├─ [id]: integer #8 + │ └─ [name]: string #9 + └─ [where]: struct 'UserWhere' #92 + ├─ [id]: optional '_77__integer_filter_c?' #77 + │ └─ item: optional '_integer_filter_c' #30 + │ └─ item: union #29 + │ ├─ variant_0: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ └─ variant_1: struct #28 + │ └─ [not]: either '_integer_filter' #27 + │ ├─ variant_0: integer #19 + │ ├─ variant_1: struct #22 + │ │ └─ [equals]: integer #19 + │ ├─ variant_2: struct #23 + │ │ └─ [not]: integer #19 + │ ├─ variant_3: struct #24 + │ │ ├─ [lt]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ [gt]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ [lte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ └─ [gte]: optional #20 + │ │ └─ item: integer #19 + │ ├─ variant_4: struct #25 + │ │ └─ [in]: array #21 + │ │ └─ item: integer #19 + │ └─ variant_5: struct #26 + │ └─ [notIn]: array #21 + │ └─ item: integer #19 + ├─ [name]: optional '_78__string_filter_c?' #78 + │ └─ item: optional '_string_filter_c' #47 + │ └─ item: union #46 + │ ├─ variant_0: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ variant_1: struct #45 + │ └─ [not]: union '_string_filter' #44 + │ ├─ variant_0: string #32 + │ ├─ variant_1: struct #35 + │ │ └─ [equals]: string #32 + │ ├─ variant_2: struct #36 + │ │ └─ [not]: string #32 + │ ├─ variant_3: struct #37 + │ │ └─ [in]: array #34 + │ │ └─ item: string #32 + │ ├─ variant_4: struct #38 + │ │ └─ [notIn]: array #34 + │ │ └─ item: string #32 + │ ├─ variant_5: struct #41 + │ │ ├─ [contains]: string #32 + │ │ └─ [mode]: optional #40 + │ │ └─ item: string #39 enum{ '"insensitive"' } + │ ├─ variant_6: struct #42 + │ │ └─ [search]: string #32 + │ └─ variant_7: struct #43 + │ ├─ [startsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [endsWith]: optional #33 + │ └─ item: string #32 + └─ [posts]: optional #91 + └─ item: union #90 + ├─ variant_0: struct #85 + │ └─ [every]: optional '_84_PostWhere__skip_12_UserWhere?' #84 + │ └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [title]: optional '_80__string_filter_c?' #80 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [author]: optional '_82_UserWhere?' #82 + │ └─ item: &UserWhere #81 + ├─ variant_1: struct #87 + │ └─ [some]: optional '_86_PostWhere__skip_12_UserWhere?' #86 + │ └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [title]: optional '_80__string_filter_c?' #80 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [author]: optional '_82_UserWhere?' #82 + │ └─ item: &UserWhere #81 + └─ variant_2: struct #89 + └─ [none]: optional '_88_PostWhere__skip_12_UserWhere?' #88 + └─ item: struct 'PostWhere__skip_12_UserWhere' #83 + ├─ [id]: optional '_79__integer_filter_c?' #79 + │ └─ item: optional '_integer_filter_c' #30 + │ └─ item: union #29 + │ ├─ variant_0: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ └─ variant_1: struct #28 + │ └─ [not]: either '_integer_filter' #27 + │ ├─ variant_0: integer #19 + │ ├─ variant_1: struct #22 + │ │ └─ [equals]: integer #19 + │ ├─ variant_2: struct #23 + │ │ └─ [not]: integer #19 + │ ├─ variant_3: struct #24 + │ │ ├─ [lt]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ [gt]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ [lte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ └─ [gte]: optional #20 + │ │ └─ item: integer #19 + │ ├─ variant_4: struct #25 + │ │ └─ [in]: array #21 + │ │ └─ item: integer #19 + │ └─ variant_5: struct #26 + │ └─ [notIn]: array #21 + │ └─ item: integer #19 + ├─ [title]: optional '_80__string_filter_c?' #80 + │ └─ item: optional '_string_filter_c' #47 + │ └─ item: union #46 + │ ├─ variant_0: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ variant_1: struct #45 + │ └─ [not]: union '_string_filter' #44 + │ ├─ variant_0: string #32 + │ ├─ variant_1: struct #35 + │ │ └─ [equals]: string #32 + │ ├─ variant_2: struct #36 + │ │ └─ [not]: string #32 + │ ├─ variant_3: struct #37 + │ │ └─ [in]: array #34 + │ │ └─ item: string #32 + │ ├─ variant_4: struct #38 + │ │ └─ [notIn]: array #34 + │ │ └─ item: string #32 + │ ├─ variant_5: struct #41 + │ │ ├─ [contains]: string #32 + │ │ └─ [mode]: optional #40 + │ │ └─ item: string #39 enum{ '"insensitive"' } + │ ├─ variant_6: struct #42 + │ │ └─ [search]: string #32 + │ └─ variant_7: struct #43 + │ ├─ [startsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [endsWith]: optional #33 + │ └─ item: string #32 + └─ [author]: optional '_82_UserWhere?' #82 + └─ item: &UserWhere #81 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one User inp.snap index c561e5cf93..56be1119b2 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__create_one User inp.snap @@ -1,29 +1,443 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #31 -└─ [data]: struct '_User_CreateInput' #30 - ├─ [id]: integer #9 - ├─ [name]: string #10 - └─ [posts]: optional #29 - └─ item: struct #28 - ├─ [create]: optional '_23__Post_CreateInput_excluding___rel_Post_User_1?' #23 - │ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #19 - │ ├─ [id]: optional #18 - │ │ └─ item: integer #14 - │ └─ [title]: string #15 - ├─ [connect]: optional '_24_PostWhere_norel?' #24 - │ └─ item: struct 'PostWhere_norel' #22 - │ ├─ [id]: optional #20 - │ │ └─ item: integer #14 - │ └─ [title]: optional #21 - │ └─ item: string #15 - └─ [createMany]: optional #27 - └─ item: struct #26 - └─ [data]: array '_25__Post_CreateInput_excluding___rel_Post_User_1[]' #25 - └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #19 - ├─ [id]: optional #18 - │ └─ item: integer #14 - └─ [title]: string #15 +root: struct #74 +└─ [data]: struct '_User_CreateInput' #73 + ├─ [id]: integer #8 + ├─ [name]: string #9 + └─ [posts]: optional #72 + └─ item: union #71 + ├─ variant_0: struct #64 + │ └─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #18 + │ ├─ [id]: optional #17 + │ │ └─ item: integer #13 + │ └─ [title]: string #14 + ├─ variant_1: struct #65 + │ └─ [connect]: struct 'PostWhere' #62 + │ ├─ [id]: optional '_31__integer_filter_c?' #31 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [title]: optional '_48__string_filter_c?' #48 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [author]: optional '_61_UserWhere__skip_16_PostWhere?' #61 + │ └─ item: struct 'UserWhere__skip_16_PostWhere' #60 + │ ├─ [id]: optional '_49__integer_filter_c?' #49 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [name]: optional '_50__string_filter_c?' #50 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [posts]: optional #59 + │ └─ item: union #58 + │ ├─ variant_0: struct #53 + │ │ └─ [every]: optional '_52_PostWhere?' #52 + │ │ └─ item: &PostWhere #51 + │ ├─ variant_1: struct #55 + │ │ └─ [some]: optional '_54_PostWhere?' #54 + │ │ └─ item: &PostWhere #51 + │ └─ variant_2: struct #57 + │ └─ [none]: optional '_56_PostWhere?' #56 + │ └─ item: &PostWhere #51 + ├─ variant_2: struct #66 + │ └─ [connectOrCreate]: struct #63 + │ ├─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #18 + │ │ ├─ [id]: optional #17 + │ │ │ └─ item: integer #13 + │ │ └─ [title]: string #14 + │ └─ [where]: struct 'PostWhere' #62 + │ ├─ [id]: optional '_31__integer_filter_c?' #31 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [title]: optional '_48__string_filter_c?' #48 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [author]: optional '_61_UserWhere__skip_16_PostWhere?' #61 + │ └─ item: struct 'UserWhere__skip_16_PostWhere' #60 + │ ├─ [id]: optional '_49__integer_filter_c?' #49 + │ │ └─ item: optional '_integer_filter_c' #30 + │ │ └─ item: union #29 + │ │ ├─ variant_0: either '_integer_filter' #27 + │ │ │ ├─ variant_0: integer #19 + │ │ │ ├─ variant_1: struct #22 + │ │ │ │ └─ [equals]: integer #19 + │ │ │ ├─ variant_2: struct #23 + │ │ │ │ └─ [not]: integer #19 + │ │ │ ├─ variant_3: struct #24 + │ │ │ │ ├─ [lt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [gt]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ ├─ [lte]: optional #20 + │ │ │ │ │ └─ item: integer #19 + │ │ │ │ └─ [gte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ variant_4: struct #25 + │ │ │ │ └─ [in]: array #21 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ variant_5: struct #26 + │ │ │ └─ [notIn]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_1: struct #28 + │ │ └─ [not]: either '_integer_filter' #27 + │ │ ├─ variant_0: integer #19 + │ │ ├─ variant_1: struct #22 + │ │ │ └─ [equals]: integer #19 + │ │ ├─ variant_2: struct #23 + │ │ │ └─ [not]: integer #19 + │ │ ├─ variant_3: struct #24 + │ │ │ ├─ [lt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [gt]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ ├─ [lte]: optional #20 + │ │ │ │ └─ item: integer #19 + │ │ │ └─ [gte]: optional #20 + │ │ │ └─ item: integer #19 + │ │ ├─ variant_4: struct #25 + │ │ │ └─ [in]: array #21 + │ │ │ └─ item: integer #19 + │ │ └─ variant_5: struct #26 + │ │ └─ [notIn]: array #21 + │ │ └─ item: integer #19 + │ ├─ [name]: optional '_50__string_filter_c?' #50 + │ │ └─ item: optional '_string_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: union '_string_filter' #44 + │ │ │ ├─ variant_0: string #32 + │ │ │ ├─ variant_1: struct #35 + │ │ │ │ └─ [equals]: string #32 + │ │ │ ├─ variant_2: struct #36 + │ │ │ │ └─ [not]: string #32 + │ │ │ ├─ variant_3: struct #37 + │ │ │ │ └─ [in]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_4: struct #38 + │ │ │ │ └─ [notIn]: array #34 + │ │ │ │ └─ item: string #32 + │ │ │ ├─ variant_5: struct #41 + │ │ │ │ ├─ [contains]: string #32 + │ │ │ │ └─ [mode]: optional #40 + │ │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #42 + │ │ │ │ └─ [search]: string #32 + │ │ │ └─ variant_7: struct #43 + │ │ │ ├─ [startsWith]: optional #33 + │ │ │ │ └─ item: string #32 + │ │ │ └─ [endsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: union '_string_filter' #44 + │ │ ├─ variant_0: string #32 + │ │ ├─ variant_1: struct #35 + │ │ │ └─ [equals]: string #32 + │ │ ├─ variant_2: struct #36 + │ │ │ └─ [not]: string #32 + │ │ ├─ variant_3: struct #37 + │ │ │ └─ [in]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_4: struct #38 + │ │ │ └─ [notIn]: array #34 + │ │ │ └─ item: string #32 + │ │ ├─ variant_5: struct #41 + │ │ │ ├─ [contains]: string #32 + │ │ │ └─ [mode]: optional #40 + │ │ │ └─ item: string #39 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #42 + │ │ │ └─ [search]: string #32 + │ │ └─ variant_7: struct #43 + │ │ ├─ [startsWith]: optional #33 + │ │ │ └─ item: string #32 + │ │ └─ [endsWith]: optional #33 + │ │ └─ item: string #32 + │ └─ [posts]: optional #59 + │ └─ item: union #58 + │ ├─ variant_0: struct #53 + │ │ └─ [every]: optional '_52_PostWhere?' #52 + │ │ └─ item: &PostWhere #51 + │ ├─ variant_1: struct #55 + │ │ └─ [some]: optional '_54_PostWhere?' #54 + │ │ └─ item: &PostWhere #51 + │ └─ variant_2: struct #57 + │ └─ [none]: optional '_56_PostWhere?' #56 + │ └─ item: &PostWhere #51 + └─ variant_3: struct #70 + └─ [createMany]: optional #69 + └─ item: struct #68 + └─ [data]: array '_67__Post_CreateInput_excluding___rel_Post_User_1[]' #67 + └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #18 + ├─ [id]: optional #17 + │ └─ item: integer #13 + └─ [title]: string #14 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Post out.snap index dd608c86de..310002f53c 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Post out.snap @@ -1,12 +1,12 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: optional '_146__PostOutputType?' #146 -└─ item: struct '_PostOutputType' #145 - ├─ [id]: integer #73 - ├─ [title]: string #74 - └─ [author]: struct '_UserOutputType_excluding___rel_Post_User_1' #144 - ├─ [id]: integer #68 - └─ [name]: string #69 +root: optional '_22__PostOutputType?' #22 +└─ item: struct '_PostOutputType' #21 + ├─ [id]: integer #12 + ├─ [title]: string #13 + └─ [author]: struct '_UserOutputType_excluding___rel_Post_User_1' #20 + ├─ [id]: integer #7 + └─ [name]: string #8 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Record out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Record out.snap index 8fe89dce4e..cd47fbec2a 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Record out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first Record out.snap @@ -1,9 +1,9 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: optional '_67__RecordOutputType?' #67 -└─ item: struct '_RecordOutputType' #66 +root: optional '_6__RecordOutputType?' #6 +└─ item: struct '_RecordOutputType' #5 ├─ [id]: string #0 ├─ [name]: string #1 └─ [age]: optional #3 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first User out.snap index e8fd261725..2429a40750 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_first User out.snap @@ -1,13 +1,13 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: optional '_111__UserOutputType?' #111 -└─ item: struct '_UserOutputType' #110 - ├─ [id]: integer #68 - ├─ [name]: string #69 - └─ [posts]: array '_109__PostOutputType_excluding___rel_Post_User_1[]' #109 - └─ item: struct '_PostOutputType_excluding___rel_Post_User_1' #108 - ├─ [id]: integer #73 - └─ [title]: string #74 +root: optional '_19__UserOutputType?' #19 +└─ item: struct '_UserOutputType' #18 + ├─ [id]: integer #7 + ├─ [name]: string #8 + └─ [posts]: array '_17__PostOutputType_excluding___rel_Post_User_1[]' #17 + └─ item: struct '_PostOutputType_excluding___rel_Post_User_1' #16 + ├─ [id]: integer #12 + └─ [title]: string #13 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post inp.snap index bdec39ce8c..5fdcf3aa0c 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post inp.snap @@ -1,204 +1,215 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- root: struct '_Post_QueryInput' #146 ├─ [where]: optional '_134_QueryPostWhereInput?' #134 │ └─ item: struct 'QueryPostWhereInput' #133 -│ ├─ [id]: optional '_122__integer_filter_c?' #122 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 -│ ├─ [title]: optional '_123__string_filter_c?' #123 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [author]: optional '_127__72WithFilters_norel?' #127 -│ │ └─ item: struct '_72WithFilters_norel' #126 -│ │ ├─ [id]: optional '_124__integer_filter_c?' #124 -│ │ │ └─ item: optional '_integer_filter_c' #38 -│ │ │ └─ item: union #37 -│ │ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ │ ├─ variant_0: integer #27 -│ │ │ │ ├─ variant_1: struct #30 -│ │ │ │ │ └─ [equals]: integer #27 -│ │ │ │ ├─ variant_2: struct #31 -│ │ │ │ │ └─ [not]: integer #27 -│ │ │ │ ├─ variant_3: struct #32 -│ │ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ └─ [gte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ variant_4: struct #33 -│ │ │ │ │ └─ [in]: array #29 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ variant_5: struct #34 -│ │ │ │ └─ [notIn]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_1: struct #36 -│ │ │ └─ [not]: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ [name]: optional '_125__string_filter_c?' #125 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 +│ ├─ [id]: optional '_113__integer_filter_c?' #113 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ ├─ [title]: optional '_114__string_filter_c?' #114 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [author]: optional '_127_UserWhere__skip_72_PostWhere?' #127 +│ │ └─ item: struct 'UserWhere__skip_72_PostWhere' #126 +│ │ ├─ [id]: optional '_115__integer_filter_c?' #115 +│ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ └─ item: union #33 +│ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_1: struct #32 +│ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ ├─ [name]: optional '_116__string_filter_c?' #116 +│ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [posts]: optional #125 +│ │ └─ item: union #124 +│ │ ├─ variant_0: struct #119 +│ │ │ └─ [every]: optional '_118_PostWhere?' #118 +│ │ │ └─ item: &PostWhere #117 +│ │ ├─ variant_1: struct #121 +│ │ │ └─ [some]: optional '_120_PostWhere?' #120 +│ │ │ └─ item: &PostWhere #117 +│ │ └─ variant_2: struct #123 +│ │ └─ [none]: optional '_122_PostWhere?' #122 +│ │ └─ item: &PostWhere #117 │ ├─ [AND]: optional '_131__130_QueryPostWhereInput[]?' #131 │ │ └─ item: array '_130_QueryPostWhereInput[]' #130 │ │ └─ item: &QueryPostWhereInput #129 @@ -210,33 +221,33 @@ root: struct '_Post_QueryInput' #146 ├─ [orderBy]: optional '_140__Post_OrderBy?' #140 │ └─ item: array '_Post_OrderBy' #139 │ └─ item: struct #138 -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [title]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [title]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } │ └─ [author]: optional '_137__User_OrderBy_excluding___rel_Post_User_1?' #137 │ └─ item: array '_User_OrderBy_excluding___rel_Post_User_1' #136 │ └─ item: struct #135 -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [name]: optional '_Sort' #51 -│ └─ item: union #50 -│ ├─ variant_0: struct #49 -│ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [name]: optional '_Sort' #47 +│ └─ item: union #46 +│ ├─ variant_0: struct #45 +│ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } ├─ [take]: optional '_141__Take?' #141 -│ └─ item: integer '_Take' #58 +│ └─ item: integer '_Take' #54 ├─ [skip]: optional '_142__Skip?' #142 -│ └─ item: integer '_Skip' #60 +│ └─ item: integer '_Skip' #56 └─ [distinct]: optional '_145__KeysOf_Post?' #145 └─ item: array '_KeysOf_Post' #144 └─ item: string #143 enum{ '"id"', '"title"', '"author"' } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post out.snap index 3ecee3bb64..c7cd624255 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Post out.snap @@ -1,14 +1,14 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- root: array '_148_PostWithNestedCount[]' #148 └─ item: struct 'PostWithNestedCount' #147 - ├─ [id]: integer #73 - ├─ [title]: string #74 - └─ [author]: struct 'User' #72 - ├─ [id]: integer #68 - ├─ [name]: string #69 - └─ [posts]: array '_71_Post[]' #71 - └─ item: &Post #70 + ├─ [id]: integer #69 + ├─ [title]: string #70 + └─ [author]: struct 'User' #68 + ├─ [id]: integer #64 + ├─ [name]: string #65 + └─ [posts]: array '_67_Post[]' #67 + └─ item: &Post #66 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record inp.snap index 1b25517497..64a05d430e 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record inp.snap @@ -1,188 +1,188 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct '_Record_QueryInput' #65 -├─ [where]: optional '_46_QueryRecordWhereInput?' #46 -│ └─ item: struct 'QueryRecordWhereInput' #45 -│ ├─ [id]: optional '_25__string_filter_c?' #25 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [name]: optional '_26__string_filter_c?' #26 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [age]: optional '_39__integer_filter_c?' #39 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 -│ ├─ [AND]: optional '_43__42_QueryRecordWhereInput[]?' #43 -│ │ └─ item: array '_42_QueryRecordWhereInput[]' #42 -│ │ └─ item: &QueryRecordWhereInput #41 -│ ├─ [OR]: optional '_43__42_QueryRecordWhereInput[]?' #43 -│ │ └─ item: array '_42_QueryRecordWhereInput[]' #42 -│ │ └─ item: &QueryRecordWhereInput #41 -│ └─ [NOT]: optional '_44_QueryRecordWhereInput?' #44 -│ └─ item: &QueryRecordWhereInput #41 -├─ [orderBy]: optional '_57__Record_OrderBy?' #57 -│ └─ item: array '_Record_OrderBy' #56 -│ └─ item: struct #55 -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [name]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [age]: optional '_Sort_nullable' #54 -│ └─ item: union #53 -│ ├─ variant_0: struct #52 -│ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -├─ [take]: optional '_59__Take?' #59 -│ └─ item: integer '_Take' #58 -├─ [skip]: optional '_61__Skip?' #61 -│ └─ item: integer '_Skip' #60 -└─ [distinct]: optional '_64__KeysOf_Record?' #64 - └─ item: array '_KeysOf_Record' #63 - └─ item: string #62 enum{ '"id"', '"name"', '"age"' } +root: struct '_Record_QueryInput' #61 +├─ [where]: optional '_42_QueryRecordWhereInput?' #42 +│ └─ item: struct 'QueryRecordWhereInput' #41 +│ ├─ [id]: optional '_21__string_filter_c?' #21 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [name]: optional '_22__string_filter_c?' #22 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [age]: optional '_35__integer_filter_c?' #35 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ ├─ [AND]: optional '_39__38_QueryRecordWhereInput[]?' #39 +│ │ └─ item: array '_38_QueryRecordWhereInput[]' #38 +│ │ └─ item: &QueryRecordWhereInput #37 +│ ├─ [OR]: optional '_39__38_QueryRecordWhereInput[]?' #39 +│ │ └─ item: array '_38_QueryRecordWhereInput[]' #38 +│ │ └─ item: &QueryRecordWhereInput #37 +│ └─ [NOT]: optional '_40_QueryRecordWhereInput?' #40 +│ └─ item: &QueryRecordWhereInput #37 +├─ [orderBy]: optional '_53__Record_OrderBy?' #53 +│ └─ item: array '_Record_OrderBy' #52 +│ └─ item: struct #51 +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [name]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [age]: optional '_Sort_nullable' #50 +│ └─ item: union #49 +│ ├─ variant_0: struct #48 +│ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +├─ [take]: optional '_55__Take?' #55 +│ └─ item: integer '_Take' #54 +├─ [skip]: optional '_57__Skip?' #57 +│ └─ item: integer '_Skip' #56 +└─ [distinct]: optional '_60__KeysOf_Record?' #60 + └─ item: array '_KeysOf_Record' #59 + └─ item: string #58 enum{ '"id"', '"name"', '"age"' } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record out.snap index d6922c9a9b..6bd45a922e 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many Record out.snap @@ -1,9 +1,9 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: array '_67_RecordWithNestedCount[]' #67 -└─ item: struct 'RecordWithNestedCount' #66 +root: array '_63_RecordWithNestedCount[]' #63 +└─ item: struct 'RecordWithNestedCount' #62 ├─ [id]: string #0 ├─ [name]: string #1 └─ [age]: optional #3 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User inp.snap index 4108f798ab..4486449e7f 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User inp.snap @@ -1,257 +1,464 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct '_User_QueryInput' #107 -├─ [where]: optional '_96_QueryUserWhereInput?' #96 -│ └─ item: struct 'QueryUserWhereInput' #95 -│ ├─ [id]: optional '_84__integer_filter_c?' #84 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 -│ ├─ [name]: optional '_85__string_filter_c?' #85 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [posts]: optional '_89__76WithFilters_norel?' #89 -│ │ └─ item: struct '_76WithFilters_norel' #88 -│ │ ├─ [id]: optional '_86__integer_filter_c?' #86 -│ │ │ └─ item: optional '_integer_filter_c' #38 -│ │ │ └─ item: union #37 -│ │ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ │ ├─ variant_0: integer #27 -│ │ │ │ ├─ variant_1: struct #30 -│ │ │ │ │ └─ [equals]: integer #27 -│ │ │ │ ├─ variant_2: struct #31 -│ │ │ │ │ └─ [not]: integer #27 -│ │ │ │ ├─ variant_3: struct #32 -│ │ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ └─ [gte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ variant_4: struct #33 -│ │ │ │ │ └─ [in]: array #29 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ variant_5: struct #34 -│ │ │ │ └─ [notIn]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_1: struct #36 -│ │ │ └─ [not]: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ [title]: optional '_87__string_filter_c?' #87 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [AND]: optional '_93__92_QueryUserWhereInput[]?' #93 -│ │ └─ item: array '_92_QueryUserWhereInput[]' #92 -│ │ └─ item: &QueryUserWhereInput #91 -│ ├─ [OR]: optional '_93__92_QueryUserWhereInput[]?' #93 -│ │ └─ item: array '_92_QueryUserWhereInput[]' #92 -│ │ └─ item: &QueryUserWhereInput #91 -│ └─ [NOT]: optional '_94_QueryUserWhereInput?' #94 -│ └─ item: &QueryUserWhereInput #91 -├─ [orderBy]: optional '_101__User_OrderBy?' #101 -│ └─ item: array '_User_OrderBy' #100 -│ └─ item: struct #99 -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [name]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [posts]: optional '_SortByAggregates' #98 -│ └─ item: struct #97 -│ ├─ [_count]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_avg]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_sum]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_min]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [_max]: optional '_Sort' #51 -│ └─ item: union #50 -│ ├─ variant_0: struct #49 -│ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -├─ [take]: optional '_102__Take?' #102 -│ └─ item: integer '_Take' #58 -├─ [skip]: optional '_103__Skip?' #103 -│ └─ item: integer '_Skip' #60 -└─ [distinct]: optional '_106__KeysOf_User?' #106 - └─ item: array '_KeysOf_User' #105 - └─ item: string #104 enum{ '"id"', '"name"', '"posts"' } +root: struct '_User_QueryInput' #105 +├─ [where]: optional '_94_QueryUserWhereInput?' #94 +│ └─ item: struct 'QueryUserWhereInput' #93 +│ ├─ [id]: optional '_73__integer_filter_c?' #73 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ ├─ [name]: optional '_74__string_filter_c?' #74 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [posts]: optional #87 +│ │ └─ item: union #86 +│ │ ├─ variant_0: struct #81 +│ │ │ └─ [every]: optional '_80_PostWhere__skip_68_UserWhere?' #80 +│ │ │ └─ item: struct 'PostWhere__skip_68_UserWhere' #79 +│ │ │ ├─ [id]: optional '_75__integer_filter_c?' #75 +│ │ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ │ └─ item: union #33 +│ │ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ variant_5: struct #30 +│ │ │ │ │ └─ [notIn]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_1: struct #32 +│ │ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [title]: optional '_76__string_filter_c?' #76 +│ │ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ │ └─ item: union #19 +│ │ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ │ ├─ variant_0: string #5 +│ │ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ │ └─ [not]: string #5 +│ │ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ │ └─ [search]: string #5 +│ │ │ │ │ └─ variant_7: struct #16 +│ │ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ variant_1: struct #18 +│ │ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [author]: optional '_78_UserWhere?' #78 +│ │ │ └─ item: &UserWhere #77 +│ │ ├─ variant_1: struct #83 +│ │ │ └─ [some]: optional '_82_PostWhere__skip_68_UserWhere?' #82 +│ │ │ └─ item: struct 'PostWhere__skip_68_UserWhere' #79 +│ │ │ ├─ [id]: optional '_75__integer_filter_c?' #75 +│ │ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ │ └─ item: union #33 +│ │ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ variant_5: struct #30 +│ │ │ │ │ └─ [notIn]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_1: struct #32 +│ │ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [title]: optional '_76__string_filter_c?' #76 +│ │ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ │ └─ item: union #19 +│ │ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ │ ├─ variant_0: string #5 +│ │ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ │ └─ [not]: string #5 +│ │ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ │ └─ [search]: string #5 +│ │ │ │ │ └─ variant_7: struct #16 +│ │ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ variant_1: struct #18 +│ │ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [author]: optional '_78_UserWhere?' #78 +│ │ │ └─ item: &UserWhere #77 +│ │ └─ variant_2: struct #85 +│ │ └─ [none]: optional '_84_PostWhere__skip_68_UserWhere?' #84 +│ │ └─ item: struct 'PostWhere__skip_68_UserWhere' #79 +│ │ ├─ [id]: optional '_75__integer_filter_c?' #75 +│ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ └─ item: union #33 +│ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_1: struct #32 +│ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ ├─ [title]: optional '_76__string_filter_c?' #76 +│ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [author]: optional '_78_UserWhere?' #78 +│ │ └─ item: &UserWhere #77 +│ ├─ [AND]: optional '_91__90_QueryUserWhereInput[]?' #91 +│ │ └─ item: array '_90_QueryUserWhereInput[]' #90 +│ │ └─ item: &QueryUserWhereInput #89 +│ ├─ [OR]: optional '_91__90_QueryUserWhereInput[]?' #91 +│ │ └─ item: array '_90_QueryUserWhereInput[]' #90 +│ │ └─ item: &QueryUserWhereInput #89 +│ └─ [NOT]: optional '_92_QueryUserWhereInput?' #92 +│ └─ item: &QueryUserWhereInput #89 +├─ [orderBy]: optional '_99__User_OrderBy?' #99 +│ └─ item: array '_User_OrderBy' #98 +│ └─ item: struct #97 +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [name]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [posts]: optional '_SortByAggregates' #96 +│ └─ item: struct #95 +│ ├─ [_count]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_avg]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_sum]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_min]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [_max]: optional '_Sort' #47 +│ └─ item: union #46 +│ ├─ variant_0: struct #45 +│ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +├─ [take]: optional '_100__Take?' #100 +│ └─ item: integer '_Take' #54 +├─ [skip]: optional '_101__Skip?' #101 +│ └─ item: integer '_Skip' #56 +└─ [distinct]: optional '_104__KeysOf_User?' #104 + └─ item: array '_KeysOf_User' #103 + └─ item: string #102 enum{ '"id"', '"name"', '"posts"' } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User out.snap index bd72120dd0..86c542832d 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_many User out.snap @@ -1,16 +1,16 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: array '_114_UserWithNestedCount[]' #114 -└─ item: struct 'UserWithNestedCount' #113 - ├─ [id]: integer #68 - ├─ [name]: string #69 - ├─ [posts]: array '_109_PostWithNestedCount_excluding___rel_Post_User_1[]' #109 - │ └─ item: struct 'PostWithNestedCount_excluding___rel_Post_User_1' #108 - │ ├─ [id]: integer #73 - │ └─ [title]: string #74 - └─ [_count]: struct #112 - └─ [posts]: optional '_Count' #111 - └─ item: integer #110 +root: array '_112_UserWithNestedCount[]' #112 +└─ item: struct 'UserWithNestedCount' #111 + ├─ [id]: integer #64 + ├─ [name]: string #65 + ├─ [posts]: array '_107_PostWithNestedCount_excluding___rel_Post_User_1[]' #107 + │ └─ item: struct 'PostWithNestedCount_excluding___rel_Post_User_1' #106 + │ ├─ [id]: integer #69 + │ └─ [title]: string #70 + └─ [_count]: struct #110 + └─ [posts]: optional '_Count' #109 + └─ item: integer #108 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post inp.snap index 0fd631bd75..12738b05a0 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post inp.snap @@ -1,6 +1,6 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- root: struct #34 └─ [where]: optional '_33_QueryUniquePostWhereInput?' #33 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post out.snap index 9eaa890e4a..8f0b946f1f 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Post out.snap @@ -1,6 +1,6 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- root: optional '_36_PostWithNestedCount?' #36 └─ item: struct 'PostWithNestedCount' #35 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Record out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Record out.snap index 3c23f021ce..db2d89dff1 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Record out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique Record out.snap @@ -1,6 +1,6 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- root: optional '_10_RecordWithNestedCount?' #10 └─ item: struct 'RecordWithNestedCount' #9 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique User out.snap index 0f10ae8193..d34a327a5e 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__find_unique User out.snap @@ -1,6 +1,6 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- root: optional '_30_UserWithNestedCount?' #30 └─ item: struct 'UserWithNestedCount' #29 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post inp.snap index 45e017777b..d80b148a20 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post inp.snap @@ -1,616 +1,958 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct '_Post_QueryInput_group_by' #231 -├─ [where]: optional '_204_QueryPostWhereInput?' #204 -│ └─ item: struct 'QueryPostWhereInput' #203 +root: struct '_Post_QueryInput_group_by' #253 +├─ [where]: optional '_213_QueryPostWhereInput?' #213 +│ └─ item: struct 'QueryPostWhereInput' #212 │ ├─ [id]: optional '_192__integer_filter_c?' #192 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 │ ├─ [title]: optional '_193__string_filter_c?' #193 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [author]: optional '_197__121WithFilters_norel?' #197 -│ │ └─ item: struct '_121WithFilters_norel' #196 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [author]: optional '_206_UserWhere__skip_117_PostWhere?' #206 +│ │ └─ item: struct 'UserWhere__skip_117_PostWhere' #205 │ │ ├─ [id]: optional '_194__integer_filter_c?' #194 -│ │ │ └─ item: optional '_integer_filter_c' #38 -│ │ │ └─ item: union #37 -│ │ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ │ ├─ variant_0: integer #27 -│ │ │ │ ├─ variant_1: struct #30 -│ │ │ │ │ └─ [equals]: integer #27 -│ │ │ │ ├─ variant_2: struct #31 -│ │ │ │ │ └─ [not]: integer #27 -│ │ │ │ ├─ variant_3: struct #32 -│ │ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ └─ [gte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ variant_4: struct #33 -│ │ │ │ │ └─ [in]: array #29 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ variant_5: struct #34 -│ │ │ │ └─ [notIn]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_1: struct #36 -│ │ │ └─ [not]: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ [name]: optional '_195__string_filter_c?' #195 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [AND]: optional '_201__200_QueryPostWhereInput[]?' #201 -│ │ └─ item: array '_200_QueryPostWhereInput[]' #200 -│ │ └─ item: &QueryPostWhereInput #199 -│ ├─ [OR]: optional '_201__200_QueryPostWhereInput[]?' #201 -│ │ └─ item: array '_200_QueryPostWhereInput[]' #200 -│ │ └─ item: &QueryPostWhereInput #199 -│ └─ [NOT]: optional '_202_QueryPostWhereInput?' #202 -│ └─ item: &QueryPostWhereInput #199 -├─ [orderBy]: optional '_215__Post_OrderBy_with_aggregates?' #215 -│ └─ item: array '_Post_OrderBy_with_aggregates' #214 -│ └─ item: struct #213 -│ ├─ [_count]: optional #206 -│ │ └─ item: struct #205 -│ │ ├─ [id]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ ├─ [title]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ [author]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_avg]: optional #208 -│ │ └─ item: struct #207 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_sum]: optional #208 -│ │ └─ item: struct #207 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_min]: optional #208 -│ │ └─ item: struct #207 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_max]: optional #208 -│ │ └─ item: struct #207 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [title]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [author]: optional '_212__User_OrderBy_excluding___rel_Post_User_1?' #212 -│ └─ item: array '_User_OrderBy_excluding___rel_Post_User_1' #211 -│ └─ item: struct #210 -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [name]: optional '_Sort' #51 -│ └─ item: union #50 -│ ├─ variant_0: struct #49 -│ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -├─ [take]: optional '_216__Take?' #216 -│ └─ item: integer '_Take' #63 -├─ [skip]: optional '_217__Skip?' #217 -│ └─ item: integer '_Skip' #65 -├─ [by]: array '_Post_GroupingFields' #219 -│ └─ item: string #218 enum{ '"id"', '"title"' } -└─ [having]: optional '_230__Post_Having?' #230 - └─ item: union '_Post_Having' #229 - ├─ variant_0: struct '_130WithFilters_norel_with_aggregates' #222 - │ ├─ [id]: optional '_220__integer_filter_with_aggregates_c?' #220 - │ │ └─ item: optional '_integer_filter_with_aggregates_c' #92 - │ │ └─ item: union #91 - │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #89 - │ │ │ ├─ variant_0: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_1: struct #84 - │ │ │ │ └─ [_count]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_2: struct #85 - │ │ │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_3: struct #86 - │ │ │ │ └─ [_avg]: either '_float_filter' #83 - │ │ │ │ ├─ variant_0: float #75 - │ │ │ │ ├─ variant_1: struct #78 - │ │ │ │ │ └─ [equals]: float #75 - │ │ │ │ ├─ variant_2: struct #79 - │ │ │ │ │ └─ [not]: float #75 - │ │ │ │ ├─ variant_3: struct #80 - │ │ │ │ │ ├─ [lt]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ ├─ [gt]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ ├─ [lte]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ └─ [gte]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ variant_4: struct #81 - │ │ │ │ │ └─ [in]: array #77 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ └─ variant_5: struct #82 - │ │ │ │ └─ [notIn]: array #77 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ variant_4: struct #87 - │ │ │ │ └─ [_min]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #88 - │ │ │ └─ [_max]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_1: struct #90 - │ │ └─ [not]: union '_integer_filter_with_aggregates' #89 - │ │ ├─ variant_0: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_1: struct #84 - │ │ │ └─ [_count]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_2: struct #85 - │ │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_3: struct #86 - │ │ │ └─ [_avg]: either '_float_filter' #83 - │ │ │ ├─ variant_0: float #75 - │ │ │ ├─ variant_1: struct #78 - │ │ │ │ └─ [equals]: float #75 - │ │ │ ├─ variant_2: struct #79 - │ │ │ │ └─ [not]: float #75 - │ │ │ ├─ variant_3: struct #80 - │ │ │ │ ├─ [lt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [gt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [lte]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ └─ [gte]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ variant_4: struct #81 - │ │ │ │ └─ [in]: array #77 - │ │ │ │ └─ item: float #75 - │ │ │ └─ variant_5: struct #82 - │ │ │ └─ [notIn]: array #77 - │ │ │ └─ item: float #75 - │ │ ├─ variant_4: struct #87 - │ │ │ └─ [_min]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #88 - │ │ └─ [_max]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ └─ [title]: optional '_221__string_filter_c?' #221 - │ └─ item: optional '_string_filter_c' #24 - │ └─ item: union #23 - │ ├─ variant_0: union '_string_filter' #21 - │ │ ├─ variant_0: string #9 - │ │ ├─ variant_1: struct #12 - │ │ │ └─ [equals]: string #9 - │ │ ├─ variant_2: struct #13 - │ │ │ └─ [not]: string #9 - │ │ ├─ variant_3: struct #14 - │ │ │ └─ [in]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_4: struct #15 - │ │ │ └─ [notIn]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_5: struct #18 - │ │ │ ├─ [contains]: string #9 - │ │ │ └─ [mode]: optional #17 - │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #19 - │ │ │ └─ [search]: string #9 - │ │ └─ variant_7: struct #20 - │ │ ├─ [startsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ [endsWith]: optional #10 - │ │ └─ item: string #9 - │ └─ variant_1: struct #22 - │ └─ [not]: union '_string_filter' #21 - │ ├─ variant_0: string #9 - │ ├─ variant_1: struct #12 - │ │ └─ [equals]: string #9 - │ ├─ variant_2: struct #13 - │ │ └─ [not]: string #9 - │ ├─ variant_3: struct #14 - │ │ └─ [in]: array #11 - │ │ └─ item: string #9 - │ ├─ variant_4: struct #15 - │ │ └─ [notIn]: array #11 - │ │ └─ item: string #9 - │ ├─ variant_5: struct #18 - │ │ ├─ [contains]: string #9 - │ │ └─ [mode]: optional #17 - │ │ └─ item: string #16 enum{ '"insensitive"' } - │ ├─ variant_6: struct #19 - │ │ └─ [search]: string #9 - │ └─ variant_7: struct #20 - │ ├─ [startsWith]: optional #10 - │ │ └─ item: string #9 - │ └─ [endsWith]: optional #10 - │ └─ item: string #9 - ├─ variant_1: struct #225 - │ └─ [AND]: array '_224__Post_Having[]' #224 - │ └─ item: &_Post_Having #223 - ├─ variant_2: struct #227 - │ └─ [OR]: array '_226__Post_Having[]' #226 - │ └─ item: &_Post_Having #223 - └─ variant_3: struct #228 - └─ [NOT]: &_Post_Having #223 +│ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ └─ item: union #33 +│ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_1: struct #32 +│ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ ├─ [name]: optional '_195__string_filter_c?' #195 +│ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [posts]: optional #204 +│ │ └─ item: union #203 +│ │ ├─ variant_0: struct #198 +│ │ │ └─ [every]: optional '_197_PostWhere?' #197 +│ │ │ └─ item: &PostWhere #196 +│ │ ├─ variant_1: struct #200 +│ │ │ └─ [some]: optional '_199_PostWhere?' #199 +│ │ │ └─ item: &PostWhere #196 +│ │ └─ variant_2: struct #202 +│ │ └─ [none]: optional '_201_PostWhere?' #201 +│ │ └─ item: &PostWhere #196 +│ ├─ [AND]: optional '_210__209_QueryPostWhereInput[]?' #210 +│ │ └─ item: array '_209_QueryPostWhereInput[]' #209 +│ │ └─ item: &QueryPostWhereInput #208 +│ ├─ [OR]: optional '_210__209_QueryPostWhereInput[]?' #210 +│ │ └─ item: array '_209_QueryPostWhereInput[]' #209 +│ │ └─ item: &QueryPostWhereInput #208 +│ └─ [NOT]: optional '_211_QueryPostWhereInput?' #211 +│ └─ item: &QueryPostWhereInput #208 +├─ [orderBy]: optional '_224__Post_OrderBy_with_aggregates?' #224 +│ └─ item: array '_Post_OrderBy_with_aggregates' #223 +│ └─ item: struct #222 +│ ├─ [_count]: optional #215 +│ │ └─ item: struct #214 +│ │ ├─ [id]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ ├─ [title]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ [author]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_avg]: optional #217 +│ │ └─ item: struct #216 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_sum]: optional #217 +│ │ └─ item: struct #216 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_min]: optional #217 +│ │ └─ item: struct #216 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_max]: optional #217 +│ │ └─ item: struct #216 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [title]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [author]: optional '_221__User_OrderBy_excluding___rel_Post_User_1?' #221 +│ └─ item: array '_User_OrderBy_excluding___rel_Post_User_1' #220 +│ └─ item: struct #219 +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [name]: optional '_Sort' #47 +│ └─ item: union #46 +│ ├─ variant_0: struct #45 +│ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +├─ [take]: optional '_225__Take?' #225 +│ └─ item: integer '_Take' #59 +├─ [skip]: optional '_226__Skip?' #226 +│ └─ item: integer '_Skip' #61 +├─ [by]: array '_Post_GroupingFields' #228 +│ └─ item: string #227 enum{ '"id"', '"title"' } +└─ [having]: optional '_252__Post_Having?' #252 + └─ item: union '_Post_Having' #251 + ├─ variant_0: struct 'PostWhere__agg' #244 + │ ├─ [id]: optional '_229__integer_filter_with_aggregates_c?' #229 + │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ └─ item: union #83 + │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #82 + │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_1: struct #76 + │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_2: struct #77 + │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_3: struct #78 + │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ ├─ variant_0: float #67 + │ │ │ ├─ variant_1: struct #70 + │ │ │ │ └─ [equals]: float #67 + │ │ │ ├─ variant_2: struct #71 + │ │ │ │ └─ [not]: float #67 + │ │ │ ├─ variant_3: struct #72 + │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #73 + │ │ │ │ └─ [in]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ └─ variant_5: struct #74 + │ │ │ └─ [notIn]: array #69 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #79 + │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #80 + │ │ └─ [_max]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [title]: optional '_230__string_filter_c?' #230 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [author]: optional '_243_UserWhere__agg__skip_117_PostWhere__agg?' #243 + │ └─ item: struct 'UserWhere__agg__skip_117_PostWhere__agg' #242 + │ ├─ [id]: optional '_231__integer_filter_with_aggregates_c?' #231 + │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ └─ item: union #83 + │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #82 + │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_1: struct #76 + │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_2: struct #77 + │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_3: struct #78 + │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ ├─ variant_0: float #67 + │ │ │ ├─ variant_1: struct #70 + │ │ │ │ └─ [equals]: float #67 + │ │ │ ├─ variant_2: struct #71 + │ │ │ │ └─ [not]: float #67 + │ │ │ ├─ variant_3: struct #72 + │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #73 + │ │ │ │ └─ [in]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ └─ variant_5: struct #74 + │ │ │ └─ [notIn]: array #69 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #79 + │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #80 + │ │ └─ [_max]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [name]: optional '_232__string_filter_c?' #232 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [posts]: optional #241 + │ └─ item: union #240 + │ ├─ variant_0: struct #235 + │ │ └─ [every]: optional '_234_PostWhere__agg?' #234 + │ │ └─ item: &PostWhere__agg #233 + │ ├─ variant_1: struct #237 + │ │ └─ [some]: optional '_236_PostWhere__agg?' #236 + │ │ └─ item: &PostWhere__agg #233 + │ └─ variant_2: struct #239 + │ └─ [none]: optional '_238_PostWhere__agg?' #238 + │ └─ item: &PostWhere__agg #233 + ├─ variant_1: struct #247 + │ └─ [AND]: array '_246__Post_Having[]' #246 + │ └─ item: &_Post_Having #245 + ├─ variant_2: struct #249 + │ └─ [OR]: array '_248__Post_Having[]' #248 + │ └─ item: &_Post_Having #245 + └─ variant_3: struct #250 + └─ [NOT]: &_Post_Having #245 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post out.snap index e00ca21324..0866a78884 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Post out.snap @@ -1,31 +1,31 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: array '_Post_GroupByResult' #244 -└─ item: struct #243 - ├─ [id]: integer #122 - ├─ [title]: string #123 - ├─ [author]: &User #124 - ├─ [_count]: struct '_Post_AggrCount' #234 - │ ├─ [_all]: optional #233 - │ │ └─ item: integer #232 - │ ├─ [id]: optional #233 - │ │ └─ item: integer #232 - │ ├─ [title]: optional #233 - │ │ └─ item: integer #232 - │ └─ [author]: optional #233 - │ └─ item: integer #232 - ├─ [_avg]: struct '_Post_SelectNumbers__1' #237 - │ └─ [id]: optional #236 - │ └─ item: float #235 - ├─ [_sum]: struct '_Post_SelectNumbers_' #242 - │ └─ [id]: optional #241 - │ └─ item: integer #240 - ├─ [_min]: struct '_Post_SelectNumbers_' #242 - │ └─ [id]: optional #241 - │ └─ item: integer #240 - └─ [_max]: struct '_Post_SelectNumbers_' #242 - └─ [id]: optional #241 - └─ item: integer #240 +root: array '_Post_GroupByResult' #266 +└─ item: struct #265 + ├─ [id]: integer #114 + ├─ [title]: string #115 + ├─ [author]: &User #116 + ├─ [_count]: struct '_Post_AggrCount' #256 + │ ├─ [_all]: optional #255 + │ │ └─ item: integer #254 + │ ├─ [id]: optional #255 + │ │ └─ item: integer #254 + │ ├─ [title]: optional #255 + │ │ └─ item: integer #254 + │ └─ [author]: optional #255 + │ └─ item: integer #254 + ├─ [_avg]: struct '_Post_SelectNumbers__1' #259 + │ └─ [id]: optional #258 + │ └─ item: float #257 + ├─ [_sum]: struct '_Post_SelectNumbers_' #264 + │ └─ [id]: optional #263 + │ └─ item: integer #262 + ├─ [_min]: struct '_Post_SelectNumbers_' #264 + │ └─ [id]: optional #263 + │ └─ item: integer #262 + └─ [_max]: struct '_Post_SelectNumbers_' #264 + └─ [id]: optional #263 + └─ item: integer #262 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record inp.snap index f602d13a90..49af92434d 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record inp.snap @@ -1,616 +1,616 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct '_Record_QueryInput_group_by' #103 -├─ [where]: optional '_46_QueryRecordWhereInput?' #46 -│ └─ item: struct 'QueryRecordWhereInput' #45 -│ ├─ [id]: optional '_25__string_filter_c?' #25 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [name]: optional '_26__string_filter_c?' #26 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [age]: optional '_39__integer_filter_c?' #39 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 -│ ├─ [AND]: optional '_43__42_QueryRecordWhereInput[]?' #43 -│ │ └─ item: array '_42_QueryRecordWhereInput[]' #42 -│ │ └─ item: &QueryRecordWhereInput #41 -│ ├─ [OR]: optional '_43__42_QueryRecordWhereInput[]?' #43 -│ │ └─ item: array '_42_QueryRecordWhereInput[]' #42 -│ │ └─ item: &QueryRecordWhereInput #41 -│ └─ [NOT]: optional '_44_QueryRecordWhereInput?' #44 -│ └─ item: &QueryRecordWhereInput #41 -├─ [orderBy]: optional '_62__Record_OrderBy_with_aggregates?' #62 -│ └─ item: array '_Record_OrderBy_with_aggregates' #61 -│ └─ item: struct #60 -│ ├─ [_count]: optional #56 -│ │ └─ item: struct #55 -│ │ ├─ [id]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ ├─ [name]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ [age]: optional '_Sort_nullable' #54 -│ │ └─ item: union #53 -│ │ ├─ variant_0: struct #52 -│ │ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_avg]: optional #58 -│ │ └─ item: struct #57 -│ │ └─ [age]: optional '_Sort_nullable' #54 -│ │ └─ item: union #53 -│ │ ├─ variant_0: struct #52 -│ │ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_sum]: optional #58 -│ │ └─ item: struct #57 -│ │ └─ [age]: optional '_Sort_nullable' #54 -│ │ └─ item: union #53 -│ │ ├─ variant_0: struct #52 -│ │ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_min]: optional #58 -│ │ └─ item: struct #57 -│ │ └─ [age]: optional '_Sort_nullable' #54 -│ │ └─ item: union #53 -│ │ ├─ variant_0: struct #52 -│ │ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_max]: optional #58 -│ │ └─ item: struct #57 -│ │ └─ [age]: optional '_Sort_nullable' #54 -│ │ └─ item: union #53 -│ │ ├─ variant_0: struct #52 -│ │ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [name]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [age]: optional '_Sort_nullable' #54 -│ └─ item: union #53 -│ ├─ variant_0: struct #52 -│ │ ├─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ [nulls]: string '_NullsOrder' #48 enum{ '"first"', '"last"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -├─ [take]: optional '_64__Take?' #64 -│ └─ item: integer '_Take' #63 -├─ [skip]: optional '_66__Skip?' #66 -│ └─ item: integer '_Skip' #65 -├─ [by]: array '_Record_GroupingFields' #68 -│ └─ item: string #67 enum{ '"id"', '"name"', '"age"' } -└─ [having]: optional '_102__Record_Having?' #102 - └─ item: union '_Record_Having' #101 - ├─ variant_0: struct '_72WithFilters_norel_with_aggregates' #94 - │ ├─ [id]: optional '_73__string_filter_c?' #73 - │ │ └─ item: optional '_string_filter_c' #24 - │ │ └─ item: union #23 - │ │ ├─ variant_0: union '_string_filter' #21 - │ │ │ ├─ variant_0: string #9 - │ │ │ ├─ variant_1: struct #12 - │ │ │ │ └─ [equals]: string #9 - │ │ │ ├─ variant_2: struct #13 - │ │ │ │ └─ [not]: string #9 - │ │ │ ├─ variant_3: struct #14 - │ │ │ │ └─ [in]: array #11 - │ │ │ │ └─ item: string #9 - │ │ │ ├─ variant_4: struct #15 - │ │ │ │ └─ [notIn]: array #11 - │ │ │ │ └─ item: string #9 - │ │ │ ├─ variant_5: struct #18 - │ │ │ │ ├─ [contains]: string #9 - │ │ │ │ └─ [mode]: optional #17 - │ │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ │ ├─ variant_6: struct #19 - │ │ │ │ └─ [search]: string #9 - │ │ │ └─ variant_7: struct #20 - │ │ │ ├─ [startsWith]: optional #10 - │ │ │ │ └─ item: string #9 - │ │ │ └─ [endsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ variant_1: struct #22 - │ │ └─ [not]: union '_string_filter' #21 - │ │ ├─ variant_0: string #9 - │ │ ├─ variant_1: struct #12 - │ │ │ └─ [equals]: string #9 - │ │ ├─ variant_2: struct #13 - │ │ │ └─ [not]: string #9 - │ │ ├─ variant_3: struct #14 - │ │ │ └─ [in]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_4: struct #15 - │ │ │ └─ [notIn]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_5: struct #18 - │ │ │ ├─ [contains]: string #9 - │ │ │ └─ [mode]: optional #17 - │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #19 - │ │ │ └─ [search]: string #9 - │ │ └─ variant_7: struct #20 - │ │ ├─ [startsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ [endsWith]: optional #10 - │ │ └─ item: string #9 - │ ├─ [name]: optional '_74__string_filter_c?' #74 - │ │ └─ item: optional '_string_filter_c' #24 - │ │ └─ item: union #23 - │ │ ├─ variant_0: union '_string_filter' #21 - │ │ │ ├─ variant_0: string #9 - │ │ │ ├─ variant_1: struct #12 - │ │ │ │ └─ [equals]: string #9 - │ │ │ ├─ variant_2: struct #13 - │ │ │ │ └─ [not]: string #9 - │ │ │ ├─ variant_3: struct #14 - │ │ │ │ └─ [in]: array #11 - │ │ │ │ └─ item: string #9 - │ │ │ ├─ variant_4: struct #15 - │ │ │ │ └─ [notIn]: array #11 - │ │ │ │ └─ item: string #9 - │ │ │ ├─ variant_5: struct #18 - │ │ │ │ ├─ [contains]: string #9 - │ │ │ │ └─ [mode]: optional #17 - │ │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ │ ├─ variant_6: struct #19 - │ │ │ │ └─ [search]: string #9 - │ │ │ └─ variant_7: struct #20 - │ │ │ ├─ [startsWith]: optional #10 - │ │ │ │ └─ item: string #9 - │ │ │ └─ [endsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ variant_1: struct #22 - │ │ └─ [not]: union '_string_filter' #21 - │ │ ├─ variant_0: string #9 - │ │ ├─ variant_1: struct #12 - │ │ │ └─ [equals]: string #9 - │ │ ├─ variant_2: struct #13 - │ │ │ └─ [not]: string #9 - │ │ ├─ variant_3: struct #14 - │ │ │ └─ [in]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_4: struct #15 - │ │ │ └─ [notIn]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_5: struct #18 - │ │ │ ├─ [contains]: string #9 - │ │ │ └─ [mode]: optional #17 - │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #19 - │ │ │ └─ [search]: string #9 - │ │ └─ variant_7: struct #20 - │ │ ├─ [startsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ [endsWith]: optional #10 - │ │ └─ item: string #9 - │ └─ [age]: optional '_93__integer_filter_with_aggregates_c?' #93 - │ └─ item: optional '_integer_filter_with_aggregates_c' #92 - │ └─ item: union #91 - │ ├─ variant_0: union '_integer_filter_with_aggregates' #89 - │ │ ├─ variant_0: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_1: struct #84 - │ │ │ └─ [_count]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_2: struct #85 - │ │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_3: struct #86 - │ │ │ └─ [_avg]: either '_float_filter' #83 - │ │ │ ├─ variant_0: float #75 - │ │ │ ├─ variant_1: struct #78 - │ │ │ │ └─ [equals]: float #75 - │ │ │ ├─ variant_2: struct #79 - │ │ │ │ └─ [not]: float #75 - │ │ │ ├─ variant_3: struct #80 - │ │ │ │ ├─ [lt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [gt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [lte]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ └─ [gte]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ variant_4: struct #81 - │ │ │ │ └─ [in]: array #77 - │ │ │ │ └─ item: float #75 - │ │ │ └─ variant_5: struct #82 - │ │ │ └─ [notIn]: array #77 - │ │ │ └─ item: float #75 - │ │ ├─ variant_4: struct #87 - │ │ │ └─ [_min]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #88 - │ │ └─ [_max]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ └─ variant_1: struct #90 - │ └─ [not]: union '_integer_filter_with_aggregates' #89 - │ ├─ variant_0: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ ├─ variant_1: struct #84 - │ │ └─ [_count]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ ├─ variant_2: struct #85 - │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ ├─ variant_3: struct #86 - │ │ └─ [_avg]: either '_float_filter' #83 - │ │ ├─ variant_0: float #75 - │ │ ├─ variant_1: struct #78 - │ │ │ └─ [equals]: float #75 - │ │ ├─ variant_2: struct #79 - │ │ │ └─ [not]: float #75 - │ │ ├─ variant_3: struct #80 - │ │ │ ├─ [lt]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ [gt]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ [lte]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ └─ [gte]: optional #76 - │ │ │ └─ item: float #75 - │ │ ├─ variant_4: struct #81 - │ │ │ └─ [in]: array #77 - │ │ │ └─ item: float #75 - │ │ └─ variant_5: struct #82 - │ │ └─ [notIn]: array #77 - │ │ └─ item: float #75 - │ ├─ variant_4: struct #87 - │ │ └─ [_min]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ └─ variant_5: struct #88 - │ └─ [_max]: either '_integer_filter' #35 - │ ├─ variant_0: integer #27 - │ ├─ variant_1: struct #30 - │ │ └─ [equals]: integer #27 - │ ├─ variant_2: struct #31 - │ │ └─ [not]: integer #27 - │ ├─ variant_3: struct #32 - │ │ ├─ [lt]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ [gt]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ [lte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ └─ [gte]: optional #28 - │ │ └─ item: integer #27 - │ ├─ variant_4: struct #33 - │ │ └─ [in]: array #29 - │ │ └─ item: integer #27 - │ └─ variant_5: struct #34 - │ └─ [notIn]: array #29 - │ └─ item: integer #27 - ├─ variant_1: struct #97 - │ └─ [AND]: array '_96__Record_Having[]' #96 - │ └─ item: &_Record_Having #95 - ├─ variant_2: struct #99 - │ └─ [OR]: array '_98__Record_Having[]' #98 - │ └─ item: &_Record_Having #95 - └─ variant_3: struct #100 - └─ [NOT]: &_Record_Having #95 +root: struct '_Record_QueryInput_group_by' #95 +├─ [where]: optional '_42_QueryRecordWhereInput?' #42 +│ └─ item: struct 'QueryRecordWhereInput' #41 +│ ├─ [id]: optional '_21__string_filter_c?' #21 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [name]: optional '_22__string_filter_c?' #22 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [age]: optional '_35__integer_filter_c?' #35 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ ├─ [AND]: optional '_39__38_QueryRecordWhereInput[]?' #39 +│ │ └─ item: array '_38_QueryRecordWhereInput[]' #38 +│ │ └─ item: &QueryRecordWhereInput #37 +│ ├─ [OR]: optional '_39__38_QueryRecordWhereInput[]?' #39 +│ │ └─ item: array '_38_QueryRecordWhereInput[]' #38 +│ │ └─ item: &QueryRecordWhereInput #37 +│ └─ [NOT]: optional '_40_QueryRecordWhereInput?' #40 +│ └─ item: &QueryRecordWhereInput #37 +├─ [orderBy]: optional '_58__Record_OrderBy_with_aggregates?' #58 +│ └─ item: array '_Record_OrderBy_with_aggregates' #57 +│ └─ item: struct #56 +│ ├─ [_count]: optional #52 +│ │ └─ item: struct #51 +│ │ ├─ [id]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ ├─ [name]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ [age]: optional '_Sort_nullable' #50 +│ │ └─ item: union #49 +│ │ ├─ variant_0: struct #48 +│ │ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_avg]: optional #54 +│ │ └─ item: struct #53 +│ │ └─ [age]: optional '_Sort_nullable' #50 +│ │ └─ item: union #49 +│ │ ├─ variant_0: struct #48 +│ │ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_sum]: optional #54 +│ │ └─ item: struct #53 +│ │ └─ [age]: optional '_Sort_nullable' #50 +│ │ └─ item: union #49 +│ │ ├─ variant_0: struct #48 +│ │ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_min]: optional #54 +│ │ └─ item: struct #53 +│ │ └─ [age]: optional '_Sort_nullable' #50 +│ │ └─ item: union #49 +│ │ ├─ variant_0: struct #48 +│ │ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_max]: optional #54 +│ │ └─ item: struct #53 +│ │ └─ [age]: optional '_Sort_nullable' #50 +│ │ └─ item: union #49 +│ │ ├─ variant_0: struct #48 +│ │ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [name]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [age]: optional '_Sort_nullable' #50 +│ └─ item: union #49 +│ ├─ variant_0: struct #48 +│ │ ├─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ [nulls]: string '_NullsOrder' #44 enum{ '"first"', '"last"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +├─ [take]: optional '_60__Take?' #60 +│ └─ item: integer '_Take' #59 +├─ [skip]: optional '_62__Skip?' #62 +│ └─ item: integer '_Skip' #61 +├─ [by]: array '_Record_GroupingFields' #64 +│ └─ item: string #63 enum{ '"id"', '"name"', '"age"' } +└─ [having]: optional '_94__Record_Having?' #94 + └─ item: union '_Record_Having' #93 + ├─ variant_0: struct 'RecordWhere__agg' #86 + │ ├─ [id]: optional '_65__string_filter_c?' #65 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ ├─ [name]: optional '_66__string_filter_c?' #66 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [age]: optional '_85__integer_filter_with_aggregates_c?' #85 + │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ └─ item: union #83 + │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_1: struct #76 + │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_2: struct #77 + │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_3: struct #78 + │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ ├─ variant_0: float #67 + │ │ │ ├─ variant_1: struct #70 + │ │ │ │ └─ [equals]: float #67 + │ │ │ ├─ variant_2: struct #71 + │ │ │ │ └─ [not]: float #67 + │ │ │ ├─ variant_3: struct #72 + │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #73 + │ │ │ │ └─ [in]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ └─ variant_5: struct #74 + │ │ │ └─ [notIn]: array #69 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #79 + │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #80 + │ │ └─ [_max]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_1: struct #82 + │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ ├─ variant_0: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ variant_1: struct #76 + │ │ └─ [_count]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ variant_2: struct #77 + │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ variant_3: struct #78 + │ │ └─ [_avg]: either '_float_filter' #75 + │ │ ├─ variant_0: float #67 + │ │ ├─ variant_1: struct #70 + │ │ │ └─ [equals]: float #67 + │ │ ├─ variant_2: struct #71 + │ │ │ └─ [not]: float #67 + │ │ ├─ variant_3: struct #72 + │ │ │ ├─ [lt]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ [gt]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ [lte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ └─ [gte]: optional #68 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #73 + │ │ │ └─ [in]: array #69 + │ │ │ └─ item: float #67 + │ │ └─ variant_5: struct #74 + │ │ └─ [notIn]: array #69 + │ │ └─ item: float #67 + │ ├─ variant_4: struct #79 + │ │ └─ [_min]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_5: struct #80 + │ └─ [_max]: either '_integer_filter' #31 + │ ├─ variant_0: integer #23 + │ ├─ variant_1: struct #26 + │ │ └─ [equals]: integer #23 + │ ├─ variant_2: struct #27 + │ │ └─ [not]: integer #23 + │ ├─ variant_3: struct #28 + │ │ ├─ [lt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [gt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [lte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ └─ [gte]: optional #24 + │ │ └─ item: integer #23 + │ ├─ variant_4: struct #29 + │ │ └─ [in]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_5: struct #30 + │ └─ [notIn]: array #25 + │ └─ item: integer #23 + ├─ variant_1: struct #89 + │ └─ [AND]: array '_88__Record_Having[]' #88 + │ └─ item: &_Record_Having #87 + ├─ variant_2: struct #91 + │ └─ [OR]: array '_90__Record_Having[]' #90 + │ └─ item: &_Record_Having #87 + └─ variant_3: struct #92 + └─ [NOT]: &_Record_Having #87 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record out.snap index 74655ad72c..a8d0d57c88 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by Record out.snap @@ -1,32 +1,32 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: array '_Record_GroupByResult' #116 -└─ item: struct #115 +root: array '_Record_GroupByResult' #108 +└─ item: struct #107 ├─ [id]: string #0 ├─ [name]: string #1 ├─ [age]: optional #3 │ └─ item: integer #2 - ├─ [_count]: struct '_Record_AggrCount' #106 - │ ├─ [_all]: optional #105 - │ │ └─ item: integer #104 - │ ├─ [id]: optional #105 - │ │ └─ item: integer #104 - │ ├─ [name]: optional #105 - │ │ └─ item: integer #104 + ├─ [_count]: struct '_Record_AggrCount' #98 + │ ├─ [_all]: optional #97 + │ │ └─ item: integer #96 + │ ├─ [id]: optional #97 + │ │ └─ item: integer #96 + │ ├─ [name]: optional #97 + │ │ └─ item: integer #96 + │ └─ [age]: optional #97 + │ └─ item: integer #96 + ├─ [_avg]: struct '_Record_SelectNumbers__1' #101 + │ └─ [age]: optional #100 + │ └─ item: float #99 + ├─ [_sum]: struct '_Record_SelectNumbers_' #106 │ └─ [age]: optional #105 │ └─ item: integer #104 - ├─ [_avg]: struct '_Record_SelectNumbers__1' #109 - │ └─ [age]: optional #108 - │ └─ item: float #107 - ├─ [_sum]: struct '_Record_SelectNumbers_' #114 - │ └─ [age]: optional #113 - │ └─ item: integer #112 - ├─ [_min]: struct '_Record_SelectNumbers_' #114 - │ └─ [age]: optional #113 - │ └─ item: integer #112 - └─ [_max]: struct '_Record_SelectNumbers_' #114 - └─ [age]: optional #113 - └─ item: integer #112 + ├─ [_min]: struct '_Record_SelectNumbers_' #106 + │ └─ [age]: optional #105 + │ └─ item: integer #104 + └─ [_max]: struct '_Record_SelectNumbers_' #106 + └─ [age]: optional #105 + └─ item: integer #104 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User inp.snap index 3c3c383f64..dd906a0f74 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User inp.snap @@ -1,630 +1,1808 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct '_User_QueryInput_group_by' #174 -├─ [where]: optional '_145_QueryUserWhereInput?' #145 -│ └─ item: struct 'QueryUserWhereInput' #144 -│ ├─ [id]: optional '_133__integer_filter_c?' #133 -│ │ └─ item: optional '_integer_filter_c' #38 -│ │ └─ item: union #37 -│ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_1: struct #36 -│ │ └─ [not]: either '_integer_filter' #35 -│ │ ├─ variant_0: integer #27 -│ │ ├─ variant_1: struct #30 -│ │ │ └─ [equals]: integer #27 -│ │ ├─ variant_2: struct #31 -│ │ │ └─ [not]: integer #27 -│ │ ├─ variant_3: struct #32 -│ │ │ ├─ [lt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [gt]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ [lte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ [gte]: optional #28 -│ │ │ └─ item: integer #27 -│ │ ├─ variant_4: struct #33 -│ │ │ └─ [in]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ variant_5: struct #34 -│ │ └─ [notIn]: array #29 -│ │ └─ item: integer #27 -│ ├─ [name]: optional '_134__string_filter_c?' #134 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [posts]: optional '_138__125WithFilters_norel?' #138 -│ │ └─ item: struct '_125WithFilters_norel' #137 -│ │ ├─ [id]: optional '_135__integer_filter_c?' #135 -│ │ │ └─ item: optional '_integer_filter_c' #38 -│ │ │ └─ item: union #37 -│ │ │ ├─ variant_0: either '_integer_filter' #35 -│ │ │ │ ├─ variant_0: integer #27 -│ │ │ │ ├─ variant_1: struct #30 -│ │ │ │ │ └─ [equals]: integer #27 -│ │ │ │ ├─ variant_2: struct #31 -│ │ │ │ │ └─ [not]: integer #27 -│ │ │ │ ├─ variant_3: struct #32 -│ │ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ │ └─ item: integer #27 -│ │ │ │ │ └─ [gte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ variant_4: struct #33 -│ │ │ │ │ └─ [in]: array #29 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ variant_5: struct #34 -│ │ │ │ └─ [notIn]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_1: struct #36 -│ │ │ └─ [not]: either '_integer_filter' #35 -│ │ │ ├─ variant_0: integer #27 -│ │ │ ├─ variant_1: struct #30 -│ │ │ │ └─ [equals]: integer #27 -│ │ │ ├─ variant_2: struct #31 -│ │ │ │ └─ [not]: integer #27 -│ │ │ ├─ variant_3: struct #32 -│ │ │ │ ├─ [lt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [gt]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ ├─ [lte]: optional #28 -│ │ │ │ │ └─ item: integer #27 -│ │ │ │ └─ [gte]: optional #28 -│ │ │ │ └─ item: integer #27 -│ │ │ ├─ variant_4: struct #33 -│ │ │ │ └─ [in]: array #29 -│ │ │ │ └─ item: integer #27 -│ │ │ └─ variant_5: struct #34 -│ │ │ └─ [notIn]: array #29 -│ │ │ └─ item: integer #27 -│ │ └─ [title]: optional '_136__string_filter_c?' #136 -│ │ └─ item: optional '_string_filter_c' #24 -│ │ └─ item: union #23 -│ │ ├─ variant_0: union '_string_filter' #21 -│ │ │ ├─ variant_0: string #9 -│ │ │ ├─ variant_1: struct #12 -│ │ │ │ └─ [equals]: string #9 -│ │ │ ├─ variant_2: struct #13 -│ │ │ │ └─ [not]: string #9 -│ │ │ ├─ variant_3: struct #14 -│ │ │ │ └─ [in]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_4: struct #15 -│ │ │ │ └─ [notIn]: array #11 -│ │ │ │ └─ item: string #9 -│ │ │ ├─ variant_5: struct #18 -│ │ │ │ ├─ [contains]: string #9 -│ │ │ │ └─ [mode]: optional #17 -│ │ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ │ ├─ variant_6: struct #19 -│ │ │ │ └─ [search]: string #9 -│ │ │ └─ variant_7: struct #20 -│ │ │ ├─ [startsWith]: optional #10 -│ │ │ │ └─ item: string #9 -│ │ │ └─ [endsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ variant_1: struct #22 -│ │ └─ [not]: union '_string_filter' #21 -│ │ ├─ variant_0: string #9 -│ │ ├─ variant_1: struct #12 -│ │ │ └─ [equals]: string #9 -│ │ ├─ variant_2: struct #13 -│ │ │ └─ [not]: string #9 -│ │ ├─ variant_3: struct #14 -│ │ │ └─ [in]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_4: struct #15 -│ │ │ └─ [notIn]: array #11 -│ │ │ └─ item: string #9 -│ │ ├─ variant_5: struct #18 -│ │ │ ├─ [contains]: string #9 -│ │ │ └─ [mode]: optional #17 -│ │ │ └─ item: string #16 enum{ '"insensitive"' } -│ │ ├─ variant_6: struct #19 -│ │ │ └─ [search]: string #9 -│ │ └─ variant_7: struct #20 -│ │ ├─ [startsWith]: optional #10 -│ │ │ └─ item: string #9 -│ │ └─ [endsWith]: optional #10 -│ │ └─ item: string #9 -│ ├─ [AND]: optional '_142__141_QueryUserWhereInput[]?' #142 -│ │ └─ item: array '_141_QueryUserWhereInput[]' #141 -│ │ └─ item: &QueryUserWhereInput #140 -│ ├─ [OR]: optional '_142__141_QueryUserWhereInput[]?' #142 -│ │ └─ item: array '_141_QueryUserWhereInput[]' #141 -│ │ └─ item: &QueryUserWhereInput #140 -│ └─ [NOT]: optional '_143_QueryUserWhereInput?' #143 -│ └─ item: &QueryUserWhereInput #140 -├─ [orderBy]: optional '_155__User_OrderBy_with_aggregates?' #155 -│ └─ item: array '_User_OrderBy_with_aggregates' #154 -│ └─ item: struct #153 -│ ├─ [_count]: optional #147 -│ │ └─ item: struct #146 -│ │ ├─ [id]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ ├─ [name]: optional '_Sort' #51 -│ │ │ └─ item: union #50 -│ │ │ ├─ variant_0: struct #49 -│ │ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ [posts]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_avg]: optional #149 -│ │ └─ item: struct #148 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_sum]: optional #149 -│ │ └─ item: struct #148 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_min]: optional #149 -│ │ └─ item: struct #148 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_max]: optional #149 -│ │ └─ item: struct #148 -│ │ └─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [id]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [name]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [posts]: optional '_SortByAggregates' #152 -│ └─ item: struct #151 -│ ├─ [_count]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_avg]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_sum]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ ├─ [_min]: optional '_Sort' #51 -│ │ └─ item: union #50 -│ │ ├─ variant_0: struct #49 -│ │ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ │ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ [_max]: optional '_Sort' #51 -│ └─ item: union #50 -│ ├─ variant_0: struct #49 -│ │ └─ [sort]: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -│ └─ variant_1: string '_SortOrder' #47 enum{ '"asc"', '"desc"' } -├─ [take]: optional '_156__Take?' #156 -│ └─ item: integer '_Take' #63 -├─ [skip]: optional '_157__Skip?' #157 -│ └─ item: integer '_Skip' #65 -├─ [by]: array '_User_GroupingFields' #159 -│ └─ item: string #158 enum{ '"id"', '"name"' } -└─ [having]: optional '_173__User_Having?' #173 - └─ item: union '_User_Having' #172 - ├─ variant_0: struct '_162WithFilters_norel_with_aggregates' #165 - │ ├─ [id]: optional '_163__integer_filter_with_aggregates_c?' #163 - │ │ └─ item: optional '_integer_filter_with_aggregates_c' #92 - │ │ └─ item: union #91 - │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #89 - │ │ │ ├─ variant_0: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_1: struct #84 - │ │ │ │ └─ [_count]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_2: struct #85 - │ │ │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_3: struct #86 - │ │ │ │ └─ [_avg]: either '_float_filter' #83 - │ │ │ │ ├─ variant_0: float #75 - │ │ │ │ ├─ variant_1: struct #78 - │ │ │ │ │ └─ [equals]: float #75 - │ │ │ │ ├─ variant_2: struct #79 - │ │ │ │ │ └─ [not]: float #75 - │ │ │ │ ├─ variant_3: struct #80 - │ │ │ │ │ ├─ [lt]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ ├─ [gt]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ ├─ [lte]: optional #76 - │ │ │ │ │ │ └─ item: float #75 - │ │ │ │ │ └─ [gte]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ variant_4: struct #81 - │ │ │ │ │ └─ [in]: array #77 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ └─ variant_5: struct #82 - │ │ │ │ └─ [notIn]: array #77 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ variant_4: struct #87 - │ │ │ │ └─ [_min]: either '_integer_filter' #35 - │ │ │ │ ├─ variant_0: integer #27 - │ │ │ │ ├─ variant_1: struct #30 - │ │ │ │ │ └─ [equals]: integer #27 - │ │ │ │ ├─ variant_2: struct #31 - │ │ │ │ │ └─ [not]: integer #27 - │ │ │ │ ├─ variant_3: struct #32 - │ │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ │ └─ item: integer #27 - │ │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ variant_4: struct #33 - │ │ │ │ │ └─ [in]: array #29 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ variant_5: struct #34 - │ │ │ │ └─ [notIn]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #88 - │ │ │ └─ [_max]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_1: struct #90 - │ │ └─ [not]: union '_integer_filter_with_aggregates' #89 - │ │ ├─ variant_0: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_1: struct #84 - │ │ │ └─ [_count]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_2: struct #85 - │ │ │ └─ [_sum]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_3: struct #86 - │ │ │ └─ [_avg]: either '_float_filter' #83 - │ │ │ ├─ variant_0: float #75 - │ │ │ ├─ variant_1: struct #78 - │ │ │ │ └─ [equals]: float #75 - │ │ │ ├─ variant_2: struct #79 - │ │ │ │ └─ [not]: float #75 - │ │ │ ├─ variant_3: struct #80 - │ │ │ │ ├─ [lt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [gt]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ ├─ [lte]: optional #76 - │ │ │ │ │ └─ item: float #75 - │ │ │ │ └─ [gte]: optional #76 - │ │ │ │ └─ item: float #75 - │ │ │ ├─ variant_4: struct #81 - │ │ │ │ └─ [in]: array #77 - │ │ │ │ └─ item: float #75 - │ │ │ └─ variant_5: struct #82 - │ │ │ └─ [notIn]: array #77 - │ │ │ └─ item: float #75 - │ │ ├─ variant_4: struct #87 - │ │ │ └─ [_min]: either '_integer_filter' #35 - │ │ │ ├─ variant_0: integer #27 - │ │ │ ├─ variant_1: struct #30 - │ │ │ │ └─ [equals]: integer #27 - │ │ │ ├─ variant_2: struct #31 - │ │ │ │ └─ [not]: integer #27 - │ │ │ ├─ variant_3: struct #32 - │ │ │ │ ├─ [lt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [gt]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ ├─ [lte]: optional #28 - │ │ │ │ │ └─ item: integer #27 - │ │ │ │ └─ [gte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ variant_4: struct #33 - │ │ │ │ └─ [in]: array #29 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ variant_5: struct #34 - │ │ │ └─ [notIn]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #88 - │ │ └─ [_max]: either '_integer_filter' #35 - │ │ ├─ variant_0: integer #27 - │ │ ├─ variant_1: struct #30 - │ │ │ └─ [equals]: integer #27 - │ │ ├─ variant_2: struct #31 - │ │ │ └─ [not]: integer #27 - │ │ ├─ variant_3: struct #32 - │ │ │ ├─ [lt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [gt]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ ├─ [lte]: optional #28 - │ │ │ │ └─ item: integer #27 - │ │ │ └─ [gte]: optional #28 - │ │ │ └─ item: integer #27 - │ │ ├─ variant_4: struct #33 - │ │ │ └─ [in]: array #29 - │ │ │ └─ item: integer #27 - │ │ └─ variant_5: struct #34 - │ │ └─ [notIn]: array #29 - │ │ └─ item: integer #27 - │ └─ [name]: optional '_164__string_filter_c?' #164 - │ └─ item: optional '_string_filter_c' #24 - │ └─ item: union #23 - │ ├─ variant_0: union '_string_filter' #21 - │ │ ├─ variant_0: string #9 - │ │ ├─ variant_1: struct #12 - │ │ │ └─ [equals]: string #9 - │ │ ├─ variant_2: struct #13 - │ │ │ └─ [not]: string #9 - │ │ ├─ variant_3: struct #14 - │ │ │ └─ [in]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_4: struct #15 - │ │ │ └─ [notIn]: array #11 - │ │ │ └─ item: string #9 - │ │ ├─ variant_5: struct #18 - │ │ │ ├─ [contains]: string #9 - │ │ │ └─ [mode]: optional #17 - │ │ │ └─ item: string #16 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #19 - │ │ │ └─ [search]: string #9 - │ │ └─ variant_7: struct #20 - │ │ ├─ [startsWith]: optional #10 - │ │ │ └─ item: string #9 - │ │ └─ [endsWith]: optional #10 - │ │ └─ item: string #9 - │ └─ variant_1: struct #22 - │ └─ [not]: union '_string_filter' #21 - │ ├─ variant_0: string #9 - │ ├─ variant_1: struct #12 - │ │ └─ [equals]: string #9 - │ ├─ variant_2: struct #13 - │ │ └─ [not]: string #9 - │ ├─ variant_3: struct #14 - │ │ └─ [in]: array #11 - │ │ └─ item: string #9 - │ ├─ variant_4: struct #15 - │ │ └─ [notIn]: array #11 - │ │ └─ item: string #9 - │ ├─ variant_5: struct #18 - │ │ ├─ [contains]: string #9 - │ │ └─ [mode]: optional #17 - │ │ └─ item: string #16 enum{ '"insensitive"' } - │ ├─ variant_6: struct #19 - │ │ └─ [search]: string #9 - │ └─ variant_7: struct #20 - │ ├─ [startsWith]: optional #10 - │ │ └─ item: string #9 - │ └─ [endsWith]: optional #10 - │ └─ item: string #9 - ├─ variant_1: struct #168 - │ └─ [AND]: array '_167__User_Having[]' #167 - │ └─ item: &_User_Having #166 - ├─ variant_2: struct #170 - │ └─ [OR]: array '_169__User_Having[]' #169 - │ └─ item: &_User_Having #166 - └─ variant_3: struct #171 - └─ [NOT]: &_User_Having #166 +root: struct '_User_QueryInput_group_by' #178 +├─ [where]: optional '_139_QueryUserWhereInput?' #139 +│ └─ item: struct 'QueryUserWhereInput' #138 +│ ├─ [id]: optional '_118__integer_filter_c?' #118 +│ │ └─ item: optional '_integer_filter_c' #34 +│ │ └─ item: union #33 +│ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_1: struct #32 +│ │ └─ [not]: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ ├─ [name]: optional '_119__string_filter_c?' #119 +│ │ └─ item: optional '_string_filter_c' #20 +│ │ └─ item: union #19 +│ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ variant_1: struct #18 +│ │ └─ [not]: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ ├─ [posts]: optional #132 +│ │ └─ item: union #131 +│ │ ├─ variant_0: struct #126 +│ │ │ └─ [every]: optional '_125_PostWhere__skip_113_UserWhere?' #125 +│ │ │ └─ item: struct 'PostWhere__skip_113_UserWhere' #124 +│ │ │ ├─ [id]: optional '_120__integer_filter_c?' #120 +│ │ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ │ └─ item: union #33 +│ │ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ variant_5: struct #30 +│ │ │ │ │ └─ [notIn]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_1: struct #32 +│ │ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [title]: optional '_121__string_filter_c?' #121 +│ │ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ │ └─ item: union #19 +│ │ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ │ ├─ variant_0: string #5 +│ │ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ │ └─ [not]: string #5 +│ │ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ │ └─ [search]: string #5 +│ │ │ │ │ └─ variant_7: struct #16 +│ │ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ variant_1: struct #18 +│ │ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [author]: optional '_123_UserWhere?' #123 +│ │ │ └─ item: &UserWhere #122 +│ │ ├─ variant_1: struct #128 +│ │ │ └─ [some]: optional '_127_PostWhere__skip_113_UserWhere?' #127 +│ │ │ └─ item: struct 'PostWhere__skip_113_UserWhere' #124 +│ │ │ ├─ [id]: optional '_120__integer_filter_c?' #120 +│ │ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ │ └─ item: union #33 +│ │ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ variant_5: struct #30 +│ │ │ │ │ └─ [notIn]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_1: struct #32 +│ │ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [title]: optional '_121__string_filter_c?' #121 +│ │ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ │ └─ item: union #19 +│ │ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ │ ├─ variant_0: string #5 +│ │ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ │ └─ [not]: string #5 +│ │ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ │ └─ [search]: string #5 +│ │ │ │ │ └─ variant_7: struct #16 +│ │ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ │ └─ item: string #5 +│ │ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ variant_1: struct #18 +│ │ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [author]: optional '_123_UserWhere?' #123 +│ │ │ └─ item: &UserWhere #122 +│ │ └─ variant_2: struct #130 +│ │ └─ [none]: optional '_129_PostWhere__skip_113_UserWhere?' #129 +│ │ └─ item: struct 'PostWhere__skip_113_UserWhere' #124 +│ │ ├─ [id]: optional '_120__integer_filter_c?' #120 +│ │ │ └─ item: optional '_integer_filter_c' #34 +│ │ │ └─ item: union #33 +│ │ │ ├─ variant_0: either '_integer_filter' #31 +│ │ │ │ ├─ variant_0: integer #23 +│ │ │ │ ├─ variant_1: struct #26 +│ │ │ │ │ └─ [equals]: integer #23 +│ │ │ │ ├─ variant_2: struct #27 +│ │ │ │ │ └─ [not]: integer #23 +│ │ │ │ ├─ variant_3: struct #28 +│ │ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ │ └─ item: integer #23 +│ │ │ │ │ └─ [gte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ variant_4: struct #29 +│ │ │ │ │ └─ [in]: array #25 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ variant_5: struct #30 +│ │ │ │ └─ [notIn]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_1: struct #32 +│ │ │ └─ [not]: either '_integer_filter' #31 +│ │ │ ├─ variant_0: integer #23 +│ │ │ ├─ variant_1: struct #26 +│ │ │ │ └─ [equals]: integer #23 +│ │ │ ├─ variant_2: struct #27 +│ │ │ │ └─ [not]: integer #23 +│ │ │ ├─ variant_3: struct #28 +│ │ │ │ ├─ [lt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [gt]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ ├─ [lte]: optional #24 +│ │ │ │ │ └─ item: integer #23 +│ │ │ │ └─ [gte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ variant_4: struct #29 +│ │ │ │ └─ [in]: array #25 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ variant_5: struct #30 +│ │ │ └─ [notIn]: array #25 +│ │ │ └─ item: integer #23 +│ │ ├─ [title]: optional '_121__string_filter_c?' #121 +│ │ │ └─ item: optional '_string_filter_c' #20 +│ │ │ └─ item: union #19 +│ │ │ ├─ variant_0: union '_string_filter' #17 +│ │ │ │ ├─ variant_0: string #5 +│ │ │ │ ├─ variant_1: struct #8 +│ │ │ │ │ └─ [equals]: string #5 +│ │ │ │ ├─ variant_2: struct #9 +│ │ │ │ │ └─ [not]: string #5 +│ │ │ │ ├─ variant_3: struct #10 +│ │ │ │ │ └─ [in]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_4: struct #11 +│ │ │ │ │ └─ [notIn]: array #7 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ ├─ variant_5: struct #14 +│ │ │ │ │ ├─ [contains]: string #5 +│ │ │ │ │ └─ [mode]: optional #13 +│ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #15 +│ │ │ │ │ └─ [search]: string #5 +│ │ │ │ └─ variant_7: struct #16 +│ │ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ │ └─ item: string #5 +│ │ │ │ └─ [endsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ variant_1: struct #18 +│ │ │ └─ [not]: union '_string_filter' #17 +│ │ │ ├─ variant_0: string #5 +│ │ │ ├─ variant_1: struct #8 +│ │ │ │ └─ [equals]: string #5 +│ │ │ ├─ variant_2: struct #9 +│ │ │ │ └─ [not]: string #5 +│ │ │ ├─ variant_3: struct #10 +│ │ │ │ └─ [in]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_4: struct #11 +│ │ │ │ └─ [notIn]: array #7 +│ │ │ │ └─ item: string #5 +│ │ │ ├─ variant_5: struct #14 +│ │ │ │ ├─ [contains]: string #5 +│ │ │ │ └─ [mode]: optional #13 +│ │ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #15 +│ │ │ │ └─ [search]: string #5 +│ │ │ └─ variant_7: struct #16 +│ │ │ ├─ [startsWith]: optional #6 +│ │ │ │ └─ item: string #5 +│ │ │ └─ [endsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [author]: optional '_123_UserWhere?' #123 +│ │ └─ item: &UserWhere #122 +│ ├─ [AND]: optional '_136__135_QueryUserWhereInput[]?' #136 +│ │ └─ item: array '_135_QueryUserWhereInput[]' #135 +│ │ └─ item: &QueryUserWhereInput #134 +│ ├─ [OR]: optional '_136__135_QueryUserWhereInput[]?' #136 +│ │ └─ item: array '_135_QueryUserWhereInput[]' #135 +│ │ └─ item: &QueryUserWhereInput #134 +│ └─ [NOT]: optional '_137_QueryUserWhereInput?' #137 +│ └─ item: &QueryUserWhereInput #134 +├─ [orderBy]: optional '_149__User_OrderBy_with_aggregates?' #149 +│ └─ item: array '_User_OrderBy_with_aggregates' #148 +│ └─ item: struct #147 +│ ├─ [_count]: optional #141 +│ │ └─ item: struct #140 +│ │ ├─ [id]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ ├─ [name]: optional '_Sort' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: struct #45 +│ │ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ [posts]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_avg]: optional #143 +│ │ └─ item: struct #142 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_sum]: optional #143 +│ │ └─ item: struct #142 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_min]: optional #143 +│ │ └─ item: struct #142 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_max]: optional #143 +│ │ └─ item: struct #142 +│ │ └─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [id]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [name]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [posts]: optional '_SortByAggregates' #146 +│ └─ item: struct #145 +│ ├─ [_count]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_avg]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_sum]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ ├─ [_min]: optional '_Sort' #47 +│ │ └─ item: union #46 +│ │ ├─ variant_0: struct #45 +│ │ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ │ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ [_max]: optional '_Sort' #47 +│ └─ item: union #46 +│ ├─ variant_0: struct #45 +│ │ └─ [sort]: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +│ └─ variant_1: string '_SortOrder' #43 enum{ '"asc"', '"desc"' } +├─ [take]: optional '_150__Take?' #150 +│ └─ item: integer '_Take' #59 +├─ [skip]: optional '_151__Skip?' #151 +│ └─ item: integer '_Skip' #61 +├─ [by]: array '_User_GroupingFields' #153 +│ └─ item: string #152 enum{ '"id"', '"name"' } +└─ [having]: optional '_177__User_Having?' #177 + └─ item: union '_User_Having' #176 + ├─ variant_0: struct 'UserWhere__agg' #169 + │ ├─ [id]: optional '_154__integer_filter_with_aggregates_c?' #154 + │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ └─ item: union #83 + │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #82 + │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_1: struct #76 + │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_2: struct #77 + │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_3: struct #78 + │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ ├─ variant_0: float #67 + │ │ │ ├─ variant_1: struct #70 + │ │ │ │ └─ [equals]: float #67 + │ │ │ ├─ variant_2: struct #71 + │ │ │ │ └─ [not]: float #67 + │ │ │ ├─ variant_3: struct #72 + │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #73 + │ │ │ │ └─ [in]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ └─ variant_5: struct #74 + │ │ │ └─ [notIn]: array #69 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #79 + │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #80 + │ │ └─ [_max]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [name]: optional '_155__string_filter_c?' #155 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [posts]: optional #168 + │ └─ item: union #167 + │ ├─ variant_0: struct #162 + │ │ └─ [every]: optional '_161_PostWhere__agg__skip_113_UserWhere__agg?' #161 + │ │ └─ item: struct 'PostWhere__agg__skip_113_UserWhere__agg' #160 + │ │ ├─ [id]: optional '_156__integer_filter_with_aggregates_c?' #156 + │ │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ │ └─ item: union #83 + │ │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_1: struct #76 + │ │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_2: struct #77 + │ │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_3: struct #78 + │ │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #79 + │ │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #80 + │ │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_1: struct #82 + │ │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ [title]: optional '_157__string_filter_c?' #157 + │ │ │ └─ item: optional '_string_filter_c' #20 + │ │ │ └─ item: union #19 + │ │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ │ ├─ variant_0: string #5 + │ │ │ │ ├─ variant_1: struct #8 + │ │ │ │ │ └─ [equals]: string #5 + │ │ │ │ ├─ variant_2: struct #9 + │ │ │ │ │ └─ [not]: string #5 + │ │ │ │ ├─ variant_3: struct #10 + │ │ │ │ │ └─ [in]: array #7 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ ├─ variant_4: struct #11 + │ │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ ├─ variant_5: struct #14 + │ │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #15 + │ │ │ │ │ └─ [search]: string #5 + │ │ │ │ └─ variant_7: struct #16 + │ │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ └─ [endsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ variant_1: struct #18 + │ │ │ └─ [not]: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [author]: optional '_159_UserWhere__agg?' #159 + │ │ └─ item: &UserWhere__agg #158 + │ ├─ variant_1: struct #164 + │ │ └─ [some]: optional '_163_PostWhere__agg__skip_113_UserWhere__agg?' #163 + │ │ └─ item: struct 'PostWhere__agg__skip_113_UserWhere__agg' #160 + │ │ ├─ [id]: optional '_156__integer_filter_with_aggregates_c?' #156 + │ │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ │ └─ item: union #83 + │ │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_1: struct #76 + │ │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_2: struct #77 + │ │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_3: struct #78 + │ │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #79 + │ │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #80 + │ │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_1: struct #82 + │ │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ [title]: optional '_157__string_filter_c?' #157 + │ │ │ └─ item: optional '_string_filter_c' #20 + │ │ │ └─ item: union #19 + │ │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ │ ├─ variant_0: string #5 + │ │ │ │ ├─ variant_1: struct #8 + │ │ │ │ │ └─ [equals]: string #5 + │ │ │ │ ├─ variant_2: struct #9 + │ │ │ │ │ └─ [not]: string #5 + │ │ │ │ ├─ variant_3: struct #10 + │ │ │ │ │ └─ [in]: array #7 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ ├─ variant_4: struct #11 + │ │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ ├─ variant_5: struct #14 + │ │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #15 + │ │ │ │ │ └─ [search]: string #5 + │ │ │ │ └─ variant_7: struct #16 + │ │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ │ └─ item: string #5 + │ │ │ │ └─ [endsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ variant_1: struct #18 + │ │ │ └─ [not]: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [author]: optional '_159_UserWhere__agg?' #159 + │ │ └─ item: &UserWhere__agg #158 + │ └─ variant_2: struct #166 + │ └─ [none]: optional '_165_PostWhere__agg__skip_113_UserWhere__agg?' #165 + │ └─ item: struct 'PostWhere__agg__skip_113_UserWhere__agg' #160 + │ ├─ [id]: optional '_156__integer_filter_with_aggregates_c?' #156 + │ │ └─ item: optional '_integer_filter_with_aggregates_c' #84 + │ │ └─ item: union #83 + │ │ ├─ variant_0: union '_integer_filter_with_aggregates' #81 + │ │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_1: struct #76 + │ │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_2: struct #77 + │ │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_3: struct #78 + │ │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ │ ├─ variant_0: float #67 + │ │ │ │ ├─ variant_1: struct #70 + │ │ │ │ │ └─ [equals]: float #67 + │ │ │ │ ├─ variant_2: struct #71 + │ │ │ │ │ └─ [not]: float #67 + │ │ │ │ ├─ variant_3: struct #72 + │ │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ │ └─ item: float #67 + │ │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ variant_4: struct #73 + │ │ │ │ │ └─ [in]: array #69 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ variant_5: struct #74 + │ │ │ │ └─ [notIn]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #79 + │ │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ │ ├─ variant_0: integer #23 + │ │ │ │ ├─ variant_1: struct #26 + │ │ │ │ │ └─ [equals]: integer #23 + │ │ │ │ ├─ variant_2: struct #27 + │ │ │ │ │ └─ [not]: integer #23 + │ │ │ │ ├─ variant_3: struct #28 + │ │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ │ └─ item: integer #23 + │ │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ variant_4: struct #29 + │ │ │ │ │ └─ [in]: array #25 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ variant_5: struct #30 + │ │ │ │ └─ [notIn]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #80 + │ │ │ └─ [_max]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #82 + │ │ └─ [not]: union '_integer_filter_with_aggregates' #81 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_1: struct #76 + │ │ │ └─ [_count]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_2: struct #77 + │ │ │ └─ [_sum]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_3: struct #78 + │ │ │ └─ [_avg]: either '_float_filter' #75 + │ │ │ ├─ variant_0: float #67 + │ │ │ ├─ variant_1: struct #70 + │ │ │ │ └─ [equals]: float #67 + │ │ │ ├─ variant_2: struct #71 + │ │ │ │ └─ [not]: float #67 + │ │ │ ├─ variant_3: struct #72 + │ │ │ │ ├─ [lt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [gt]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ ├─ [lte]: optional #68 + │ │ │ │ │ └─ item: float #67 + │ │ │ │ └─ [gte]: optional #68 + │ │ │ │ └─ item: float #67 + │ │ │ ├─ variant_4: struct #73 + │ │ │ │ └─ [in]: array #69 + │ │ │ │ └─ item: float #67 + │ │ │ └─ variant_5: struct #74 + │ │ │ └─ [notIn]: array #69 + │ │ │ └─ item: float #67 + │ │ ├─ variant_4: struct #79 + │ │ │ └─ [_min]: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #80 + │ │ └─ [_max]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [title]: optional '_157__string_filter_c?' #157 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [author]: optional '_159_UserWhere__agg?' #159 + │ └─ item: &UserWhere__agg #158 + ├─ variant_1: struct #172 + │ └─ [AND]: array '_171__User_Having[]' #171 + │ └─ item: &_User_Having #170 + ├─ variant_2: struct #174 + │ └─ [OR]: array '_173__User_Having[]' #173 + │ └─ item: &_User_Having #170 + └─ variant_3: struct #175 + └─ [NOT]: &_User_Having #170 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User out.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User out.snap index 8cd6ba24f1..01a12de166 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User out.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__group_by User out.snap @@ -1,32 +1,32 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.output)" +expression: "tree::print(out)" --- -root: array '_User_GroupByResult' #187 -└─ item: struct #186 - ├─ [id]: integer #117 - ├─ [name]: string #118 - ├─ [posts]: array '_120_Post[]' #120 - │ └─ item: &Post #119 - ├─ [_count]: struct '_User_AggrCount' #177 - │ ├─ [_all]: optional #176 - │ │ └─ item: integer #175 - │ ├─ [id]: optional #176 - │ │ └─ item: integer #175 - │ ├─ [name]: optional #176 - │ │ └─ item: integer #175 - │ └─ [posts]: optional #176 - │ └─ item: integer #175 - ├─ [_avg]: struct '_User_SelectNumbers__1' #180 - │ └─ [id]: optional #179 - │ └─ item: float #178 - ├─ [_sum]: struct '_User_SelectNumbers_' #185 - │ └─ [id]: optional #184 - │ └─ item: integer #183 - ├─ [_min]: struct '_User_SelectNumbers_' #185 - │ └─ [id]: optional #184 - │ └─ item: integer #183 - └─ [_max]: struct '_User_SelectNumbers_' #185 - └─ [id]: optional #184 - └─ item: integer #183 +root: array '_User_GroupByResult' #191 +└─ item: struct #190 + ├─ [id]: integer #109 + ├─ [name]: string #110 + ├─ [posts]: array '_112_Post[]' #112 + │ └─ item: &Post #111 + ├─ [_count]: struct '_User_AggrCount' #181 + │ ├─ [_all]: optional #180 + │ │ └─ item: integer #179 + │ ├─ [id]: optional #180 + │ │ └─ item: integer #179 + │ ├─ [name]: optional #180 + │ │ └─ item: integer #179 + │ └─ [posts]: optional #180 + │ └─ item: integer #179 + ├─ [_avg]: struct '_User_SelectNumbers__1' #184 + │ └─ [id]: optional #183 + │ └─ item: float #182 + ├─ [_sum]: struct '_User_SelectNumbers_' #189 + │ └─ [id]: optional #188 + │ └─ item: integer #187 + ├─ [_min]: struct '_User_SelectNumbers_' #189 + │ └─ [id]: optional #188 + │ └─ item: integer #187 + └─ [_max]: struct '_User_SelectNumbers_' #189 + └─ [id]: optional #188 + └─ item: integer #187 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Post inp.snap index ea4b5b726f..4a5cb19d7e 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Post inp.snap @@ -1,227 +1,1072 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #135 -├─ [data]: struct '_Post_UpdateInput' #114 -│ ├─ [id]: optional #110 -│ │ └─ item: union #109 -│ │ ├─ variant_0: integer #68 -│ │ ├─ variant_1: struct #105 -│ │ │ └─ [set]: integer #68 -│ │ ├─ variant_2: struct #106 -│ │ │ └─ [multiply]: integer #68 -│ │ ├─ variant_3: struct #107 -│ │ │ └─ [decrement]: integer #68 -│ │ └─ variant_4: struct #108 -│ │ └─ [increment]: integer #68 -│ └─ [title]: optional #113 -│ └─ item: union #112 -│ ├─ variant_0: string #69 -│ └─ variant_1: struct #111 -│ └─ [set]: string #69 -└─ [where]: optional '_134_QueryPostWhereInput?' #134 - └─ item: struct 'QueryPostWhereInput' #133 - ├─ [id]: optional '_122__integer_filter_c?' #122 - │ └─ item: optional '_integer_filter_c' #51 - │ └─ item: union #50 - │ ├─ variant_0: either '_integer_filter' #48 - │ │ ├─ variant_0: integer #40 - │ │ ├─ variant_1: struct #43 - │ │ │ └─ [equals]: integer #40 - │ │ ├─ variant_2: struct #44 - │ │ │ └─ [not]: integer #40 - │ │ ├─ variant_3: struct #45 - │ │ │ ├─ [lt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [gt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [lte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ [gte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ variant_4: struct #46 - │ │ │ └─ [in]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_5: struct #47 - │ │ └─ [notIn]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_1: struct #49 - │ └─ [not]: either '_integer_filter' #48 - │ ├─ variant_0: integer #40 - │ ├─ variant_1: struct #43 - │ │ └─ [equals]: integer #40 - │ ├─ variant_2: struct #44 - │ │ └─ [not]: integer #40 - │ ├─ variant_3: struct #45 - │ │ ├─ [lt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [gt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [lte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ └─ [gte]: optional #41 - │ │ └─ item: integer #40 - │ ├─ variant_4: struct #46 - │ │ └─ [in]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_5: struct #47 - │ └─ [notIn]: array #42 - │ └─ item: integer #40 - ├─ [title]: optional '_123__string_filter_c?' #123 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [author]: optional '_127__67WithFilters_norel?' #127 - │ └─ item: struct '_67WithFilters_norel' #126 - │ ├─ [id]: optional '_124__integer_filter_c?' #124 - │ │ └─ item: optional '_integer_filter_c' #51 - │ │ └─ item: union #50 - │ │ ├─ variant_0: either '_integer_filter' #48 - │ │ │ ├─ variant_0: integer #40 - │ │ │ ├─ variant_1: struct #43 - │ │ │ │ └─ [equals]: integer #40 - │ │ │ ├─ variant_2: struct #44 - │ │ │ │ └─ [not]: integer #40 - │ │ │ ├─ variant_3: struct #45 - │ │ │ │ ├─ [lt]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ ├─ [gt]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ ├─ [lte]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ └─ [gte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ variant_4: struct #46 - │ │ │ │ └─ [in]: array #42 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ variant_5: struct #47 - │ │ │ └─ [notIn]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_1: struct #49 - │ │ └─ [not]: either '_integer_filter' #48 - │ │ ├─ variant_0: integer #40 - │ │ ├─ variant_1: struct #43 - │ │ │ └─ [equals]: integer #40 - │ │ ├─ variant_2: struct #44 - │ │ │ └─ [not]: integer #40 - │ │ ├─ variant_3: struct #45 - │ │ │ ├─ [lt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [gt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [lte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ [gte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ variant_4: struct #46 - │ │ │ └─ [in]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_5: struct #47 - │ │ └─ [notIn]: array #42 - │ │ └─ item: integer #40 - │ └─ [name]: optional '_125__string_filter_c?' #125 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [AND]: optional '_131__130_QueryPostWhereInput[]?' #131 - │ └─ item: array '_130_QueryPostWhereInput[]' #130 - │ └─ item: &QueryPostWhereInput #129 - ├─ [OR]: optional '_131__130_QueryPostWhereInput[]?' #131 - │ └─ item: array '_130_QueryPostWhereInput[]' #130 - │ └─ item: &QueryPostWhereInput #129 - └─ [NOT]: optional '_132_QueryPostWhereInput?' #132 - └─ item: &QueryPostWhereInput #129 +root: struct #178 +├─ [data]: struct '_Post_UpdateInput' #171 +│ ├─ [id]: optional #149 +│ │ └─ item: union #148 +│ │ ├─ variant_0: integer #62 +│ │ ├─ variant_1: struct #144 +│ │ │ └─ [set]: integer #62 +│ │ ├─ variant_2: struct #145 +│ │ │ └─ [multiply]: integer #62 +│ │ ├─ variant_3: struct #146 +│ │ │ └─ [decrement]: integer #62 +│ │ └─ variant_4: struct #147 +│ │ └─ [increment]: integer #62 +│ ├─ [title]: optional #152 +│ │ └─ item: union #151 +│ │ ├─ variant_0: string #63 +│ │ └─ variant_1: struct #150 +│ │ └─ [set]: string #63 +│ └─ [author]: optional #170 +│ └─ item: union #169 +│ ├─ variant_0: struct #155 +│ │ └─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #153 +│ │ ├─ [id]: integer #57 +│ │ └─ [name]: string #58 +│ ├─ variant_1: struct #156 +│ │ └─ [connect]: struct 'UserWhere' #136 +│ │ ├─ [id]: optional '_121__integer_filter_c?' #121 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [name]: optional '_122__string_filter_c?' #122 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [posts]: optional #135 +│ │ └─ item: union #134 +│ │ ├─ variant_0: struct #129 +│ │ │ └─ [every]: optional '_128_PostWhere__skip_61_UserWhere?' #128 +│ │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ │ └─ item: &UserWhere #125 +│ │ ├─ variant_1: struct #131 +│ │ │ └─ [some]: optional '_130_PostWhere__skip_61_UserWhere?' #130 +│ │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ │ └─ item: &UserWhere #125 +│ │ └─ variant_2: struct #133 +│ │ └─ [none]: optional '_132_PostWhere__skip_61_UserWhere?' #132 +│ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ └─ item: &UserWhere #125 +│ ├─ variant_2: struct #157 +│ │ └─ [connectOrCreate]: struct #154 +│ │ ├─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #153 +│ │ │ ├─ [id]: integer #57 +│ │ │ └─ [name]: string #58 +│ │ └─ [where]: struct 'UserWhere' #136 +│ │ ├─ [id]: optional '_121__integer_filter_c?' #121 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [name]: optional '_122__string_filter_c?' #122 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [posts]: optional #135 +│ │ └─ item: union #134 +│ │ ├─ variant_0: struct #129 +│ │ │ └─ [every]: optional '_128_PostWhere__skip_61_UserWhere?' #128 +│ │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ │ └─ item: &UserWhere #125 +│ │ ├─ variant_1: struct #131 +│ │ │ └─ [some]: optional '_130_PostWhere__skip_61_UserWhere?' #130 +│ │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ │ └─ item: &UserWhere #125 +│ │ └─ variant_2: struct #133 +│ │ └─ [none]: optional '_132_PostWhere__skip_61_UserWhere?' #132 +│ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 +│ │ ├─ [id]: optional '_123__integer_filter_c?' #123 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [title]: optional '_124__string_filter_c?' #124 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [author]: optional '_126_UserWhere?' #126 +│ │ └─ item: &UserWhere #125 +│ └─ variant_3: struct #168 +│ └─ [update]: struct '_User_UpdateInput_excluding___rel_Post_User_1' #167 +│ ├─ [id]: optional #163 +│ │ └─ item: union #162 +│ │ ├─ variant_0: integer #57 +│ │ ├─ variant_1: struct #158 +│ │ │ └─ [set]: integer #57 +│ │ ├─ variant_2: struct #159 +│ │ │ └─ [multiply]: integer #57 +│ │ ├─ variant_3: struct #160 +│ │ │ └─ [decrement]: integer #57 +│ │ └─ variant_4: struct #161 +│ │ └─ [increment]: integer #57 +│ └─ [name]: optional #166 +│ └─ item: union #165 +│ ├─ variant_0: string #58 +│ └─ variant_1: struct #164 +│ └─ [set]: string #58 +└─ [where]: optional '_177_QueryPostWhereInput?' #177 + └─ item: struct 'QueryPostWhereInput' #176 + ├─ [id]: optional '_77__integer_filter_c?' #77 + │ └─ item: optional '_integer_filter_c' #47 + │ └─ item: union #46 + │ ├─ variant_0: either '_integer_filter' #44 + │ │ ├─ variant_0: integer #36 + │ │ ├─ variant_1: struct #39 + │ │ │ └─ [equals]: integer #36 + │ │ ├─ variant_2: struct #40 + │ │ │ └─ [not]: integer #36 + │ │ ├─ variant_3: struct #41 + │ │ │ ├─ [lt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [gt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [lte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ [gte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ variant_4: struct #42 + │ │ │ └─ [in]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_5: struct #43 + │ │ └─ [notIn]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_1: struct #45 + │ └─ [not]: either '_integer_filter' #44 + │ ├─ variant_0: integer #36 + │ ├─ variant_1: struct #39 + │ │ └─ [equals]: integer #36 + │ ├─ variant_2: struct #40 + │ │ └─ [not]: integer #36 + │ ├─ variant_3: struct #41 + │ │ ├─ [lt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [gt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [lte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ └─ [gte]: optional #37 + │ │ └─ item: integer #36 + │ ├─ variant_4: struct #42 + │ │ └─ [in]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_5: struct #43 + │ └─ [notIn]: array #38 + │ └─ item: integer #36 + ├─ [title]: optional '_78__string_filter_c?' #78 + │ └─ item: optional '_string_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ variant_1: struct #31 + │ └─ [not]: union '_string_filter' #30 + │ ├─ variant_0: string #18 + │ ├─ variant_1: struct #21 + │ │ └─ [equals]: string #18 + │ ├─ variant_2: struct #22 + │ │ └─ [not]: string #18 + │ ├─ variant_3: struct #23 + │ │ └─ [in]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_4: struct #24 + │ │ └─ [notIn]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_5: struct #27 + │ │ ├─ [contains]: string #18 + │ │ └─ [mode]: optional #26 + │ │ └─ item: string #25 enum{ '"insensitive"' } + │ ├─ variant_6: struct #28 + │ │ └─ [search]: string #18 + │ └─ variant_7: struct #29 + │ ├─ [startsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [endsWith]: optional #19 + │ └─ item: string #18 + ├─ [author]: optional '_91_UserWhere__skip_65_PostWhere?' #91 + │ └─ item: struct 'UserWhere__skip_65_PostWhere' #90 + │ ├─ [id]: optional '_79__integer_filter_c?' #79 + │ │ └─ item: optional '_integer_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: either '_integer_filter' #44 + │ │ │ ├─ variant_0: integer #36 + │ │ │ ├─ variant_1: struct #39 + │ │ │ │ └─ [equals]: integer #36 + │ │ │ ├─ variant_2: struct #40 + │ │ │ │ └─ [not]: integer #36 + │ │ │ ├─ variant_3: struct #41 + │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ variant_4: struct #42 + │ │ │ │ └─ [in]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_5: struct #43 + │ │ │ └─ [notIn]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: either '_integer_filter' #44 + │ │ ├─ variant_0: integer #36 + │ │ ├─ variant_1: struct #39 + │ │ │ └─ [equals]: integer #36 + │ │ ├─ variant_2: struct #40 + │ │ │ └─ [not]: integer #36 + │ │ ├─ variant_3: struct #41 + │ │ │ ├─ [lt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [gt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [lte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ [gte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ variant_4: struct #42 + │ │ │ └─ [in]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_5: struct #43 + │ │ └─ [notIn]: array #38 + │ │ └─ item: integer #36 + │ ├─ [name]: optional '_80__string_filter_c?' #80 + │ │ └─ item: optional '_string_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: union '_string_filter' #30 + │ │ │ ├─ variant_0: string #18 + │ │ │ ├─ variant_1: struct #21 + │ │ │ │ └─ [equals]: string #18 + │ │ │ ├─ variant_2: struct #22 + │ │ │ │ └─ [not]: string #18 + │ │ │ ├─ variant_3: struct #23 + │ │ │ │ └─ [in]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_4: struct #24 + │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_5: struct #27 + │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #28 + │ │ │ │ └─ [search]: string #18 + │ │ │ └─ variant_7: struct #29 + │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ [endsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [posts]: optional #89 + │ └─ item: union #88 + │ ├─ variant_0: struct #83 + │ │ └─ [every]: optional '_82_PostWhere?' #82 + │ │ └─ item: &PostWhere #81 + │ ├─ variant_1: struct #85 + │ │ └─ [some]: optional '_84_PostWhere?' #84 + │ │ └─ item: &PostWhere #81 + │ └─ variant_2: struct #87 + │ └─ [none]: optional '_86_PostWhere?' #86 + │ └─ item: &PostWhere #81 + ├─ [AND]: optional '_174__173_QueryPostWhereInput[]?' #174 + │ └─ item: array '_173_QueryPostWhereInput[]' #173 + │ └─ item: &QueryPostWhereInput #172 + ├─ [OR]: optional '_174__173_QueryPostWhereInput[]?' #174 + │ └─ item: array '_173_QueryPostWhereInput[]' #173 + │ └─ item: &QueryPostWhereInput #172 + └─ [NOT]: optional '_175_QueryPostWhereInput?' #175 + └─ item: &QueryPostWhereInput #172 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Record inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Record inp.snap index d15858feda..25d53e8836 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Record inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many Record inp.snap @@ -1,8 +1,8 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #60 +root: struct #56 ├─ [data]: struct '_Record_UpdateInput' #17 │ ├─ [id]: optional #7 │ │ └─ item: union #6 @@ -16,7 +16,8 @@ root: struct #60 │ │ └─ [set]: string #1 │ └─ [age]: optional #16 │ └─ item: union #15 -│ ├─ variant_0: integer #2 +│ ├─ variant_0: optional #3 +│ │ └─ item: integer #2 │ ├─ variant_1: struct #11 │ │ └─ [set]: optional #3 │ │ └─ item: integer #2 @@ -26,160 +27,160 @@ root: struct #60 │ │ └─ [decrement]: integer #2 │ └─ variant_4: struct #14 │ └─ [increment]: integer #2 -└─ [where]: optional '_59_QueryRecordWhereInput?' #59 - └─ item: struct 'QueryRecordWhereInput' #58 - ├─ [id]: optional '_38__string_filter_c?' #38 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [name]: optional '_39__string_filter_c?' #39 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [age]: optional '_52__integer_filter_c?' #52 - │ └─ item: optional '_integer_filter_c' #51 - │ └─ item: union #50 - │ ├─ variant_0: either '_integer_filter' #48 - │ │ ├─ variant_0: integer #40 - │ │ ├─ variant_1: struct #43 - │ │ │ └─ [equals]: integer #40 - │ │ ├─ variant_2: struct #44 - │ │ │ └─ [not]: integer #40 - │ │ ├─ variant_3: struct #45 - │ │ │ ├─ [lt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [gt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [lte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ [gte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ variant_4: struct #46 - │ │ │ └─ [in]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_5: struct #47 - │ │ └─ [notIn]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_1: struct #49 - │ └─ [not]: either '_integer_filter' #48 - │ ├─ variant_0: integer #40 - │ ├─ variant_1: struct #43 - │ │ └─ [equals]: integer #40 - │ ├─ variant_2: struct #44 - │ │ └─ [not]: integer #40 - │ ├─ variant_3: struct #45 - │ │ ├─ [lt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [gt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [lte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ └─ [gte]: optional #41 - │ │ └─ item: integer #40 - │ ├─ variant_4: struct #46 - │ │ └─ [in]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_5: struct #47 - │ └─ [notIn]: array #42 - │ └─ item: integer #40 - ├─ [AND]: optional '_56__55_QueryRecordWhereInput[]?' #56 - │ └─ item: array '_55_QueryRecordWhereInput[]' #55 - │ └─ item: &QueryRecordWhereInput #54 - ├─ [OR]: optional '_56__55_QueryRecordWhereInput[]?' #56 - │ └─ item: array '_55_QueryRecordWhereInput[]' #55 - │ └─ item: &QueryRecordWhereInput #54 - └─ [NOT]: optional '_57_QueryRecordWhereInput?' #57 - └─ item: &QueryRecordWhereInput #54 +└─ [where]: optional '_55_QueryRecordWhereInput?' #55 + └─ item: struct 'QueryRecordWhereInput' #54 + ├─ [id]: optional '_34__string_filter_c?' #34 + │ └─ item: optional '_string_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ variant_1: struct #31 + │ └─ [not]: union '_string_filter' #30 + │ ├─ variant_0: string #18 + │ ├─ variant_1: struct #21 + │ │ └─ [equals]: string #18 + │ ├─ variant_2: struct #22 + │ │ └─ [not]: string #18 + │ ├─ variant_3: struct #23 + │ │ └─ [in]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_4: struct #24 + │ │ └─ [notIn]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_5: struct #27 + │ │ ├─ [contains]: string #18 + │ │ └─ [mode]: optional #26 + │ │ └─ item: string #25 enum{ '"insensitive"' } + │ ├─ variant_6: struct #28 + │ │ └─ [search]: string #18 + │ └─ variant_7: struct #29 + │ ├─ [startsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [endsWith]: optional #19 + │ └─ item: string #18 + ├─ [name]: optional '_35__string_filter_c?' #35 + │ └─ item: optional '_string_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ variant_1: struct #31 + │ └─ [not]: union '_string_filter' #30 + │ ├─ variant_0: string #18 + │ ├─ variant_1: struct #21 + │ │ └─ [equals]: string #18 + │ ├─ variant_2: struct #22 + │ │ └─ [not]: string #18 + │ ├─ variant_3: struct #23 + │ │ └─ [in]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_4: struct #24 + │ │ └─ [notIn]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_5: struct #27 + │ │ ├─ [contains]: string #18 + │ │ └─ [mode]: optional #26 + │ │ └─ item: string #25 enum{ '"insensitive"' } + │ ├─ variant_6: struct #28 + │ │ └─ [search]: string #18 + │ └─ variant_7: struct #29 + │ ├─ [startsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [endsWith]: optional #19 + │ └─ item: string #18 + ├─ [age]: optional '_48__integer_filter_c?' #48 + │ └─ item: optional '_integer_filter_c' #47 + │ └─ item: union #46 + │ ├─ variant_0: either '_integer_filter' #44 + │ │ ├─ variant_0: integer #36 + │ │ ├─ variant_1: struct #39 + │ │ │ └─ [equals]: integer #36 + │ │ ├─ variant_2: struct #40 + │ │ │ └─ [not]: integer #36 + │ │ ├─ variant_3: struct #41 + │ │ │ ├─ [lt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [gt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [lte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ [gte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ variant_4: struct #42 + │ │ │ └─ [in]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_5: struct #43 + │ │ └─ [notIn]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_1: struct #45 + │ └─ [not]: either '_integer_filter' #44 + │ ├─ variant_0: integer #36 + │ ├─ variant_1: struct #39 + │ │ └─ [equals]: integer #36 + │ ├─ variant_2: struct #40 + │ │ └─ [not]: integer #36 + │ ├─ variant_3: struct #41 + │ │ ├─ [lt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [gt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [lte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ └─ [gte]: optional #37 + │ │ └─ item: integer #36 + │ ├─ variant_4: struct #42 + │ │ └─ [in]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_5: struct #43 + │ └─ [notIn]: array #38 + │ └─ item: integer #36 + ├─ [AND]: optional '_52__51_QueryRecordWhereInput[]?' #52 + │ └─ item: array '_51_QueryRecordWhereInput[]' #51 + │ └─ item: &QueryRecordWhereInput #50 + ├─ [OR]: optional '_52__51_QueryRecordWhereInput[]?' #52 + │ └─ item: array '_51_QueryRecordWhereInput[]' #51 + │ └─ item: &QueryRecordWhereInput #50 + └─ [NOT]: optional '_53_QueryRecordWhereInput?' #53 + └─ item: &QueryRecordWhereInput #50 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many User inp.snap index 286989789a..46abab4ad6 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_many User inp.snap @@ -1,227 +1,1321 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #102 -├─ [data]: struct '_User_UpdateInput' #81 -│ ├─ [id]: optional #77 -│ │ └─ item: union #76 -│ │ ├─ variant_0: integer #63 -│ │ ├─ variant_1: struct #72 -│ │ │ └─ [set]: integer #63 -│ │ ├─ variant_2: struct #73 -│ │ │ └─ [multiply]: integer #63 -│ │ ├─ variant_3: struct #74 -│ │ │ └─ [decrement]: integer #63 -│ │ └─ variant_4: struct #75 -│ │ └─ [increment]: integer #63 -│ └─ [name]: optional #80 -│ └─ item: union #79 -│ ├─ variant_0: string #64 -│ └─ variant_1: struct #78 -│ └─ [set]: string #64 -└─ [where]: optional '_101_QueryUserWhereInput?' #101 - └─ item: struct 'QueryUserWhereInput' #100 - ├─ [id]: optional '_89__integer_filter_c?' #89 - │ └─ item: optional '_integer_filter_c' #51 - │ └─ item: union #50 - │ ├─ variant_0: either '_integer_filter' #48 - │ │ ├─ variant_0: integer #40 - │ │ ├─ variant_1: struct #43 - │ │ │ └─ [equals]: integer #40 - │ │ ├─ variant_2: struct #44 - │ │ │ └─ [not]: integer #40 - │ │ ├─ variant_3: struct #45 - │ │ │ ├─ [lt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [gt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [lte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ [gte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ variant_4: struct #46 - │ │ │ └─ [in]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_5: struct #47 - │ │ └─ [notIn]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_1: struct #49 - │ └─ [not]: either '_integer_filter' #48 - │ ├─ variant_0: integer #40 - │ ├─ variant_1: struct #43 - │ │ └─ [equals]: integer #40 - │ ├─ variant_2: struct #44 - │ │ └─ [not]: integer #40 - │ ├─ variant_3: struct #45 - │ │ ├─ [lt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [gt]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ [lte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ └─ [gte]: optional #41 - │ │ └─ item: integer #40 - │ ├─ variant_4: struct #46 - │ │ └─ [in]: array #42 - │ │ └─ item: integer #40 - │ └─ variant_5: struct #47 - │ └─ [notIn]: array #42 - │ └─ item: integer #40 - ├─ [name]: optional '_90__string_filter_c?' #90 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [posts]: optional '_94__71WithFilters_norel?' #94 - │ └─ item: struct '_71WithFilters_norel' #93 - │ ├─ [id]: optional '_91__integer_filter_c?' #91 - │ │ └─ item: optional '_integer_filter_c' #51 - │ │ └─ item: union #50 - │ │ ├─ variant_0: either '_integer_filter' #48 - │ │ │ ├─ variant_0: integer #40 - │ │ │ ├─ variant_1: struct #43 - │ │ │ │ └─ [equals]: integer #40 - │ │ │ ├─ variant_2: struct #44 - │ │ │ │ └─ [not]: integer #40 - │ │ │ ├─ variant_3: struct #45 - │ │ │ │ ├─ [lt]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ ├─ [gt]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ ├─ [lte]: optional #41 - │ │ │ │ │ └─ item: integer #40 - │ │ │ │ └─ [gte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ variant_4: struct #46 - │ │ │ │ └─ [in]: array #42 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ variant_5: struct #47 - │ │ │ └─ [notIn]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_1: struct #49 - │ │ └─ [not]: either '_integer_filter' #48 - │ │ ├─ variant_0: integer #40 - │ │ ├─ variant_1: struct #43 - │ │ │ └─ [equals]: integer #40 - │ │ ├─ variant_2: struct #44 - │ │ │ └─ [not]: integer #40 - │ │ ├─ variant_3: struct #45 - │ │ │ ├─ [lt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [gt]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ ├─ [lte]: optional #41 - │ │ │ │ └─ item: integer #40 - │ │ │ └─ [gte]: optional #41 - │ │ │ └─ item: integer #40 - │ │ ├─ variant_4: struct #46 - │ │ │ └─ [in]: array #42 - │ │ │ └─ item: integer #40 - │ │ └─ variant_5: struct #47 - │ │ └─ [notIn]: array #42 - │ │ └─ item: integer #40 - │ └─ [title]: optional '_92__string_filter_c?' #92 - │ └─ item: optional '_string_filter_c' #37 - │ └─ item: union #36 - │ ├─ variant_0: union '_string_filter' #34 - │ │ ├─ variant_0: string #22 - │ │ ├─ variant_1: struct #25 - │ │ │ └─ [equals]: string #22 - │ │ ├─ variant_2: struct #26 - │ │ │ └─ [not]: string #22 - │ │ ├─ variant_3: struct #27 - │ │ │ └─ [in]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_4: struct #28 - │ │ │ └─ [notIn]: array #24 - │ │ │ └─ item: string #22 - │ │ ├─ variant_5: struct #31 - │ │ │ ├─ [contains]: string #22 - │ │ │ └─ [mode]: optional #30 - │ │ │ └─ item: string #29 enum{ '"insensitive"' } - │ │ ├─ variant_6: struct #32 - │ │ │ └─ [search]: string #22 - │ │ └─ variant_7: struct #33 - │ │ ├─ [startsWith]: optional #23 - │ │ │ └─ item: string #22 - │ │ └─ [endsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ variant_1: struct #35 - │ └─ [not]: union '_string_filter' #34 - │ ├─ variant_0: string #22 - │ ├─ variant_1: struct #25 - │ │ └─ [equals]: string #22 - │ ├─ variant_2: struct #26 - │ │ └─ [not]: string #22 - │ ├─ variant_3: struct #27 - │ │ └─ [in]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_4: struct #28 - │ │ └─ [notIn]: array #24 - │ │ └─ item: string #22 - │ ├─ variant_5: struct #31 - │ │ ├─ [contains]: string #22 - │ │ └─ [mode]: optional #30 - │ │ └─ item: string #29 enum{ '"insensitive"' } - │ ├─ variant_6: struct #32 - │ │ └─ [search]: string #22 - │ └─ variant_7: struct #33 - │ ├─ [startsWith]: optional #23 - │ │ └─ item: string #22 - │ └─ [endsWith]: optional #23 - │ └─ item: string #22 - ├─ [AND]: optional '_98__97_QueryUserWhereInput[]?' #98 - │ └─ item: array '_97_QueryUserWhereInput[]' #97 - │ └─ item: &QueryUserWhereInput #96 - ├─ [OR]: optional '_98__97_QueryUserWhereInput[]?' #98 - │ └─ item: array '_97_QueryUserWhereInput[]' #97 - │ └─ item: &QueryUserWhereInput #96 - └─ [NOT]: optional '_99_QueryUserWhereInput?' #99 - └─ item: &QueryUserWhereInput #96 +root: struct #143 +├─ [data]: struct '_User_UpdateInput' #120 +│ ├─ [id]: optional #71 +│ │ └─ item: union #70 +│ │ ├─ variant_0: integer #57 +│ │ ├─ variant_1: struct #66 +│ │ │ └─ [set]: integer #57 +│ │ ├─ variant_2: struct #67 +│ │ │ └─ [multiply]: integer #57 +│ │ ├─ variant_3: struct #68 +│ │ │ └─ [decrement]: integer #57 +│ │ └─ variant_4: struct #69 +│ │ └─ [increment]: integer #57 +│ ├─ [name]: optional #74 +│ │ └─ item: union #73 +│ │ ├─ variant_0: string #58 +│ │ └─ variant_1: struct #72 +│ │ └─ [set]: string #58 +│ └─ [posts]: optional #119 +│ └─ item: union #118 +│ ├─ variant_0: struct #94 +│ │ └─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #76 +│ │ ├─ [id]: optional #75 +│ │ │ └─ item: integer #62 +│ │ └─ [title]: string #63 +│ ├─ variant_1: struct #95 +│ │ └─ [connect]: struct 'PostWhere' #92 +│ │ ├─ [id]: optional '_77__integer_filter_c?' #77 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [title]: optional '_78__string_filter_c?' #78 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [author]: optional '_91_UserWhere__skip_65_PostWhere?' #91 +│ │ └─ item: struct 'UserWhere__skip_65_PostWhere' #90 +│ │ ├─ [id]: optional '_79__integer_filter_c?' #79 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [name]: optional '_80__string_filter_c?' #80 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [posts]: optional #89 +│ │ └─ item: union #88 +│ │ ├─ variant_0: struct #83 +│ │ │ └─ [every]: optional '_82_PostWhere?' #82 +│ │ │ └─ item: &PostWhere #81 +│ │ ├─ variant_1: struct #85 +│ │ │ └─ [some]: optional '_84_PostWhere?' #84 +│ │ │ └─ item: &PostWhere #81 +│ │ └─ variant_2: struct #87 +│ │ └─ [none]: optional '_86_PostWhere?' #86 +│ │ └─ item: &PostWhere #81 +│ ├─ variant_2: struct #96 +│ │ └─ [connectOrCreate]: struct #93 +│ │ ├─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #76 +│ │ │ ├─ [id]: optional #75 +│ │ │ │ └─ item: integer #62 +│ │ │ └─ [title]: string #63 +│ │ └─ [where]: struct 'PostWhere' #92 +│ │ ├─ [id]: optional '_77__integer_filter_c?' #77 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [title]: optional '_78__string_filter_c?' #78 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [author]: optional '_91_UserWhere__skip_65_PostWhere?' #91 +│ │ └─ item: struct 'UserWhere__skip_65_PostWhere' #90 +│ │ ├─ [id]: optional '_79__integer_filter_c?' #79 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [name]: optional '_80__string_filter_c?' #80 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [posts]: optional #89 +│ │ └─ item: union #88 +│ │ ├─ variant_0: struct #83 +│ │ │ └─ [every]: optional '_82_PostWhere?' #82 +│ │ │ └─ item: &PostWhere #81 +│ │ ├─ variant_1: struct #85 +│ │ │ └─ [some]: optional '_84_PostWhere?' #84 +│ │ │ └─ item: &PostWhere #81 +│ │ └─ variant_2: struct #87 +│ │ └─ [none]: optional '_86_PostWhere?' #86 +│ │ └─ item: &PostWhere #81 +│ ├─ variant_3: struct #107 +│ │ └─ [update]: struct '_Post_UpdateInput_excluding___rel_Post_User_1' #106 +│ │ ├─ [id]: optional #102 +│ │ │ └─ item: union #101 +│ │ │ ├─ variant_0: integer #62 +│ │ │ ├─ variant_1: struct #97 +│ │ │ │ └─ [set]: integer #62 +│ │ │ ├─ variant_2: struct #98 +│ │ │ │ └─ [multiply]: integer #62 +│ │ │ ├─ variant_3: struct #99 +│ │ │ │ └─ [decrement]: integer #62 +│ │ │ └─ variant_4: struct #100 +│ │ │ └─ [increment]: integer #62 +│ │ └─ [title]: optional #105 +│ │ └─ item: union #104 +│ │ ├─ variant_0: string #63 +│ │ └─ variant_1: struct #103 +│ │ └─ [set]: string #63 +│ ├─ variant_4: struct #110 +│ │ └─ [updateMany]: struct #109 +│ │ ├─ [where]: optional '_108_PostWhere?' #108 +│ │ │ └─ item: struct 'PostWhere' #92 +│ │ │ ├─ [id]: optional '_77__integer_filter_c?' #77 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [title]: optional '_78__string_filter_c?' #78 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [author]: optional '_91_UserWhere__skip_65_PostWhere?' #91 +│ │ │ └─ item: struct 'UserWhere__skip_65_PostWhere' #90 +│ │ │ ├─ [id]: optional '_79__integer_filter_c?' #79 +│ │ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ │ └─ item: union #46 +│ │ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ variant_5: struct #43 +│ │ │ │ │ └─ [notIn]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_1: struct #45 +│ │ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ [name]: optional '_80__string_filter_c?' #80 +│ │ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ │ └─ item: union #32 +│ │ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ │ ├─ variant_0: string #18 +│ │ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ │ └─ [not]: string #18 +│ │ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ │ └─ [search]: string #18 +│ │ │ │ │ └─ variant_7: struct #29 +│ │ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ │ └─ item: string #18 +│ │ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ variant_1: struct #31 +│ │ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [posts]: optional #89 +│ │ │ └─ item: union #88 +│ │ │ ├─ variant_0: struct #83 +│ │ │ │ └─ [every]: optional '_82_PostWhere?' #82 +│ │ │ │ └─ item: &PostWhere #81 +│ │ │ ├─ variant_1: struct #85 +│ │ │ │ └─ [some]: optional '_84_PostWhere?' #84 +│ │ │ │ └─ item: &PostWhere #81 +│ │ │ └─ variant_2: struct #87 +│ │ │ └─ [none]: optional '_86_PostWhere?' #86 +│ │ │ └─ item: &PostWhere #81 +│ │ └─ [data]: struct '_Post_UpdateInput_excluding___rel_Post_User_1' #106 +│ │ ├─ [id]: optional #102 +│ │ │ └─ item: union #101 +│ │ │ ├─ variant_0: integer #62 +│ │ │ ├─ variant_1: struct #97 +│ │ │ │ └─ [set]: integer #62 +│ │ │ ├─ variant_2: struct #98 +│ │ │ │ └─ [multiply]: integer #62 +│ │ │ ├─ variant_3: struct #99 +│ │ │ │ └─ [decrement]: integer #62 +│ │ │ └─ variant_4: struct #100 +│ │ │ └─ [increment]: integer #62 +│ │ └─ [title]: optional #105 +│ │ └─ item: union #104 +│ │ ├─ variant_0: string #63 +│ │ └─ variant_1: struct #103 +│ │ └─ [set]: string #63 +│ ├─ variant_5: struct #113 +│ │ └─ [deleteMany]: struct #112 +│ │ └─ [where]: optional '_111_PostWhere?' #111 +│ │ └─ item: struct 'PostWhere' #92 +│ │ ├─ [id]: optional '_77__integer_filter_c?' #77 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [title]: optional '_78__string_filter_c?' #78 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [author]: optional '_91_UserWhere__skip_65_PostWhere?' #91 +│ │ └─ item: struct 'UserWhere__skip_65_PostWhere' #90 +│ │ ├─ [id]: optional '_79__integer_filter_c?' #79 +│ │ │ └─ item: optional '_integer_filter_c' #47 +│ │ │ └─ item: union #46 +│ │ │ ├─ variant_0: either '_integer_filter' #44 +│ │ │ │ ├─ variant_0: integer #36 +│ │ │ │ ├─ variant_1: struct #39 +│ │ │ │ │ └─ [equals]: integer #36 +│ │ │ │ ├─ variant_2: struct #40 +│ │ │ │ │ └─ [not]: integer #36 +│ │ │ │ ├─ variant_3: struct #41 +│ │ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ │ └─ item: integer #36 +│ │ │ │ │ └─ [gte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ variant_4: struct #42 +│ │ │ │ │ └─ [in]: array #38 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ variant_5: struct #43 +│ │ │ │ └─ [notIn]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_1: struct #45 +│ │ │ └─ [not]: either '_integer_filter' #44 +│ │ │ ├─ variant_0: integer #36 +│ │ │ ├─ variant_1: struct #39 +│ │ │ │ └─ [equals]: integer #36 +│ │ │ ├─ variant_2: struct #40 +│ │ │ │ └─ [not]: integer #36 +│ │ │ ├─ variant_3: struct #41 +│ │ │ │ ├─ [lt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [gt]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ ├─ [lte]: optional #37 +│ │ │ │ │ └─ item: integer #36 +│ │ │ │ └─ [gte]: optional #37 +│ │ │ │ └─ item: integer #36 +│ │ │ ├─ variant_4: struct #42 +│ │ │ │ └─ [in]: array #38 +│ │ │ │ └─ item: integer #36 +│ │ │ └─ variant_5: struct #43 +│ │ │ └─ [notIn]: array #38 +│ │ │ └─ item: integer #36 +│ │ ├─ [name]: optional '_80__string_filter_c?' #80 +│ │ │ └─ item: optional '_string_filter_c' #33 +│ │ │ └─ item: union #32 +│ │ │ ├─ variant_0: union '_string_filter' #30 +│ │ │ │ ├─ variant_0: string #18 +│ │ │ │ ├─ variant_1: struct #21 +│ │ │ │ │ └─ [equals]: string #18 +│ │ │ │ ├─ variant_2: struct #22 +│ │ │ │ │ └─ [not]: string #18 +│ │ │ │ ├─ variant_3: struct #23 +│ │ │ │ │ └─ [in]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_4: struct #24 +│ │ │ │ │ └─ [notIn]: array #20 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ ├─ variant_5: struct #27 +│ │ │ │ │ ├─ [contains]: string #18 +│ │ │ │ │ └─ [mode]: optional #26 +│ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #28 +│ │ │ │ │ └─ [search]: string #18 +│ │ │ │ └─ variant_7: struct #29 +│ │ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ │ └─ item: string #18 +│ │ │ │ └─ [endsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ variant_1: struct #31 +│ │ │ └─ [not]: union '_string_filter' #30 +│ │ │ ├─ variant_0: string #18 +│ │ │ ├─ variant_1: struct #21 +│ │ │ │ └─ [equals]: string #18 +│ │ │ ├─ variant_2: struct #22 +│ │ │ │ └─ [not]: string #18 +│ │ │ ├─ variant_3: struct #23 +│ │ │ │ └─ [in]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_4: struct #24 +│ │ │ │ └─ [notIn]: array #20 +│ │ │ │ └─ item: string #18 +│ │ │ ├─ variant_5: struct #27 +│ │ │ │ ├─ [contains]: string #18 +│ │ │ │ └─ [mode]: optional #26 +│ │ │ │ └─ item: string #25 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #28 +│ │ │ │ └─ [search]: string #18 +│ │ │ └─ variant_7: struct #29 +│ │ │ ├─ [startsWith]: optional #19 +│ │ │ │ └─ item: string #18 +│ │ │ └─ [endsWith]: optional #19 +│ │ │ └─ item: string #18 +│ │ └─ [posts]: optional #89 +│ │ └─ item: union #88 +│ │ ├─ variant_0: struct #83 +│ │ │ └─ [every]: optional '_82_PostWhere?' #82 +│ │ │ └─ item: &PostWhere #81 +│ │ ├─ variant_1: struct #85 +│ │ │ └─ [some]: optional '_84_PostWhere?' #84 +│ │ │ └─ item: &PostWhere #81 +│ │ └─ variant_2: struct #87 +│ │ └─ [none]: optional '_86_PostWhere?' #86 +│ │ └─ item: &PostWhere #81 +│ └─ variant_6: struct #117 +│ └─ [createMany]: optional #116 +│ └─ item: struct #115 +│ └─ [data]: array '_114__Post_CreateInput_excluding___rel_Post_User_1[]' #114 +│ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #76 +│ ├─ [id]: optional #75 +│ │ └─ item: integer #62 +│ └─ [title]: string #63 +└─ [where]: optional '_142_QueryUserWhereInput?' #142 + └─ item: struct 'QueryUserWhereInput' #141 + ├─ [id]: optional '_121__integer_filter_c?' #121 + │ └─ item: optional '_integer_filter_c' #47 + │ └─ item: union #46 + │ ├─ variant_0: either '_integer_filter' #44 + │ │ ├─ variant_0: integer #36 + │ │ ├─ variant_1: struct #39 + │ │ │ └─ [equals]: integer #36 + │ │ ├─ variant_2: struct #40 + │ │ │ └─ [not]: integer #36 + │ │ ├─ variant_3: struct #41 + │ │ │ ├─ [lt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [gt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [lte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ [gte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ variant_4: struct #42 + │ │ │ └─ [in]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_5: struct #43 + │ │ └─ [notIn]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_1: struct #45 + │ └─ [not]: either '_integer_filter' #44 + │ ├─ variant_0: integer #36 + │ ├─ variant_1: struct #39 + │ │ └─ [equals]: integer #36 + │ ├─ variant_2: struct #40 + │ │ └─ [not]: integer #36 + │ ├─ variant_3: struct #41 + │ │ ├─ [lt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [gt]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ [lte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ └─ [gte]: optional #37 + │ │ └─ item: integer #36 + │ ├─ variant_4: struct #42 + │ │ └─ [in]: array #38 + │ │ └─ item: integer #36 + │ └─ variant_5: struct #43 + │ └─ [notIn]: array #38 + │ └─ item: integer #36 + ├─ [name]: optional '_122__string_filter_c?' #122 + │ └─ item: optional '_string_filter_c' #33 + │ └─ item: union #32 + │ ├─ variant_0: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ variant_1: struct #31 + │ └─ [not]: union '_string_filter' #30 + │ ├─ variant_0: string #18 + │ ├─ variant_1: struct #21 + │ │ └─ [equals]: string #18 + │ ├─ variant_2: struct #22 + │ │ └─ [not]: string #18 + │ ├─ variant_3: struct #23 + │ │ └─ [in]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_4: struct #24 + │ │ └─ [notIn]: array #20 + │ │ └─ item: string #18 + │ ├─ variant_5: struct #27 + │ │ ├─ [contains]: string #18 + │ │ └─ [mode]: optional #26 + │ │ └─ item: string #25 enum{ '"insensitive"' } + │ ├─ variant_6: struct #28 + │ │ └─ [search]: string #18 + │ └─ variant_7: struct #29 + │ ├─ [startsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [endsWith]: optional #19 + │ └─ item: string #18 + ├─ [posts]: optional #135 + │ └─ item: union #134 + │ ├─ variant_0: struct #129 + │ │ └─ [every]: optional '_128_PostWhere__skip_61_UserWhere?' #128 + │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 + │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 + │ │ │ └─ item: optional '_integer_filter_c' #47 + │ │ │ └─ item: union #46 + │ │ │ ├─ variant_0: either '_integer_filter' #44 + │ │ │ │ ├─ variant_0: integer #36 + │ │ │ │ ├─ variant_1: struct #39 + │ │ │ │ │ └─ [equals]: integer #36 + │ │ │ │ ├─ variant_2: struct #40 + │ │ │ │ │ └─ [not]: integer #36 + │ │ │ │ ├─ variant_3: struct #41 + │ │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ variant_4: struct #42 + │ │ │ │ │ └─ [in]: array #38 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ variant_5: struct #43 + │ │ │ │ └─ [notIn]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_1: struct #45 + │ │ │ └─ [not]: either '_integer_filter' #44 + │ │ │ ├─ variant_0: integer #36 + │ │ │ ├─ variant_1: struct #39 + │ │ │ │ └─ [equals]: integer #36 + │ │ │ ├─ variant_2: struct #40 + │ │ │ │ └─ [not]: integer #36 + │ │ │ ├─ variant_3: struct #41 + │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ variant_4: struct #42 + │ │ │ │ └─ [in]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_5: struct #43 + │ │ │ └─ [notIn]: array #38 + │ │ │ └─ item: integer #36 + │ │ ├─ [title]: optional '_124__string_filter_c?' #124 + │ │ │ └─ item: optional '_string_filter_c' #33 + │ │ │ └─ item: union #32 + │ │ │ ├─ variant_0: union '_string_filter' #30 + │ │ │ │ ├─ variant_0: string #18 + │ │ │ │ ├─ variant_1: struct #21 + │ │ │ │ │ └─ [equals]: string #18 + │ │ │ │ ├─ variant_2: struct #22 + │ │ │ │ │ └─ [not]: string #18 + │ │ │ │ ├─ variant_3: struct #23 + │ │ │ │ │ └─ [in]: array #20 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ ├─ variant_4: struct #24 + │ │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ ├─ variant_5: struct #27 + │ │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #28 + │ │ │ │ │ └─ [search]: string #18 + │ │ │ │ └─ variant_7: struct #29 + │ │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ └─ [endsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ variant_1: struct #31 + │ │ │ └─ [not]: union '_string_filter' #30 + │ │ │ ├─ variant_0: string #18 + │ │ │ ├─ variant_1: struct #21 + │ │ │ │ └─ [equals]: string #18 + │ │ │ ├─ variant_2: struct #22 + │ │ │ │ └─ [not]: string #18 + │ │ │ ├─ variant_3: struct #23 + │ │ │ │ └─ [in]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_4: struct #24 + │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_5: struct #27 + │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #28 + │ │ │ │ └─ [search]: string #18 + │ │ │ └─ variant_7: struct #29 + │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ [endsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [author]: optional '_126_UserWhere?' #126 + │ │ └─ item: &UserWhere #125 + │ ├─ variant_1: struct #131 + │ │ └─ [some]: optional '_130_PostWhere__skip_61_UserWhere?' #130 + │ │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 + │ │ ├─ [id]: optional '_123__integer_filter_c?' #123 + │ │ │ └─ item: optional '_integer_filter_c' #47 + │ │ │ └─ item: union #46 + │ │ │ ├─ variant_0: either '_integer_filter' #44 + │ │ │ │ ├─ variant_0: integer #36 + │ │ │ │ ├─ variant_1: struct #39 + │ │ │ │ │ └─ [equals]: integer #36 + │ │ │ │ ├─ variant_2: struct #40 + │ │ │ │ │ └─ [not]: integer #36 + │ │ │ │ ├─ variant_3: struct #41 + │ │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ │ └─ item: integer #36 + │ │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ variant_4: struct #42 + │ │ │ │ │ └─ [in]: array #38 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ variant_5: struct #43 + │ │ │ │ └─ [notIn]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_1: struct #45 + │ │ │ └─ [not]: either '_integer_filter' #44 + │ │ │ ├─ variant_0: integer #36 + │ │ │ ├─ variant_1: struct #39 + │ │ │ │ └─ [equals]: integer #36 + │ │ │ ├─ variant_2: struct #40 + │ │ │ │ └─ [not]: integer #36 + │ │ │ ├─ variant_3: struct #41 + │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ variant_4: struct #42 + │ │ │ │ └─ [in]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_5: struct #43 + │ │ │ └─ [notIn]: array #38 + │ │ │ └─ item: integer #36 + │ │ ├─ [title]: optional '_124__string_filter_c?' #124 + │ │ │ └─ item: optional '_string_filter_c' #33 + │ │ │ └─ item: union #32 + │ │ │ ├─ variant_0: union '_string_filter' #30 + │ │ │ │ ├─ variant_0: string #18 + │ │ │ │ ├─ variant_1: struct #21 + │ │ │ │ │ └─ [equals]: string #18 + │ │ │ │ ├─ variant_2: struct #22 + │ │ │ │ │ └─ [not]: string #18 + │ │ │ │ ├─ variant_3: struct #23 + │ │ │ │ │ └─ [in]: array #20 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ ├─ variant_4: struct #24 + │ │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ ├─ variant_5: struct #27 + │ │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ │ ├─ variant_6: struct #28 + │ │ │ │ │ └─ [search]: string #18 + │ │ │ │ └─ variant_7: struct #29 + │ │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ │ └─ item: string #18 + │ │ │ │ └─ [endsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ variant_1: struct #31 + │ │ │ └─ [not]: union '_string_filter' #30 + │ │ │ ├─ variant_0: string #18 + │ │ │ ├─ variant_1: struct #21 + │ │ │ │ └─ [equals]: string #18 + │ │ │ ├─ variant_2: struct #22 + │ │ │ │ └─ [not]: string #18 + │ │ │ ├─ variant_3: struct #23 + │ │ │ │ └─ [in]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_4: struct #24 + │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_5: struct #27 + │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #28 + │ │ │ │ └─ [search]: string #18 + │ │ │ └─ variant_7: struct #29 + │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ [endsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [author]: optional '_126_UserWhere?' #126 + │ │ └─ item: &UserWhere #125 + │ └─ variant_2: struct #133 + │ └─ [none]: optional '_132_PostWhere__skip_61_UserWhere?' #132 + │ └─ item: struct 'PostWhere__skip_61_UserWhere' #127 + │ ├─ [id]: optional '_123__integer_filter_c?' #123 + │ │ └─ item: optional '_integer_filter_c' #47 + │ │ └─ item: union #46 + │ │ ├─ variant_0: either '_integer_filter' #44 + │ │ │ ├─ variant_0: integer #36 + │ │ │ ├─ variant_1: struct #39 + │ │ │ │ └─ [equals]: integer #36 + │ │ │ ├─ variant_2: struct #40 + │ │ │ │ └─ [not]: integer #36 + │ │ │ ├─ variant_3: struct #41 + │ │ │ │ ├─ [lt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [gt]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ ├─ [lte]: optional #37 + │ │ │ │ │ └─ item: integer #36 + │ │ │ │ └─ [gte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ variant_4: struct #42 + │ │ │ │ └─ [in]: array #38 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ variant_5: struct #43 + │ │ │ └─ [notIn]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_1: struct #45 + │ │ └─ [not]: either '_integer_filter' #44 + │ │ ├─ variant_0: integer #36 + │ │ ├─ variant_1: struct #39 + │ │ │ └─ [equals]: integer #36 + │ │ ├─ variant_2: struct #40 + │ │ │ └─ [not]: integer #36 + │ │ ├─ variant_3: struct #41 + │ │ │ ├─ [lt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [gt]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ ├─ [lte]: optional #37 + │ │ │ │ └─ item: integer #36 + │ │ │ └─ [gte]: optional #37 + │ │ │ └─ item: integer #36 + │ │ ├─ variant_4: struct #42 + │ │ │ └─ [in]: array #38 + │ │ │ └─ item: integer #36 + │ │ └─ variant_5: struct #43 + │ │ └─ [notIn]: array #38 + │ │ └─ item: integer #36 + │ ├─ [title]: optional '_124__string_filter_c?' #124 + │ │ └─ item: optional '_string_filter_c' #33 + │ │ └─ item: union #32 + │ │ ├─ variant_0: union '_string_filter' #30 + │ │ │ ├─ variant_0: string #18 + │ │ │ ├─ variant_1: struct #21 + │ │ │ │ └─ [equals]: string #18 + │ │ │ ├─ variant_2: struct #22 + │ │ │ │ └─ [not]: string #18 + │ │ │ ├─ variant_3: struct #23 + │ │ │ │ └─ [in]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_4: struct #24 + │ │ │ │ └─ [notIn]: array #20 + │ │ │ │ └─ item: string #18 + │ │ │ ├─ variant_5: struct #27 + │ │ │ │ ├─ [contains]: string #18 + │ │ │ │ └─ [mode]: optional #26 + │ │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #28 + │ │ │ │ └─ [search]: string #18 + │ │ │ └─ variant_7: struct #29 + │ │ │ ├─ [startsWith]: optional #19 + │ │ │ │ └─ item: string #18 + │ │ │ └─ [endsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ variant_1: struct #31 + │ │ └─ [not]: union '_string_filter' #30 + │ │ ├─ variant_0: string #18 + │ │ ├─ variant_1: struct #21 + │ │ │ └─ [equals]: string #18 + │ │ ├─ variant_2: struct #22 + │ │ │ └─ [not]: string #18 + │ │ ├─ variant_3: struct #23 + │ │ │ └─ [in]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_4: struct #24 + │ │ │ └─ [notIn]: array #20 + │ │ │ └─ item: string #18 + │ │ ├─ variant_5: struct #27 + │ │ │ ├─ [contains]: string #18 + │ │ │ └─ [mode]: optional #26 + │ │ │ └─ item: string #25 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #28 + │ │ │ └─ [search]: string #18 + │ │ └─ variant_7: struct #29 + │ │ ├─ [startsWith]: optional #19 + │ │ │ └─ item: string #18 + │ │ └─ [endsWith]: optional #19 + │ │ └─ item: string #18 + │ └─ [author]: optional '_126_UserWhere?' #126 + │ └─ item: &UserWhere #125 + ├─ [AND]: optional '_139__138_QueryUserWhereInput[]?' #139 + │ └─ item: array '_138_QueryUserWhereInput[]' #138 + │ └─ item: &QueryUserWhereInput #137 + ├─ [OR]: optional '_139__138_QueryUserWhereInput[]?' #139 + │ └─ item: array '_138_QueryUserWhereInput[]' #138 + │ └─ item: &QueryUserWhereInput #137 + └─ [NOT]: optional '_140_QueryUserWhereInput?' #140 + └─ item: &QueryUserWhereInput #137 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Post inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Post inp.snap index 6d78ea8bcd..0c0529de4f 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Post inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Post inp.snap @@ -1,26 +1,860 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #56 -├─ [data]: struct '_Post_UpdateInput' #53 -│ ├─ [id]: optional #43 -│ │ └─ item: integer #18 -│ ├─ [title]: optional #44 -│ │ └─ item: string #19 -│ └─ [author]: optional #52 -│ └─ item: struct #51 -│ ├─ [create]: optional '_49__User_CreateInput_excluding___rel_Post_User_1?' #49 -│ │ └─ item: struct '_User_CreateInput_excluding___rel_Post_User_1' #45 -│ │ ├─ [id]: integer #13 -│ │ └─ [name]: string #14 -│ └─ [connect]: optional '_50_UserWhere_norel?' #50 -│ └─ item: struct 'UserWhere_norel' #48 -│ ├─ [id]: optional #46 -│ │ └─ item: integer #13 -│ └─ [name]: optional #47 -│ └─ item: string #14 -└─ [where]: struct 'QueryUniquePostWhereInput' #55 - └─ [id]: optional #54 - └─ item: integer #18 +root: struct #162 +├─ [data]: struct '_Post_UpdateInput' #159 +│ ├─ [id]: optional #121 +│ │ └─ item: union #120 +│ │ ├─ variant_0: integer #26 +│ │ ├─ variant_1: struct #116 +│ │ │ └─ [set]: integer #26 +│ │ ├─ variant_2: struct #117 +│ │ │ └─ [multiply]: integer #26 +│ │ ├─ variant_3: struct #118 +│ │ │ └─ [decrement]: integer #26 +│ │ └─ variant_4: struct #119 +│ │ └─ [increment]: integer #26 +│ ├─ [title]: optional #124 +│ │ └─ item: union #123 +│ │ ├─ variant_0: string #27 +│ │ └─ variant_1: struct #122 +│ │ └─ [set]: string #27 +│ └─ [author]: optional #158 +│ └─ item: union #157 +│ ├─ variant_0: struct #143 +│ │ └─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #125 +│ │ ├─ [id]: integer #21 +│ │ └─ [name]: string #22 +│ ├─ variant_1: struct #144 +│ │ └─ [connect]: struct 'UserWhere' #141 +│ │ ├─ [id]: optional '_126__integer_filter_c?' #126 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [name]: optional '_127__string_filter_c?' #127 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [posts]: optional #140 +│ │ └─ item: union #139 +│ │ ├─ variant_0: struct #134 +│ │ │ └─ [every]: optional '_133_PostWhere__skip_25_UserWhere?' #133 +│ │ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ │ └─ item: &UserWhere #130 +│ │ ├─ variant_1: struct #136 +│ │ │ └─ [some]: optional '_135_PostWhere__skip_25_UserWhere?' #135 +│ │ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ │ └─ item: &UserWhere #130 +│ │ └─ variant_2: struct #138 +│ │ └─ [none]: optional '_137_PostWhere__skip_25_UserWhere?' #137 +│ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ └─ item: &UserWhere #130 +│ ├─ variant_2: struct #145 +│ │ └─ [connectOrCreate]: struct #142 +│ │ ├─ [create]: struct '_User_CreateInput_excluding___rel_Post_User_1' #125 +│ │ │ ├─ [id]: integer #21 +│ │ │ └─ [name]: string #22 +│ │ └─ [where]: struct 'UserWhere' #141 +│ │ ├─ [id]: optional '_126__integer_filter_c?' #126 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [name]: optional '_127__string_filter_c?' #127 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [posts]: optional #140 +│ │ └─ item: union #139 +│ │ ├─ variant_0: struct #134 +│ │ │ └─ [every]: optional '_133_PostWhere__skip_25_UserWhere?' #133 +│ │ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ │ └─ item: &UserWhere #130 +│ │ ├─ variant_1: struct #136 +│ │ │ └─ [some]: optional '_135_PostWhere__skip_25_UserWhere?' #135 +│ │ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ │ └─ item: &UserWhere #130 +│ │ └─ variant_2: struct #138 +│ │ └─ [none]: optional '_137_PostWhere__skip_25_UserWhere?' #137 +│ │ └─ item: struct 'PostWhere__skip_25_UserWhere' #132 +│ │ ├─ [id]: optional '_128__integer_filter_c?' #128 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [title]: optional '_129__string_filter_c?' #129 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [author]: optional '_131_UserWhere?' #131 +│ │ └─ item: &UserWhere #130 +│ └─ variant_3: struct #156 +│ └─ [update]: struct '_User_UpdateInput_excluding___rel_Post_User_1' #155 +│ ├─ [id]: optional #151 +│ │ └─ item: union #150 +│ │ ├─ variant_0: integer #21 +│ │ ├─ variant_1: struct #146 +│ │ │ └─ [set]: integer #21 +│ │ ├─ variant_2: struct #147 +│ │ │ └─ [multiply]: integer #21 +│ │ ├─ variant_3: struct #148 +│ │ │ └─ [decrement]: integer #21 +│ │ └─ variant_4: struct #149 +│ │ └─ [increment]: integer #21 +│ └─ [name]: optional #154 +│ └─ item: union #153 +│ ├─ variant_0: string #22 +│ └─ variant_1: struct #152 +│ └─ [set]: string #22 +└─ [where]: struct 'QueryUniquePostWhereInput' #161 + └─ [id]: optional #160 + └─ item: integer #26 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Record inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Record inp.snap index 6435ba972e..7ea462bbbb 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Record inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one Record inp.snap @@ -2,16 +2,32 @@ source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs expression: "tree::print(inp)" --- -root: struct #11 -├─ [data]: struct '_Record_UpdateInput' #8 -│ ├─ [id]: optional #5 -│ │ └─ item: string #0 -│ ├─ [name]: optional #6 -│ │ └─ item: string #1 -│ └─ [age]: optional #7 -│ └─ item: optional #3 -│ └─ item: integer #2 -└─ [where]: struct 'QueryUniqueRecordWhereInput' #10 - └─ [id]: optional #9 +root: struct #20 +├─ [data]: struct '_Record_UpdateInput' #17 +│ ├─ [id]: optional #7 +│ │ └─ item: union #6 +│ │ ├─ variant_0: string #0 +│ │ └─ variant_1: struct #5 +│ │ └─ [set]: string #0 +│ ├─ [name]: optional #10 +│ │ └─ item: union #9 +│ │ ├─ variant_0: string #1 +│ │ └─ variant_1: struct #8 +│ │ └─ [set]: string #1 +│ └─ [age]: optional #16 +│ └─ item: union #15 +│ ├─ variant_0: optional #3 +│ │ └─ item: integer #2 +│ ├─ variant_1: struct #11 +│ │ └─ [set]: optional #3 +│ │ └─ item: integer #2 +│ ├─ variant_2: struct #12 +│ │ └─ [multiply]: integer #2 +│ ├─ variant_3: struct #13 +│ │ └─ [decrement]: integer #2 +│ └─ variant_4: struct #14 +│ └─ [increment]: integer #2 +└─ [where]: struct 'QueryUniqueRecordWhereInput' #19 + └─ [id]: optional #18 └─ item: string #0 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one User inp.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one User inp.snap index 40b6d713b1..e6fc648ba6 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one User inp.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__test__update_one User inp.snap @@ -1,34 +1,913 @@ --- source: typegraph/core/src/runtimes/prisma/type_generation/mod.rs -expression: "tree::print(types.input)" +expression: "tree::print(inp)" --- -root: struct #39 -├─ [data]: struct '_User_UpdateInput' #36 -│ ├─ [id]: optional #22 -│ │ └─ item: integer #13 -│ ├─ [name]: optional #23 -│ │ └─ item: string #14 -│ └─ [posts]: optional #35 -│ └─ item: struct #34 -│ ├─ [create]: optional '_29__Post_CreateInput_excluding___rel_Post_User_1?' #29 -│ │ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #25 -│ │ ├─ [id]: optional #24 -│ │ │ └─ item: integer #18 -│ │ └─ [title]: string #19 -│ ├─ [connect]: optional '_30_PostWhere_norel?' #30 -│ │ └─ item: struct 'PostWhere_norel' #28 -│ │ ├─ [id]: optional #26 -│ │ │ └─ item: integer #18 -│ │ └─ [title]: optional #27 -│ │ └─ item: string #19 -│ └─ [createMany]: optional #33 -│ └─ item: struct #32 -│ └─ [data]: array '_31__Post_CreateInput_excluding___rel_Post_User_1[]' #31 -│ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #25 -│ ├─ [id]: optional #24 -│ │ └─ item: integer #18 -│ └─ [title]: string #19 -└─ [where]: struct 'QueryUniqueUserWhereInput' #38 - └─ [id]: optional #37 - └─ item: integer #13 +root: struct #115 +├─ [data]: struct '_User_UpdateInput' #112 +│ ├─ [id]: optional #35 +│ │ └─ item: union #34 +│ │ ├─ variant_0: integer #21 +│ │ ├─ variant_1: struct #30 +│ │ │ └─ [set]: integer #21 +│ │ ├─ variant_2: struct #31 +│ │ │ └─ [multiply]: integer #21 +│ │ ├─ variant_3: struct #32 +│ │ │ └─ [decrement]: integer #21 +│ │ └─ variant_4: struct #33 +│ │ └─ [increment]: integer #21 +│ ├─ [name]: optional #38 +│ │ └─ item: union #37 +│ │ ├─ variant_0: string #22 +│ │ └─ variant_1: struct #36 +│ │ └─ [set]: string #22 +│ └─ [posts]: optional #111 +│ └─ item: union #110 +│ ├─ variant_0: struct #86 +│ │ └─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #40 +│ │ ├─ [id]: optional #39 +│ │ │ └─ item: integer #26 +│ │ └─ [title]: string #27 +│ ├─ variant_1: struct #87 +│ │ └─ [connect]: struct 'PostWhere' #84 +│ │ ├─ [id]: optional '_53__integer_filter_c?' #53 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [title]: optional '_70__string_filter_c?' #70 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [author]: optional '_83_UserWhere__skip_29_PostWhere?' #83 +│ │ └─ item: struct 'UserWhere__skip_29_PostWhere' #82 +│ │ ├─ [id]: optional '_71__integer_filter_c?' #71 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [name]: optional '_72__string_filter_c?' #72 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [posts]: optional #81 +│ │ └─ item: union #80 +│ │ ├─ variant_0: struct #75 +│ │ │ └─ [every]: optional '_74_PostWhere?' #74 +│ │ │ └─ item: &PostWhere #73 +│ │ ├─ variant_1: struct #77 +│ │ │ └─ [some]: optional '_76_PostWhere?' #76 +│ │ │ └─ item: &PostWhere #73 +│ │ └─ variant_2: struct #79 +│ │ └─ [none]: optional '_78_PostWhere?' #78 +│ │ └─ item: &PostWhere #73 +│ ├─ variant_2: struct #88 +│ │ └─ [connectOrCreate]: struct #85 +│ │ ├─ [create]: struct '_Post_CreateInput_excluding___rel_Post_User_1' #40 +│ │ │ ├─ [id]: optional #39 +│ │ │ │ └─ item: integer #26 +│ │ │ └─ [title]: string #27 +│ │ └─ [where]: struct 'PostWhere' #84 +│ │ ├─ [id]: optional '_53__integer_filter_c?' #53 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [title]: optional '_70__string_filter_c?' #70 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [author]: optional '_83_UserWhere__skip_29_PostWhere?' #83 +│ │ └─ item: struct 'UserWhere__skip_29_PostWhere' #82 +│ │ ├─ [id]: optional '_71__integer_filter_c?' #71 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [name]: optional '_72__string_filter_c?' #72 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [posts]: optional #81 +│ │ └─ item: union #80 +│ │ ├─ variant_0: struct #75 +│ │ │ └─ [every]: optional '_74_PostWhere?' #74 +│ │ │ └─ item: &PostWhere #73 +│ │ ├─ variant_1: struct #77 +│ │ │ └─ [some]: optional '_76_PostWhere?' #76 +│ │ │ └─ item: &PostWhere #73 +│ │ └─ variant_2: struct #79 +│ │ └─ [none]: optional '_78_PostWhere?' #78 +│ │ └─ item: &PostWhere #73 +│ ├─ variant_3: struct #99 +│ │ └─ [update]: struct '_Post_UpdateInput_excluding___rel_Post_User_1' #98 +│ │ ├─ [id]: optional #94 +│ │ │ └─ item: union #93 +│ │ │ ├─ variant_0: integer #26 +│ │ │ ├─ variant_1: struct #89 +│ │ │ │ └─ [set]: integer #26 +│ │ │ ├─ variant_2: struct #90 +│ │ │ │ └─ [multiply]: integer #26 +│ │ │ ├─ variant_3: struct #91 +│ │ │ │ └─ [decrement]: integer #26 +│ │ │ └─ variant_4: struct #92 +│ │ │ └─ [increment]: integer #26 +│ │ └─ [title]: optional #97 +│ │ └─ item: union #96 +│ │ ├─ variant_0: string #27 +│ │ └─ variant_1: struct #95 +│ │ └─ [set]: string #27 +│ ├─ variant_4: struct #102 +│ │ └─ [updateMany]: struct #101 +│ │ ├─ [where]: optional '_100_PostWhere?' #100 +│ │ │ └─ item: struct 'PostWhere' #84 +│ │ │ ├─ [id]: optional '_53__integer_filter_c?' #53 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [title]: optional '_70__string_filter_c?' #70 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [author]: optional '_83_UserWhere__skip_29_PostWhere?' #83 +│ │ │ └─ item: struct 'UserWhere__skip_29_PostWhere' #82 +│ │ │ ├─ [id]: optional '_71__integer_filter_c?' #71 +│ │ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ │ └─ item: union #51 +│ │ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ variant_5: struct #48 +│ │ │ │ │ └─ [notIn]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_1: struct #50 +│ │ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ [name]: optional '_72__string_filter_c?' #72 +│ │ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ │ └─ item: union #68 +│ │ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ │ ├─ variant_0: string #54 +│ │ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ │ └─ [not]: string #54 +│ │ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ │ └─ [search]: string #54 +│ │ │ │ │ └─ variant_7: struct #65 +│ │ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ │ └─ item: string #54 +│ │ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ variant_1: struct #67 +│ │ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [posts]: optional #81 +│ │ │ └─ item: union #80 +│ │ │ ├─ variant_0: struct #75 +│ │ │ │ └─ [every]: optional '_74_PostWhere?' #74 +│ │ │ │ └─ item: &PostWhere #73 +│ │ │ ├─ variant_1: struct #77 +│ │ │ │ └─ [some]: optional '_76_PostWhere?' #76 +│ │ │ │ └─ item: &PostWhere #73 +│ │ │ └─ variant_2: struct #79 +│ │ │ └─ [none]: optional '_78_PostWhere?' #78 +│ │ │ └─ item: &PostWhere #73 +│ │ └─ [data]: struct '_Post_UpdateInput_excluding___rel_Post_User_1' #98 +│ │ ├─ [id]: optional #94 +│ │ │ └─ item: union #93 +│ │ │ ├─ variant_0: integer #26 +│ │ │ ├─ variant_1: struct #89 +│ │ │ │ └─ [set]: integer #26 +│ │ │ ├─ variant_2: struct #90 +│ │ │ │ └─ [multiply]: integer #26 +│ │ │ ├─ variant_3: struct #91 +│ │ │ │ └─ [decrement]: integer #26 +│ │ │ └─ variant_4: struct #92 +│ │ │ └─ [increment]: integer #26 +│ │ └─ [title]: optional #97 +│ │ └─ item: union #96 +│ │ ├─ variant_0: string #27 +│ │ └─ variant_1: struct #95 +│ │ └─ [set]: string #27 +│ ├─ variant_5: struct #105 +│ │ └─ [deleteMany]: struct #104 +│ │ └─ [where]: optional '_103_PostWhere?' #103 +│ │ └─ item: struct 'PostWhere' #84 +│ │ ├─ [id]: optional '_53__integer_filter_c?' #53 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [title]: optional '_70__string_filter_c?' #70 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [author]: optional '_83_UserWhere__skip_29_PostWhere?' #83 +│ │ └─ item: struct 'UserWhere__skip_29_PostWhere' #82 +│ │ ├─ [id]: optional '_71__integer_filter_c?' #71 +│ │ │ └─ item: optional '_integer_filter_c' #52 +│ │ │ └─ item: union #51 +│ │ │ ├─ variant_0: either '_integer_filter' #49 +│ │ │ │ ├─ variant_0: integer #41 +│ │ │ │ ├─ variant_1: struct #44 +│ │ │ │ │ └─ [equals]: integer #41 +│ │ │ │ ├─ variant_2: struct #45 +│ │ │ │ │ └─ [not]: integer #41 +│ │ │ │ ├─ variant_3: struct #46 +│ │ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ │ └─ item: integer #41 +│ │ │ │ │ └─ [gte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ variant_4: struct #47 +│ │ │ │ │ └─ [in]: array #43 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ variant_5: struct #48 +│ │ │ │ └─ [notIn]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_1: struct #50 +│ │ │ └─ [not]: either '_integer_filter' #49 +│ │ │ ├─ variant_0: integer #41 +│ │ │ ├─ variant_1: struct #44 +│ │ │ │ └─ [equals]: integer #41 +│ │ │ ├─ variant_2: struct #45 +│ │ │ │ └─ [not]: integer #41 +│ │ │ ├─ variant_3: struct #46 +│ │ │ │ ├─ [lt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [gt]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ ├─ [lte]: optional #42 +│ │ │ │ │ └─ item: integer #41 +│ │ │ │ └─ [gte]: optional #42 +│ │ │ │ └─ item: integer #41 +│ │ │ ├─ variant_4: struct #47 +│ │ │ │ └─ [in]: array #43 +│ │ │ │ └─ item: integer #41 +│ │ │ └─ variant_5: struct #48 +│ │ │ └─ [notIn]: array #43 +│ │ │ └─ item: integer #41 +│ │ ├─ [name]: optional '_72__string_filter_c?' #72 +│ │ │ └─ item: optional '_string_filter_c' #69 +│ │ │ └─ item: union #68 +│ │ │ ├─ variant_0: union '_string_filter' #66 +│ │ │ │ ├─ variant_0: string #54 +│ │ │ │ ├─ variant_1: struct #57 +│ │ │ │ │ └─ [equals]: string #54 +│ │ │ │ ├─ variant_2: struct #58 +│ │ │ │ │ └─ [not]: string #54 +│ │ │ │ ├─ variant_3: struct #59 +│ │ │ │ │ └─ [in]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_4: struct #60 +│ │ │ │ │ └─ [notIn]: array #56 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ ├─ variant_5: struct #63 +│ │ │ │ │ ├─ [contains]: string #54 +│ │ │ │ │ └─ [mode]: optional #62 +│ │ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ │ ├─ variant_6: struct #64 +│ │ │ │ │ └─ [search]: string #54 +│ │ │ │ └─ variant_7: struct #65 +│ │ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ │ └─ item: string #54 +│ │ │ │ └─ [endsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ variant_1: struct #67 +│ │ │ └─ [not]: union '_string_filter' #66 +│ │ │ ├─ variant_0: string #54 +│ │ │ ├─ variant_1: struct #57 +│ │ │ │ └─ [equals]: string #54 +│ │ │ ├─ variant_2: struct #58 +│ │ │ │ └─ [not]: string #54 +│ │ │ ├─ variant_3: struct #59 +│ │ │ │ └─ [in]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_4: struct #60 +│ │ │ │ └─ [notIn]: array #56 +│ │ │ │ └─ item: string #54 +│ │ │ ├─ variant_5: struct #63 +│ │ │ │ ├─ [contains]: string #54 +│ │ │ │ └─ [mode]: optional #62 +│ │ │ │ └─ item: string #61 enum{ '"insensitive"' } +│ │ │ ├─ variant_6: struct #64 +│ │ │ │ └─ [search]: string #54 +│ │ │ └─ variant_7: struct #65 +│ │ │ ├─ [startsWith]: optional #55 +│ │ │ │ └─ item: string #54 +│ │ │ └─ [endsWith]: optional #55 +│ │ │ └─ item: string #54 +│ │ └─ [posts]: optional #81 +│ │ └─ item: union #80 +│ │ ├─ variant_0: struct #75 +│ │ │ └─ [every]: optional '_74_PostWhere?' #74 +│ │ │ └─ item: &PostWhere #73 +│ │ ├─ variant_1: struct #77 +│ │ │ └─ [some]: optional '_76_PostWhere?' #76 +│ │ │ └─ item: &PostWhere #73 +│ │ └─ variant_2: struct #79 +│ │ └─ [none]: optional '_78_PostWhere?' #78 +│ │ └─ item: &PostWhere #73 +│ └─ variant_6: struct #109 +│ └─ [createMany]: optional #108 +│ └─ item: struct #107 +│ └─ [data]: array '_106__Post_CreateInput_excluding___rel_Post_User_1[]' #106 +│ └─ item: struct '_Post_CreateInput_excluding___rel_Post_User_1' #40 +│ ├─ [id]: optional #39 +│ │ └─ item: integer #26 +│ └─ [title]: string #27 +└─ [where]: struct 'QueryUniqueUserWhereInput' #114 + └─ [id]: optional #113 + └─ item: integer #21 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Post.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Post.snap new file mode 100644 index 0000000000..d6ee4288d0 --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Post.snap @@ -0,0 +1,211 @@ +--- +source: typegraph/core/src/runtimes/prisma/type_generation/where_.rs +expression: "tree::print(context.generate(&Where::new(post))?)" +--- +root: struct 'PostWhere' #77 +├─ [id]: optional '_62__integer_filter_c?' #62 +│ └─ item: optional '_integer_filter_c' #34 +│ └─ item: union #33 +│ ├─ variant_0: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ └─ variant_1: struct #32 +│ └─ [not]: either '_integer_filter' #31 +│ ├─ variant_0: integer #23 +│ ├─ variant_1: struct #26 +│ │ └─ [equals]: integer #23 +│ ├─ variant_2: struct #27 +│ │ └─ [not]: integer #23 +│ ├─ variant_3: struct #28 +│ │ ├─ [lt]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ [gt]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ [lte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ └─ [gte]: optional #24 +│ │ └─ item: integer #23 +│ ├─ variant_4: struct #29 +│ │ └─ [in]: array #25 +│ │ └─ item: integer #23 +│ └─ variant_5: struct #30 +│ └─ [notIn]: array #25 +│ └─ item: integer #23 +├─ [title]: optional '_63__string_filter_c?' #63 +│ └─ item: optional '_string_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ variant_1: struct #18 +│ └─ [not]: union '_string_filter' #17 +│ ├─ variant_0: string #5 +│ ├─ variant_1: struct #8 +│ │ └─ [equals]: string #5 +│ ├─ variant_2: struct #9 +│ │ └─ [not]: string #5 +│ ├─ variant_3: struct #10 +│ │ └─ [in]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_4: struct #11 +│ │ └─ [notIn]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_5: struct #14 +│ │ ├─ [contains]: string #5 +│ │ └─ [mode]: optional #13 +│ │ └─ item: string #12 enum{ '"insensitive"' } +│ ├─ variant_6: struct #15 +│ │ └─ [search]: string #5 +│ └─ variant_7: struct #16 +│ ├─ [startsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ [endsWith]: optional #6 +│ └─ item: string #5 +└─ [author]: optional '_76_UserWhere__skip_45_PostWhere?' #76 + └─ item: struct 'UserWhere__skip_45_PostWhere' #75 + ├─ [id]: optional '_64__integer_filter_c?' #64 + │ └─ item: optional '_integer_filter_c' #34 + │ └─ item: union #33 + │ ├─ variant_0: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_1: struct #32 + │ └─ [not]: either '_integer_filter' #31 + │ ├─ variant_0: integer #23 + │ ├─ variant_1: struct #26 + │ │ └─ [equals]: integer #23 + │ ├─ variant_2: struct #27 + │ │ └─ [not]: integer #23 + │ ├─ variant_3: struct #28 + │ │ ├─ [lt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [gt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [lte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ └─ [gte]: optional #24 + │ │ └─ item: integer #23 + │ ├─ variant_4: struct #29 + │ │ └─ [in]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_5: struct #30 + │ └─ [notIn]: array #25 + │ └─ item: integer #23 + ├─ [name]: optional '_65__string_filter_c?' #65 + │ └─ item: optional '_string_filter_c' #20 + │ └─ item: union #19 + │ ├─ variant_0: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ variant_1: struct #18 + │ └─ [not]: union '_string_filter' #17 + │ ├─ variant_0: string #5 + │ ├─ variant_1: struct #8 + │ │ └─ [equals]: string #5 + │ ├─ variant_2: struct #9 + │ │ └─ [not]: string #5 + │ ├─ variant_3: struct #10 + │ │ └─ [in]: array #7 + │ │ └─ item: string #5 + │ ├─ variant_4: struct #11 + │ │ └─ [notIn]: array #7 + │ │ └─ item: string #5 + │ ├─ variant_5: struct #14 + │ │ ├─ [contains]: string #5 + │ │ └─ [mode]: optional #13 + │ │ └─ item: string #12 enum{ '"insensitive"' } + │ ├─ variant_6: struct #15 + │ │ └─ [search]: string #5 + │ └─ variant_7: struct #16 + │ ├─ [startsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [endsWith]: optional #6 + │ └─ item: string #5 + └─ [posts]: optional #74 + └─ item: union #73 + ├─ variant_0: struct #68 + │ └─ [every]: optional '_67_PostWhere?' #67 + │ └─ item: &PostWhere #66 + ├─ variant_1: struct #70 + │ └─ [some]: optional '_69_PostWhere?' #69 + │ └─ item: &PostWhere #66 + └─ variant_2: struct #72 + └─ [none]: optional '_71_PostWhere?' #71 + └─ item: &PostWhere #66 + diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Record.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Record.snap index aeadc528e3..303dd304df 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Record.snap +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where Record.snap @@ -2,11 +2,151 @@ source: typegraph/core/src/runtimes/prisma/type_generation/where_.rs expression: "tree::print(where_type)" --- -root: struct 'RecordWhere_norel' #8 -├─ [id]: optional #5 -│ └─ item: string #0 -├─ [name]: optional #6 -│ └─ item: string #1 -└─ [age]: optional #7 - └─ item: integer #2 +root: struct 'RecordWhere' #36 +├─ [id]: optional '_21__string_filter_c?' #21 +│ └─ item: optional '_string_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ variant_1: struct #18 +│ └─ [not]: union '_string_filter' #17 +│ ├─ variant_0: string #5 +│ ├─ variant_1: struct #8 +│ │ └─ [equals]: string #5 +│ ├─ variant_2: struct #9 +│ │ └─ [not]: string #5 +│ ├─ variant_3: struct #10 +│ │ └─ [in]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_4: struct #11 +│ │ └─ [notIn]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_5: struct #14 +│ │ ├─ [contains]: string #5 +│ │ └─ [mode]: optional #13 +│ │ └─ item: string #12 enum{ '"insensitive"' } +│ ├─ variant_6: struct #15 +│ │ └─ [search]: string #5 +│ └─ variant_7: struct #16 +│ ├─ [startsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ [endsWith]: optional #6 +│ └─ item: string #5 +├─ [name]: optional '_22__string_filter_c?' #22 +│ └─ item: optional '_string_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ variant_1: struct #18 +│ └─ [not]: union '_string_filter' #17 +│ ├─ variant_0: string #5 +│ ├─ variant_1: struct #8 +│ │ └─ [equals]: string #5 +│ ├─ variant_2: struct #9 +│ │ └─ [not]: string #5 +│ ├─ variant_3: struct #10 +│ │ └─ [in]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_4: struct #11 +│ │ └─ [notIn]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_5: struct #14 +│ │ ├─ [contains]: string #5 +│ │ └─ [mode]: optional #13 +│ │ └─ item: string #12 enum{ '"insensitive"' } +│ ├─ variant_6: struct #15 +│ │ └─ [search]: string #5 +│ └─ variant_7: struct #16 +│ ├─ [startsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ [endsWith]: optional #6 +│ └─ item: string #5 +└─ [age]: optional '_35__integer_filter_c?' #35 + └─ item: optional '_integer_filter_c' #34 + └─ item: union #33 + ├─ variant_0: either '_integer_filter' #31 + │ ├─ variant_0: integer #23 + │ ├─ variant_1: struct #26 + │ │ └─ [equals]: integer #23 + │ ├─ variant_2: struct #27 + │ │ └─ [not]: integer #23 + │ ├─ variant_3: struct #28 + │ │ ├─ [lt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [gt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [lte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ └─ [gte]: optional #24 + │ │ └─ item: integer #23 + │ ├─ variant_4: struct #29 + │ │ └─ [in]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_5: struct #30 + │ └─ [notIn]: array #25 + │ └─ item: integer #23 + └─ variant_1: struct #32 + └─ [not]: either '_integer_filter' #31 + ├─ variant_0: integer #23 + ├─ variant_1: struct #26 + │ └─ [equals]: integer #23 + ├─ variant_2: struct #27 + │ └─ [not]: integer #23 + ├─ variant_3: struct #28 + │ ├─ [lt]: optional #24 + │ │ └─ item: integer #23 + │ ├─ [gt]: optional #24 + │ │ └─ item: integer #23 + │ ├─ [lte]: optional #24 + │ │ └─ item: integer #23 + │ └─ [gte]: optional #24 + │ └─ item: integer #23 + ├─ variant_4: struct #29 + │ └─ [in]: array #25 + │ └─ item: integer #23 + └─ variant_5: struct #30 + └─ [notIn]: array #25 + └─ item: integer #23 diff --git a/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where User.snap b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where User.snap new file mode 100644 index 0000000000..751feaaafb --- /dev/null +++ b/typegraph/core/src/runtimes/prisma/type_generation/snapshots/typegraph_core__runtimes__prisma__type_generation__where___test__where User.snap @@ -0,0 +1,407 @@ +--- +source: typegraph/core/src/runtimes/prisma/type_generation/where_.rs +expression: "tree::print(context.generate(&Where::new(user))?)" +--- +root: struct 'UserWhere' #61 +├─ [id]: optional '_46__integer_filter_c?' #46 +│ └─ item: optional '_integer_filter_c' #34 +│ └─ item: union #33 +│ ├─ variant_0: either '_integer_filter' #31 +│ │ ├─ variant_0: integer #23 +│ │ ├─ variant_1: struct #26 +│ │ │ └─ [equals]: integer #23 +│ │ ├─ variant_2: struct #27 +│ │ │ └─ [not]: integer #23 +│ │ ├─ variant_3: struct #28 +│ │ │ ├─ [lt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [gt]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ ├─ [lte]: optional #24 +│ │ │ │ └─ item: integer #23 +│ │ │ └─ [gte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ variant_4: struct #29 +│ │ │ └─ [in]: array #25 +│ │ │ └─ item: integer #23 +│ │ └─ variant_5: struct #30 +│ │ └─ [notIn]: array #25 +│ │ └─ item: integer #23 +│ └─ variant_1: struct #32 +│ └─ [not]: either '_integer_filter' #31 +│ ├─ variant_0: integer #23 +│ ├─ variant_1: struct #26 +│ │ └─ [equals]: integer #23 +│ ├─ variant_2: struct #27 +│ │ └─ [not]: integer #23 +│ ├─ variant_3: struct #28 +│ │ ├─ [lt]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ [gt]: optional #24 +│ │ │ └─ item: integer #23 +│ │ ├─ [lte]: optional #24 +│ │ │ └─ item: integer #23 +│ │ └─ [gte]: optional #24 +│ │ └─ item: integer #23 +│ ├─ variant_4: struct #29 +│ │ └─ [in]: array #25 +│ │ └─ item: integer #23 +│ └─ variant_5: struct #30 +│ └─ [notIn]: array #25 +│ └─ item: integer #23 +├─ [name]: optional '_47__string_filter_c?' #47 +│ └─ item: optional '_string_filter_c' #20 +│ └─ item: union #19 +│ ├─ variant_0: union '_string_filter' #17 +│ │ ├─ variant_0: string #5 +│ │ ├─ variant_1: struct #8 +│ │ │ └─ [equals]: string #5 +│ │ ├─ variant_2: struct #9 +│ │ │ └─ [not]: string #5 +│ │ ├─ variant_3: struct #10 +│ │ │ └─ [in]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_4: struct #11 +│ │ │ └─ [notIn]: array #7 +│ │ │ └─ item: string #5 +│ │ ├─ variant_5: struct #14 +│ │ │ ├─ [contains]: string #5 +│ │ │ └─ [mode]: optional #13 +│ │ │ └─ item: string #12 enum{ '"insensitive"' } +│ │ ├─ variant_6: struct #15 +│ │ │ └─ [search]: string #5 +│ │ └─ variant_7: struct #16 +│ │ ├─ [startsWith]: optional #6 +│ │ │ └─ item: string #5 +│ │ └─ [endsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ variant_1: struct #18 +│ └─ [not]: union '_string_filter' #17 +│ ├─ variant_0: string #5 +│ ├─ variant_1: struct #8 +│ │ └─ [equals]: string #5 +│ ├─ variant_2: struct #9 +│ │ └─ [not]: string #5 +│ ├─ variant_3: struct #10 +│ │ └─ [in]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_4: struct #11 +│ │ └─ [notIn]: array #7 +│ │ └─ item: string #5 +│ ├─ variant_5: struct #14 +│ │ ├─ [contains]: string #5 +│ │ └─ [mode]: optional #13 +│ │ └─ item: string #12 enum{ '"insensitive"' } +│ ├─ variant_6: struct #15 +│ │ └─ [search]: string #5 +│ └─ variant_7: struct #16 +│ ├─ [startsWith]: optional #6 +│ │ └─ item: string #5 +│ └─ [endsWith]: optional #6 +│ └─ item: string #5 +└─ [posts]: optional #60 + └─ item: union #59 + ├─ variant_0: struct #54 + │ └─ [every]: optional '_53_PostWhere__skip_41_UserWhere?' #53 + │ └─ item: struct 'PostWhere__skip_41_UserWhere' #52 + │ ├─ [id]: optional '_48__integer_filter_c?' #48 + │ │ └─ item: optional '_integer_filter_c' #34 + │ │ └─ item: union #33 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #32 + │ │ └─ [not]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [title]: optional '_49__string_filter_c?' #49 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [author]: optional '_51_UserWhere?' #51 + │ └─ item: &UserWhere #50 + ├─ variant_1: struct #56 + │ └─ [some]: optional '_55_PostWhere__skip_41_UserWhere?' #55 + │ └─ item: struct 'PostWhere__skip_41_UserWhere' #52 + │ ├─ [id]: optional '_48__integer_filter_c?' #48 + │ │ └─ item: optional '_integer_filter_c' #34 + │ │ └─ item: union #33 + │ │ ├─ variant_0: either '_integer_filter' #31 + │ │ │ ├─ variant_0: integer #23 + │ │ │ ├─ variant_1: struct #26 + │ │ │ │ └─ [equals]: integer #23 + │ │ │ ├─ variant_2: struct #27 + │ │ │ │ └─ [not]: integer #23 + │ │ │ ├─ variant_3: struct #28 + │ │ │ │ ├─ [lt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [gt]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ ├─ [lte]: optional #24 + │ │ │ │ │ └─ item: integer #23 + │ │ │ │ └─ [gte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ variant_4: struct #29 + │ │ │ │ └─ [in]: array #25 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ variant_5: struct #30 + │ │ │ └─ [notIn]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_1: struct #32 + │ │ └─ [not]: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ ├─ [title]: optional '_49__string_filter_c?' #49 + │ │ └─ item: optional '_string_filter_c' #20 + │ │ └─ item: union #19 + │ │ ├─ variant_0: union '_string_filter' #17 + │ │ │ ├─ variant_0: string #5 + │ │ │ ├─ variant_1: struct #8 + │ │ │ │ └─ [equals]: string #5 + │ │ │ ├─ variant_2: struct #9 + │ │ │ │ └─ [not]: string #5 + │ │ │ ├─ variant_3: struct #10 + │ │ │ │ └─ [in]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_4: struct #11 + │ │ │ │ └─ [notIn]: array #7 + │ │ │ │ └─ item: string #5 + │ │ │ ├─ variant_5: struct #14 + │ │ │ │ ├─ [contains]: string #5 + │ │ │ │ └─ [mode]: optional #13 + │ │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ │ ├─ variant_6: struct #15 + │ │ │ │ └─ [search]: string #5 + │ │ │ └─ variant_7: struct #16 + │ │ │ ├─ [startsWith]: optional #6 + │ │ │ │ └─ item: string #5 + │ │ │ └─ [endsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ variant_1: struct #18 + │ │ └─ [not]: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [author]: optional '_51_UserWhere?' #51 + │ └─ item: &UserWhere #50 + └─ variant_2: struct #58 + └─ [none]: optional '_57_PostWhere__skip_41_UserWhere?' #57 + └─ item: struct 'PostWhere__skip_41_UserWhere' #52 + ├─ [id]: optional '_48__integer_filter_c?' #48 + │ └─ item: optional '_integer_filter_c' #34 + │ └─ item: union #33 + │ ├─ variant_0: either '_integer_filter' #31 + │ │ ├─ variant_0: integer #23 + │ │ ├─ variant_1: struct #26 + │ │ │ └─ [equals]: integer #23 + │ │ ├─ variant_2: struct #27 + │ │ │ └─ [not]: integer #23 + │ │ ├─ variant_3: struct #28 + │ │ │ ├─ [lt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [gt]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ ├─ [lte]: optional #24 + │ │ │ │ └─ item: integer #23 + │ │ │ └─ [gte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ variant_4: struct #29 + │ │ │ └─ [in]: array #25 + │ │ │ └─ item: integer #23 + │ │ └─ variant_5: struct #30 + │ │ └─ [notIn]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_1: struct #32 + │ └─ [not]: either '_integer_filter' #31 + │ ├─ variant_0: integer #23 + │ ├─ variant_1: struct #26 + │ │ └─ [equals]: integer #23 + │ ├─ variant_2: struct #27 + │ │ └─ [not]: integer #23 + │ ├─ variant_3: struct #28 + │ │ ├─ [lt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [gt]: optional #24 + │ │ │ └─ item: integer #23 + │ │ ├─ [lte]: optional #24 + │ │ │ └─ item: integer #23 + │ │ └─ [gte]: optional #24 + │ │ └─ item: integer #23 + │ ├─ variant_4: struct #29 + │ │ └─ [in]: array #25 + │ │ └─ item: integer #23 + │ └─ variant_5: struct #30 + │ └─ [notIn]: array #25 + │ └─ item: integer #23 + ├─ [title]: optional '_49__string_filter_c?' #49 + │ └─ item: optional '_string_filter_c' #20 + │ └─ item: union #19 + │ ├─ variant_0: union '_string_filter' #17 + │ │ ├─ variant_0: string #5 + │ │ ├─ variant_1: struct #8 + │ │ │ └─ [equals]: string #5 + │ │ ├─ variant_2: struct #9 + │ │ │ └─ [not]: string #5 + │ │ ├─ variant_3: struct #10 + │ │ │ └─ [in]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_4: struct #11 + │ │ │ └─ [notIn]: array #7 + │ │ │ └─ item: string #5 + │ │ ├─ variant_5: struct #14 + │ │ │ ├─ [contains]: string #5 + │ │ │ └─ [mode]: optional #13 + │ │ │ └─ item: string #12 enum{ '"insensitive"' } + │ │ ├─ variant_6: struct #15 + │ │ │ └─ [search]: string #5 + │ │ └─ variant_7: struct #16 + │ │ ├─ [startsWith]: optional #6 + │ │ │ └─ item: string #5 + │ │ └─ [endsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ variant_1: struct #18 + │ └─ [not]: union '_string_filter' #17 + │ ├─ variant_0: string #5 + │ ├─ variant_1: struct #8 + │ │ └─ [equals]: string #5 + │ ├─ variant_2: struct #9 + │ │ └─ [not]: string #5 + │ ├─ variant_3: struct #10 + │ │ └─ [in]: array #7 + │ │ └─ item: string #5 + │ ├─ variant_4: struct #11 + │ │ └─ [notIn]: array #7 + │ │ └─ item: string #5 + │ ├─ variant_5: struct #14 + │ │ ├─ [contains]: string #5 + │ │ └─ [mode]: optional #13 + │ │ └─ item: string #12 enum{ '"insensitive"' } + │ ├─ variant_6: struct #15 + │ │ └─ [search]: string #5 + │ └─ variant_7: struct #16 + │ ├─ [startsWith]: optional #6 + │ │ └─ item: string #5 + │ └─ [endsWith]: optional #6 + │ └─ item: string #5 + └─ [author]: optional '_51_UserWhere?' #51 + └─ item: &UserWhere #50 + diff --git a/typegraph/core/src/runtimes/prisma/type_generation/update_input.rs b/typegraph/core/src/runtimes/prisma/type_generation/update_input.rs deleted file mode 100644 index e5b5e542c5..0000000000 --- a/typegraph/core/src/runtimes/prisma/type_generation/update_input.rs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. -// SPDX-License-Identifier: MPL-2.0 - -use crate::errors::Result; -use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::TypeId; -use crate::types::{Type, TypeFun}; - -use super::TypeGen; - -pub struct UpdateInput { - model_id: TypeId, -} - -impl UpdateInput { - pub fn new(model_id: TypeId) -> Self { - Self { model_id } - } -} - -impl TypeGen for UpdateInput { - fn generate(&self, context: &mut super::TypeGenContext) -> Result { - let mut builder = t::struct_(); - - for (key, type_id) in self.model_id.as_struct().unwrap().iter_props() { - let attrs = type_id.attrs()?; - // TODO check injection - let typ = attrs.concrete_type.as_type()?; - let (typ, _nullable) = match typ { - Type::Optional(inner) => (TypeId(inner.data.of).as_type()?, true), - _ => (typ, false), - }; - - let mutation_type = match typ { - Type::Optional(_) => unreachable!(), - Type::Boolean(_) | Type::String(_) => { - t::unionx![type_id, t::struct_().prop("set", type_id)].build()? - } - Type::Integer(_) | Type::Float(_) => { - let wrapped_type_id = typ.get_id(); - t::unionx![ - wrapped_type_id, - t::struct_().prop("set", type_id), - t::struct_().prop("multiply", wrapped_type_id), - t::struct_().prop("decrement", wrapped_type_id), - t::struct_().prop("increment", wrapped_type_id), - ] - .build()? - } - Type::Array(inner) => { - if context - .registry - .find_relationship_on(self.model_id, key) - .is_some() - { - continue; - } - // scalar list: only supported in PostgreSQL, CockroachDB and MongoDB - // see: https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#relational-databases - let item_type = inner.data.of.into(); - t::unionx![ - type_id, - t::struct_().prop("set", type_id), - t::struct_().prop("push", item_type), - // "unset": mongo only - ] - .build()? - } - _ => { - // TODO: (mongo only) composite types - // see: https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#composite-type-methods - continue; - } - }; - - builder.propx(key, t::optional(mutation_type))?; - } - - builder.named(self.name()).build() - } - - fn name(&self) -> String { - format!( - "_{}_UpdateInput", - self.model_id.type_name().unwrap().unwrap() - ) - } -} diff --git a/typegraph/core/src/runtimes/prisma/type_generation/where_.rs b/typegraph/core/src/runtimes/prisma/type_generation/where_.rs index 44d63bd229..a60350a754 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/where_.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/where_.rs @@ -1,53 +1,110 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 -use crate::{ - errors::Result, - t::{self, ConcreteTypeBuilder, TypeBuilder}, - types::{Type, TypeId}, -}; +use common::typegraph::runtimes::prisma::ScalarType; +use indexmap::IndexMap; + +use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::Property; +use crate::runtimes::prisma::relationship::Cardinality; +use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; +use crate::types::TypeId; +use super::filters::{ + BooleanFilter, CompleteFilter, NumberFilter, NumberType, ScalarListFilter, StringFilter, +}; use super::TypeGen; pub struct Where { model_id: TypeId, - relations: bool, // list relations to skip?? + skip_models: IndexMap, + aggregates: bool, } impl Where { - pub fn new(model_id: TypeId, relations: bool) -> Self { + pub fn new(model_id: TypeId) -> Self { Self { model_id, - relations, + skip_models: Default::default(), + aggregates: false, + } + } + + fn nested(&self, name: &str, model_id: TypeId) -> Self { + let mut skip_models = self.skip_models.clone(); + skip_models.insert(self.model_id, name.to_string()); + Self { + model_id, + skip_models, + aggregates: self.aggregates, + } + } + + pub fn with_aggregates(self) -> Self { + Self { + aggregates: true, + ..self } } } +// TODO merge with with filters?? impl TypeGen for Where { - fn generate(&self, context: &mut super::TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { + let name = self.name(); let mut builder = t::struct_(); - for (key, type_id) in self.model_id.as_struct().unwrap().iter_props() { - if let Some(rel) = context.registry.find_relationship_on(self.model_id, key) { - if !self.relations { - continue; - } - let model = rel.get_opposite_of(self.model_id, key).unwrap(); - - let inner = context.generate(&Where { - model_id: model.model_type, - relations: false, - })?; - builder.propx(key, t::optional(inner))?; - } else { - let non_optional = type_id.non_optional_concrete_type()?; - match non_optional.as_type()? { - Type::Optional(_) => unreachable!(), - Type::Func(_) => continue, - _ => { - builder.propx(key, t::optional(non_optional))?; + let model = context.model(self.model_id)?; + let model = model.borrow(); + + for (key, prop) in model.iter_props() { + match prop { + Property::Model(prop) => { + let inner = match self.skip_models.get(&prop.model_id) { + Some(name) => t::proxy(name.clone()).build()?, + None => context.generate(&self.nested(&name, prop.model_id))?, + }; + match prop.quantifier { + Cardinality::Many => { + builder.propx( + key, + t::optionalx(t::unionx!( + t::struct_().propx("every", t::optional(inner))?, + t::struct_().propx("some", t::optional(inner))?, + t::struct_().propx("none", t::optional(inner))?, + ))?, + )?; + } + _ => { + builder.propx(key, t::optional(inner))?; + } } } + + Property::Scalar(prop) => { + let generated = if let Cardinality::Many = prop.quantifier { + context.generate(&CompleteFilter(ScalarListFilter(prop.type_id)))? + } else { + match prop.prop_type { + ScalarType::Boolean => { + context.generate(&CompleteFilter(BooleanFilter))? + } + ScalarType::Integer => context.generate(&CompleteFilter( + NumberFilter::new(NumberType::Integer, self.aggregates), // TODO with aggregates?? + ))?, + ScalarType::Float => context.generate(&CompleteFilter( + NumberFilter::new(NumberType::Float, self.aggregates), // TODO with aggregates?? + ))?, + ScalarType::String { .. } => { + context.generate(&CompleteFilter(StringFilter))? + } + } + }; + // TODO cardinality?? - many? + builder.propx(key, t::optional(generated))?; + } + Property::Unmanaged(_) => continue, } } @@ -56,8 +113,26 @@ impl TypeGen for Where { fn name(&self) -> String { let model_name = self.model_id.type_name().unwrap().unwrap(); - let suffix = if !self.relations { "_norel" } else { "" }; - format!("{model_name}Where{suffix}") + + let suffix1 = if self.aggregates { + "__agg".to_string() + } else { + "".to_string() + }; + + let suffix2 = if !self.skip_models.is_empty() { + format!( + "__skip_{}", + self.skip_models + .iter() + .map(|(id, name)| { format!("{}_{}", id.0, name) }) + .collect::>() + .join("__") + ) + } else { + "".to_string() + }; + format!("{model_name}Where{suffix1}{suffix2}") } } @@ -71,13 +146,26 @@ mod test { fn test_generate_where() -> Result<()> { setup(None)?; - let mut context = TypeGenContext::default(); + let mut context = PrismaContext::default(); let record = models::simple_record()?; - context.registry.manage(record)?; + context.manage(record)?; - let where_type = context.generate(&Where::new(record, false))?; + let where_type = context.generate(&Where::new(record))?; insta::assert_snapshot!("where Record", tree::print(where_type)); + let (user, post) = models::simple_relationship()?; + context.manage(user)?; + + insta::assert_snapshot!( + "where User", + tree::print(context.generate(&Where::new(user))?) + ); + + insta::assert_snapshot!( + "where Post", + tree::print(context.generate(&Where::new(post))?) + ); + Ok(()) } } diff --git a/typegraph/core/src/runtimes/prisma/type_generation/with_nested_count.rs b/typegraph/core/src/runtimes/prisma/type_generation/with_nested_count.rs index 9a04806d8c..dae7c491e5 100644 --- a/typegraph/core/src/runtimes/prisma/type_generation/with_nested_count.rs +++ b/typegraph/core/src/runtimes/prisma/type_generation/with_nested_count.rs @@ -2,12 +2,14 @@ // SPDX-License-Identifier: MPL-2.0 use crate::errors::Result; +use crate::runtimes::prisma::context::PrismaContext; +use crate::runtimes::prisma::model::Property; +use crate::runtimes::prisma::relationship::Cardinality; use crate::runtimes::prisma::type_generation::count::Count; use crate::t::{self, ConcreteTypeBuilder, TypeBuilder}; -use crate::types::ProxyResolution; -use crate::{runtimes::prisma::relationship::Cardinality, types::TypeId}; +use crate::types::{ProxyResolution, TypeId}; -use super::{TypeGen, TypeGenContext}; +use super::TypeGen; pub struct WithNestedCount { model_id: TypeId, @@ -24,42 +26,60 @@ impl WithNestedCount { } impl TypeGen for WithNestedCount { - fn generate(&self, context: &mut TypeGenContext) -> Result { + fn generate(&self, context: &PrismaContext) -> Result { let mut countable = vec![]; let mut builder = t::struct_(); - let model = self.model_id.as_struct().unwrap(); - for (key, type_id) in model.iter_props() { - if let Some(rel) = context.registry.find_relationship_on(self.model_id, key) { - if self.skip.contains(&rel.name) { - continue; - } - // TODO get_concrete_type(resolve_proxy=true) - let relation_model = rel.get_opposite_of(self.model_id, key).unwrap(); - match relation_model.cardinality { - Cardinality::Optional => { - let inner = context.generate(&WithNestedCount { - model_id: relation_model.model_type, - skip: [self.skip.as_slice(), &[rel.name.clone()]].concat(), - })?; - builder.propx(key, t::optional(inner))?; - countable.push(key.to_string()); - } - Cardinality::Many => { - let inner = context.generate(&WithNestedCount { - model_id: relation_model.model_type, - skip: [self.skip.as_slice(), &[rel.name.clone()]].concat(), - })?; - builder.propx(key, t::array(inner))?; - countable.push(key.to_string()); + let model = context.model(self.model_id)?; + let model = model.borrow(); + for (key, prop) in model.iter_props() { + match prop { + Property::Model(prop) => { + let rel_name = model.relationships.get(key).ok_or_else(|| { + format!("relationship not registered: {}::{}", model.type_name, key) + })?; + let rel = context.relationships.get(rel_name).unwrap(); + + if self.skip.contains(rel_name) || rel.left.model_type == rel.right.model_type { + continue; } - Cardinality::One => { - builder.prop(key, relation_model.model_type); + + match prop.quantifier { + Cardinality::Optional => { + let inner = context.generate(&WithNestedCount { + model_id: prop.model_id, + skip: [self.skip.as_slice(), &[rel_name.clone()]].concat(), + })?; + builder.propx(key, t::optional(inner))?; + countable.push(key.to_string()); + } + + Cardinality::Many => { + let inner = context.generate(&WithNestedCount { + model_id: prop.model_id, + skip: [self.skip.as_slice(), &[rel_name.clone()]].concat(), + })?; + builder.propx(key, t::array(inner))?; + countable.push(key.to_string()); + } + + Cardinality::One => { + builder.prop(key, prop.model_id); + } } } - } else { - let type_id = type_id.concrete_type(ProxyResolution::Force)?.unwrap(); - builder.prop(key, type_id); + + Property::Scalar(prop) => { + let type_id = prop + .wrapper_type_id + .concrete_type(ProxyResolution::Force)? + .unwrap(); + builder.prop(key, type_id); + } + + Property::Unmanaged(type_id) => { + builder.prop(key, *type_id); + } } } diff --git a/typegraph/core/src/runtimes/prisma/type_utils.rs b/typegraph/core/src/runtimes/prisma/type_utils.rs index fabc0b808c..75bd2da5ef 100644 --- a/typegraph/core/src/runtimes/prisma/type_utils.rs +++ b/typegraph/core/src/runtimes/prisma/type_utils.rs @@ -7,9 +7,6 @@ use crate::errors::Result; use crate::types::Type; use crate::types::TypeAttributes; use crate::types::TypeFun; -use crate::types::TypeId; - -use super::relationship::Cardinality; impl TypeAttributes { pub fn is_unique_ref(&self) -> Result { @@ -29,68 +26,6 @@ impl TypeAttributes { } } -pub fn as_relationship_target( - concrete_type: TypeId, - cardinality: Option, -) -> Result> { - match concrete_type.as_type()? { - Type::Struct(_) => Ok(Some(( - concrete_type, - cardinality.unwrap_or(Cardinality::One), - ))), - Type::Optional(inner) => { - let concrete_type = TypeId(inner.data.of).attrs()?.concrete_type; - if cardinality.is_some() { - return Err("nested optional/list not supported".into()); - } - as_relationship_target(concrete_type, Some(Cardinality::Optional)) - } - Type::Array(inner) => { - let concrete_type = TypeId(inner.data.of).attrs()?.concrete_type; - if cardinality.is_some() { - return Err("nested optional/list not supported".into()); - } - as_relationship_target(concrete_type, Some(Cardinality::Many)) - } - _ => Ok(None), - } -} - -pub fn get_id_field(model_id: TypeId) -> Result { - let matches = model_id - .as_struct()? - .iter_props() - .map(|(k, ty)| -> Result> { - match ty.as_type()? { - Type::Integer(i) => Ok(i.base.as_id.then_some(k.to_string())), - Type::String(i) => Ok(i.base.as_id.then_some(k.to_string())), - typ => match typ.get_base() { - Some(base) => { - if base.as_id { - Err(format!( - "id must be on type Integer or String, not {}", - typ.get_data().variant_name() - ) - .into()) - } else { - Ok(None) - } - } - None => Ok(None), - }, - } - }) - .collect::>>>()? - .into_iter() - .flatten() - .collect::>(); - match matches.len() { - 0 => Err("no id field found".into()), - 1 => Ok(matches.into_iter().next().unwrap()), - _ => Err("multiple id fields not supported".into()), - } -} - pub struct RuntimeConfig<'a>(Cow<'a, [(String, String)]>); impl<'a> RuntimeConfig<'a> { diff --git a/typegraph/core/src/t.rs b/typegraph/core/src/t.rs index 553f12d3d7..fa0aa11721 100644 --- a/typegraph/core/src/t.rs +++ b/typegraph/core/src/t.rs @@ -282,6 +282,18 @@ impl Default for TypeUnion { } } +impl UnionBuilder { + pub fn add(&mut self, ty: TypeId) -> &mut Self { + self.data.variants.push(ty.0); + self + } + + pub fn addx(&mut self, ty: impl TypeBuilder) -> Result<&mut Self> { + self.add(ty.build()?); + Ok(self) + } +} + pub fn union(variants: impl IntoIterator) -> UnionBuilder { UnionBuilder { data: TypeUnion { @@ -360,16 +372,6 @@ pub fn struct_() -> StructBuilder { Default::default() } -pub fn struct_from(props: impl Iterator) -> StructBuilder { - StructBuilder { - data: TypeStruct { - props: props.map(|(k, ty)| (k, ty.into())).collect(), - ..Default::default() - }, - ..Default::default() - } -} - pub fn struct_extends(ty: TypeId) -> Result { Ok(StructBuilder { data: TypeStruct { diff --git a/typegraph/core/src/test_utils.rs b/typegraph/core/src/test_utils.rs index 32439043b0..c47294d9c9 100644 --- a/typegraph/core/src/test_utils.rs +++ b/typegraph/core/src/test_utils.rs @@ -42,8 +42,8 @@ pub mod models { pub fn simple_relationship() -> Result<(TypeId, TypeId)> { let user = t::struct_() .prop("id", t::integer().as_id(true).build()?) - .prop("name", t::string().build()?) - .prop("posts", t::array(t::proxy("Post").build()?).build()?) + .propx("name", t::string())? + .propx("posts", t::arrayx(t::proxy("Post"))?)? .named("User") .build()?; diff --git a/typegraph/core/src/typegraph.rs b/typegraph/core/src/typegraph.rs index 9a20709d74..bd4970452d 100644 --- a/typegraph/core/src/typegraph.rs +++ b/typegraph/core/src/typegraph.rs @@ -60,6 +60,15 @@ thread_local! { static TYPEGRAPH_VERSION: &str = "0.0.3"; +pub fn with_tg(f: impl FnOnce(&TypegraphContext) -> T) -> Result { + TG.with(|tg| { + let tg = tg.borrow(); + tg.as_ref() + .map(f) + .ok_or_else(errors::expected_typegraph_context) + }) +} + pub fn with_tg_mut(f: impl FnOnce(&mut TypegraphContext) -> T) -> Result { TG.with(|tg| { let mut tg = tg.borrow_mut(); diff --git a/typegraph/core/src/types.rs b/typegraph/core/src/types.rs index d465c9affe..02422d3703 100644 --- a/typegraph/core/src/types.rs +++ b/typegraph/core/src/types.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use std::fmt::Debug; -use common::typegraph::TypeNode; +use common::typegraph::{Injection, TypeNode}; use enum_dispatch::enum_dispatch; use crate::conversion::types::TypeConversion; @@ -276,7 +276,7 @@ pub struct TypeAttributes { pub name: Option, pub proxy_data: HashMap, pub policy_chain: Vec, - pub injection: Option, + pub injection: Option, } impl TypeId { @@ -335,7 +335,7 @@ impl TypeId { let mut type_id = *self; let mut proxy_data: HashMap = HashMap::new(); let mut policy_chain = Vec::new(); - let mut injection: Option = None; + let mut injection: Option = None; let mut name = None; loop { @@ -358,7 +358,9 @@ impl TypeId { if injection.is_some() { return Err("multiple injections not supported".to_string().into()); } - injection = Some(inner.data.injection.clone()); + injection = Some( + serde_json::from_str(&inner.data.injection).map_err(|e| e.to_string())?, + ); type_id = inner.data.tpe.into(); continue; } diff --git a/typegraph/python/pyproject.toml b/typegraph/python/pyproject.toml index 30e3b74438..788fde24c2 100644 --- a/typegraph/python/pyproject.toml +++ b/typegraph/python/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "typegraph" -version = "0.2.3-0+dev" +version = "0.2.3" description = "Declarative API development platform. Build serverless backends with zero-trust and less code, no matter where and how your (legacy) systems are." authors = ["Metatype Contributors "] license = "MPL-2.0" diff --git a/typegraph/python/typegraph/__init__.py b/typegraph/python/typegraph/__init__.py index f6f2314f3a..046b6ea035 100644 --- a/typegraph/python/typegraph/__init__.py +++ b/typegraph/python/typegraph/__init__.py @@ -5,4 +5,4 @@ from typegraph.policy import Policy # noqa from typegraph import effects as fx # noqa -version = "0.2.3-0+dev" +version = "0.2.3" diff --git a/website/static/specs/0.0.3.json b/website/static/specs/0.0.3.json index e8c98bcc20..32986a1ee0 100644 --- a/website/static/specs/0.0.3.json +++ b/website/static/specs/0.0.3.json @@ -1684,9 +1684,7 @@ "models": { "type": "array", "items": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 + "$ref": "#/definitions/Model" } }, "relationships": { @@ -1709,6 +1707,253 @@ }, "additionalProperties": false }, + "Model": { + "type": "object", + "required": [ + "idFields", + "props", + "typeIdx", + "typeName" + ], + "properties": { + "typeIdx": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "typeName": { + "type": "string" + }, + "props": { + "type": "array", + "items": { + "$ref": "#/definitions/Property" + } + }, + "idFields": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Property": { + "oneOf": [ + { + "type": "object", + "required": [ + "auto", + "cardinality", + "key", + "propType", + "type", + "typeIdx", + "unique" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "scalar" + ] + }, + "key": { + "type": "string" + }, + "propType": { + "$ref": "#/definitions/ScalarType" + }, + "cardinality": { + "$ref": "#/definitions/Cardinality" + }, + "typeIdx": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "injection": { + "anyOf": [ + { + "$ref": "#/definitions/ManagedInjection" + }, + { + "type": "null" + } + ] + }, + "unique": { + "type": "boolean" + }, + "auto": { + "type": "boolean" + } + } + }, + { + "type": "object", + "required": [ + "cardinality", + "key", + "modelName", + "relationshipName", + "relationshipSide", + "type", + "typeIdx", + "unique" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "relationship" + ] + }, + "key": { + "type": "string" + }, + "cardinality": { + "$ref": "#/definitions/Cardinality" + }, + "typeIdx": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "modelName": { + "type": "string" + }, + "unique": { + "type": "boolean" + }, + "relationshipName": { + "type": "string" + }, + "relationshipSide": { + "$ref": "#/definitions/Side" + } + } + } + ] + }, + "ScalarType": { + "oneOf": [ + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Boolean" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Int" + ] + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Float" + ] + } + } + }, + { + "type": "object", + "required": [ + "format", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "String" + ] + }, + "format": { + "$ref": "#/definitions/StringType" + } + } + } + ] + }, + "StringType": { + "type": "string", + "enum": [ + "Plain", + "Uuid", + "DateTime" + ] + }, + "Cardinality": { + "type": "string", + "enum": [ + "optional", + "one", + "many" + ] + }, + "ManagedInjection": { + "type": "object", + "properties": { + "create": { + "anyOf": [ + { + "$ref": "#/definitions/Injection2" + }, + { + "type": "null" + } + ] + }, + "update": { + "anyOf": [ + { + "$ref": "#/definitions/Injection2" + }, + { + "type": "null" + } + ] + } + } + }, + "Injection2": { + "type": "string", + "enum": [ + "DateNow" + ] + }, + "Side": { + "type": "string", + "enum": [ + "left", + "right" + ] + }, "Relationship": { "type": "object", "required": [ @@ -1749,14 +1994,6 @@ } } }, - "Cardinality": { - "type": "string", - "enum": [ - "optional", - "one", - "many" - ] - }, "MigrationOptions": { "type": "object", "required": [