PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.12.2
Independent Analytics – WordPress Analytics Plugin v2.12.2
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 1 year ago Pruning_Scheduler.php 1 year ago
Pruner.php
94 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 $cutoff_date;
12 private function __construct()
13 {
14 $this->cutoff_date = (new \IAWP\Data_Pruning\Pruning_Scheduler())->get_pruning_cutoff_as_datetime();
15 }
16 private function run()
17 {
18 if (\is_null($this->cutoff_date)) {
19 return;
20 }
21 $db = Illuminate_Builder::get_connection();
22 $db->transaction(function () {
23 $sessions_table = Query::get_table_name(Query::SESSIONS);
24 Illuminate_Builder::new()->from($sessions_table)->where('created_at', '<', $this->cutoff_date->format('Y-m-d\\TH:i:s'))->delete();
25 // Delete orphaned views
26 $views_table = Query::get_table_name(Query::VIEWS);
27 $this->delete_session_orphans($views_table, 'session_id');
28 // Delete orphaned form submissions
29 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
30 $this->delete_session_orphans($form_submissions_table, 'session_id');
31 // Delete orphaned WooCommerce orders
32 $orders_table = Query::get_table_name(Query::ORDERS);
33 $this->delete_view_orphans($orders_table, 'view_id', 'id');
34 // Delete orphaned visitors
35 $visitors_table = Query::get_table_name(Query::VISITORS);
36 $this->delete_session_orphans($visitors_table, 'visitor_id');
37 // Delete orphaned resources
38 $resources_table = Query::get_table_name(Query::RESOURCES);
39 $this->delete_view_orphans($resources_table, 'id', 'resource_id');
40 // Delete orphaned referrers
41 $referrers_table = Query::get_table_name(Query::REFERRERS);
42 $this->delete_session_orphans($referrers_table, 'id', 'referrer_id');
43 // Delete orphaned forms
44 $forms_table = Query::get_table_name(Query::FORMS);
45 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();
46 // Delete orphaned device browsers
47 $device_browsers_table = Query::get_table_name(Query::DEVICE_BROWSERS);
48 $this->delete_session_orphans($device_browsers_table, 'device_browser_id');
49 // Delete orphaned device oss
50 $device_oss_table = Query::get_table_name(Query::DEVICE_OSS);
51 $this->delete_session_orphans($device_oss_table, 'device_os_id');
52 // Delete orphaned device types
53 $device_types_table = Query::get_table_name(Query::DEVICE_TYPES);
54 $this->delete_session_orphans($device_types_table, 'device_type_id');
55 // Don't touch cities or countries for now
56 // This would be a very different custom query as cities reference countries
57 // Delete orphaned campaigns
58 $campaigns_table = Query::get_table_name(Query::CAMPAIGNS);
59 $this->delete_session_orphans($campaigns_table, 'campaign_id');
60 // Delete orphaned clicks
61 $this->delete_view_orphans(Tables::clicks(), 'view_id', 'id');
62 // Delete orphaned clicked links
63 $clicks_table = Tables::clicks();
64 Illuminate_Builder::new()->from(Tables::clicked_links(), 'orphans')->leftJoin("{$clicks_table} AS clicks", "orphans.click_id", '=', "clicks.click_id")->whereNull('clicks.click_id')->delete();
65 // Delete orphaned click targets
66 Illuminate_Builder::new()->from(Tables::click_targets(), 'orphans')->leftJoin("{$clicks_table} AS clicks", "orphans.click_target_id", '=', "clicks.click_target_id")->whereNull('clicks.click_id')->delete();
67 });
68 \delete_option('iawp_beginning_of_time');
69 }
70 private function delete_session_orphans(string $table, string $column, ?string $sessions_column = null) : int
71 {
72 $sessions_table = Query::get_table_name(Query::SESSIONS);
73 $sessions_column = $sessions_column ?? $column;
74 return Illuminate_Builder::new()->from($table, 'orphans')->leftJoin("{$sessions_table} AS sessions", "orphans.{$column}", '=', "sessions.{$sessions_column}")->whereNull('sessions.session_id')->delete();
75 }
76 private function delete_view_orphans(string $table, string $column, ?string $views_column = null) : int
77 {
78 $views_table = Query::get_table_name(Query::VIEWS);
79 $views_column = $views_column ?? $column;
80 return Illuminate_Builder::new()->from($table, 'orphans')->leftJoin("{$views_table} AS views", "orphans.{$column}", '=', "views.{$views_column}")->whereNull('views.id')->delete();
81 }
82 public static function register_hook()
83 {
84 \add_action('iawp_prune', function () {
85 self::prune();
86 });
87 }
88 public static function prune()
89 {
90 $pruner = new self();
91 $pruner->run();
92 }
93 }
94