Search::searchTable()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 0
cts 19
cp 0
rs 9.552
c 0
b 0
f 0
cc 3
nc 3
nop 4
crap 12
1
<?php declare(strict_types=1);
2
3
/**
4
 * @copyright   (c) 2017-present brian ridley
5
 * @author      brian ridley <[email protected]>
6
 * @license     http://opensource.org/licenses/MIT MIT
7
 */
8
9
namespace ptlis\GrepDb\Search;
10
11
use Doctrine\DBAL\Connection;
12
use ptlis\GrepDb\Metadata\MySQL\MetadataFactory;
13
use ptlis\GrepDb\Search\Result\RowSearchResult;
14
use ptlis\GrepDb\Search\Strategy\StringMatchTableSearchStrategy;
15
16
/**
17
 * Provides search.
18
 */
19
final class Search
20
{
21
    /**
22
     * Performs a search across databases on a server.
23
     *
24
     * @param Connection $connection
25
     * @param string $searchTerm
26
     * @return \Generator|RowSearchResult[]
27
     */
28
    public function searchServer(
29
        Connection $connection,
30
        string $searchTerm
31
    ): \Generator {
32
        $serverMetadata = (new MetadataFactory())->getServerMetadata($connection);
33
34
        foreach ($serverMetadata->getAllDatabaseMetadata() as $databaseMetadata) {
35
            $resultList = $this->searchDatabase(
36
                $connection,
37
                $databaseMetadata->getDatabaseName(),
38
                $searchTerm
39
            );
40
41
            foreach ($resultList as $result) {
42
                yield $result;
43
            }
44
        }
45
    }
46
47
    /**
48
     * Performs a search across tables in a database.
49
     *
50
     * @param Connection $connection
51
     * @param string $databaseName
52
     * @param string $searchTerm
53
     * @return \Generator|RowSearchResult[]
54
     */
55
    public function searchDatabase(
56
        Connection $connection,
57
        string $databaseName,
58
        string $searchTerm
59
    ): \Generator {
60
        $databaseMetadata = (new MetadataFactory())->getDatabaseMetadata($connection, $databaseName);
61
62
        foreach ($databaseMetadata->getAllTableMetadata() as $tableMetadata) {
63
            $resultList = $this->searchTable(
64
                $connection,
65
                $tableMetadata->getDatabaseName(),
66
                $tableMetadata->getTableName(),
67
                $searchTerm
68
            );
69
70
            foreach ($resultList as $result) {
71
                yield $result;
72
            }
73
        }
74
    }
75
76
    /**
77
     * Performs a search on the provided table.
78
     *
79
     * @param Connection $connection
80
     * @param string $databaseName
81
     * @param string $tableName
82
     * @param string $searchTerm
83
     * @return \Generator|RowSearchResult[]
84
     */
85
    public function searchTable(
86
        Connection $connection,
87
        string $databaseName,
88
        string $tableName,
89
        string $searchTerm
90
    ): \Generator {
91
        $tableMetadata = (new MetadataFactory())->getTableMetadata($connection, $databaseName, $tableName);
92
93
        if (!$tableMetadata->hasStringTypeColumn()) {
94
            return;
95
        }
96
97
        $rowResultList = (new StringMatchTableSearchStrategy())->getMatches(
98
            $connection,
99
            $tableMetadata,
100
            $searchTerm
101
        );
102
103
        // Yield batch tracking rows returned
104
        foreach ($rowResultList as $rowResult) {
105
            yield $rowResult;
106
        }
107
    }
108
}