Completed
Pull Request — master (#3)
by Valentin
14:15
created

SnapshotRecord   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 4
dl 0
loc 120
c 0
b 0
f 0
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A isSuppressionEnabled() 0 4 1
A setSuppression() 0 4 1
A getIncidentsHistory() 0 4 1
A getLastIncident() 0 4 1
A pushIncident() 0 7 1
A archiveLastIncident() 0 15 3
A forgetLastIncident() 0 4 1
1
<?php
2
3
namespace Spiral\Snapshotter\AggregationHandler\Database;
4
5
use Spiral\Models\Accessors\SqlTimestamp;
6
use Spiral\Models\Traits\TimestampsTrait;
7
use Spiral\ORM\Entities\Relations\HasManyRelation;
8
use Spiral\ORM\Record;
9
10
/**
11
 * Class Aggregation
12
 *
13
 * @property SqlTimestamp   $time_created
14
 * @property bool           $suppression
15
 * @property string         $exception_hash
16
 * @property int            $count_occurred
17
 * @property IncidentRecord $last_incident
18
 *
19
 * @method HasManyRelation $incidents
20
 */
21
class SnapshotRecord extends Record
22
{
23
    use TimestampsTrait;
24
25
    /**
26
     * {@inheritdoc}
27
     */
28
    const DATABASE = 'snapshots';
29
30
    /**
31
     * {@inheritdoc}
32
     */
33
    const SCHEMA = [
34
        //primary fields
35
        'id'             => 'primary',
36
        'suppression'    => 'bool',
37
38
        //exception teaser
39
        'exception_hash' => 'string',
40
41
        //counters
42
        'count_occurred' => 'int',
43
44
        //All occurred incidents before last one
45
        'incidents'      => [
46
            self::HAS_MANY => IncidentRecord::class
47
        ],
48
49
        //Last occurred incident
50
        'last_incident'  => [
51
            self::BELONGS_TO        => IncidentRecord::class,
52
            self::NULLABLE          => true,
53
            self::CREATE_CONSTRAINT => false
54
        ]
55
    ];
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    const INDEXES = [
61
        [self::UNIQUE, 'exception_hash'],
62
    ];
63
64
    /**
65
     * {@inheritdoc}
66
     */
67
    const DEFAULTS = [
68
        'suppression' => false
69
    ];
70
71
    /**
72
     * @return bool
73
     */
74
    public function isSuppressionEnabled(): bool
75
    {
76
        return !empty($this->suppression);
77
    }
78
79
    /**
80
     * @param bool $suppression
81
     */
82
    public function setSuppression(bool $suppression)
83
    {
84
        $this->suppression = $suppression;
85
    }
86
87
    /**
88
     * @return HasManyRelation
89
     */
90
    public function getIncidentsHistory(): HasManyRelation
91
    {
92
        return $this->incidents;
0 ignored issues
show
Documentation introduced by
The property incidents does not exist on object<Spiral\Snapshotte...atabase\SnapshotRecord>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
93
    }
94
95
    /**
96
     * @return IncidentRecord|null
97
     */
98
    public function getLastIncident()
99
    {
100
        return $this->last_incident;
101
    }
102
103
    /**
104
     * @param IncidentRecord $incident
105
     */
106
    public function pushIncident(IncidentRecord $incident)
107
    {
108
        $this->archiveLastIncident();
109
110
        $this->count_occurred++;
111
        $this->last_incident = $incident;
112
    }
113
114
    /**
115
     * Move last incident to history.
116
     */
117
    public function archiveLastIncident()
118
    {
119
        $lastIncident = $this->getLastIncident();
120
        if (!empty($lastIncident)) {
121
            if ($this->isSuppressionEnabled()) {
122
                //Remove exception trace before archiving
123
                $lastIncident->suppress();
124
            } else {
125
                $lastIncident->status->setStored();
126
            }
127
128
            //Move to history
129
            $this->incidents->add($lastIncident);
0 ignored issues
show
Documentation introduced by
The property incidents does not exist on object<Spiral\Snapshotte...atabase\SnapshotRecord>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
130
        }
131
    }
132
133
    /**
134
     * Forget last incident.
135
     */
136
    public function forgetLastIncident()
137
    {
138
        $this->last_incident = null;
139
    }
140
}