PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.4
Independent Analytics – WordPress Analytics Plugin v2.15.4
2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Data_Pruning / Pruner.php
independent-analytics / IAWP / Data_Pruning Last commit date
Pruner.php 6 days ago Pruning_Scheduler.php 6 days ago
Pruner.php
98 lines
1 <?php
2
3 namespace IAWP\Data_Pruning;
4
5 use IAWP\Illuminate_Builder;
6 use IAWP\Query;
7 use IAWP\Tables;
8 /** @internal */
9 class Pruner
10 {
11 private function __construct()
12 {
13 }
14 private function run() : void
15 {
16 $scheduler = new \IAWP\Data_Pruning\Pruning_Scheduler();
17 if ($scheduler->is_enabled() === \false) {
18 return;
19 }
20 $cutoff_date = $scheduler->get_pruning_cutoff_as_datetime();
21 if ($cutoff_date === null) {
22 return;
23 }
24 $sessions_table = Query::get_table_name(Query::SESSIONS);
25 Illuminate_Builder::new()->from($sessions_table)->where('created_at', '<', $cutoff_date->format('Y-m-d\\TH:i:s'))->delete();
26 // Delete orphaned views
27 $views_table = Query::get_table_name(Query::VIEWS);
28 $this->delete_session_orphans($views_table, 'session_id');
29 // Delete orphaned form submissions
30 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
31 $this->delete_session_orphans($form_submissions_table, 'session_id');
32 // Delete orphaned WooCommerce orders
33 $orders_table = Query::get_table_name(Query::ORDERS);
34 $this->delete_view_orphans($orders_table, 'view_id', 'id');
35 // Delete orphaned visitors
36 $visitors_table = Query::get_table_name(Query::VISITORS);
37 $this->delete_session_orphans($visitors_table, 'visitor_id');
38 // Delete orphaned resources
39 $resources_table = Query::get_table_name(Query::RESOURCES);
40 $this->delete_view_orphans($resources_table, 'id', 'resource_id');
41 // Delete orphaned referrers
42 $referrers_table = Query::get_table_name(Query::REFERRERS);
43 $this->delete_session_orphans($referrers_table, 'id', 'referrer_id');
44 // Delete orphaned forms
45 $forms_table = Query::get_table_name(Query::FORMS);
46 Illuminate_Builder::new()->from($forms_table, 'orphans')->leftJoin("{$form_submissions_table} AS form_submissions", "orphans.form_id", '=', "form_submissions.form_id")->whereNull('form_submissions.form_id')->delete();
47 // Delete orphaned device browsers
48 $device_browsers_table = Query::get_table_name(Query::DEVICE_BROWSERS);
49 $this->delete_session_orphans($device_browsers_table, 'device_browser_id');
50 // Delete orphaned device oss
51 $device_oss_table = Query::get_table_name(Query::DEVICE_OSS);
52 $this->delete_session_orphans($device_oss_table, 'device_os_id');
53 // Delete orphaned device types
54 $device_types_table = Query::get_table_name(Query::DEVICE_TYPES);
55 $this->delete_session_orphans($device_types_table, 'device_type_id');
56 // Don't touch cities or countries for now
57 // This would be a very different custom query as cities reference countries
58 // Delete orphaned campaigns
59 $campaigns_table = Query::get_table_name(Query::CAMPAIGNS);
60 $this->delete_session_orphans($campaigns_table, 'campaign_id');
61 // Delete orphaned clicks
62 $this->delete_view_orphans(Tables::clicks(), 'view_id', 'id');
63 // Delete orphaned clicked links
64 $clicks_table = Tables::clicks();
65 Illuminate_Builder::new()->from(Tables::clicked_links(), 'orphans')->leftJoin("{$clicks_table} AS clicks", 'orphans.click_id', '=', 'clicks.click_id')->whereNull('clicks.click_id')->delete();
66 // Delete orphaned links
67 $clicked_links_table = Tables::clicked_links();
68 Illuminate_Builder::new()->from(Tables::links(), 'links')->leftJoin("{$clicked_links_table} AS clicked_links", 'clicked_links.link_id', '=', 'links.id')->whereNull('clicked_links.click_id')->delete();
69 // Delete orphaned click targets
70 $links_table = Tables::links();
71 Illuminate_Builder::new()->from(Tables::click_targets(), 'orphans')->leftJoin("{$links_table} AS links", 'orphans.click_target_id', '=', 'links.click_target_id')->whereNull('links.id')->delete();
72 \delete_option('iawp_beginning_of_time');
73 }
74 private function delete_session_orphans(string $table, string $column, ?string $sessions_column = null) : int
75 {
76 $sessions_table = Query::get_table_name(Query::SESSIONS);
77 $sessions_column = $sessions_column ?? $column;
78 return Illuminate_Builder::new()->from($table, 'orphans')->leftJoin("{$sessions_table} AS sessions", "orphans.{$column}", '=', "sessions.{$sessions_column}")->whereNull('sessions.session_id')->delete();
79 }
80 private function delete_view_orphans(string $table, string $column, ?string $views_column = null) : int
81 {
82 $views_table = Query::get_table_name(Query::VIEWS);
83 $views_column = $views_column ?? $column;
84 return Illuminate_Builder::new()->from($table, 'orphans')->leftJoin("{$views_table} AS views", "orphans.{$column}", '=', "views.{$views_column}")->whereNull('views.id')->delete();
85 }
86 public static function register_hook()
87 {
88 \add_action('iawp_prune', function () {
89 self::prune();
90 });
91 }
92 public static function prune()
93 {
94 $pruner = new self();
95 $pruner->run();
96 }
97 }
98