rosavox/lib/alveolata/storage/implementation-sqltablegroup/functions.php
2025-05-23 07:33:29 +00:00

202 lines
4.8 KiB
PHP

<?php
namespace alveolata\storage;
// require_once(DIR_ALVEOLATA . '/definitions.php');
require_once(DIR_ALVEOLATA . '/string/functions.php');
require_once(DIR_ALVEOLATA . '/list/functions.php');
require_once(DIR_ALVEOLATA . '/report/functions.php');
require_once(DIR_ALVEOLATA . '/storage/implementation-sqltable/functions.php');
/**
* @author Christian Fraß <frass@greenscale.de>
*/
class struct_sqltablegroup
{
/**
* @var struct_sqltable
* @author Christian Fraß <frass@greenscale.de>
*/
public $core;
/**
* @var list<record<sqltable:struct_sqltable,key:string,target:string>>
* @author Christian Fraß <frass@greenscale.de>
*/
public $satellites;
/**
* @author Christian Fraß <frass@greenscale.de>
*/
public function __construct(
\alveolata\storage\struct_sqltable $core,
array $satellites
)
{
$this->core = $core;
$this->satellites = $satellites;
}
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_make(
\alveolata\storage\struct_sqltable $core,
array $satellites
)
{
return (
new struct_sqltablegroup(
$core,
$satellites
)
);
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_teardown(
struct_sqltablegroup $subject
) : void
{
foreach ($subject->satellites as $satellite) {
\alveolata\storage\sqltable_teardown($satellite['sqltable']);
}
\alveolata\storage\sqltable_teardown($subject->core);
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_setup(
struct_sqltablegroup $subject
) : void
{
\alveolata\storage\sqltable_setup($subject->core);
foreach ($subject->satellites as $satellite) {
\alveolata\storage\sqltable_setup($satellite['sqltable']);
}
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_create(
struct_sqltablegroup $subject,
/*map<string,any> */$value
)/* : int*/
{
$value_stripped = $value;
foreach ($subject->satellites as $satellite) {
unset($value_stripped[$satellite['target']]);
}
$key = \alveolata\storage\sqltable_create($subject->core, $value_stripped);
foreach ($subject->satellites as $satellite) {
foreach ($value[$satellite['target']] as $value_orbit) {
$value_orbit[$satellite['key']] = $key;
\alveolata\storage\sqltable_create($satellite['sqltable'], $value_orbit);
}
}
return $key;
}
/**
* @author Christian Fraß <frass@greenscale.de>
* @todo improve update of satellites
*/
function sqltablegroup_update(
struct_sqltablegroup $subject,
/*int */$key,
/*map<string,any> */$value
) : void
{
$value_stripped = $value;
foreach ($subject->satellites as $satellite) {
unset($value_stripped[$satellite['target']]);
}
\alveolata\storage\sqltable_update($subject->core, $key, $value_stripped);
foreach ($subject->satellites as $satellite) {
// delete old
$keys_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
foreach ($keys_satellites as $key_satellite) {
\alveolata\storage\sqltable_delete($satellite['sqltable'], $key_satellite);
}
// create new
foreach ($value[$satellite['target']] as $value_orbit) {
$value_orbit[$satellite['key']] = $key;
\alveolata\storage\sqltable_create($satellite['sqltable'], $value_orbit);
}
}
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_delete(
struct_sqltablegroup $subject,
/*int */$key
) : void
{
foreach ($subject->satellites as $satellite) {
$key_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
foreach ($key_satellites as $key_satellite) {
\alveolata\storage\sqltable_delete($satellite['sqltable'], $key_satellite);
}
}
\alveolata\storage\sqltable_delete($subject->core, $key);
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function sqltablegroup_read(
struct_sqltablegroup $subject,
/*int */$key
)/* : map<string,any>*/
{
$value = \alveolata\storage\sqltable_read($subject->core, $key);
foreach ($subject->satellites as $satellite) {
$keys_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
$value_orbit = [];
foreach ($keys_satellites as $key_satellite) {
$value_orbit_element = \alveolata\storage\sqltable_read($satellite['sqltable'], $key_satellite);
unset($value_orbit_element[$satellite['key']]);
array_push($value_orbit, $value_orbit_element);
}
$value[$satellite['target']] = $value_orbit;
}
return $value;
}
/**
* @author Christian Fraß <frass@greenscale.de>
* @todo search in satellites
*/
function sqltablegroup_search(
struct_sqltablegroup $subject,
array $parameters = []
) : array
{
$parameters_stripped = $parameters;
foreach ($subject->satellites as $satellite) {
unset($parameters_stripped[$satellite['target']]);
}
return \alveolata\storage\sqltable_search($subject->core, $parameters_stripped);
}
?>