DescribeQueryHandler::runQuery()   B
last analyzed

Complexity

Conditions 11
Paths 7

Size

Total Lines 38
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 27
CRAP Score 11.0055

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 11
eloc 28
c 1
b 0
f 0
nc 7
nop 1
dl 0
loc 38
ccs 27
cts 28
cp 0.9643
crap 11.0055
rs 7.3166

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * This file is part of the sweetrdf/InMemoryStoreSqlite package and licensed under
5
 * the terms of the GPL-2 license.
6
 *
7
 * (c) Konrad Abicht <[email protected]>
8
 * (c) Benjamin Nowack
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace sweetrdf\InMemoryStoreSqlite\Store\QueryHandler;
15
16
class DescribeQueryHandler extends SelectQueryHandler
17
{
18
    private array $added_triples;
19
    private array $described_ids;
20
    private array $ids;
21
    private array $r;
22
23 3
    public function runQuery($infos)
24
    {
25 3
        $ids = $infos['query']['result_uris'];
26 3
        if ($vars = $infos['query']['result_vars']) {
27 2
            $sub_r = parent::runQuery($infos);
28 2
            $rf = $infos['result_format'] ?? '';
29 2
            if (\in_array($rf, ['sql', 'structure', 'index'])) {
30
                return $sub_r;
31
            }
32 2
            $rows = $sub_r['rows'] ?? [];
33 2
            foreach ($rows as $row) {
34 2
                foreach ($vars as $info) {
35 2
                    $val = isset($row[$info['var']]) ? $row[$info['var']] : '';
36
                    if (
37 2
                        $val
38 2
                        && ('literal' != $row[$info['var'].' type']) && !\in_array($val, $ids)
39
                    ) {
40 2
                        $ids[] = $val;
41
                    }
42
                }
43
            }
44
        }
45 3
        $this->r = [];
46 3
        $this->described_ids = [];
47 3
        $this->ids = $ids;
48 3
        $this->added_triples = [];
49 3
        $is_sub_describe = 0;
50 3
        while ($this->ids) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->ids of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
51 3
            $id = $this->ids[0];
52 3
            $this->described_ids[] = $id;
53 3
            $q = 'CONSTRUCT { <'.$id.'> ?p ?o . } WHERE {<'.$id.'> ?p ?o .}';
54 3
            $sub_r = $this->store->query($q);
55 3
            $sub_index = \is_array($sub_r['result']) ? $sub_r['result'] : [];
56 3
            $this->mergeSubResults($sub_index, $is_sub_describe);
57 3
            $is_sub_describe = 1;
58
        }
59
60 3
        return $this->r;
61
    }
62
63 3
    private function mergeSubResults($index, $is_sub_describe = 1)
64
    {
65 3
        foreach ($index as $s => $ps) {
66 3
            if (!isset($this->r[$s])) {
67 3
                $this->r[$s] = [];
68
            }
69 3
            foreach ($ps as $p => $os) {
70 3
                if (!isset($this->r[$s][$p])) {
71 3
                    $this->r[$s][$p] = [];
72
                }
73 3
                foreach ($os as $o) {
74 3
                    $id = md5($s.' '.$p.' '.serialize($o));
75 3
                    if (!isset($this->added_triples[$id])) {
76 3
                        if (1 || !$is_sub_describe) {
77 3
                            $this->r[$s][$p][] = $o;
78 3
                            if (\is_array($o) && ('bnode' == $o['type']) && !\in_array($o['value'], $this->ids)) {
79 3
                                $this->ids[] = $o['value'];
80
                            }
81
                        } elseif (!\is_array($o) || ('bnode' != $o['type'])) {
82
                            $this->r[$s][$p][] = $o;
83
                        }
84 3
                        $this->added_triples[$id] = 1;
85
                    }
86
                }
87
            }
88
        }
89
        /* adjust ids */
90 3
        $ids = $this->ids;
91 3
        $this->ids = [];
92 3
        foreach ($ids as $id) {
93 3
            if (!\in_array($id, $this->described_ids)) {
94 1
                $this->ids[] = $id;
95
            }
96
        }
97
    }
98
}
99