Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Codegen compilation error for Float scalars with default values in Input objects #3108

Closed
joaquim-verges opened this issue May 14, 2021 · 2 comments

Comments

@joaquim-verges
Copy link
Contributor

joaquim-verges commented May 14, 2021

Summary

We recently upgraded from Apollo Android 2.4.1 to 2.5.6, and encountered a compilation error in the autogenerated code.

In short, Input objects in our json schema with inputs of type Float and default values that omit the decimal part (eg. "defaultValue": "1") causes the Java codegen to generate a default value as an Integer instead of Double which causes a compilation error:

private Input<Double> myFloatField = Input.fromNullable(1);
                                                        ^
equality constraints: Double
lower bounds: Integer

Version
2.5.6

Description

I was able to narrow down the issue to a specific codegen corner case:

  • Only happens in Java codegen (issue does not happen with Kotlin models)
  • Only happens with json schema format (issue does not happen with sdl schema format)

When a INPUT_OBJECT type has a Float input field with a default value of 1 or 0 (omitting the decimal part) like so:

 {
  "kind": "INPUT_OBJECT",
  "name": "ReviewRefInput",
  "description": "Circle ref to review input",
  "fields": null,
  "inputFields": [
    {
      "name": "myFloatField",
      "description": "Testing float input codegen",
      "type": {
        "kind": "SCALAR",
        "name": "Float",
        "ofType": null
      },
      "defaultValue": "1"
   }
  ]
}

The corresponding output in the generated java file is:

private Input<Double> myFloatField = Input.fromNullable(1);

Which is a compilation error, as 1 is considered an Integer, and therefore that assignment fails with:

private Input<Double> myFloatField = Input.fromNullable(1);
                                                        ^
equality constraints: Double
lower bounds: Integer

The equivalent Kotlin generated code is correct however:

val myFloatField: Input<Double> = Input.optional(1.0)

The Kotlin codegen correctly converts 1 to 1.0 since the scalar is type Float, but the Java codegen does not.

This also happens for mandatory fields:

java: private double mandatoryFloat = 1;
kotlin: val mandatoryFloat: Double = 1.0

Interestingly, the java codegen does the correct transformation when using schemas in sdl format, so the issue only happens when parsing from json.

I was able to reproduce the issue easily with the apollo-compiler unit tests by modifying the colorInput entry in src/test/validation/schema.json, changing the green input field to have a default value of 0 instead of 0.0.

The generated file ColorInput.java shows the error:

private Input<Double> green = Input.fromNullable(0);

while the equivalent kotlin file is correct:

val green: Input<Double> = Input.optional(0.0)

Hope this is clear enough, let me know if you need any more information, and thanks for this amazing library!

@joaquim-verges
Copy link
Contributor Author

A little more information:

We first checked if this was a schema definition issue, but the spec says it is a valid case, and we confirmed it here.

I looked a bit deeper at the code, and believe the issue was introduced in #2917 specifically in GraphQLParser.ValueContext.toKotlin() that was added to IRBuilder.kt l. 152:

is GraphQLParser.NumberValueContext -> if (
          NUMBER().text.contains('.') ||
          NUMBER().text.contains("e")) {
        NUMBER().text.toDouble()
      } else {
        NUMBER().text.toInt()
      }

Which shows exactly what the problem is.

I was able to fix it by passing the IntrospectionSchema.TypeRef to that method and check the scalar type to return the correct type.

I'm going to push a PR for it :)

@joaquim-verges
Copy link
Contributor Author

Pushed a fix in #3109 - let me know if I got it right :)

