BiAuditGraph.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. Lib::loadClass('Api_WfsNs');
  3. Lib::loadClass('Response');
  4. Lib::loadClass('Core_XmlWriter');
  5. class Route_UrlAction_BiAuditGraph extends RouteBase {
  6. function defaultAction() {
  7. $args = [];
  8. $args['raportId'] = V::get('raportId', 0, $_GET, 'int');
  9. $args['featureId'] = V::get('featureId', '', $_GET);
  10. $args['primaryKey'] = V::get('primaryKey', '', $_GET);
  11. if ($args['raportId']) return UI::layout([$this, 'raportView'], [ 'args' => $args ]);
  12. UI::layout([$this, 'defaultView']);
  13. }
  14. function defaultView() {
  15. // typeName = "default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person"
  16. $namespace = 'default_db/BI_audit_KRS_person/BI_audit_KRS_person'; // V::get('namespace', '', $_GET);
  17. if (!$namespace) throw new Exception("Missing namespace");
  18. $primaryKey = V::get('primaryKey', '', $_GET);
  19. if (!$primaryKey) throw new Exception("Missing primaryKey");
  20. echo UI::h('div', [ 'id' => "ref_graph_node", 'style' => "width:98%; height:500px; border:1px solid silver; margin:8px auto; padding:0" ], [
  21. "Pobieranie danych..."
  22. ]);
  23. echo UI::h('script', [ 'src' => "static/visjs/vis.min.js" ]);
  24. echo UI::h('style', [ 'type' => "text/css", 'src' => "static/visjs/vis.min.css" ]);
  25. UI::inlineJS(__FILE__ . '.view.js', [
  26. 'HTML_ID_REF_GRAPH' => 'ref_graph_node',
  27. 'TYPENAME' => Api_WfsNs::typeName($namespace),
  28. 'PRIMARY_KEY' => $primaryKey,
  29. 'WFS_URL' => Router::getRoute('WfsBiAudit')->getLink(),
  30. 'DBG' => (V::get('DBG', 0, $_GET, 'int') > 0),
  31. ]);
  32. }
  33. function raportOutputMatrixAction() {
  34. $args = [];
  35. $args['raportId'] = V::get('raportId', 0, $_GET, 'int');
  36. $args['outputFormat'] = V::get('outputFormat', '', $_GET, 'word');
  37. try {
  38. if (!$args['raportId']) throw new Exception("Wrong param raportId");
  39. } catch (\Exception $e) {
  40. switch ($args['outputFormat']) {
  41. case 'json': return $this->sendJsonErrorMsg($e->getMessage());
  42. case 'xml': return $this->sendXmlErrorMsg($e->getMessage());
  43. case 'html':
  44. default: {
  45. return $this->sendHtmlErrorMsg($e->getMessage());
  46. }
  47. }
  48. }
  49. $matrix = $this->getRaportOutputMatrix($args['raportId']);
  50. switch ($args['outputFormat']) {
  51. case 'json': return $this->sendJsonMatrix($args['raportId'], $matrix);
  52. case 'xml': return $this->sendXmlMatrix($args['raportId'], $matrix);
  53. case 'html':
  54. default: {
  55. return $this->sendHtmlMatrix($args['raportId'], $matrix);
  56. }
  57. }
  58. }
  59. function sendJsonMatrix($raportId, $matrix) { // TODO: ..
  60. print_r($matrix);
  61. }
  62. function sendXmlMatrix($raportId, $matrix) { // TODO: ...
  63. print_r($matrix);
  64. }
  65. function sendHtmlMatrix($raportId, $matrix) {
  66. UI::gora();
  67. UI::table([
  68. 'caption' => "Wyniki raportu Nr {$raportId}",
  69. 'rows' => $matrix,
  70. ]);
  71. UI::dol();
  72. }
  73. function sendJsonErrorMsg($msg) { // TODO: ..
  74. echo $e->getMessage();
  75. }
  76. function sendXmlErrorMsg($msg) { // TODO: ...
  77. echo $e->getMessage();
  78. }
  79. function sendHtmlErrorMsg($msg) {
  80. UI::gora();
  81. UI::alert('danger', $e->getMessage());
  82. UI::dol();
  83. }
  84. function raportOutputStatsAction() {
  85. session_write_close();
  86. $args = [];
  87. $args['raportId'] = V::get('raportId', 0, $_GET, 'int');
  88. $args['outputFormat'] = V::get('outputFormat', '', $_GET, 'word');
  89. try {
  90. if (!$args['raportId']) throw new Exception("Wrong param raportId");
  91. } catch (\Exception $e) {
  92. switch ($args['outputFormat']) {
  93. case 'json': return $this->sendJsonErrorMsg($e->getMessage());
  94. case 'xml': return $this->sendXmlErrorMsg($e->getMessage());
  95. case 'html':
  96. default: {
  97. return $this->sendHtmlErrorMsg($e->getMessage());
  98. }
  99. }
  100. }
  101. $stats = $this->getOutputStats($args['raportId']);
  102. switch ($args['outputFormat']) {
  103. case 'json': return $this->sendJsonStats($args['raportId'], $stats);
  104. case 'xml': return $this->sendXmlStats($args['raportId'], $stats);
  105. case 'html':
  106. default: {
  107. return $this->sendHtmlStats($args['raportId'], $stats);
  108. }
  109. }
  110. }
  111. function getOutputStats($raportId) {
  112. $matrix = $this->getRaportOutputMatrix($raportId);
  113. $listObjectsNs = $this->_getListPointChildNs();
  114. $listPointChildAlias = $this->_getListPointChildAlias();
  115. $getPointFeatureIdFromPath = function ($item) {
  116. $listPointChildAlias = $this->_getListPointChildAlias();
  117. return array_reduce($listPointChildAlias, function ($ret, $objAlias) use ($item) {
  118. $pk = V::get("pk_{$objAlias}", 0, $item);
  119. if ($pk) $ret = "{$objAlias}.{$pk}";
  120. return $ret;
  121. }, null);
  122. };
  123. $lastPkPath = 0;
  124. $lastPos = 0;
  125. $fidMatrix = array_map(function ($item) use ($getPointFeatureIdFromPath, &$lastPkPath, &$lastPos) {
  126. if ($lastPkPath != $item['pk_Path']) {
  127. $lastPos = 0;
  128. }
  129. $lastPos += 1;
  130. $lastPkPath = $item['pk_Path'];
  131. return [
  132. 'pk_Path' => $item['pk_Path'],
  133. 'pos' => $lastPos,
  134. 'fid' => $getPointFeatureIdFromPath($item),
  135. ];
  136. }, $matrix);
  137. DBG::log($fidMatrix, 'array', '$fidMatrix');
  138. $listPathLength = array_reduce($matrix, function ($ret, $item) {
  139. $ret[ $item['pk_Path'] ] = 1 + V::get($item['pk_Path'], 0, $ret);
  140. return $ret;
  141. }, []);
  142. $listPathPk = array_keys($listPathLength);
  143. $pointOccurs = array_reduce($matrix, function ($ret, $item) use ($listPointChildAlias) {
  144. foreach ($listPointChildAlias as $alias) {
  145. $pkField = "pk_{$alias}";
  146. if ($item[$pkField]) {
  147. $featureId = "{$alias}.{$item[$pkField]}";
  148. $ret[$featureId] = 1 + V::getValue($ret[$featureId], 0);
  149. }
  150. }
  151. return $ret;
  152. }, []);
  153. asort($pointOccurs);
  154. DBG::log($pointOccurs, 'array', '$pointOccurs');
  155. $prevItem = [];
  156. $edges = array_reduce($matrix, function ($ret, $item) use (&$prevItem, $getPointFeatureIdFromPath) {
  157. if (!empty($prevItem) && $prevItem['pk_Path'] === $item['pk_Path']) {
  158. $ret[] = [ 'source' => $getPointFeatureIdFromPath($prevItem), 'target' => $getPointFeatureIdFromPath($item), 'pathId' => $item['pk_Path'] ];
  159. $prevItem = array_merge([], $item);
  160. return $ret;
  161. } else {
  162. $prevItem = array_merge([], $item);
  163. return $ret;
  164. }
  165. }, []);
  166. DBG::log("edges - done");
  167. $prevFeaturesOnPath = [];
  168. $prevPathId = 0;
  169. $allToAllEdges = array_reduce($matrix, function ($ret, $item) use (&$prevFeaturesOnPath, &$prevPathId, $getPointFeatureIdFromPath) {
  170. $curFeatureId = $getPointFeatureIdFromPath($item);
  171. if (!empty($prevFeaturesOnPath) && $prevPathId === $item['pk_Path']) {
  172. foreach ($prevFeaturesOnPath as $idx => $prevFeatureId) {
  173. $ret[] = [ 'source' => $prevFeatureId, 'target' => $curFeatureId, 'pathId' => $item['pk_Path'], 'length' => (1 + $idx) ];
  174. }
  175. array_unshift($prevFeaturesOnPath, $curFeatureId);
  176. $prevPathId = $item['pk_Path'];
  177. return $ret;
  178. } else {
  179. $prevFeaturesOnPath = [ $curFeatureId ];
  180. $prevPathId = $item['pk_Path'];
  181. return $ret;
  182. }
  183. }, []);
  184. DBG::log("edges_all_to_all - done");
  185. $stats = [];
  186. // $stats['path_length'] = $listPathLength;
  187. $stats['path_total'] = count($listPathLength);
  188. $stats['point_total'] = count($matrix);
  189. $stats['point_occurs'] = $pointOccurs;
  190. $stats['edges_all_to_all'] = $allToAllEdges;
  191. $stats['edges'] = $edges;
  192. $stats['nodes'] = array_map([ $this, 'getFeature' ], array_keys($pointOccurs));
  193. $stats['path_list'] = array_values(array_reduce($fidMatrix, function ($ret, $item) {
  194. $pkPath = $item['pk_Path'];
  195. if (!array_key_exists($pkPath, $ret)) $ret[ $pkPath ] = [ 'pkPath' => $pkPath, 'fids' => [] ];
  196. $ret[ $pkPath ][ 'fids' ][] = $item['fid'];
  197. return $ret;
  198. }, []));
  199. return $stats;
  200. }
  201. function getFeature($featureId) {
  202. list($objectName, $primaryKey) = explode(".", $featureId);
  203. if (!$objectName) throw new Exception("Wrong featureId '{$featureId}' - missing objectName");
  204. if (!$primaryKey) throw new Exception("Wrong featureId '{$featureId}' - missing primaryKey");
  205. $tableName = $objectName;
  206. $item = DB::getPDO()->fetchFirst(" select * from `{$tableName}` where id = :id ", [ ':id' => $primaryKey ]);
  207. $getLabel = [ $this, '_getFeatureLabel' ];
  208. return array_merge($item, [
  209. '@label' => $getLabel($objectName, $item), // TODO: label depend on table / later format from xsd
  210. '@object' => $objectName,
  211. '@primaryKey' => $primaryKey,
  212. ]);
  213. }
  214. function _getFeatureLabel($objectName, $item) {
  215. $primaryKey = $item['@primaryKey'];
  216. switch ($objectName) {
  217. case 'BI_audit_ENERGA_RUM_KONTRAHENCI': return V::get('Pelna_nazwa_kontrahenta', $primaryKey, $item);
  218. case 'BI_audit_MSIG': return V::get('nazwa', $primaryKey, $item);
  219. case 'BI_audit_MSIG_person': return V::getValue(
  220. implode(" ", array_filter([
  221. V::get('imiona', '', $item),
  222. V::get('nazwisko', '', $item)
  223. ], 'strlen'))
  224. , "{$objectName} Nr {$primaryKey}"
  225. );
  226. case 'BI_audit_CEIDG': return V::get('firma', $primaryKey, $item);
  227. case 'BI_audit_KRS': return V::get('nazwa', $primaryKey, $item);
  228. case 'BI_audit_KRS_person': return V::getValue(
  229. implode(" ", array_filter([
  230. V::get('imiona', '', $item),
  231. V::get('nazwisko', '', $item)
  232. ], 'strlen'))
  233. , "{$objectName} Nr {$primaryKey}"
  234. );
  235. case 'BI_audit_MSIG_company': return V::get('nazwa', $primaryKey, $item);
  236. case 'BI_audit_KRS_company': return V::get('nazwa', $primaryKey, $item);
  237. case 'TERYT_adresy': return "TERYT({$item['TERYT_SYM']}/{$item['TERYT_SYM_UL']})";
  238. case 'BI_audit_MSIG_address': return V::getValue(
  239. implode(", ", array_filter([
  240. implode(" ", array_filter([
  241. V::get('A_kod', '', $item),
  242. V::get('S_miejscowosc', '', $item)
  243. ], 'strlen')),
  244. implode(" ", array_filter([
  245. V::get('A_nrDomu', '', $item),
  246. V::get('A_nrDomu', '', $item),
  247. V::get('A_nrLokalu', '', $item)
  248. ], 'strlen'))
  249. ], 'strlen'))
  250. , "{$objectName} Nr {$primaryKey}"
  251. );
  252. default: return "TODO: {$objectName} Nr {$primaryKey}";
  253. }
  254. }
  255. function sendJsonStats($raportId, $stats) {
  256. Response::sendJson([
  257. 'type' => "success",
  258. 'msg' => "OK",
  259. 'body' => $stats
  260. ]);
  261. die();
  262. }
  263. function sendXmlStats($raportId, $stats) {
  264. header('Content-type: application/xml; charset=utf-8');
  265. $xmlWriter = new Core_XmlWriter();
  266. if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404);
  267. $xmlWriter->openUri('php://output');
  268. $xmlWriter->setIndent(true);
  269. $xmlWriter->startDocument('1.0','UTF-8');
  270. $xmlWriter->startElement('p5:reportGraph');
  271. // $xmlWriter->writeAttribute('xml:lang', "en-GB");
  272. $xmlWriter->writeAttribute('xmlns:p5', Api_WfsNs::getBaseWfsUri());
  273. $xmlWriter->writeAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink");
  274. $xmlWriter->writeAttribute('xmlns:wps', "http://www.opengis.net/wps/1.0.0");
  275. $xmlWriter->writeAttribute('xmlns:ows', "http://www.opengis.net/ows/1.1");
  276. $xmlWriter->writeAttribute('xmlns:ogc', "http://www.opengis.net/ogc");
  277. $xmlWriter->writeAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance");
  278. $xmlWriter->writeAttribute('id', $raportId);
  279. $xmlWriter->h('p5:nodes', [], array_map(function ($node) {
  280. return [
  281. 'p5:node', [
  282. 'objectName' => $node['@object'],
  283. 'primaryKey' => $node['@primaryKey'],
  284. 'label' => $node['@label'],
  285. ], []
  286. ];
  287. }, $stats['nodes']) );
  288. $xmlWriter->h('p5:edges', [], array_map(function ($node) {
  289. return [
  290. 'p5:edge', [
  291. 'source' => $node['source'],
  292. 'target' => $node['target'],
  293. 'pathId' => $node['pathId'],
  294. ], []
  295. ];
  296. }, $stats['edges']) );
  297. // [edges] => Array:
  298. // [0] => Array:
  299. // [source] => BI_audit_KRS_person.747000
  300. // [target] => BI_audit_MSIG_person.856408
  301. // [pathId] => 396191
  302. $xmlWriter->endElement(); // root
  303. $xmlWriter->endDocument();
  304. exit;
  305. }
  306. function sendHtmlStats($raportId, $stats) {
  307. UI::gora();
  308. DBG::nicePrint($stats, "\$stats");
  309. $dbgNode = function ($item) {
  310. return [
  311. 'object' => $item['@object'],
  312. 'primaryKey' => $item['@primaryKey'],
  313. 'label' => $item['@label'],
  314. ];
  315. };
  316. UI::table([ 'rows' => array_map($dbgNode, $stats['nodes']) ]);
  317. UI::dol();
  318. }
  319. function raportView($args) {
  320. $raportId = V::get('raportId', 0, $args, 'int');
  321. $featureId = V::get('featureId', '', $args, '');
  322. $h = [ 'UI', 'h' ];
  323. echo $h('div', [ 'id' => "bi_audit_raport-network_graph" ], "TODO: loading data...");
  324. echo $h('script', ['src'=>"static/vendor.js?v=a76e2988", 'type'=>"text/javascript"]);
  325. echo $h('script', [ 'src' => "static/visjs/vis.min.js" ]);
  326. echo UI::h('link', [ 'href' => 'static/react-bootstrap-typeahead.min.css', 'type' => 'text/css', 'rel' => 'stylesheet' ]);
  327. UI::inlineJS(__FILE__ . '.network-graph.js', [
  328. 'HTML_ID_REF_GRAPH' => 'bi_audit_raport-network_graph',
  329. // 'TYPENAME' => Api_WfsNs::typeName($namespace),
  330. // 'PRIMARY_KEY' => $primaryKey,
  331. // 'WFS_URL' => Router::getRoute('WfsBiAudit')->getLink(),
  332. 'RAPORT_ID' => $raportId,
  333. 'API_URL' => $this->getLink('raportOutputStats', [ 'outputFormat' => "json", 'raportId' => $raportId ]),
  334. 'STATS' => $this->getOutputStats($raportId),
  335. 'DATA_MATRIX' => $this->getRaportOutputMatrix($raportId),
  336. 'DBG' => (V::get('DBG', 0, $_GET, 'int') > 0),
  337. ]);
  338. $this->getRaportOutputMatrix($raportId); // TODO: DBG
  339. }
  340. function getRaportNetworkGraphDataAjaxAction() {
  341. }
  342. function _getListPointChildNs() {
  343. $listObjectsNs = [];
  344. $listObjectsNs[] = 'default_db__x3A__BI_audit_CEIDG:BI_audit_CEIDG';
  345. $listObjectsNs[] = 'default_db__x3A__BI_audit_CEIDG_pelnomocnicy:BI_audit_CEIDG_pelnomocnicy';
  346. $listObjectsNs[] = 'default_db__x3A__BI_audit_CEIDG_powiazania:BI_audit_CEIDG_powiazania';
  347. $listObjectsNs[] = 'default_db__x3A__BI_audit_ENERGA_PRACOWNICY:BI_audit_ENERGA_PRACOWNICY';
  348. $listObjectsNs[] = 'default_db__x3A__BI_audit_ENERGA_PRACOWNICY_adresy:BI_audit_ENERGA_PRACOWNICY_adresy';
  349. $listObjectsNs[] = 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI:BI_audit_ENERGA_RUM_KONTRAHENCI';
  350. $listObjectsNs[] = 'default_db__x3A__BI_audit_KRS:BI_audit_KRS';
  351. $listObjectsNs[] = 'default_db__x3A__BI_audit_KRS_address:BI_audit_KRS_address';
  352. $listObjectsNs[] = 'default_db__x3A__BI_audit_KRS_company:BI_audit_KRS_company';
  353. $listObjectsNs[] = 'default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person';
  354. $listObjectsNs[] = 'default_db__x3A__BI_audit_KW_requested_person:BI_audit_KW_requested_person';
  355. $listObjectsNs[] = 'default_db__x3A__BI_audit_MSIG:BI_audit_MSIG';
  356. $listObjectsNs[] = 'default_db__x3A__BI_audit_MSIG_address:BI_audit_MSIG_address';
  357. $listObjectsNs[] = 'default_db__x3A__BI_audit_MSIG_company:BI_audit_MSIG_company';
  358. $listObjectsNs[] = 'default_db__x3A__BI_audit_MSIG_person:BI_audit_MSIG_person';
  359. $listObjectsNs[] = 'default_db__x3A__TERYT_adresy:TERYT_adresy';
  360. return $listObjectsNs;
  361. }
  362. function _getListPointChildAlias() {
  363. return array_map(function ($objNs) {
  364. // return str_replace([ 'BI_audit_' ], '', substr($objNs, strrpos($objNs, ':') + 1));
  365. return substr($objNs, strrpos($objNs, ':') + 1);
  366. }, $this->_getListPointChildNs());
  367. }
  368. function getRaportOutputMatrix($raportId) {
  369. // Main Raport Acl NS: default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA
  370. // - Found Paths in: default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row
  371. // - Path Points in: default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object
  372. $mainNs = [
  373. 'Raport' => 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA',
  374. 'Path' => 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row',
  375. 'Point' => 'default_db__x3A__BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object:BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA_row_object',
  376. ];
  377. $listObjectsNs = $this->_getListPointChildNs();
  378. $outRefTables = array_merge(
  379. [ [ 'label' => 'Raport_to_Path', 'table' => ACL::getRefTable(Api_WfsNs::toNamespace($mainNs['Raport']), $mainNs['Path']) ] ],
  380. [ [ 'label' => 'Path_to_Point', 'table' => ACL::getRefTable(Api_WfsNs::toNamespace($mainNs['Path']), $mainNs['Point']) ] ],
  381. array_map(function ($objNs) use ($mainNs) {
  382. $objLabel = str_replace([ 'BI_audit_' ], '', substr($objNs, strrpos($objNs, ':') + 1));
  383. return [ 'label' => "Point_to_{$objLabel}", 'table' => ACL::getRefTable(Api_WfsNs::toNamespace($mainNs['Point']), $objNs) ];
  384. }, $listObjectsNs)
  385. );
  386. $nsToTableName = function ($objNs) {
  387. return substr($objNs, strrpos($objNs, ':') + 1);
  388. };
  389. $mainTables = array_map($nsToTableName, array_merge($mainNs));
  390. $refFromPointTables = array_map($nsToTableName, $listObjectsNs);
  391. $allTables = array_merge($mainTables, $refFromPointTables);
  392. DBG::log($allTables, 'array', '$allTables');
  393. $refTables = array_combine( array_map(V::makePick('label'), $outRefTables), array_map(V::makePick('table'), $outRefTables) );
  394. DBG::log($refTables, 'array', '$refTables');
  395. $listPointChildAlias = $this->_getListPointChildAlias();
  396. DBG::log($listPointChildAlias, 'array', '$listPointChildAlias');
  397. $sqlSelect = implode("\n , ", array_merge(
  398. array_map(function ($tbl, $key) {
  399. return "t_{$key}.ID as pk_{$key}";
  400. }, $mainTables, array_keys($mainTables)),
  401. array_map(function ($tbl, $key) use ($listPointChildAlias) {
  402. return "t_{$key}.ID as pk_{$listPointChildAlias[$key]}";
  403. }, $refFromPointTables, array_keys($refFromPointTables))
  404. ));
  405. $sqlTablesFrom = [];
  406. // return "\n" . "join `{$tableName}` `t_{$key}` on ( `t_{$key}`.ID = `t_{}` ) ";
  407. $sqlListFromJoin = [];
  408. $fromPointRefTables = array_slice(array_values($refTables), 2);
  409. for ($i = 0; $i < count($listObjectsNs); $i++) {
  410. $sqlListFromJoin[] = "
  411. left join `{$fromPointRefTables[$i]}` as r_Point_to_{$i} on ( r_Point_to_{$i}.PRIMARY_KEY = t_Point.ID )
  412. left join `{$allTables[$i]}` as t_{$i} on ( t_{$i}.ID = r_Point_to_{$i}.REMOTE_PRIMARY_KEY )
  413. ";
  414. }
  415. $sqlFromJoin = implode("\n", $sqlListFromJoin);
  416. $sql = "
  417. select {$sqlSelect}
  418. from `{$allTables['Raport']}` as t_Raport
  419. left join `{$refTables['Raport_to_Path']}` as r_Raport_to_Path on ( r_Raport_to_Path.PRIMARY_KEY = t_Raport.ID )
  420. left join `{$allTables['Path']}` as t_Path on ( t_Path.ID = r_Raport_to_Path.REMOTE_PRIMARY_KEY )
  421. left join `{$refTables['Path_to_Point']}` as r_Path_to_Point on ( r_Path_to_Point.PRIMARY_KEY = t_Path.ID )
  422. left join `{$allTables['Point']}` as t_Point on ( t_Point.ID = r_Path_to_Point.REMOTE_PRIMARY_KEY )
  423. {$sqlFromJoin}
  424. where t_Raport.ID = {$raportId}
  425. "; //TODO DEBUG LIMIT OPTIMALIZATION - HANGS limit 300
  426. return DB::getPDO()->fetchAll($sql);
  427. }
  428. }