Files
lucent-laravel/src/Edge/EdgeRepo.php
T

113 lines
2.8 KiB
PHP
Raw Normal View History

2023-10-02 23:10:49 +03:00
<?php namespace Lucent\Edge;
2024-09-07 13:22:58 +03:00
use Lucent\Database\Database;
2023-10-02 23:10:49 +03:00
use Lucent\LucentException;
use PDOException;
2023-11-29 17:10:15 +02:00
use stdClass;
2023-10-02 23:10:49 +03:00
class EdgeRepo
{
2023-11-29 17:10:15 +02:00
public function __construct()
{
}
2023-10-02 23:10:49 +03:00
2023-11-29 17:10:15 +02:00
public function insert(Edge $edge): void
2023-10-02 23:10:49 +03:00
{
try {
2024-09-07 13:22:58 +03:00
Database::make()->table("edges")->insert($edge->toDB());
2023-10-02 23:10:49 +03:00
} catch (PDOException $e) {
if ($e->getCode() == 23505) {
throw new LucentException("Edge already exists");
}
throw $e;
}
}
2024-08-19 17:48:10 +03:00
/**
* @param list<Edge> $edges
* @return void
* @throws LucentException
*/
public function insertMany(array $edges): void
{
$edgesDB = collect($edges)->map(fn($e) => $e->toDB())->toArray();
try {
2024-09-07 13:22:58 +03:00
Database::make()->table("edges")->insert($edgesDB);
2024-08-19 17:48:10 +03:00
} catch (PDOException $e) {
if ($e->getCode() == 23505) {
throw new LucentException("Edge already exists");
}
throw $e;
}
}
/**
* @param string $from
* @param list<Edge> $edges
* @return void
*/
public function replaceForRecord(string $from, array $edges): void
2023-10-02 23:10:49 +03:00
{
$edgesDB = collect($edges)->map(fn($e) => $e->toDB())->toArray();
2024-09-07 13:22:58 +03:00
Database::make()->table("edges")->where("source", $from)->delete();
Database::make()->table("edges")->insert($edgesDB);
2023-10-02 23:10:49 +03:00
}
2024-08-19 17:48:10 +03:00
/**
* @return list<Edge>
*/
public function findAll(): array
2023-11-29 17:10:15 +02:00
{
2024-09-07 13:22:58 +03:00
$edges = Database::make()->table("edges")->get();
2024-08-19 17:48:10 +03:00
return $edges->map([$this, 'mapEdge'])->toArray();
}
public function findForSource(string $recordId): array
{
2024-09-07 13:22:58 +03:00
$edges = Database::make()->table("edges")->where("source", $recordId)->get();
2024-08-19 17:48:10 +03:00
return $edges->map([$this, 'mapEdge'])->toArray();
2023-11-29 17:10:15 +02:00
}
public function mapEdge(stdClass $edge): Edge
{
return new Edge(
source: $edge->source,
target: $edge->target,
sourceSchema: $edge->sourceSchema,
targetSchema: $edge->targetSchema,
field: $edge->field,
rank: $edge->rank,
depth: $edge->depth ?? 0
);
}
public function remove(Edge $edge): void
{
2024-09-07 13:22:58 +03:00
Database::make()->table("edges")
2023-11-29 17:10:15 +02:00
->where("source", $edge->source)
->where("target", $edge->target)
->where("sourceSchema", $edge->sourceSchema)
->where("targetSchema", $edge->targetSchema)
->where("field", $edge->field)
->delete();
}
2024-08-19 17:48:10 +03:00
public function findLastEdgeRank(string $source, string $field): string
{
2024-09-07 13:22:58 +03:00
$data = Database::make()->table("edges")
2024-08-19 17:48:10 +03:00
->where("source", $source)
->where("field", $field)
->orderBy("rank", "desc")
->first();
return $data->rank ?? "";
}
2023-10-02 23:10:49 +03:00
}