Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Demonstrate poor handling of cyclic datastructures
This PR is not meant to ever be merged. This is a demonstration of some broken behavior around handling datastructures with cyclic dependencies. The problem is if we provide a struct to `MarshalQueryWithOptions()` and that struct has cyclic fields, even if not populated, and even if we provide a Field that limits the output to a set depth, `MarshalQueryWithOptions()` will still recurse infinitely and cause a panic due to exhausting the stack. This is a big problem because goql is a GraphQL library, and GraphQL is for querying graph datastructures, and datastructures in graphs will very commonly have cyclic relationships because graphs have cycles :) The correct behavior would be to: 1. If no Fields are provided, do not recursively walk into fields of structs that've already been walked. This is safe to do because GraphQL already doesn't allow infinite expansion; if you want relationships, even recursive ones, to a particular depth then GQL will force you to specify that in your query. Thus we can assume that you'll have to specify that to `goql` via a `Fields` param. 2. If `Fields` *are* provided, we can recursively walk already walked fields, but only to the depth specified in those `Fields`. Future work will have to be done to get this behavior to work.
- Loading branch information