*/ class struct_sqltablegroup { /** * @var struct_sqltable * @author Christian Fraß */ public $core; /** * @var list> * @author Christian Fraß */ public $satellites; /** * @author Christian Fraß */ public function __construct( \alveolata\storage\struct_sqltable $core, array $satellites ) { $this->core = $core; $this->satellites = $satellites; } } /** * @author Christian Fraß */ function sqltablegroup_make( \alveolata\storage\struct_sqltable $core, array $satellites ) { return ( new struct_sqltablegroup( $core, $satellites ) ); } /** * @author Christian Fraß */ 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ß */ 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ß */ function sqltablegroup_create( struct_sqltablegroup $subject, /*map */$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ß * @todo improve update of satellites */ function sqltablegroup_update( struct_sqltablegroup $subject, /*int */$key, /*map */$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ß */ 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ß */ function sqltablegroup_read( struct_sqltablegroup $subject, /*int */$key )/* : map*/ { $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ß * @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); } ?>