Completed
Push — master ( 4bb4eb...402013 )
by Arthur
03:35
created

MappingGuesserManager   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 139
Duplicated Lines 28.78 %

Coupling/Cohesion

Components 1
Dependencies 10

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 24
c 2
b 0
f 0
lcom 1
cbo 10
dl 40
loc 139
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A guess() 0 9 2
A guessFields() 0 8 2
B guessFieldType() 0 23 6
B guessTypeResolveConfig() 20 20 5
B guessFieldResolveConfig() 20 20 5
A getBestGuess() 0 14 3
A addGuesser() 0 6 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace Arthem\GraphQLMapper\Mapping\Guess;
4
5
use Arthem\GraphQLMapper\Mapping\Context\ContainerContext;
6
use Arthem\GraphQLMapper\Mapping\Context\FieldContext;
7
use Arthem\GraphQLMapper\Mapping\SchemaContainer;
8
9
class MappingGuesserManager
10
{
11
    /**
12
     * @var GuesserInterface[]
13
     */
14
    private $guessers;
15
16
    /**
17
     * @param SchemaContainer $schemaContainer
18
     */
19
    public function guess(SchemaContainer $schemaContainer)
20
    {
21
        foreach ($schemaContainer->getTypes() as $type) {
22
            $containerContext = new ContainerContext($type, $schemaContainer);
23
            $this->guessFields($containerContext);
24
25
            $this->guessTypeResolveConfig($containerContext);
26
        }
27
    }
28
29
    /**
30
     * @param ContainerContext $containerContext
31
     */
32
    private function guessFields(ContainerContext $containerContext)
33
    {
34
        foreach ($containerContext->getContainer()->getFields() as $field) {
35
            $fieldContext = $containerContext->createFieldContext($field);
36
            $this->guessFieldType($fieldContext);
37
            $this->guessFieldResolveConfig($fieldContext);
38
        }
39
    }
40
41
    /**
42
     * @param FieldContext $fieldContext
43
     */
44
    private function guessFieldType(FieldContext $fieldContext)
45
    {
46
        $field = $fieldContext->getField();
47
        if ($field->getType()) {
48
            return;
49
        }
50
51
        $guesses = [];
52
        foreach ($this->guessers as $guesser) {
53
            if ($guesser instanceof FieldGuesserInterface) {
54
                $guess = $guesser->guessFieldType($fieldContext);
55
                if (null !== $guess) {
56
                    $guesses[] = $guess;
57
                }
58
            }
59
        }
60
61
        /** @var TypeGuess $best */
62
        $best = $this->getBestGuess($guesses);
63
        if (null !== $best) {
64
            $field->setType($best->getType());
65
        }
66
    }
67
68
    /**
69
     * @param ContainerContext $containerContext
70
     */
71 View Code Duplication
    private function guessTypeResolveConfig(ContainerContext $containerContext)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
72
    {
73
        $guesses = [];
74
        foreach ($this->guessers as $guesser) {
75
            if ($guesser instanceof TypeGuesserInterface) {
76
                $guess = $guesser->guessTypeResolveConfig($containerContext);
77
                if (null !== $guess) {
78
                    $guesses[] = $guess;
79
                }
80
            }
81
        }
82
83
        /** @var ResolveConfigGuess $best */
84
        $best = $this->getBestGuess($guesses);
85
        if (null !== $best) {
86
            $containerContext
87
                ->getContainer()
88
                ->mergeResolveConfig($best->getConfig());
89
        }
90
    }
91
92
    /**
93
     * @param FieldContext $fieldContext
94
     */
95 View Code Duplication
    private function guessFieldResolveConfig(FieldContext $fieldContext)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
96
    {
97
        $guesses = [];
98
        foreach ($this->guessers as $guesser) {
99
            if ($guesser instanceof FieldGuesserInterface) {
100
                $guess = $guesser->guessFieldResolveConfig($fieldContext);
101
                if (null !== $guess) {
102
                    $guesses[] = $guess;
103
                }
104
            }
105
        }
106
107
        /** @var ResolveConfigGuess $best */
108
        $best = $this->getBestGuess($guesses);
109
        if (null !== $best) {
110
            $fieldContext
111
                ->getField()
112
                ->mergeResolveConfig($best->getConfig());
113
        }
114
    }
115
116
    /**
117
     * Return the guess most likely to be correct from a list of guesses
118
     *
119
     * @param Guess[] $guesses An array of guesses
120
     * @return Guess|null The guess with the highest confidence
121
     */
122
    public function getBestGuess(array $guesses)
123
    {
124
        $result        = null;
125
        $maxConfidence = -1;
126
127
        foreach ($guesses as $guess) {
128
            if ($maxConfidence < $confidence = $guess->getConfidence()) {
129
                $maxConfidence = $confidence;
130
                $result        = $guess;
131
            }
132
        }
133
134
        return $result;
135
    }
136
137
    /**
138
     * @param GuesserInterface $guesser
139
     * @return $this
140
     */
141
    public function addGuesser(GuesserInterface $guesser)
142
    {
143
        $this->guessers[] = $guesser;
144
145
        return $this;
146
    }
147
}
148