FeatureAttrSelected.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. class FeatureAttrSelected {
  3. static function getTotalSelected($typeName) {
  4. $idUser = User::getID();
  5. self::prepareUserTable($typeName, $idUser);
  6. $tableName = self::getAttributeTableName($typeName, $idUser);
  7. return (int)DB::getPDO()->fetchValue("
  8. select count(*) as total
  9. from `{$tableName}`
  10. ");
  11. }
  12. static function getAllSelected($typeName) {
  13. $idUser = User::getID();
  14. self::prepareUserTable($typeName, $idUser);
  15. $tableName = self::getAttributeTableName($typeName, $idUser);
  16. return DB::getPDO()->fetchValuesList("
  17. select primaryKey
  18. from `{$tableName}`
  19. ");
  20. }
  21. static function getSelectState($typeName, array $listPrimaryKeys) {
  22. $idUser = User::getID();
  23. self::prepareUserTable($typeName, $idUser);
  24. $tableName = self::getAttributeTableName($typeName, $idUser);
  25. if (empty($listPrimaryKeys)) return [];
  26. $dbQuote = [ DB::getPDO(), 'quote' ];
  27. $sqlPks = implode(", ", array_map(function ($pk) use ($dbQuote) {
  28. return $dbQuote($pk);
  29. }, $listPrimaryKeys));
  30. $selected = DB::getPDO()->fetchValuesListByKey("
  31. select primaryKey
  32. from `{$tableName}`
  33. where primaryKey in ( {$sqlPks} )
  34. ", $key = 'primaryKey');
  35. return array_combine($listPrimaryKeys, array_map(function ($pk) use ($selected) {
  36. return in_array($pk, $selected);
  37. }, $listPrimaryKeys));
  38. }
  39. static function selectAllByFilter($typeName, array $filterQuery) {
  40. $idUser = User::getID();
  41. self::prepareUserTable($typeName, $idUser);
  42. $tableName = self::getAttributeTableName($typeName, $idUser);
  43. $acl = ACL::getAclByTypeName($typeName);
  44. $args = [];
  45. parse_str($filterQuery[0], $args);
  46. DBG::log(['$filterQuery' => $filterQuery, '$args' => $args], 'array', "DBG: selectAllByFilter");
  47. $params = [];
  48. $params['limit'] = 0;
  49. $params['cols'] = [ $acl->getPrimaryKeyField() ];
  50. foreach ($args as $k => $v) {
  51. if (strlen($k) > 3 && substr($k, 0, 2) == 'f_' && strlen($v) > 0) {// filter prefix
  52. $params[$k] = $v;
  53. }
  54. else if (strlen($k) > 4 && substr($k, 0, 3) == 'sf_' && strlen($v) > 0) {// special filter prefix
  55. $params[$k] = $v;
  56. }
  57. }
  58. $queryFeatures = $acl->buildQuery($params);
  59. DBG::log($queryFeatures, 'array', '$queryFeatures');
  60. try {
  61. $sql = $queryFeatures->getRawQueryPrimaryKeys();
  62. DBG::log($sql, 'string', 'sql getRawQueryPrimaryKeys');
  63. Lib::loadClass('FeatureAttrSelected');
  64. $userSelectedTableName = FeatureAttrSelected::getAttributeTableName($typeName = $acl->getNamespace(), $idUser = User::getID());
  65. DB::getPDO()->execSql("
  66. insert ignore into `{$userSelectedTableName}` (`primaryKey`)
  67. select `selectedTable`.`@primaryKey`
  68. from ( {$sql} ) as `selectedTable`
  69. ");
  70. } catch (Exception $e) {
  71. DBG::log($e);
  72. DBG::log('legacyMode - execute query for all primary keys');
  73. $listItems = $queryFeatures->getItems();
  74. $listPrimaryKeys = array_map(function ($item) {
  75. return $item['ID'];
  76. }, $listItems);
  77. foreach ($listPrimaryKeys as $pk) {
  78. DB::getPDO()->execSql(" insert ignore `{$tableName}` (`primaryKey`) values ( :pk ) ", [ ':pk' => $pk ]);
  79. }
  80. }
  81. }
  82. static function select($typeName, array $listPrimaryKeys) {
  83. $idUser = User::getID();
  84. self::prepareUserTable($typeName, $idUser);
  85. $tableName = self::getAttributeTableName($typeName, $idUser);
  86. foreach ($listPrimaryKeys as $pk) {
  87. DB::getPDO()->execSql(" insert ignore `{$tableName}` (`primaryKey`) values ( :pk ) ", [ ':pk' => $pk ]);
  88. }
  89. }
  90. static function unselect($typeName, array $listPrimaryKeys) {
  91. $idUser = User::getID();
  92. self::prepareUserTable($typeName, $idUser);
  93. $tableName = self::getAttributeTableName($typeName, $idUser);
  94. foreach ($listPrimaryKeys as $pk) {
  95. DB::getPDO()->execSql(" delete from `{$tableName}` where `primaryKey` = :pk ", [ ':pk' => $pk ]);
  96. }
  97. }
  98. static function unselectAll($typeName) {
  99. $idUser = User::getID();
  100. self::prepareUserTable($typeName, $idUser);
  101. $tableName = self::getAttributeTableName($typeName, $idUser);
  102. DB::getPDO()->execSql(" truncate table `{$tableName}` ");
  103. }
  104. static function prepareUserTable($typeName, $idUser) {
  105. static $_created = [];
  106. $key = "{$typeName}-{$idUser}";
  107. if (!array_key_exists($key, $_created)) {
  108. self::_prepareUserTable($typeName, $idUser);
  109. $_created[$key] = true;
  110. }
  111. }
  112. static function _prepareUserTable($typeName, $idUser) {
  113. $tableName = self::getAttributeTableName($typeName, $idUser);
  114. // TODO: primaryKey type from $acl
  115. // TODO: table name limit to 64 chars
  116. DB::getPDO()->execSql("
  117. CREATE TABLE IF NOT EXISTS `{$tableName}` (
  118. `primaryKey` int(11) NOT NULL,
  119. UNIQUE KEY `primaryKey` (`primaryKey`)
  120. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  121. ");
  122. }
  123. // @example FeatureAttrSelected::getAttributeTableName($typeName, $idUser);
  124. static function getAttributeTableName($typeName, $idUser) {
  125. static $_created = [];
  126. $key = "{$typeName}-{$idUser}";
  127. if (!array_key_exists($key, $_created)) {
  128. $_created[$key] = self::_getAttributeTableName($typeName, $idUser);
  129. }
  130. return $_created[$key];
  131. }
  132. static function _getAttributeTableName($typeName, $idUser) {
  133. $acl = ACL::getAclByTypeName($typeName);
  134. $rootTableName = $acl->getRootTableName();
  135. return "{$rootTableName}__@selected_{$idUser}";
  136. }
  137. }