Pruner.php
85 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\Data_Pruning; |
| 4 | |
| 5 | use IAWP\Illuminate_Builder; |
| 6 | use IAWP\Query; |
| 7 | /** @internal */ |
| 8 | class Pruner |
| 9 | { |
| 10 | private $cutoff_date; |
| 11 | private function __construct() |
| 12 | { |
| 13 | $this->cutoff_date = (new \IAWP\Data_Pruning\Pruning_Scheduler())->get_pruning_cutoff_as_datetime(); |
| 14 | } |
| 15 | private function run() |
| 16 | { |
| 17 | if (\is_null($this->cutoff_date)) { |
| 18 | return; |
| 19 | } |
| 20 | $db = Illuminate_Builder::get_connection(); |
| 21 | $db->transaction(function () { |
| 22 | $sessions_table = Query::get_table_name(Query::SESSIONS); |
| 23 | Illuminate_Builder::get_builder()->from($sessions_table)->where('created_at', '<', $this->cutoff_date->format('Y-m-d\\TH:i:s'))->delete(); |
| 24 | // Delete orphaned views |
| 25 | $views_table = Query::get_table_name(Query::VIEWS); |
| 26 | $this->delete_session_orphans($views_table, 'session_id'); |
| 27 | // Delete orphaned form submissions |
| 28 | $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS); |
| 29 | $this->delete_session_orphans($form_submissions_table, 'session_id'); |
| 30 | // Delete orphaned WooCommerce orders |
| 31 | $orders_table = Query::get_table_name(Query::ORDERS); |
| 32 | $this->delete_view_orphans($orders_table, 'view_id', 'id'); |
| 33 | // Delete orphaned visitors |
| 34 | $visitors_table = Query::get_table_name(Query::VISITORS); |
| 35 | $this->delete_session_orphans($visitors_table, 'visitor_id'); |
| 36 | // Delete orphaned resources |
| 37 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 38 | $this->delete_view_orphans($resources_table, 'id', 'resource_id'); |
| 39 | // Delete orphaned referrers |
| 40 | $referrers_table = Query::get_table_name(Query::REFERRERS); |
| 41 | $this->delete_session_orphans($referrers_table, 'id', 'referrer_id'); |
| 42 | // Delete orphaned forms |
| 43 | $forms_table = Query::get_table_name(Query::FORMS); |
| 44 | Illuminate_Builder::get_builder()->from($forms_table, 'orphans')->leftJoin("{$form_submissions_table} AS form_submissions", "orphans.form_id", '=', "form_submissions.form_id")->whereNull('form_submissions.form_id')->delete(); |
| 45 | // Delete orphaned device browsers |
| 46 | $device_browsers_table = Query::get_table_name(Query::DEVICE_BROWSERS); |
| 47 | $this->delete_session_orphans($device_browsers_table, 'device_browser_id'); |
| 48 | // Delete orphaned device oss |
| 49 | $device_oss_table = Query::get_table_name(Query::DEVICE_OSS); |
| 50 | $this->delete_session_orphans($device_oss_table, 'device_os_id'); |
| 51 | // Delete orphaned device types |
| 52 | $device_types_table = Query::get_table_name(Query::DEVICE_TYPES); |
| 53 | $this->delete_session_orphans($device_types_table, 'device_type_id'); |
| 54 | // Don't touch cities or countries for now |
| 55 | // This would be a very different custom query as cities reference countries |
| 56 | // Delete orphaned campaigns |
| 57 | $campaigns_table = Query::get_table_name(Query::CAMPAIGNS); |
| 58 | $this->delete_session_orphans($campaigns_table, 'campaign_id'); |
| 59 | }); |
| 60 | } |
| 61 | private function delete_session_orphans(string $table, string $column, ?string $sessions_column = null) : int |
| 62 | { |
| 63 | $sessions_table = Query::get_table_name(Query::SESSIONS); |
| 64 | $sessions_column = $sessions_column ?? $column; |
| 65 | return Illuminate_Builder::get_builder()->from($table, 'orphans')->leftJoin("{$sessions_table} AS sessions", "orphans.{$column}", '=', "sessions.{$sessions_column}")->whereNull('sessions.session_id')->delete(); |
| 66 | } |
| 67 | private function delete_view_orphans(string $table, string $column, ?string $views_column = null) : int |
| 68 | { |
| 69 | $views_table = Query::get_table_name(Query::VIEWS); |
| 70 | $views_column = $views_column ?? $column; |
| 71 | return Illuminate_Builder::get_builder()->from($table, 'orphans')->leftJoin("{$views_table} AS views", "orphans.{$column}", '=', "views.{$views_column}")->whereNull('views.id')->delete(); |
| 72 | } |
| 73 | public static function register_hook() |
| 74 | { |
| 75 | \add_action('iawp_prune', function () { |
| 76 | self::prune(); |
| 77 | }); |
| 78 | } |
| 79 | public static function prune() |
| 80 | { |
| 81 | $pruner = new self(); |
| 82 | $pruner->run(); |
| 83 | } |
| 84 | } |
| 85 |