From 58a037bd9822bab7e84a556e03845d73440070f1 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sat, 25 May 2024 09:39:43 +0400 Subject: [PATCH] renommer SqliteCapacitor en SqliteStorage --- src/db/Capacitor.php | 12 ++-- src/db/CapacitorStorage.php | 35 ++++++++---- ...{SqliteCapacitor.php => SqliteStorage.php} | 57 ++++++++++--------- ...apacitorTest.php => SqliteStorageTest.php} | 48 ++++++++-------- 4 files changed, 84 insertions(+), 68 deletions(-) rename src/db/sqlite/{SqliteCapacitor.php => SqliteStorage.php} (92%) rename tests/db/sqlite/{SqliteCapacitorTest.php => SqliteStorageTest.php} (64%) diff --git a/src/db/Capacitor.php b/src/db/Capacitor.php index e38c851..8d890b7 100644 --- a/src/db/Capacitor.php +++ b/src/db/Capacitor.php @@ -34,16 +34,20 @@ class Capacitor { return $this->storage->_charge($this->channel, $item, $func, $args); } + function discharge($filter=null, ?bool $reset=null): iterable { + return $this->storage->_discharge($this->channel, $reset); + } + function count($filter=null): int { return $this->storage->_count($this->channel, $filter); } - function discharge($filter=null, ?bool $reset=null): iterable { - return $this->storage->_discharge($this->channel, $filter, $reset); + function one($filter): ?array { + return $this->storage->_one($this->channel, $filter); } - function get($filter) { - return $this->storage->_get($this->channel, $filter); + function all($filter): iterable { + return $this->storage->_all($this->channel, $filter); } function each($filter, ?callable $func=null, ?array $args=null): int { diff --git a/src/db/CapacitorStorage.php b/src/db/CapacitorStorage.php index 1665592..b392270 100644 --- a/src/db/CapacitorStorage.php +++ b/src/db/CapacitorStorage.php @@ -50,6 +50,13 @@ abstract class CapacitorStorage { return $this->_charge($this->getChannel($channel), $item, $func, $args); } + abstract function _discharge(CapacitorChannel $channel, bool $reset=true): iterable; + + /** décharger les données du canal spécifié */ + function discharge(?string $channel, bool $reset=true): iterable { + return $this->_discharge($this->getChannel($channel), $reset); + } + abstract function _count(CapacitorChannel $channel, $filter): int; /** indiquer le nombre d'éléments du canal spécifié */ @@ -57,22 +64,26 @@ abstract class CapacitorStorage { return $this->_count($this->getChannel($channel), $filter); } - abstract function _discharge(CapacitorChannel $channel, $filter, ?bool $reset): iterable; - - /** décharger les données du canal spécifié */ - function discharge(?string $channel, $filter=null, ?bool $reset=null): iterable { - return $this->_discharge($this->getChannel($channel), $filter, $reset); - } - - abstract function _get(CapacitorChannel $channel, $filter); + abstract function _one(CapacitorChannel $channel, $filter): ?array; /** - * obtenir l'élément identifié par les clés spécifiées sur le canal spécifié + * obtenir la ligne correspondant au filtre sur le canal spécifié * - * si $filter n'est pas un tableau, il est transformé en ["_id" => $filter] + * si $filter n'est pas un tableau, il est transformé en ["id_" => $filter] */ - function get(?string $channel, $filter) { - return $this->_get($this->getChannel($channel), $filter); + function one(?string $channel, $filter): ?array { + return $this->_one($this->getChannel($channel), $filter); + } + + abstract function _all(CapacitorChannel $channel, $filter): iterable; + + /** + * obtenir les lignes correspondant au filtre sur le canal spécifié + * + * si $filter n'est pas un tableau, il est transformé en ["id_" => $filter] + */ + function all(?string $channel, $filter): iterable { + return $this->_one($this->getChannel($channel), $filter); } abstract function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): int; diff --git a/src/db/sqlite/SqliteCapacitor.php b/src/db/sqlite/SqliteStorage.php similarity index 92% rename from src/db/sqlite/SqliteCapacitor.php rename to src/db/sqlite/SqliteStorage.php index 3c0c66a..648d699 100644 --- a/src/db/sqlite/SqliteCapacitor.php +++ b/src/db/sqlite/SqliteStorage.php @@ -9,9 +9,9 @@ use nur\sery\str; use nur\sery\ValueException; /** - * Class SqliteCapacitor + * Class SqliteStorage */ -class SqliteCapacitor extends CapacitorStorage { +class SqliteStorage extends CapacitorStorage { function __construct($sqlite) { $this->sqlite = Sqlite::with($sqlite); } @@ -204,6 +204,17 @@ class SqliteCapacitor extends CapacitorStorage { return 1; } + function _discharge(CapacitorChannel $channel, bool $reset=true): iterable { + $rows = $this->sqlite->all([ + "select item__", + "from" => $channel->getTableName(), + ]); + foreach ($rows as $row) { + yield unserialize($row['item__']); + } + if ($reset) $this->_reset($channel); + } + protected function verifixFilter(CapacitorChannel $channel, &$filter): void { if ($filter !== null && !is_array($filter)) { $id = $filter; @@ -222,34 +233,30 @@ class SqliteCapacitor extends CapacitorStorage { ]); } - function _discharge(CapacitorChannel $channel, $filter, ?bool $reset): iterable { + function _one(CapacitorChannel $channel, $filter): ?array { + if ($filter === null) throw ValueException::null("filter"); + $this->verifixFilter($channel, $filter); + $row = $this->sqlite->one([ + "select", + "from" => $channel->getTableName(), + "where" => $filter, + ]); + return $this->unserialize($channel, $row); + } + + function _all(CapacitorChannel $channel, $filter): iterable { $this->verifixFilter($channel, $filter); - if ($reset === null) $reset = $filter === null; $rows = $this->sqlite->all([ - "select item__", + "select", "from" => $channel->getTableName(), "where" => $filter, ]); foreach ($rows as $row) { - yield unserialize($row['item__']); + yield $this->unserialize($channel, $row); } - if ($reset) $this->_reset($channel); - } - - function _get(CapacitorChannel $channel, $filter) { - if ($filter === null) throw ValueException::null("filter"); - $this->verifixFilter($channel, $filter); - $row = $this->sqlite->one([ - "select item__", - "from" => $channel->getTableName(), - "where" => $filter, - ]); - if ($row === null) return null; - else return unserialize($row["item__"]); } function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): int { - $this->verifixFilter($channel, $filter); if ($func === null) $func = [$channel, "onEach"]; $onEach = func::_prepare($func); $sqlite = $this->sqlite; @@ -259,15 +266,9 @@ class SqliteCapacitor extends CapacitorStorage { $sqlite->beginTransaction(); $commitThreshold = $channel->getEachCommitThreshold(); try { - $rows = $sqlite->all([ - "select", - "from" => $tableName, - "where" => $filter, - ]); $args ??= []; - foreach ($rows as $row) { - $values = $this->unserialize($channel, $row); - $updates = func::_call($onEach, [$values["item"], $values, ...$args]); + foreach ($this->_all($channel, $filter) as $row) { + $updates = func::_call($onEach, [$row["item"], $row, ...$args]); if (is_array($updates)) { $updates = $this->serialize($channel, $updates); if (array_key_exists("item__", $updates)) { diff --git a/tests/db/sqlite/SqliteCapacitorTest.php b/tests/db/sqlite/SqliteStorageTest.php similarity index 64% rename from tests/db/sqlite/SqliteCapacitorTest.php rename to tests/db/sqlite/SqliteStorageTest.php index f140d28..425ff3a 100644 --- a/tests/db/sqlite/SqliteCapacitorTest.php +++ b/tests/db/sqlite/SqliteStorageTest.php @@ -5,32 +5,32 @@ use nulib\tests\TestCase; use nur\sery\db\Capacitor; use nur\sery\db\CapacitorChannel; -class SqliteCapacitorTest extends TestCase { - function _testChargeStrings(SqliteCapacitor $capacitor, ?string $channel) { - $capacitor->reset($channel); - $capacitor->charge($channel, "first"); - $capacitor->charge($channel, "second"); - $capacitor->charge($channel, "third"); - $items = iterator_to_array($capacitor->discharge($channel, null, false)); +class SqliteStorageTest extends TestCase { + function _testChargeStrings(SqliteStorage $storage, ?string $channel) { + $storage->reset($channel); + $storage->charge($channel, "first"); + $storage->charge($channel, "second"); + $storage->charge($channel, "third"); + $items = iterator_to_array($storage->discharge($channel, false)); self::assertSame(["first", "second", "third"], $items); } - function _testChargeArrays(SqliteCapacitor $capacitor, ?string $channel) { - $capacitor->reset($channel); - $capacitor->charge($channel, ["id" => 10, "name" => "first"]); - $capacitor->charge($channel, ["name" => "second", "id" => 20]); - $capacitor->charge($channel, ["name" => "third", "id" => "30"]); + function _testChargeArrays(SqliteStorage $storage, ?string $channel) { + $storage->reset($channel); + $storage->charge($channel, ["id" => 10, "name" => "first"]); + $storage->charge($channel, ["name" => "second", "id" => 20]); + $storage->charge($channel, ["name" => "third", "id" => "30"]); } function testChargeStrings() { - $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); - $this->_testChargeStrings($capacitor, null); - $capacitor->close(); + $storage = new SqliteStorage(__DIR__.'/capacitor.db'); + $this->_testChargeStrings($storage, null); + $storage->close(); } function testChargeArrays() { - $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); - $capacitor->addChannel(new class extends CapacitorChannel { + $storage = new SqliteStorage(__DIR__.'/capacitor.db'); + $storage->addChannel(new class extends CapacitorChannel { const NAME = "arrays"; function getKeyDefinitions(): ?array { return ["id" => "integer"]; @@ -40,14 +40,14 @@ class SqliteCapacitorTest extends TestCase { } }); - $this->_testChargeStrings($capacitor, "strings"); - $this->_testChargeArrays($capacitor, "arrays"); - $capacitor->close(); + $this->_testChargeStrings($storage, "strings"); + $this->_testChargeArrays($storage, "arrays"); + $storage->close(); } function testEach() { - $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); - $capacitor = new Capacitor($capacitor, new class extends CapacitorChannel { + $storage = new SqliteStorage(__DIR__.'/capacitor.db'); + $capacitor = new Capacitor($storage, new class extends CapacitorChannel { const NAME = "each"; function getKeyDefinitions(): ?array { @@ -86,8 +86,8 @@ class SqliteCapacitorTest extends TestCase { } function testPrimayKey() { - $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); - $capacitor = new Capacitor($capacitor, new class extends CapacitorChannel { + $storage = new SqliteStorage(__DIR__.'/capacitor.db'); + $capacitor = new Capacitor($storage, new class extends CapacitorChannel { const NAME = "pk"; function getKeyDefinitions(): ?array {