PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.2
Independent Analytics – WordPress Analytics Plugin v2.15.2
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 / vendor / illuminate / database / Console / PruneCommand.php
independent-analytics / vendor / illuminate / database / Console Last commit date
Factories 2 weeks ago Migrations 2 weeks ago Seeds 2 weeks ago DatabaseInspectionCommand.php 2 weeks ago DbCommand.php 2 weeks ago DumpCommand.php 2 weeks ago MonitorCommand.php 2 weeks ago PruneCommand.php 2 weeks ago ShowCommand.php 2 weeks ago TableCommand.php 2 weeks ago WipeCommand.php 2 weeks ago
PruneCommand.php
149 lines
1 <?php
2
3 namespace IAWPSCOPED\Illuminate\Database\Console;
4
5 use IAWPSCOPED\Illuminate\Console\Command;
6 use IAWPSCOPED\Illuminate\Contracts\Events\Dispatcher;
7 use IAWPSCOPED\Illuminate\Database\Eloquent\MassPrunable;
8 use IAWPSCOPED\Illuminate\Database\Eloquent\Prunable;
9 use IAWPSCOPED\Illuminate\Database\Eloquent\SoftDeletes;
10 use IAWPSCOPED\Illuminate\Database\Events\ModelsPruned;
11 use IAWPSCOPED\Illuminate\Support\Str;
12 use InvalidArgumentException;
13 use IAWPSCOPED\Symfony\Component\Finder\Finder;
14 /** @internal */
15 class PruneCommand extends Command
16 {
17 /**
18 * The console command name.
19 *
20 * @var string
21 */
22 protected $signature = 'model:prune
23 {--model=* : Class names of the models to be pruned}
24 {--except=* : Class names of the models to be excluded from pruning}
25 {--chunk=1000 : The number of models to retrieve per chunk of models to be deleted}
26 {--pretend : Display the number of prunable records found instead of deleting them}';
27 /**
28 * The console command description.
29 *
30 * @var string
31 */
32 protected $description = 'Prune models that are no longer needed';
33 /**
34 * Execute the console command.
35 *
36 * @param \Illuminate\Contracts\Events\Dispatcher $events
37 * @return void
38 */
39 public function handle(Dispatcher $events)
40 {
41 $models = $this->models();
42 if ($models->isEmpty()) {
43 $this->components->info('No prunable models found.');
44 return;
45 }
46 if ($this->option('pretend')) {
47 $models->each(function ($model) {
48 $this->pretendToPrune($model);
49 });
50 return;
51 }
52 $pruning = [];
53 $events->listen(ModelsPruned::class, function ($event) use(&$pruning) {
54 if (!\in_array($event->model, $pruning)) {
55 $pruning[] = $event->model;
56 $this->newLine();
57 $this->components->info(\sprintf('Pruning [%s] records.', $event->model));
58 }
59 $this->components->twoColumnDetail($event->model, "{$event->count} records");
60 });
61 $models->each(function ($model) {
62 $this->pruneModel($model);
63 });
64 $events->forget(ModelsPruned::class);
65 }
66 /**
67 * Prune the given model.
68 *
69 * @param string $model
70 * @return void
71 */
72 protected function pruneModel(string $model)
73 {
74 $instance = new $model();
75 $chunkSize = \property_exists($instance, 'prunableChunkSize') ? $instance->prunableChunkSize : $this->option('chunk');
76 $total = $this->isPrunable($model) ? $instance->pruneAll($chunkSize) : 0;
77 if ($total == 0) {
78 $this->components->info("No prunable [{$model}] records found.");
79 }
80 }
81 /**
82 * Determine the models that should be pruned.
83 *
84 * @return \Illuminate\Support\Collection
85 */
86 protected function models()
87 {
88 if (!empty($models = $this->option('model'))) {
89 return \IAWPSCOPED\collect($models)->filter(function ($model) {
90 return \class_exists($model);
91 })->values();
92 }
93 $except = $this->option('except');
94 if (!empty($models) && !empty($except)) {
95 throw new InvalidArgumentException('The --models and --except options cannot be combined.');
96 }
97 return \IAWPSCOPED\collect((new Finder())->in($this->getDefaultPath())->files()->name('*.php'))->map(function ($model) {
98 $namespace = $this->laravel->getNamespace();
99 return $namespace . \str_replace(['/', '.php'], ['\\', ''], Str::after($model->getRealPath(), \realpath(app_path()) . \DIRECTORY_SEPARATOR));
100 })->when(!empty($except), function ($models) use($except) {
101 return $models->reject(function ($model) use($except) {
102 return \in_array($model, $except);
103 });
104 })->filter(function ($model) {
105 return $this->isPrunable($model);
106 })->filter(function ($model) {
107 return \class_exists($model);
108 })->values();
109 }
110 /**
111 * Get the default path where models are located.
112 *
113 * @return string|string[]
114 */
115 protected function getDefaultPath()
116 {
117 return app_path('Models');
118 }
119 /**
120 * Determine if the given model class is prunable.
121 *
122 * @param string $model
123 * @return bool
124 */
125 protected function isPrunable($model)
126 {
127 $uses = class_uses_recursive($model);
128 return \in_array(Prunable::class, $uses) || \in_array(MassPrunable::class, $uses);
129 }
130 /**
131 * Display how many models will be pruned.
132 *
133 * @param string $model
134 * @return void
135 */
136 protected function pretendToPrune($model)
137 {
138 $instance = new $model();
139 $count = $instance->prunable()->when(\in_array(SoftDeletes::class, class_uses_recursive(\get_class($instance))), function ($query) {
140 $query->withTrashed();
141 })->count();
142 if ($count === 0) {
143 $this->components->info("No prunable [{$model}] records found.");
144 } else {
145 $this->components->info("{$count} [{$model}] records will be pruned.");
146 }
147 }
148 }
149