This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-graphql-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 805f473  SLING-10085 - Cache the GraphQL schemas in the 
DefaultQueryExecutor
805f473 is described below

commit 805f4734d603a5d00cb0d477a422b349b132dffe
Author: Radu Cotescu <[email protected]>
AuthorDate: Mon Jan 25 10:05:20 2021 +0100

    SLING-10085 - Cache the GraphQL schemas in the DefaultQueryExecutor
    
    * cache the TypeRegistryDefinition, based on the schema's text 
representation;
    the GraphQL schema object cannot be cached, due to its embedded runtime
    wiring, which holds a Resource object
---
 .../graphql/core/engine/DefaultQueryExecutor.java  | 25 +++++++------
 .../core/engine/DefaultQueryExecutorTest.java      | 41 +++++++++++++---------
 2 files changed, 40 insertions(+), 26 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java 
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
index 063f3ff..3591bca 100644
--- 
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
+++ 
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
@@ -97,10 +97,11 @@ public class DefaultQueryExecutor implements QueryExecutor {
     private static final LogSanitizer cleanLog = new LogSanitizer();
 
     private Map<String, String> resourceToHashMap;
-    private Map<String, GraphQLSchema> hashToSchemaMap;
+    private Map<String, TypeDefinitionRegistry> hashToSchemaMap;
     private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
     private final Lock readLock = readWriteLock.readLock();
     private final Lock writeLock = readWriteLock.writeLock();
+    private final SchemaGenerator schemaGenerator = new SchemaGenerator();
 
     @Reference
     private RankedSchemaProviders schemaProvider;
@@ -146,7 +147,8 @@ public class DefaultQueryExecutor implements QueryExecutor {
                         Arrays.toString(selectors)));
             }
             LOGGER.debug("Resource {} maps to GQL schema {}", 
queryResource.getPath(), schemaDef);
-            final GraphQLSchema schema = getSchema(schemaDef, queryResource, 
selectors);
+            final TypeDefinitionRegistry typeDefinitionRegistry = 
getTypeDefinitionRegistry(schemaDef, queryResource, selectors);
+            final GraphQLSchema schema = buildSchema(typeDefinitionRegistry, 
queryResource);
             ExecutionInput executionInput = ExecutionInput.newExecutionInput()
                     .query(query)
                     .variables(variables)
