ActiveFixture::getData()   A
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 4
nc 5
nop 0
1
<?php
2
/**
3
 *
4
 * @author Mihkel Viilveer <[email protected]>
5
 * @date 11.11.2014
6
 */
7
8
namespace opus\elastic\components;
9
10
11
use yii\base\InvalidParamException;
12
use yii\elasticsearch\ActiveRecord;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, opus\elastic\components\ActiveRecord.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
13
use yii\elasticsearch\Connection;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, opus\elastic\components\Connection.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
14
use yii\test\BaseActiveFixture;
15
16
/**
17
 * Class ActiveFixture
18
 *
19
 * @author Mihkel Viilveer <[email protected]>
20
 * @package opus\elastic\components
21
 */
22
class ActiveFixture extends BaseActiveFixture
23
{
24
    /**
25
     * @var Connection|string the DB connection object or the application component ID of the DB connection.
26
     * After the DbFixture object is created, if you want to change this property, you should only assign it
27
     * with a DB connection object.
28
     */
29
    public $db = 'elasticsearch';
30
31
    /**
32
     * @var string
33
     */
34
    public $index;
35
36
    /**
37
     * @var string
38
     */
39
    public $type;
40
41
    public function init()
42
    {
43
        parent::init();
44
45
        /** @var ActiveRecord $model */
46
        $model = $this->modelClass;
47
        $this->index || $this->index = $model::index();
48
        $this->type || $this->type = $model::type();
49
50
        if (empty($this->type) || empty($this->index)) {
51
            throw new InvalidParamException('"index" and "type" must be specified');
52
        }
53
54
    }
55
56
    /**
57
     * Loads the fixture.
58
     *
59
     * The default implementation will first clean up the table by calling [[resetTable()]].
60
     * It will then populate the table with the data returned by [[getData()]].
61
     *
62
     * If you override this method, you should consider calling the parent implementation
63
     * so that the data returned by [[getData()]] can be populated into the table.
64
     */
65
    public function load()
66
    {
67
        $this->resetType();
68
        $this->data = [];
69
        foreach ($this->getData() as $alias => $row) {
70
            $this->db->createCommand()->insert($this->index, $this->type, $row);
71
            $this->data[$alias] = $row;
72
        }
73
    }
74
75
76
    /**
77
     * Returns the fixture data.
78
     *
79
     * This method is called by [[loadData()]] to get the needed fixture data.
80
     *
81
     * The default implementation will try to return the fixture data by including the external file specified by [[dataFile]].
82
     * The file should return an array of data rows (column name => column value), each corresponding to a row in the table.
83
     *
84
     * If the data file does not exist, an empty array will be returned.
85
     *
86
     * @return array the data rows to be inserted into the collection.
87
     */
88
    protected function getData()
89
    {
90
        if ($this->dataFile === false) {
91
            return [];
92
        }
93
        if ($this->dataFile !== null) {
94
            $dataFile = \Yii::getAlias($this->dataFile);
0 ignored issues
show
Bug introduced by
It seems like $this->dataFile can also be of type boolean; however, yii\BaseYii::getAlias() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
95
        } else {
96
            $class = new \ReflectionClass($this);
97
            $dataFile = dirname($class->getFileName()) . '/data/' . $this->type . '.php';
98
        }
99
        return is_file($dataFile) ? require($dataFile) : [];
100
    }
101
102
    /**
103
     * @return mixed
104
     */
105
    private function resetType()
106
    {
107
        return $this->db->createCommand(
108
            [
109
                'queryParts' =>
110
                    [
111
                        'query' => ['match_all' => []]
112
                    ],
113
                'index' => $this->index,
114
                'type' => $this->type,
115
            ]
116
        )->deleteByQuery();
117
    }
118
}
119