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

MappingGuesserManager::guessFieldResolveConfig()   B

Complexity

Conditions 5
Paths 8

Size

Total Lines 20
Code Lines 12

Duplication

Lines 20
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 20
loc 20
rs 8.8571
cc 5
eloc 12
nc 8
nop 1
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