From 412088867bbffe46b08e726954bb58b98d777ba0 Mon Sep 17 00:00:00 2001 From: Volker Killesreiter Date: Wed, 18 Dec 2024 14:06:53 +0100 Subject: [PATCH] Load entity types and add cache tags and contexts in search api producer * load entity types and add cache tags and contexts --- .../ThunderSearchApiProducerBase.php | 7 ++ .../DataProducer/ThunderSearchApiTest.php | 116 ++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 modules/thunder_gqls/tests/src/Kernel/DataProducer/ThunderSearchApiTest.php diff --git a/modules/thunder_gqls/src/Plugin/GraphQL/DataProducer/ThunderSearchApiProducerBase.php b/modules/thunder_gqls/src/Plugin/GraphQL/DataProducer/ThunderSearchApiProducerBase.php index e568b6971..bd3bcb0e2 100644 --- a/modules/thunder_gqls/src/Plugin/GraphQL/DataProducer/ThunderSearchApiProducerBase.php +++ b/modules/thunder_gqls/src/Plugin/GraphQL/DataProducer/ThunderSearchApiProducerBase.php @@ -161,6 +161,13 @@ protected function buildBaseQuery( $query->range($offset, $limit); $cacheContext->addCacheableDependency($searchIndex); + foreach ($searchIndex->getDatasources() as $datasource) { + $storage = $this->entityTypeManager->getStorage($datasource->getEntityTypeId()); + $entityType = $storage->getEntityType(); + + $cacheContext->addCacheTags($entityType->getListCacheTags()); + $cacheContext->addCacheContexts($entityType->getListCacheContexts()); + } return $query; } diff --git a/modules/thunder_gqls/tests/src/Kernel/DataProducer/ThunderSearchApiTest.php b/modules/thunder_gqls/tests/src/Kernel/DataProducer/ThunderSearchApiTest.php new file mode 100644 index 000000000..c12a7236e --- /dev/null +++ b/modules/thunder_gqls/tests/src/Kernel/DataProducer/ThunderSearchApiTest.php @@ -0,0 +1,116 @@ +installSchema('search_api', [ + 'search_api_item', + ]); + $this->installEntitySchema('search_api_task'); + $this->installConfig('search_api'); + + // Create a test server. + $this->searchApiServer = Server::create([ + 'name' => 'Test Server', + 'id' => 'test_server', + 'status' => 1, + 'backend' => 'search_api_test', + ]); + $this->searchApiServer->save(); + + $this->searchApiIndex = Index::create([ + 'name' => 'Test Index', + 'id' => 'test_index', + 'status' => 1, + 'tracker_settings' => [ + 'default' => [], + ], + 'datasource_settings' => [ + 'entity:node' => [], + ], + 'server' => $this->searchApiServer->id(), + 'options' => ['index_directly' => FALSE], + ]); + $this->searchApiIndex->save(); + + $schema = <<setUpSchema($schema); + } + + /** + * Test cache metadata for the query. + */ + public function testQueryCacheMetadata(): void { + $query = <<mockResolver('Query', 'search', + $this->builder->produce('thunder_search_api') + ->map('index', $this->builder->fromValue('test_index')) + ->map('offset', $this->builder->fromValue(0)) + ->map('limit', $this->builder->fromValue(20)) + ); + $this->mockResolver('SearchApiResult', 'total', $this->builder->fromValue(1)); + + $metadata = $this->defaultCacheMetaData(); + $metadata->setCacheContexts(['languages:language_interface', 'user.permissions', 'user.node_grants:view']); + $metadata->addCacheTags(['config:search_api.index.test_index', 'node_list']); + + $this->assertResults($query, [], [ + 'search' => ['total' => '1'], + ], $metadata); + } + +}