15
15
16
16
use function array_slice ;
17
17
use function count ;
18
- use Exception ;
19
- use function is_array ;
20
- use function is_string ;
21
18
use Laudis \Neo4j \Contracts \ConnectionInterface ;
22
19
use Laudis \Neo4j \Contracts \FormatterInterface ;
23
20
use Laudis \Neo4j \Databags \Statement ;
24
21
use Laudis \Neo4j \Formatter \Specialised \BoltOGMTranslator ;
25
- use Laudis \Neo4j \Formatter \Specialised \HttpOGMArrayTranslator ;
26
- use Laudis \Neo4j \Formatter \Specialised \HttpOGMStringTranslator ;
22
+ use Laudis \Neo4j \Formatter \Specialised \HttpOGMTranslator ;
27
23
use Laudis \Neo4j \Types \CypherList ;
28
24
use Laudis \Neo4j \Types \CypherMap ;
29
25
use Psr \Http \Message \RequestInterface ;
30
26
use Psr \Http \Message \ResponseInterface ;
27
+ use stdClass ;
31
28
32
29
/**
33
30
* Formats the result in a basic OGM (Object Graph Mapping) format by mapping al cypher types to types found in the \Laudis\Neo4j\Types namespace.
38
35
*
39
36
* @psalm-type OGMResults = CypherList<CypherMap<OGMTypes>>
40
37
*
41
- * @psalm-import-type NodeArray from \Laudis\Neo4j\Formatter\Specialised\HttpOGMArrayTranslator
42
- * @psalm-import-type MetaArray from \Laudis\Neo4j\Formatter\Specialised\HttpOGMArrayTranslator
43
- * @psalm-import-type RelationshipArray from \Laudis\Neo4j\Formatter\Specialised\HttpOGMArrayTranslator
44
- *
45
- * @psalm-type CypherResultDataRow = list<array{row: list<scalar|array|null>, meta: MetaArray, graph: array{nodes: list<NodeArray>, relationships: list<RelationshipArray>}}>
46
- * @psalm-type CypherResult = array{columns: list<string>, data: CypherResultDataRow}
47
- *
48
38
* @psalm-import-type BoltMeta from \Laudis\Neo4j\Contracts\FormatterInterface
49
39
*
50
40
* @implements FormatterInterface<CypherList<CypherMap<OGMTypes>>>
54
44
final class OGMFormatter implements FormatterInterface
55
45
{
56
46
private BoltOGMTranslator $ boltTranslator ;
57
- private HttpOGMArrayTranslator $ arrayTranslator ;
58
- private HttpOGMStringTranslator $ stringTranslator ;
47
+ private HttpOGMTranslator $ httpTranslator ;
59
48
60
- public function __construct (BoltOGMTranslator $ boltTranslator , HttpOGMArrayTranslator $ arrayTranslator , HttpOGMStringTranslator $ stringTranslator )
49
+ public function __construct (BoltOGMTranslator $ boltTranslator , HttpOGMTranslator $ httpTranslator )
61
50
{
62
51
$ this ->boltTranslator = $ boltTranslator ;
63
- $ this ->arrayTranslator = $ arrayTranslator ;
64
- $ this ->stringTranslator = $ stringTranslator ;
52
+ $ this ->httpTranslator = $ httpTranslator ;
65
53
}
66
54
67
55
/**
@@ -71,11 +59,7 @@ public function __construct(BoltOGMTranslator $boltTranslator, HttpOGMArrayTrans
71
59
*/
72
60
public static function create (): OGMFormatter
73
61
{
74
- return new self (
75
- new BoltOGMTranslator (),
76
- new HttpOGMArrayTranslator (),
77
- new HttpOGMStringTranslator ()
78
- );
62
+ return new self (new BoltOGMTranslator (), new HttpOGMTranslator ());
79
63
}
80
64
81
65
/**
@@ -98,59 +82,15 @@ public function formatBoltResult(array $meta, array $results, ConnectionInterfac
98
82
return new CypherList ($ tbr );
99
83
}
100
84
101
- public function formatHttpResult (ResponseInterface $ response , array $ body , ConnectionInterface $ connection , float $ resultsAvailableAfter , float $ resultsConsumedAfter , iterable $ statements ): CypherList
85
+ public function formatHttpResult (ResponseInterface $ response , stdClass $ body , ConnectionInterface $ connection , float $ resultsAvailableAfter , float $ resultsConsumedAfter , iterable $ statements ): CypherList
102
86
{
103
87
/** @var list<CypherList<CypherMap<OGMTypes>>> $tbr */
104
88
$ tbr = [];
105
89
106
- foreach ($ body ['results ' ] as $ results ) {
107
- /** @var CypherResult $results */
108
- $ tbr [] = $ this ->buildResult ($ results );
109
- }
110
-
111
- return new CypherList ($ tbr );
112
- }
113
-
114
- /**
115
- * @param CypherResult $result
116
- *
117
- * @throws Exception
118
- *
119
- * @return CypherList<CypherMap<OGMTypes>>
120
- */
121
- private function buildResult (array $ result ): CypherList
122
- {
123
- /** @var list<CypherMap<OGMTypes>> $tbr */
124
- $ tbr = [];
125
-
126
- $ columns = $ result ['columns ' ];
127
- foreach ($ result ['data ' ] as $ data ) {
128
- $ meta = $ data ['meta ' ];
129
- $ nodes = $ data ['graph ' ]['nodes ' ];
130
- $ relationship = $ data ['graph ' ]['relationships ' ];
131
- $ metaIndex = 0 ;
132
- $ relationshipIndex = 0 ;
133
-
134
- /** @var array<string, OGMTypes> $record */
135
- $ record = [];
136
- foreach ($ data ['row ' ] as $ i => $ value ) {
137
- if (is_array ($ value )) {
138
- $ translation = $ this ->arrayTranslator ->translate ($ meta , $ relationship , $ metaIndex , $ relationshipIndex , $ nodes , $ value );
139
-
140
- $ relationshipIndex += $ translation [1 ];
141
- $ metaIndex += $ translation [0 ];
142
- $ record [$ columns [$ i ]] = $ translation [2 ];
143
- } elseif (is_string ($ value )) {
144
- [$ metaIncrement , $ translation ] = $ this ->stringTranslator ->translate ($ metaIndex , $ meta , $ value );
145
- $ metaIndex += $ metaIncrement ;
146
- $ record [$ columns [$ i ]] = $ translation ;
147
- } else {
148
- $ record [$ columns [$ i ]] = $ value ;
149
- ++$ metaIndex ;
150
- }
151
- }
152
-
153
- $ tbr [] = new CypherMap ($ record );
90
+ /** @var list<stdClass> $results */
91
+ $ results = $ body ->results ;
92
+ foreach ($ results as $ result ) {
93
+ $ tbr [] = $ this ->httpTranslator ->translateResult ($ result );
154
94
}
155
95
156
96
return new CypherList ($ tbr );
0 commit comments