From 927f484a4b32a0fb86a99eb5912889bebcfc5e66 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sun, 9 Jun 2019 10:29:36 -0700 Subject: [PATCH 1/2] fix: correct element collection fetch sort order --- .../schema/impl/JpaPredicateBuilder.java | 7 ++- .../schema/StarwarsQueryExecutorTests.java | 61 ++++++++++++++++--- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java index 4d5adb33c..59463ca42 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/JpaPredicateBuilder.java @@ -28,8 +28,8 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Expression; -import javax.persistence.criteria.Fetch; import javax.persistence.criteria.From; +import javax.persistence.criteria.Join; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.metamodel.EntityType; @@ -420,15 +420,16 @@ else if(Collection.class.isAssignableFrom(type)) { || EntityType.class.isInstance(from.getModel())) { From join = null; - for(Fetch fetch: from.getFetches()) { + for(Join fetch: from.getJoins()) { if(fetch.getAttribute().getName().equals(filter.getField())) join = (From) fetch; } if(join == null) { - join = (From) from.fetch(filter.getField()); + join = (From) from.join(filter.getField()); } + Predicate in = join.in(value); if(filter.getCriterias().contains(PredicateFilter.Criteria.NIN)) diff --git a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java index 4d73fe721..9ee275ab6 100644 --- a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java +++ b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java @@ -29,6 +29,7 @@ import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaExecutor; import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -351,6 +352,7 @@ public void queryOrderByFields() { } @Test + @Ignore public void queryOrderByFieldsNested() { //given: String query = "query { Humans(where: {id: {EQ: \"1000\"}}) { select {name(orderBy: DESC) homePlanet friends { name(orderBy:DESC) } } } }"; @@ -401,9 +403,9 @@ public void queryByCollectionOfEnumsAtRootLevel() { String expected = "{Humans={select=[" - + "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{name=Han Solo, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{name=Leia Organa, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}" + + "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}" + "]}}"; //when: @@ -684,6 +686,47 @@ public void queryWithWhereInsideOneToManyRelationsNotExisting() { @Test public void queryWithWhereInsideCompositeRelationsAndCollectionFiltering() { + //given: + String query = "query {" + + " Characters(where: {\n" + + " friends: {appearsIn: {IN: A_NEW_HOPE}}\n" + + " }) {\n" + + " select {\n" + + " id\n" + + " name\n" + + " appearsIn\n" + + " friends(where: {name: {LIKE: \"Leia\"}}) {\n" + + " id\n" + + " name\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + + String expected = "{Characters={select=[" + + "{id=1000, name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[" + + "{id=1003, name=Leia Organa}" + + "]}, " + + "{id=1002, name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[" + + "{id=1003, name=Leia Organa}" + + "]}, " + + "{id=2000, name=C-3PO, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[" + + "{id=1003, name=Leia Organa}" + + "]}, " + + "{id=2001, name=R2-D2, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[" + + "{id=1003, name=Leia Organa}" + + "]}" + + "]}}"; + + //when: + Object result = executor.execute(query).getData(); + + //then: + assertThat(result.toString()).isEqualTo(expected); + } + + @Test + public void queryWithWhereInsideCompositeRelationsAndCollectionFiltering2() { //given: String query = "query {" + " Humans(where: {" + @@ -1167,11 +1210,11 @@ public void queryWithNestedWhereSearchCriteriaShouldFetchElementCollectionsAttri "}"; String expected = "{Characters={select=[" - + "{id=1000, name=Luke Skywalker, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{id=1002, name=Han Solo, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{id=1003, name=Leia Organa, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{id=2000, name=C-3PO, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}, " - + "{id=2001, name=R2-D2, appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]}" + + "{id=1000, name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{id=1002, name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{id=1003, name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{id=2000, name=C-3PO, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, " + + "{id=2001, name=R2-D2, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}" + "]}}"; //when: @@ -1207,7 +1250,7 @@ public void queryWithNestedWhereCompoundSearchCriteriaShouldFetchElementCollecti + "name=Luke Skywalker, " + "homePlanet=Tatooine, " + "favoriteDroid={name=C-3PO}, " - + "appearsIn=[A_NEW_HOPE, THE_FORCE_AWAKENS, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI]" + + "appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]" + "}]}}"; //when: From 75f4fee0a28c497e16b81ac119f03251ce8f3fa2 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sun, 9 Jun 2019 10:35:58 -0700 Subject: [PATCH 2/2] fix: remove @Ignore from queryOrderByFieldsNested --- .../graphql/jpa/query/schema/StarwarsQueryExecutorTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java index 9ee275ab6..0689ddef0 100644 --- a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java +++ b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java @@ -29,7 +29,6 @@ import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaExecutor; import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -352,7 +351,6 @@ public void queryOrderByFields() { } @Test - @Ignore public void queryOrderByFieldsNested() { //given: String query = "query { Humans(where: {id: {EQ: \"1000\"}}) { select {name(orderBy: DESC) homePlanet friends { name(orderBy:DESC) } } } }";