JsonExtractor   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 76
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 34
c 1
b 0
f 0
dl 0
loc 76
rs 10
wmc 13

4 Methods

Rating   Name   Duplication   Size   Complexity  
A setColumns() 0 3 1
A getColumns() 0 3 1
A transpose() 0 11 3
B extract() 0 43 8
1
<?php
2
3
namespace Coco\SourceWatcher\Core\Extractors;
4
5
use Coco\SourceWatcher\Core\Extractor;
6
use Coco\SourceWatcher\Core\IO\Inputs\FileInput;
7
use Coco\SourceWatcher\Core\Row;
8
use Coco\SourceWatcher\Core\SourceWatcherException;
9
use Coco\SourceWatcher\Utils\Internationalization;
10
use Flow\JSONPath\JSONPath;
11
use Flow\JSONPath\JSONPathException;
12
13
/**
14
 * Class JsonExtractor
15
 *
16
 * @package Coco\SourceWatcher\Core\Extractors
17
 */
18
class JsonExtractor extends Extractor
19
{
20
    protected array $columns = [];
21
22
    protected array $availableOptions = [ "columns" ];
23
24
    public function getColumns () : array
25
    {
26
        return $this->columns;
27
    }
28
29
    public function setColumns ( array $columns ) : void
30
    {
31
        $this->columns = $columns;
32
    }
33
34
    /**
35
     * @return array
36
     * @throws SourceWatcherException
37
     */
38
    public function extract () : array
39
    {
40
        if ( $this->input == null ) {
41
            throw new SourceWatcherException( Internationalization::getInstance()->getText( JsonExtractor::class,
42
                "No_Input_Provided" ) );
43
        }
44
45
        $inputIsFileInput = $this->input instanceof FileInput;
46
47
        if ( !$inputIsFileInput ) {
48
            throw new SourceWatcherException( sprintf( Internationalization::getInstance()->getText( JsonExtractor::class,
49
                "Input_Not_Instance_Of_File_Input" ), FileInput::class ) );
50
        }
51
52
        $this->result = [];
53
54
        if ( !file_exists( $this->input->getInput() ) ) {
55
            throw new SourceWatcherException( sprintf( Internationalization::getInstance()->getText( JsonExtractor::class,
56
                "File_Input_File_Not_Found" ), $this->input->getInput() ) );
57
        }
58
59
        $data = json_decode( file_get_contents( $this->input->getInput() ), true );
60
61
        if ( $this->columns ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->columns 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...
62
            $jsonPath = new JSONPath( $data );
63
64
            try {
65
                foreach ( $this->columns as $key => $path ) {
66
                    $this->columns[$key] = $jsonPath->find( $path )->getData();
67
                }
68
            } catch ( JSONPathException $jsonPathException ) {
69
                throw new SourceWatcherException( sprintf( Internationalization::getInstance()->getText( JsonExtractor::class,
70
                    "JSON_Path_Exception" ), $jsonPathException->getMessage() ) );
71
            }
72
73
            $data = $this->transpose( $this->columns );
74
        }
75
76
        foreach ( $data as $row ) {
77
            array_push( $this->result, new Row( $row ) );
78
        }
79
80
        return $this->result;
81
    }
82
83
    private function transpose ( $columns ) : array
84
    {
85
        $data = [];
86
87
        foreach ( $columns as $column => $items ) {
88
            foreach ( $items as $row => $item ) {
89
                $data[$row][$column] = $item;
90
            }
91
        }
92
93
        return $data;
94
    }
95
}
96