From 234cc70d9a09d8661bfc8c43b9b93ece6a717adf Mon Sep 17 00:00:00 2001 From: George Buckingham Date: Mon, 21 Feb 2022 15:03:19 +0000 Subject: [PATCH 1/3] Add support for using a custom DAG Edge model --- README.md | 25 +++++++++++++++++++++++++ config/laravel-dag-manager.php | 10 ++++++++++ src/Tasks/AddDagEdge.php | 16 ++++++++++++---- src/Tasks/RemoveDagEdge.php | 4 +++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7683de2..ed2497c 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,31 @@ $ancestors = MyModel::dagAncestorsOf($myModel->id, 'my-source', 1)->get(); Not providing the `$maxHops` parameter means that all descendants, ancestors, or relations will be returned. +### Custom DAG edge model + +You can use your own model class if you need to customise the behaviour of the DAG edge model. + +Your custom model class must extend the `Telkins\Models\DagEdge` class: + +```php +namespace App\Models; + +use Telkins\Models\DagEdge as BaseModel; + +class MyDagEdge extends BaseModel +{ +... +``` + +You can then specify the fully qualified class name of your custom model in the package config file. + +```php +// config/laravel-dag-manager.php +... +'edge_model' => \App\Models\MyDagEdge::class, +... +``` + ## Testing ```bash diff --git a/config/laravel-dag-manager.php b/config/laravel-dag-manager.php index 6e0f47a..8f5eaaf 100644 --- a/config/laravel-dag-manager.php +++ b/config/laravel-dag-manager.php @@ -44,4 +44,14 @@ 'table_name' => 'dag_edges', + /** + *------------------------------------------------------------------------- + * Edge Model + *------------------------------------------------------------------------- + * + * The fully qualified class name of the DAG edge model. + */ + + 'edge_model' => \Telkins\Dag\Models\DagEdge::class, + ]; diff --git a/src/Tasks/AddDagEdge.php b/src/Tasks/AddDagEdge.php index 1b23edc..18d1d92 100644 --- a/src/Tasks/AddDagEdge.php +++ b/src/Tasks/AddDagEdge.php @@ -51,7 +51,9 @@ public function execute(): ?Collection protected function edgeExists(): bool { - return DagEdge::where([ + $edgeClass = config('laravel-dag-manager.edge_model'); + + return $edgeClass::where([ ['start_vertex', $this->startVertex], ['end_vertex', $this->endVertex], ['hops', 0], @@ -68,7 +70,9 @@ protected function guardAgainstCircularRelation(): void throw new CircularReferenceException(); } - if (DagEdge::where([ + $edgeClass = config('laravel-dag-manager.edge_model'); + + if ($edgeClass::where([ ['start_vertex', $this->endVertex], ['end_vertex', $this->startVertex], ['source', $this->source], @@ -92,7 +96,9 @@ protected function createEdge(): DagEdge protected function createDirectEdge(): DagEdge { - $edge = DagEdge::create([ + $edgeClass = config('laravel-dag-manager.edge_model'); + + $edge = $edgeClass::create([ 'start_vertex' => $this->startVertex, 'end_vertex' => $this->endVertex, 'hops' => 0, @@ -187,7 +193,9 @@ protected function executeInsert(Builder $select): void protected function getNewlyInsertedEdges(DagEdge $edge): Collection { - return DagEdge::where('direct_edge_id', $edge->id) + $edgeClass = config('laravel-dag-manager.edge_model'); + + return $edgeClass::where('direct_edge_id', $edge->id) ->orderBy('hops') ->get(); } diff --git a/src/Tasks/RemoveDagEdge.php b/src/Tasks/RemoveDagEdge.php index eccb8c0..05f17dd 100644 --- a/src/Tasks/RemoveDagEdge.php +++ b/src/Tasks/RemoveDagEdge.php @@ -30,7 +30,9 @@ public function __construct(int $startVertex, int $endVertex, string $source, st */ public function execute(): bool { - $edge = DagEdge::where([ + $edgeClass = config('laravel-dag-manager.edge_model'); + + $edge = $edgeClass::where([ ['start_vertex', $this->startVertex], ['end_vertex', $this->endVertex], ['hops', 0], From de1679a1f5d146e878922dd37f5ad3847000efdf Mon Sep 17 00:00:00 2001 From: Travis Elkins Date: Fri, 30 Sep 2022 21:57:27 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Changed=20spelling=20from=20=F0=9F=87=AC?= =?UTF-8?q?=F0=9F=87=A7=20to=20=F0=9F=87=BA=F0=9F=87=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ed2497c..df3fae4 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ Not providing the `$maxHops` parameter means that all descendants, ancestors, or ### Custom DAG edge model -You can use your own model class if you need to customise the behaviour of the DAG edge model. +You can use your own model class if you need to customise the behavior of the DAG edge model. Your custom model class must extend the `Telkins\Models\DagEdge` class: From 3771f6b7399b25b23bd956f0983a13d05ca95579 Mon Sep 17 00:00:00 2001 From: Travis Elkins Date: Fri, 30 Sep 2022 21:57:56 +0200 Subject: [PATCH 3/3] DRYed up new config access for DAG edge model. --- src/Concerns/UsesDagConfig.php | 7 ++++++- src/Tasks/AddDagEdge.php | 11 +++++++---- src/Tasks/RemoveDagEdge.php | 5 ++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Concerns/UsesDagConfig.php b/src/Concerns/UsesDagConfig.php index f9b8242..bc55912 100644 --- a/src/Concerns/UsesDagConfig.php +++ b/src/Concerns/UsesDagConfig.php @@ -15,4 +15,9 @@ public function defaultTableName(): ?string { return config('laravel-dag-manager.table_name'); } -} \ No newline at end of file + + public function dagEdgeModel(): ?string + { + return config('laravel-dag-manager.edge_model'); + } +} diff --git a/src/Tasks/AddDagEdge.php b/src/Tasks/AddDagEdge.php index 18d1d92..e3b5c86 100644 --- a/src/Tasks/AddDagEdge.php +++ b/src/Tasks/AddDagEdge.php @@ -7,12 +7,15 @@ use Illuminate\Database\Query\Builder; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; +use Telkins\Dag\Concerns\UsesDagConfig; use Telkins\Dag\Exceptions\CircularReferenceException; use Telkins\Dag\Exceptions\TooManyHopsException; use Telkins\Dag\Models\DagEdge; class AddDagEdge { + use UsesDagConfig; + protected ?string $connection; protected int $endVertex; protected int $maxHops; @@ -51,7 +54,7 @@ public function execute(): ?Collection protected function edgeExists(): bool { - $edgeClass = config('laravel-dag-manager.edge_model'); + $edgeClass = $this->dagEdgeModel(); return $edgeClass::where([ ['start_vertex', $this->startVertex], @@ -70,7 +73,7 @@ protected function guardAgainstCircularRelation(): void throw new CircularReferenceException(); } - $edgeClass = config('laravel-dag-manager.edge_model'); + $edgeClass = $this->dagEdgeModel(); if ($edgeClass::where([ ['start_vertex', $this->endVertex], @@ -96,7 +99,7 @@ protected function createEdge(): DagEdge protected function createDirectEdge(): DagEdge { - $edgeClass = config('laravel-dag-manager.edge_model'); + $edgeClass = $this->dagEdgeModel(); $edge = $edgeClass::create([ 'start_vertex' => $this->startVertex, @@ -193,7 +196,7 @@ protected function executeInsert(Builder $select): void protected function getNewlyInsertedEdges(DagEdge $edge): Collection { - $edgeClass = config('laravel-dag-manager.edge_model'); + $edgeClass = $this->dagEdgeModel(); return $edgeClass::where('direct_edge_id', $edge->id) ->orderBy('hops') diff --git a/src/Tasks/RemoveDagEdge.php b/src/Tasks/RemoveDagEdge.php index 05f17dd..a7f47d1 100644 --- a/src/Tasks/RemoveDagEdge.php +++ b/src/Tasks/RemoveDagEdge.php @@ -6,10 +6,13 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; +use Telkins\Dag\Concerns\UsesDagConfig; use Telkins\Dag\Models\DagEdge; class RemoveDagEdge { + use UsesDagConfig; + protected ?string $connection; protected int $endVertex; protected string $source; @@ -30,7 +33,7 @@ public function __construct(int $startVertex, int $endVertex, string $source, st */ public function execute(): bool { - $edgeClass = config('laravel-dag-manager.edge_model'); + $edgeClass = $this->dagEdgeModel(); $edge = $edgeClass::where([ ['start_vertex', $this->startVertex],