rdf_sync-1.x-dev/src/RdfSyncConnection.php

src/RdfSyncConnection.php
<?php

declare(strict_types=1);

namespace Drupal\rdf_sync;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\ImmutableConfig;
use EasyRdf\Graph;
use EasyRdf\GraphStore;
use EasyRdf\Serialiser\Ntriples;
use EasyRdf\Sparql\Result;

/**
 * Defines rdf_sync.connection service.
 */
class RdfSyncConnection implements RdfSyncConnectionInterface {

  /**
   * RDF sync settings static cache.
   */
  protected ImmutableConfig $settings;

  public function __construct(
    protected readonly ConfigFactoryInterface $configFactory,
    protected readonly RdfSyncConnectorPluginManager $connectorManager,
  ) {}

  /**
   * {@inheritdoc}
   */
  public function query(string $query): Result {
    return $this->getPluginInstance()->query($query);
  }

  /**
   * {@inheritdoc}
   */
  public function update(string $query): Result {
    return $this->getPluginInstance()->update($query);
  }

  /**
   * {@inheritdoc}
   */
  public function clearGraph(): void {
    $uri = $this->getSettings()->get('graph_uri');
    $this->getPluginInstance()->clearGraph($uri);
  }

  /**
   * {@inheritdoc}
   */
  public function createGraphStore(): GraphStore {
    return $this->getPluginInstance()->createGraphStore();
  }

  /**
   * {@inheritdoc}
   */
  public function updateTriples(array $triples): void {
    // @todo Replace this with a single query.
    $this->deleteTriples(array_keys($triples));
    $this->insertTriples($triples);
  }

  /**
   * {@inheritdoc}
   */
  public function deleteTriples(array $uris): void {
    $serializer = new Ntriples();
    $clauses = array_map(
      function (string $uri) use ($serializer): string {
        return '?subject = ' . $serializer->serialiseValue(['value' => $uri, 'type' => 'uri']);
      },
      $uris,
    );

    $graphUri = $this->getSettings()->get('graph_uri');
    $clauses = implode(" ||\n", $clauses);

    $query = <<<QUERY
        DELETE FROM <$graphUri>
            { ?subject ?predicate ?object }
        WHERE {
            ?subject ?predicate ?object .
            FILTER (
                $clauses
            )
        }
        QUERY;

    $this->update($query);
  }

  /**
   * {@inheritdoc}
   */
  public function insertTriples(array $triples): void {
    $graph = new Graph();
    $graph->parse($triples, 'php');
    $triples = $graph->serialise('ntriples');
    $graphUri = $this->getSettings()->get('graph_uri');
    $query = <<<QUERY
      INSERT INTO <$graphUri> {
        $triples
      }
      QUERY;
    $this->update($query);
  }

  /**
   * Returns the currently configured RDF Sync connector plugin instance.
   *
   * @return \Drupal\rdf_sync\RdfSyncConnectorPluginInterface
   *   The currently configured RDF Sync connector plugin instance.
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   *   When the configured plugin doesn't exist.
   */
  protected function getPluginInstance(): RdfSyncConnectorPluginInterface {
    $connectorConfig = $this->getSettings()->get('connector');
    $connector = $this->connectorManager->createInstance($connectorConfig['id'], $connectorConfig['config']);
    assert($connector instanceof RdfSyncConnectorPluginInterface);
    return $connector;
  }

  /**
   * Returns the RDF Sync settings.
   *
   * @return \Drupal\Core\Config\ImmutableConfig
   *   The RDF Sync settings.
   */
  protected function getSettings(): ImmutableConfig {
    if (!isset($this->settings)) {
      $this->settings = $this->configFactory->get('rdf_sync.settings');
    }
    return $this->settings;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc