GraphQLize Update (#3) - Logical Operators & Filter by nested objects.

Tamizhvendan S

Tamizhvendan S

Author, GraphQLize

Hello World,

The third iteration of GraphQLize went well as planned and the filters in GraphQLize just got better :).

Let's take a peek at what's new in GraphQLize and what is in the pipeline for the next two weeks.

Logical Operators

Now we can use logical operators and, or and not in the filters.

AND

query {
# payments of a customer with the id `1`
# and amount greater than `5.99`
payments(where: {and: {customerId: {eq: 1}, amount: {gt: 5.99}}}) {
paymentId
amount
}
}

and also supports list of conditions.

The above query can be rewritten as

query {
payments(where: {and: [{customerId: {eq: 1}, amount: {gt: 5.99}}]}) {
paymentId
amount
}
}

OR

or is similar to and in syntax. It accepts both a single condition or a list of conditions.

query {
# languages with the name either "English" or "French"
languages(where: {or: [{name: {eq: "English"}}, {name: {eq: "French"}}]}) {
languageId
name
}
}

NOT

Using the not operator we can invert the filter condition.

query {
# languages with the name except "English" or "French"
languages(where: {not: {or: [{name: {eq: "English"}}, {name: {eq: "French"}}]}}) {
languageId
name
}
}

Filter by nested object(s)

Another major feature that was added during the last iteration is filtering the resulting objects based on the fields of a nested object(s).

One to One

For example, to get all the cities of a country using the country's name in the above schema, We can query it as

query {
cities(where: {country: {country: {eq : "Algeria"}}}) {
cityId
city
}
}

One to Many

If the nested object has one-to-many relationship with its parent, the filter condition yield the results if at-least one of the nested object's field(s) satisfy the condition.

For the above schema, we can get a list of countries which has at-least one city that starts with Ab using the below query.

query {
# returns countries which has at-least one city
# with the name like 'AB%'
countries(where: {cities: {city: {like: "Ab%"}}}) {
countryId
country
}
}

Many to Many

A filter based on a nested object with the many-to-many relationship behaves the same as that of one-to-many.

For the above schema, to get the actors who are part of at-lease one film which has the word LIFE in its title.

query {
actors(where: {films: {title: {:like "%LIFE%"}}}) {
firstName
lastName
}
}

Let's assume that we have a schema like below

To filter authors who has at-least one course with the rating 5, we can achieve it using the following query.

query {
authors(where: {courses : {rating: {eq: 5}}}) {
firstName
lastName
}
}

If we want to filter only the authors who has got the rating 5 in all their courses, we can achieve it by

query {
authors(where: {not: {courses : {rating: {neq: 5}}}}) {
firstName
lastName
}
}

We are making use of SQL anti-join here by inverting the whole condition using not and complementing the inner condition using its reverse (neq in the place of eq).

Existence Check

GraphQLize provides a special filter parameter have to filter based on the existence of child objects. For example, in the above schema, if we'd like to filter only the authors who have courses, it can be achieved using the following query.

query {
authors(where: {have: courses}) {
firstName
lastName
}
}

Suppose, if we want to filter authors who don't have courses, we can make use of the not in addition to have in the filter.

query {
authors(where: {not: {have:courses}}) {
firstName
lastName
}
}

The have parameter is available only in the one-to-many and many-to-many relationship fields

What's Next?

The focus of the next iteration of GraphQLize is adding support for SQL aggregate functions.

You can keep track of the progress by

Cheers,
Tamizh