Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
72.73% covered (success)
72.73%
8 / 11
CRAP
52.94% covered (warning)
52.94%
18 / 34
AbstractQmpMoloquent
0.00% covered (danger)
0.00%
0 / 1
72.73% covered (success)
72.73%
8 / 11
47.12
52.94% covered (warning)
52.94%
18 / 34
 pipeline
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 setPipeline
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 __get
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 newEloquentBuilder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 newBaseQueryBuilder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 dotGet
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 14
 setKeyFilter
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 pullFilter
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setKey
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 pushFilter
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 useQueryBuilder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
1<?php
2
3namespace Qmp\Laravel\MongoLow\Models;
4
5use Illuminate\Support\Facades\Log;
6use Qmp\Laravel\MongoLow\MongoPipeline;
7use Qmp\Laravel\MongoLow\Query\Builder as QueryBuilder;
8use Qmp\Laravel\MongoLow\Eloquent\Builder;
9
10abstract class AbstractQmpMoloquent extends \MoloquentOrigin
11{
12    /**
13     * The pipeline associated with the model
14     *
15     * @var Qmp\Laravel\MongoLow\MongoPipeline
16     */
17    protected $pipeline;
18
19    /**
20     * Return model pipeline for aggregation
21     *
22     * @return Qmp\Laravel\MongoLow\MongoPipeline
23     */
24    public static function pipeline($model = null)
25    {
26
27       
28        $model = $model ?? resolve(get_called_class());
29
30        if (!$model->pipeline) {
31            $model->setPipeline(new MongoPipeline($model));
32        }
33        return $model->pipeline;
34    }
35
36    /**
37     * Set Model Pipeline
38     *
39     * @param MongoPipeline $pipeline
40     * @return void
41     */
42    public function setPipeline(MongoPipeline $pipeline)
43    {
44        $this->pipeline = $pipeline;
45    }
46
47    /**
48     * Intercept pipeline or return parent property
49     *
50     * @param  String $property
51     * @return mixed
52     */
53    public function __get($property)
54    {
55        if ($property === 'pipeline') {
56            return $this->pipeline;
57        }
58        return parent::__get($property);
59    }
60
61    /**
62     * @inheritdoc
63     */
64    public function newEloquentBuilder($query)
65    {
66        return new Builder($query);
67    }
68
69    /**
70     * @inheritdoc
71     */
72    protected function newBaseQueryBuilder()
73    {
74        $connection = $this->getConnection();
75
76        return new QueryBuilder($connection, $connection->getPostProcessor());
77    }
78
79    /**
80     * Get item if exist with dot chain
81     *
82     * example:
83     * $model = new Model();
84     * $model->a = [
85     *      'b' => ['c' => 'test !']
86     * ];
87     * $model->dotGet($model, 'a.b.c');
88     * // Return 'test !'
89     *
90     * @param mixed $model
91     * @param string $chain
92     * @return mixed|null
93     */
94    public function dotGet(string $chain, $model = null)
95    {
96        $arrayChain = explode('.', $chain);
97        $toSearch = array_shift($arrayChain);
98        $childs = implode('.', $arrayChain);
99
100        if ($model === null) {
101            $model = $this;
102        } else if (is_array($model)) {
103            $model = (object) $model;
104        }
105
106        try {
107            $child = $model->$toSearch;
108        } catch (\ErrorException $e) {
109            Log::debug('Unable to get chain:' . var_export(['chain' => $chain, 'model' => $model, 'message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
110            return null;
111        }
112
113        if (!empty($arrayChain)) {
114            return self::dotGet($childs, $child);
115        }
116
117        return $child;
118    }
119
120    /**
121     * Add or set a key at position with arrayFilter.
122     * @param mixed $column
123     * @param mixed $value
124     * @param array $options
125     * @param bool $unique
126     * @return int
127     */
128    public function setKeyFilter($column, $key, $value = null, $options = [], $unique = false)
129    {
130        return $this->useQueryBuilder('setKeyFilter', func_get_args());
131    }
132
133    /**
134     * Remove one or more values from an array with arrayFilter.
135     * @param mixed $column
136     * @param mixed $value
137     * @param array $options
138     * @return int
139     */
140    public function pullFilter($column, $value = null, $options = [])
141    {
142        return $this->useQueryBuilder('pullFilter', func_get_args());
143    }
144
145    /**
146     * Set key at position
147     *
148     * @param mixed $column
149     * @param mixed $key
150     * @param mixed $value
151     * @return int
152     */
153    public function setKey($key, $value)
154    {
155        return $this->useQueryBuilder('setKey', func_get_args());
156    }
157
158    /** Append one or more values to an array with arrayFilter.
159     * @param mixed $column
160     * @param mixed $value
161     * @param array $options
162     * @param bool $unique
163     * @return int
164     */
165    public function pushFilter($column, $value = null, $options = [], $unique = false)
166    {
167        return $this->useQueryBuilder('pushFilter', func_get_args());
168    }
169
170
171    protected function useQueryBuilder($method, $params)
172    {
173        $query =  $this->setKeysForSaveQuery($this->newQuery());
174
175        $return = $query->{$method}(...$params);
176        $this->refresh();
177
178        return $return;
179    }
180}