apollographql / apollo-rs

Spec compliant GraphQL Tools in Rust.
Apache License 2.0
574 stars 45 forks source link

Pruning unused declarations after mutation #839

Open goto-bus-stop opened 8 months ago

goto-bus-stop commented 8 months ago

When you mutate an executable document, fragments or variables that were previously in use may become unused. Currently the user is responsible for tracking this and pruning the now-unused definitions, otherwise the mutated document is invalid. It's not that trivial to do given that usages may occur anywhere in the document. I think it would be better if apollo-rs can do this. It may just have to be something like document.prune_unused() at the minimum, but maybe we can figure out something more ergonomic (eg. combining validation and pruning into a single method, since you would normally want to do this at the point where you finish mutating and turn your document into a Valid<ExecutableDocument>)

SimonSapin commented 7 months ago

DocumentBuilder in crates/apollo-compiler/src/execution/introspection_split.rs does something similar, but intertwined with traversing/filtering a document and creating another.

Geal commented 1 month ago

some notes about how a related issue was solved in the router would be useful to look at to solve this in the compiler: https://github.com/apollographql/router/pull/5952 In particular, the part about tracking dependencies between fragments, to find the right order in which processing and filtering them, without going through the entire query too many times