8
8
use Magento \Analytics \ReportXml \DB \SelectBuilderFactory ;
9
9
use Magento \Framework \App \CacheInterface ;
10
10
use Magento \Framework \ObjectManagerInterface ;
11
+ use Magento \Framework \App \ObjectManager ;
12
+ use Magento \Framework \Serialize \Serializer \Json ;
13
+ use Magento \Framework \DB \Select ;
11
14
12
15
/**
13
16
* Creates Query object according to configuration
@@ -45,36 +48,44 @@ class QueryFactory
45
48
*/
46
49
private $ selectHydrator ;
47
50
51
+ /**
52
+ * @var Json|null
53
+ */
54
+ private $ jsonSerializer ;
55
+
48
56
/**
49
57
* QueryFactory constructor.
50
58
*
51
- * @param CacheInterface $queryCache
52
- * @param SelectHydrator $selectHydrator
59
+ * @param CacheInterface $queryCache
60
+ * @param SelectHydrator $selectHydrator
53
61
* @param ObjectManagerInterface $objectManager
54
- * @param SelectBuilderFactory $selectBuilderFactory
55
- * @param Config $config
56
- * @param array $assemblers
62
+ * @param SelectBuilderFactory $selectBuilderFactory
63
+ * @param Config $config
64
+ * @param array $assemblers
65
+ * @param Json|null $jsonSerializer
57
66
*/
58
67
public function __construct (
59
68
CacheInterface $ queryCache ,
60
69
SelectHydrator $ selectHydrator ,
61
70
ObjectManagerInterface $ objectManager ,
62
71
SelectBuilderFactory $ selectBuilderFactory ,
63
72
Config $ config ,
64
- array $ assemblers
73
+ array $ assemblers ,
74
+ Json $ jsonSerializer = null
65
75
) {
66
76
$ this ->config = $ config ;
67
77
$ this ->selectBuilderFactory = $ selectBuilderFactory ;
68
78
$ this ->assemblers = $ assemblers ;
69
79
$ this ->queryCache = $ queryCache ;
70
80
$ this ->objectManager = $ objectManager ;
71
81
$ this ->selectHydrator = $ selectHydrator ;
82
+ $ this ->jsonSerializer = $ jsonSerializer ?: ObjectManager::getInstance ()->get (Json::class);
72
83
}
73
84
74
85
/**
75
86
* Returns query connection name according to configuration
76
87
*
77
- * @param string $queryConfig
88
+ * @param string $queryConfig
78
89
* @return string
79
90
*/
80
91
private function getQueryConnectionName ($ queryConfig )
@@ -89,7 +100,7 @@ private function getQueryConnectionName($queryConfig)
89
100
/**
90
101
* Create query according to configuration settings
91
102
*
92
- * @param string $queryName
103
+ * @param string $queryName
93
104
* @return Query
94
105
*/
95
106
private function constructQuery ($ queryName )
@@ -101,12 +112,29 @@ private function constructQuery($queryName)
101
112
$ selectBuilder = $ assembler ->assemble ($ selectBuilder , $ queryConfig );
102
113
}
103
114
$ select = $ selectBuilder ->create ();
115
+ return $ this ->createQueryObject (
116
+ $ select ,
117
+ $ selectBuilder ->getConnectionName (),
118
+ $ queryConfig
119
+ );
120
+ }
121
+
122
+ /**
123
+ * Create query class using objectmanger
124
+ *
125
+ * @param Select $select
126
+ * @param string $connection
127
+ * @param array $queryConfig
128
+ * @return Query
129
+ */
130
+ private function createQueryObject ($ select , $ connection , $ queryConfig )
131
+ {
104
132
return $ this ->objectManager ->create (
105
133
Query::class,
106
134
[
107
135
'select ' => $ select ,
108
136
'selectHydrator ' => $ this ->selectHydrator ,
109
- 'connectionName ' => $ selectBuilder -> getConnectionName () ,
137
+ 'connectionName ' => $ connection ,
110
138
'config ' => $ queryConfig
111
139
]
112
140
);
@@ -115,26 +143,25 @@ private function constructQuery($queryName)
115
143
/**
116
144
* Creates query by name
117
145
*
118
- * @param string $queryName
146
+ * @param string $queryName
119
147
* @return Query
120
148
*/
121
149
public function create ($ queryName )
122
150
{
123
151
$ cached = $ this ->queryCache ->load ($ queryName );
124
152
if ($ cached ) {
125
- $ queryData = json_decode ($ cached , true );
126
- return $ this ->objectManager ->create (
127
- Query::class,
128
- [
129
- 'select ' => $ this ->selectHydrator ->recreate ($ queryData ['select_parts ' ]),
130
- 'selectHydrator ' => $ this ->selectHydrator ,
131
- 'connectionName ' => $ queryData ['connectionName ' ],
132
- 'config ' => $ queryData ['config ' ]
133
- ]
153
+ $ queryData = $ this ->jsonSerializer ->unserialize ($ cached );
154
+ return $ this ->createQueryObject (
155
+ $ this ->selectHydrator ->recreate ($ queryData ['select_parts ' ]),
156
+ $ queryData ['connectionName ' ],
157
+ $ queryData ['config ' ]
134
158
);
135
159
}
136
160
$ query = $ this ->constructQuery ($ queryName );
137
- $ this ->queryCache ->save (json_encode ($ query ), $ queryName );
161
+ $ this ->queryCache ->save (
162
+ $ this ->jsonSerializer ->serialize ($ query ),
163
+ $ queryName
164
+ );
138
165
return $ query ;
139
166
}
140
167
}
0 commit comments