FeatureAttrSelected.php 4.8 KB

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