@@ -182,7 +184,8 @@ public class DefaultQueryExecutor implements QueryExecutor {
                         Arrays.toString(selectors)));
             }
             LOGGER.debug("Resource {} maps to GQL schema {}", 
queryResource.getPath(), schemaDef);
-            final GraphQLSchema schema = getSchema(schemaDef, queryResource, 
selectors);
+            final TypeDefinitionRegistry typeDefinitionRegistry = 
getTypeDefinitionRegistry(schemaDef, queryResource, selectors);
+            final GraphQLSchema schema = buildSchema(typeDefinitionRegistry, 
queryResource);
             final GraphQL graphQL = GraphQL.newGraphQL(schema).build();
             if (LOGGER.isDebugEnabled()) {
                 LOGGER.debug("Executing query\n[{}]\nat [{}] with variables 
[{}]",
@@ -332,7 +335,7 @@ public class DefaultQueryExecutor implements QueryExecutor {
         }
     }
 
-    GraphQLSchema getSchema(@NotNull String sdl, @NotNull Resource 
currentResource, @NotNull String[] selectors) {
+    TypeDefinitionRegistry getTypeDefinitionRegistry(@NotNull String sdl, 
@NotNull Resource currentResource, @NotNull String[] selectors) {
         readLock.lock();
         String newHash = SHA256Hasher.getHash(sdl);
         /*
@@ -352,12 +355,8 @@ public class DefaultQueryExecutor implements QueryExecutor 
{
                 if (!newHash.equals(oldHash)) {
                     resourceToHashMap.put(resourceToHashMapKey, newHash);
                     TypeDefinitionRegistry typeRegistry = new 
SchemaParser().parse(sdl);
-                    Iterable<GraphQLScalarType> scalars = 
scalarsProvider.getCustomScalars(typeRegistry.scalars());
-                    RuntimeWiring runtimeWiring = buildWiring(typeRegistry, 
scalars, currentResource);
-                    SchemaGenerator schemaGenerator = new SchemaGenerator();
-                    GraphQLSchema schema = 
schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
-                    hashToSchemaMap.put(newHash, schema);
-                    return schema;
+                    hashToSchemaMap.put(newHash, typeRegistry);
+                    return typeRegistry;
                 }
                 readLock.lock();
             } finally {
@@ -371,6 +370,12 @@ public class DefaultQueryExecutor implements QueryExecutor 
{
         }
     }
 
+    private GraphQLSchema buildSchema(@NotNull TypeDefinitionRegistry 
typeRegistry, @NotNull Resource currentResource) {
+        Iterable<GraphQLScalarType> scalars = 
scalarsProvider.getCustomScalars(typeRegistry.scalars());
+        RuntimeWiring runtimeWiring = buildWiring(typeRegistry, scalars, 
currentResource);
+        return schemaGenerator.makeExecutableSchema(typeRegistry, 
runtimeWiring);
+    }
+
     private String getCacheKey(@NotNull Resource resource, @NotNull String[] 
selectors) {
         return resource.getPath() + ":" + String.join(".", selectors);
     }
diff --git 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
index cbad4f2..769f168 100644
--- 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
+++ 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
@@ -51,7 +51,7 @@ import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
-import graphql.schema.GraphQLSchema;
+import graphql.schema.idl.TypeDefinitionRegistry;
 
 import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
 import static org.hamcrest.Matchers.containsString;
@@ -330,28 +330,33 @@ public class DefaultQueryExecutorTest extends 
ResourceQueryTestBase {
     }
 
     @Test
-    public void testCachedSchemas() throws IOException {
+    public void testCachedTypeRegistry() throws IOException {
         // by default we'll get the test-schema
         final DefaultQueryExecutor queryExecutor = (DefaultQueryExecutor) 
context.getService(QueryExecutor.class);
         final RankedSchemaProviders schemaProvider = 
context.getService(RankedSchemaProviders.class);
         assertNotNull(queryExecutor);
         assertNotNull(schemaProvider);
         String[] selectors = new String[]{};
-        GraphQLSchema schema1 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        GraphQLSchema schema2 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        assertEquals(schema1, schema2);
+        TypeDefinitionRegistry
+                registry1 = 
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        TypeDefinitionRegistry registry2 =
+                
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        assertEquals(registry1, registry2);
 
         // change the schema provider
         context.registerService(SchemaProvider.class, new 
MockSchemaProvider("test-schema-selected-foryou"), Constants.SERVICE_RANKING,
                 Integer.MAX_VALUE);
-        GraphQLSchema schema3 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        GraphQLSchema schema4 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        assertEquals(schema3, schema4);
-        assertNotEquals(schema1, schema3);
+        TypeDefinitionRegistry
+                registry3 = 
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        TypeDefinitionRegistry registry4 =
+                
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        assertEquals(registry1, registry2);
+        assertEquals(registry3, registry4);
+        assertNotEquals(registry1, registry3);
     }
 
     @Test
-    public void testSchemasWithTheCacheDisabled() throws IOException {
+    public void testTypeRegistryWithTheCacheDisabled() throws IOException {
         Map<String, Object> properties = new HashMap<>();
         properties.put("schemaCacheSize", 0);
 
@@ -364,16 +369,20 @@ public class DefaultQueryExecutorTest extends 
ResourceQueryTestBase {
         assertNotNull(queryExecutor);
         assertNotNull(schemaProvider);
         String[] selectors = new String[]{};
-        GraphQLSchema schema1 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        GraphQLSchema schema2 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        assertNotEquals(schema1, schema2);
+        TypeDefinitionRegistry
+                registry1 = 
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        TypeDefinitionRegistry registry2 =
+                
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        assertNotEquals(registry1, registry2);
 
         // change the schema provider
         context.registerService(SchemaProvider.class, new 
MockSchemaProvider("test-schema-selected-foryou"), Constants.SERVICE_RANKING,
                 Integer.MAX_VALUE);
-        GraphQLSchema schema3 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        GraphQLSchema schema4 = 
queryExecutor.getSchema(schemaProvider.getSchema(resource, selectors), 
resource, selectors);
-        assertNotEquals(schema3, schema4);
+        TypeDefinitionRegistry
+                registry3 = 
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        TypeDefinitionRegistry registry4 =
+                
queryExecutor.getTypeDefinitionRegistry(schemaProvider.getSchema(resource, 
selectors), resource, selectors);
+        assertNotEquals(registry3, registry4);
     }
 
 }

Reply via email to