PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.2.0
Independent Analytics – WordPress Analytics Plugin v2.2.0
2.15.5 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 years ago Migrations 2 years ago Seeds 2 years ago DbCommand.php 2 years ago DumpCommand.php 2 years ago PruneCommand.php 2 years ago WipeCommand.php 2 years ago
PruneCommand.php
133 lines
1 <?php
2
3 namespace IAWP_SCOPED\Illuminate\Database\Console;
4
5 use IAWP_SCOPED\Illuminate\Console\Command;
6 use IAWP_SCOPED\Illuminate\Contracts\Events\Dispatcher;
7 use IAWP_SCOPED\Illuminate\Database\Eloquent\MassPrunable;
8 use IAWP_SCOPED\Illuminate\Database\Eloquent\Prunable;
9 use IAWP_SCOPED\Illuminate\Database\Eloquent\SoftDeletes;
10 use IAWP_SCOPED\Illuminate\Database\Events\ModelsPruned;
11 use IAWP_SCOPED\Illuminate\Support\Str;
12 use InvalidArgumentException;
13 use IAWP_SCOPED\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->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 $events->listen(ModelsPruned::class, function ($event) {
53 $this->info("{$event->count} [{$event->model}] records have been pruned.");
54 });
55 $models->each(function ($model) {
56 $instance = new $model();
57 $chunkSize = \property_exists($instance, 'prunableChunkSize') ? $instance->prunableChunkSize : $this->option('chunk');
58 $total = $this->isPrunable($model) ? $instance->pruneAll($chunkSize) : 0;
59 if ($total == 0) {
60 $this->info("No prunable [{$model}] records found.");
61 }
62 });
63 $events->forget(ModelsPruned::class);
64 }
65 /**
66 * Determine the models that should be pruned.
67 *
68 * @return \Illuminate\Support\Collection
69 */
70 protected function models()
71 {
72 if (!empty($models = $this->option('model'))) {
73 return \IAWP_SCOPED\collect($models)->filter(function ($model) {
74 return \class_exists($model);
75 })->values();
76 }
77 $except = $this->option('except');
78 if (!empty($models) && !empty($except)) {
79 throw new InvalidArgumentException('The --models and --except options cannot be combined.');
80 }
81 return \IAWP_SCOPED\collect((new Finder())->in($this->getDefaultPath())->files()->name('*.php'))->map(function ($model) {
82 $namespace = $this->laravel->getNamespace();
83 return $namespace . \str_replace(['/', '.php'], ['\\', ''], Str::after($model->getRealPath(), \realpath(app_path()) . \DIRECTORY_SEPARATOR));
84 })->when(!empty($except), function ($models) use($except) {
85 return $models->reject(function ($model) use($except) {
86 return \in_array($model, $except);
87 });
88 })->filter(function ($model) {
89 return $this->isPrunable($model);
90 })->filter(function ($model) {
91 return \class_exists($model);
92 })->values();
93 }
94 /**
95 * Get the default path where models are located.
96 *
97 * @return string
98 */
99 protected function getDefaultPath()
100 {
101 return app_path('Models');
102 }
103 /**
104 * Determine if the given model class is prunable.
105 *
106 * @param string $model
107 * @return bool
108 */
109 protected function isPrunable($model)
110 {
111 $uses = class_uses_recursive($model);
112 return \in_array(Prunable::class, $uses) || \in_array(MassPrunable::class, $uses);
113 }
114 /**
115 * Display how many models will be pruned.
116 *
117 * @param string $model
118 * @return void
119 */
120 protected function pretendToPrune($model)
121 {
122 $instance = new $model();
123 $count = $instance->prunable()->when(\in_array(SoftDeletes::class, class_uses_recursive(\get_class($instance))), function ($query) {
124 $query->withTrashed();
125 })->count();
126 if ($count === 0) {
127 $this->info("No prunable [{$model}] records found.");
128 } else {
129 $this->info("{$count} [{$model}] records will be pruned.");
130 }
131 }
132 }
133