martinbonnin added a commit that referenced this issue May 18, 2021
…as (#3109)

* Fix Float input fields Java codegen with default values in json schemas

see #3108

* add a test case for lists in defaultValues and handle it

Co-authored-by: Martin Bonnin <martin@mbonnin.net>
martinbonnin added a commit that referenced this issue Nov 22, 2021
* Add a "Who is Apollo" section to the main README (#3073)

* Slight tweaks to the "Who is Apollo?" README section (#3079)

To align with apollographql/apollo-client#8079.

* Update dependency gatsby-theme-apollo-docs to v4.7.3

* Issue #3095: Expose channel capacity parameter. (#3096)

Co-authored-by: Neal Sanche <neal@yourarq.com>

* Update dependency gatsby to v2.32.13

* Update dependency gatsby-theme-apollo-docs to v4.7.4

* Fix Float input fields Java codegen with default values in json schemas (#3109)

* Fix Float input fields Java codegen with default values in json schemas

see #3108

* add a test case for lists in defaultValues and handle it

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* bump Kotlin and Coroutines to 1.5.0 (#3113)

* bump Kotlin and Coroutines to 1.5.0

* make the KotlinCompile task depend on antlr generation

* update metalava-plugin

* update metalava

* update metalava using Jdk8.

Not really sure why the signatures would differ based on the java
version...

* release 2.5.7

* version is now 2.5.8-SNAPSHOT

* Update README.md (#3120)

* Replace spectrum with discourse (#3123)

* Discourse: pre-fill the category and tags

* Update multi-modules.mdx (#3125)

* Implement Query Batching for `apollo-runtime` (#3117)

* Implement Query Batching for `apollo-runtime`

* update metalava signatures

* Trigger HTTP call on max batch size, added synchronization, throw when using GET method

* Unit tests for BatchPoller

* Fix checkstyle

* Propagate parsing errors in callbacks, better syncrhonization, use LinkedList

* Added some tests for batch response parsing

* Added tests for request body + headers

* Builder API to enable per query batching, dont rely on time for tests

* update Metalava signatures

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* pass 'operationName' in the introspection query (#3126)

* bump junit (#3131)

* Update dependency gatsby-theme-apollo-docs to v4.7.6

* feat: add Reactor support (#3138)

* feat: add Reactor support

resolves #627

* remove .gitignore that is handled by the top level one

* update metalava signatures

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* Update dependency gatsby-theme-apollo-docs to v4.7.9

* add reactor in the left column of the doc (#3141)

* release 2.5.8

* version is now 2.5.9-SNAPSHOT

* Fix overriding `canBeBatched` value when cloning `QueryCall` with `toBuilder()` (#3146)

* Update get-started-multiplatform.mdx (#3150)

update dep version forcing as per gradle new api

* Update badge from Bintray to MavenCentral for apollo-idling-resource (#3153)

Thanks!

* Update 09-write-your-first-mutation.mdx (#3154)

* Update 01-configure-project.mdx

* Update 02-add-the-graphql-schema.mdx

* release 2.5.9

* version is now 2.5.10-SNAPSHOT

* refactor: RxJava 2/3 support (#3166)

* Update dependency striptags to 3.2.0 [SECURITY] (#3178)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency gatsby-theme-apollo-docs to v4.7.11

* Update dependency gatsby-theme-apollo-docs to v4.7.12

* remove duplicate executionContext (#3213)

* feat: add Mutiny support (#3198)

* feat: add Mutiny support

* Update gatsby-config.js

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* add v3 docs (#3223)

* Add 3.0 alpha notice (#3231)

* Update dependency gatsby-theme-apollo-docs to v4.7.13

* July 2021 ROADMAP update (#3255)

* Update ROADMAP.md

* Update dependency gatsby-theme-apollo-docs to v4.7.14

* Update multi-modules.mdx

Add a not about multi platform, See #3297

* Update multi-modules.mdx

Remove deleted branch

* Replace Spectrum with community.apollographql.com (#3299)

* Update ROADMAP.md

* Update dependency path-parse to 1.0.7 [SECURITY] (#3296)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency gatsby-theme-apollo-docs to v4.7.15

* Remove root redirect and build deploy previews at / (#3309)

* Deploy the prod site at the root (#3312)

* Update dependency gatsby-theme-apollo-docs to v4.7.16

* Remove path prefixes for docs redirects (#3329)

* Updated coroutines for use native-mt version (#3330)

* Updated coroutines for use native-mt version

* Update get-started-multiplatform.mdx

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* Update dependency gatsby-theme-apollo-docs to v4.7.18

* Increase Json nesting to 256 (#3334)

Closes #3308

* Bump docs theme to add Algolia search (#3346)

* Configure for updated docs theme

* Upgrade docs theme

* Bump docs theme version

* Bump docs theme version

* Update docs theme version

* Move config from docs netlify.toml to root level netlify.toml

* Upgrade docs theme

* Upgrade docs theme

* Upgrade docs theme

* Upgrade docs theme

* Bump docs theme to v5

Co-authored-by: Trevor Blades <tdblades@gmail.com>

* Update dependency gatsby-theme-apollo-docs to v5.0.1

* Add Reactor && Mutiny to advanced topics (#3355)

* feat: add Mutiny support

* Update gatsby-config.js

* doc: Add Reactor && Mutiny to advanced topics

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* Update dependency gatsby-theme-apollo-docs to v5.0.2

* Update dependency gatsby-theme-apollo-docs to v5.0.3

* Update dependency gatsby-theme-apollo-docs to v5.0.7

* Who is Apollo README updates (#3379)

Small updates to align "Who is Apollo" sections across repos.

* Update dependency gatsby-theme-apollo-docs to v5.0.8

* Give a hint at errorPayload (#3381)

See #3369

* docs: Configure custom Algolia filters (#3378)

* Configure algolia filters

* Upgrade theme

* Upgrade theme

* Adding Benoit (#3388)

* Workaround wrong input field default values (#3398)

* add a test case for #3394

* do not generate defaultValues for input fields of input object type

* make an exception for emptyList for backward compatibility

* do not crash when trying to indent the GraphQL document (#3399)

* Minor improvements to the Tutorial documentation (#3396)

* Minor improvements to the Tutorial documentation

* Rephrase a sentence

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* Remove unneeded dependency

* Use 2.5.9 to be consistent with the code on tutorial's repo

Co-authored-by: Martin Bonnin <martin@mbonnin.net>

* Add ./gradlew push${MainService}ApolloOperations (#3403)

* add RegisterOperations

* add ApolloRegisterOperationsTask

* add a test case

* fix bad copy/paste

* update metalava signatures

* add some doc

* Update docs/source/advanced/operation-safelisting.mdx

Co-authored-by: Benoit Lubek <BoD@JRAF.org>

* Update docs/source/advanced/operation-safelisting.mdx

Co-authored-by: Benoit Lubek <BoD@JRAF.org>

* add the link to the operation registry server documentation

Co-authored-by: Benoit Lubek <BoD@JRAF.org>

* Replace 'data graph' with 'graph' (#3389)

* Operation Registry: normalize queries before computing the hash (#3406)

* add normalization

* be robust to Number.toString() in JS being different from
Double.toString() in Java

* remove extra "only"

* workaround a doc issue where the 3.x was used instead of 2.x

* release 2.5.10

* version is now 2.5.11-SNAPSHOT

* Indicate the supported native platforms in the doc (2.x) (#3419)

* Indicate the supported native platforms in the doc.

* Clarification about the `js` target also being available

* Added toString method for Input (#3427)

* Fix outdated doc about FileUpload (#3429)

* Update ROADMAP.md (#3445)

* update ROADMAP.md

* update ROADMAP.md

* Update dependency gatsby-theme-apollo-docs to v5.3.1

* Make safelistingHash closer to its apollo-tooling counterpart (#3471)

* take #2 on query normalization

* added a comment

* add comment

* Update dependency gatsby-theme-apollo-docs to v5.3.2

* Update dependency gatsby-theme-apollo-docs to v5.3.3

* Update dependency url-parse to 1.5.2 [SECURITY] (#3522)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency ws to 7.4.6 [SECURITY] (#3523)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency ssri to 7.1.1 [SECURITY] (#3521)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency postcss to 7.0.36 [SECURITY] (#3519)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency object-path to 0.11.8 [SECURITY] (#3518)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency dns-packet to 1.3.2 [SECURITY] (#3517)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency browserslist to 4.16.5 [SECURITY] (#3516)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Update dependency axios to 0.21.2 [SECURITY] (#3515)

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Bump docs theme and align React version w/ other docsets (#3539)

* Always make sure the Response is closed (#3541)

* release 2.5.11

* version is now 2.5.12-SNAPSHOT

* Gateway clarification based on license change

* Update dependency gatsby-theme-apollo-docs to v5.3.8

* update docs dependencies

* pass 'operationName' in the introspection query (#3126)

* update ROADMAP

* add multiplatform in the multimodules doc

* Remove root redirect and build deploy previews at / (#3309)

* Deploy the prod site at the root (#3312)

* Remove path prefixes for docs redirects (#3329)

* add a Kotlin Native Doc

inspired by commit 2e2f5d9

* Bump docs theme to add Algolia search (#3346)

* Configure for updated docs theme

* Upgrade docs theme

* Bump docs theme version

* Bump docs theme version

* Update docs theme version

* Move config from docs netlify.toml to root level netlify.toml

* Upgrade docs theme

* Upgrade docs theme

* Upgrade docs theme

* Upgrade docs theme

* Bump docs theme to v5

Co-authored-by: Trevor Blades <tdblades@gmail.com>

* update algolia filters

* Adding Benoit (#3388)

* replace data graph with 'graph'

* premliminary work for registerOperations

* wip

* wip

* fix sorting

* add Gradle tasks for registerOperations

* add safelisting doc

* update apiDump

* revert debug and fix tests that require mpp-utils

Co-authored-by: Danielle Man <man.danielleh@gmail.com>
Co-authored-by: Hugh Willson <hugh@octonary.com>
Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Neal Sanche <neal.sanche@robotsandpencils.com>
Co-authored-by: Neal Sanche <neal@yourarq.com>
Co-authored-by: Joaquim Verges <joaquim.verges@gmail.com>
Co-authored-by: Moncef AOUDIA <22281426+aoudiamoncef@users.noreply.github.com>
Co-authored-by: Fabio Santo <fabio.santo.mail@gmail.com>
Co-authored-by: Nicola Corti <corti.nico@gmail.com>
Co-authored-by: Robert Theis <943135+rmtheis@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Stephen Barlow <stephen@apollographql.com>
Co-authored-by: Trevor Blades <tdblades@gmail.com>
Co-authored-by: Виталий <vir@provir.ru>
Co-authored-by: Janessa Garrow <janessa@apollographql.com>
Co-authored-by: Benoit Lubek <BoD@JRAF.org>
Co-authored-by: Andrew Orobator <orobator.andrew@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants