lucian
lucian

Reputation: 681

Sort GraphQL query results in the exact order of input array

I need to get a number of items from a GraphQL enabled database (no control over its schema) and output them in the exact order called.

For example, if the database holds the items 1,2,3 in that respective order I need to get them as 3,1,2.

Query:

{items(filter: {id: {_in: ["3","1","2"] } } ) {data}}

Actual result:

{"data": {"items": [{"data": "data-from-1"},{"data": "data-from-2"},{"data": "data-from-3"}]}}

Expected result:

{"data": {"items": [{"data": "data-from-3"},{"data": "data-from-1"},{"data": "data-from-1"}]}}

So I guess that what I'm looking for is a 'meta' operator that relates to other operators rather than the actual query – something like:

sort:["_in"] or orderby:{operator:"_in"}

...but I didn't manage to find out if such a thing exists or not.

So is it possible in general or maybe in some flavour of GraphQL? Or is it my only choice to prebuild a query with aliases and do it like this:

{ 
_3: items(filter:{id: { _eq: "3" }}){data}
_1: items(filter:{id: { _eq: "1" }}){data}
_2: items(filter:{id: { _eq: "2" }}){data}
}

Upvotes: 0

Views: 3680

Answers (1)

albert
albert

Reputation: 192

Which GraphQL client are you using? If you're using Apollo, and you really don't have access to the schema/resolvers in the server, you can create a local field and resolve it on your own, and so you can manipulate as much as you want.

Reference https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/#defining

Basically, if you're querying a field like:

query {
  someQuery(someFilter: {foo: "bar"}) {
    items {
      data
    }
  }
}

You can create a local field and write a typePolicy to it. Then you can query something like:

query {
  someQuery(someFilter: {foo: "bar"}) {
    items {
      data
    }

    parsedItems @client
  }
}

Then you can get data from ìtems and resolve parsedItems locally as you want.

Upvotes: 2

Related Questions