/framework/Kolab_Storage/lib/Horde/Kolab/Storage/QuerySet/Base.php

https://github.com/finger2000/horde · PHP · 325 lines · 149 code · 21 blank · 155 comment · 19 complexity · d1ff3b011f73e80fe8a3d77f0273d0d8 MD5 · raw file

  1. <?php
  2. /**
  3. * Adds a set of uncached queries to the list handlers.
  4. *
  5. * PHP version 5
  6. *
  7. * @category Kolab
  8. * @package Kolab_Storage
  9. * @author Gunnar Wrobel <wrobel@pardus.de>
  10. * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
  11. * @link http://pear.horde.org/index.php?package=Kolab_Storage
  12. */
  13. /**
  14. * Adds a set of uncached queries to the list handlers.
  15. *
  16. * Copyright 2011 Horde LLC (http://www.horde.org/)
  17. *
  18. * See the enclosed file COPYING for license information (LGPL). If you
  19. * did not receive this file, see http://www.horde.org/licenses/lgpl21.
  20. *
  21. * @category Kolab
  22. * @package Kolab_Storage
  23. * @author Gunnar Wrobel <wrobel@pardus.de>
  24. * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
  25. * @link http://pear.horde.org/index.php?package=Kolab_Storage
  26. */
  27. abstract class Horde_Kolab_Storage_QuerySet_Base
  28. implements Horde_Kolab_Storage_QuerySet
  29. {
  30. /** Query set identifiers */
  31. const BASIC = 'basic';
  32. const HORDE = 'horde';
  33. /**
  34. * The factory for generating additional resources.
  35. *
  36. * @var Horde_Kolab_Storage_Factory
  37. */
  38. private $_factory;
  39. /**
  40. * The list of query types to add to lists.
  41. *
  42. * @var array
  43. */
  44. private $_list_queries = array();
  45. /**
  46. * The list of query types to add to data handlers.
  47. *
  48. * @var array
  49. */
  50. private $_data_queries = array();
  51. /**
  52. * The query class map. Override in extending classes.
  53. *
  54. * @var array
  55. */
  56. protected $_class_map = array();
  57. /**
  58. * Predefined query sets.
  59. *
  60. * @var array
  61. */
  62. private $_list_query_sets = array(
  63. self::BASIC => array(
  64. Horde_Kolab_Storage_List::QUERY_BASE,
  65. Horde_Kolab_Storage_List::QUERY_ACL
  66. ),
  67. self::HORDE => array(
  68. Horde_Kolab_Storage_List::QUERY_BASE,
  69. Horde_Kolab_Storage_List::QUERY_ACL,
  70. Horde_Kolab_Storage_List::QUERY_SHARE
  71. )
  72. );
  73. /**
  74. * Predefined query sets.
  75. *
  76. * @var array
  77. */
  78. private $_data_query_sets = array(
  79. self::HORDE => array(
  80. Horde_Kolab_Storage_Data::QUERY_PREFS => 'h-prefs',
  81. Horde_Kolab_Storage_Data::QUERY_HISTORY => true,
  82. )
  83. );
  84. /**
  85. * Constructor.
  86. *
  87. * @param Horde_Kolab_Storage_Factory $factory The factory.
  88. * @param array $params Optional parameters.
  89. * <pre>
  90. * - list: Array of list query settings
  91. * - queryset [string]: One of the predefined query set
  92. * ("basic" or "horde")
  93. * - myset [string]: A list of query types that should be selected.
  94. * - classmap [array] : An array of "type" => "class" mappings.
  95. * </pre>
  96. */
  97. public function __construct(
  98. Horde_Kolab_Storage_Factory $factory, array $params = array()
  99. ) {
  100. $this->_factory = $factory;
  101. if (isset($params['list']['classmap'])) {
  102. $this->_class_map = array_merge(
  103. $this->_class_map, $params['list']['classmap']
  104. );
  105. }
  106. if (isset($params['list']['queryset'])) {
  107. if (isset($this->_list_query_sets[$params['list']['queryset']])) {
  108. $this->_list_queries = $this->_list_query_sets[$params['list']['queryset']];
  109. } else {
  110. throw new Horde_Kolab_Storage_Exception(
  111. sprintf(
  112. 'List query set %s not supported!',
  113. $params['list']['queryset']
  114. )
  115. );
  116. }
  117. }
  118. if (isset($params['list']['myset'])) {
  119. $this->_list_queries = array_merge($this->_list_queries, $params['list']['myset']);
  120. }
  121. if (empty($this->_list_queries)) {
  122. $this->_list_queries = $this->_list_query_sets[self::BASIC];
  123. }
  124. if (isset($params['data']['queryset'])) {
  125. if (isset($this->_data_query_sets[$params['data']['queryset']])) {
  126. $this->_data_queries = $this->_data_query_sets[$params['data']['queryset']];
  127. } else {
  128. throw new Horde_Kolab_Storage_Exception(
  129. sprintf(
  130. 'Data query set %s not supported!',
  131. $params['data']['queryset']
  132. )
  133. );
  134. }
  135. }
  136. if (isset($params['data']['myset'])) {
  137. $this->_data_queries = array_merge($this->_data_queries, $params['data']['myset']);
  138. }
  139. }
  140. /**
  141. * Add the set of list queries.
  142. *
  143. * @param Horde_Kolab_Storage_List $list The list.
  144. * @param array $params Additional query parameters.
  145. *
  146. * @return NULL
  147. */
  148. public function addListQuerySet(Horde_Kolab_Storage_List $list, $params = array())
  149. {
  150. foreach ($this->_list_queries as $query) {
  151. $this->_addListQuery($list, $query, $params);
  152. }
  153. }
  154. /**
  155. * Add a list query.
  156. *
  157. * @param Horde_Kolab_Storage_List $list The list.
  158. * @param string $type The query type.
  159. * @param array $params Additional query parameters.
  160. *
  161. * @return NULL
  162. */
  163. private function _addListQuery(Horde_Kolab_Storage_List $list, $type, $params = array())
  164. {
  165. if (isset($this->_class_map[$type])) {
  166. $params = array_merge(
  167. $this->_getListQueryParameters($list),
  168. $params
  169. );
  170. $list->registerQuery(
  171. $type,
  172. $this->_createListQuery(
  173. $this->_class_map[$type], $list, $params
  174. )
  175. );
  176. } else {
  177. throw new Horde_Kolab_Storage_Exception(
  178. sprintf('Query type %s not supported!', $type)
  179. );
  180. }
  181. }
  182. /**
  183. * Fetch any additional parameters required when creating list queries.
  184. *
  185. * @param Horde_Kolab_Storage_List $list The list.
  186. *
  187. * @return array The parameters for list queries.
  188. */
  189. abstract protected function _getListQueryParameters(
  190. Horde_Kolab_Storage_List $list
  191. );
  192. /**
  193. * Create the specified list query type.
  194. *
  195. * @param string $name The query name.
  196. * @param Horde_Kolab_Storage_List $list The list that should be queried.
  197. * @param array $params Additional parameters provided
  198. * to the query constructor.
  199. *
  200. * @return Horde_Kolab_Storage_Query A query handler.
  201. *
  202. * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
  203. */
  204. private function _createListQuery($name, Horde_Kolab_Storage_List $list, $params = array())
  205. {
  206. return $this->_createQuery($name, $list, $params);
  207. }
  208. /**
  209. * Add the set of data queries.
  210. *
  211. * @since Horde_Kolab_Storage 1.1.0
  212. *
  213. * @param Horde_Kolab_Storage_Data $data The data.
  214. * @param array $params Additional query parameters.
  215. *
  216. * @return NULL
  217. */
  218. public function addDataQuerySet(Horde_Kolab_Storage_Data $data, $params = array())
  219. {
  220. foreach ($this->_data_queries as $query => $type) {
  221. if ($type === true || $type == $data->getType()) {
  222. $this->_addDataQuery($data, $query, $params);
  223. }
  224. }
  225. }
  226. /**
  227. * Add a data query.
  228. *
  229. * @param Horde_Kolab_Storage_Data $data The data.
  230. * @param string $type The query type.
  231. * @param array $params Additional query parameters.
  232. *
  233. * @return NULL
  234. */
  235. private function _addDataQuery(Horde_Kolab_Storage_Data $data, $type, $params = array())
  236. {
  237. if (isset($this->_class_map[$type])) {
  238. $params = array_merge(
  239. $this->_getDataQueryParameters($data),
  240. $params
  241. );
  242. $data->registerQuery(
  243. $type,
  244. $this->_createDataQuery(
  245. $this->_class_map[$type], $data, $params
  246. )
  247. );
  248. } else {
  249. throw new Horde_Kolab_Storage_Exception(
  250. sprintf('Query type %s not supported!', $type)
  251. );
  252. }
  253. }
  254. /**
  255. * Fetch any additional parameters required when creating data queries.
  256. *
  257. * @param Horde_Kolab_Storage_Data $data The data.
  258. *
  259. * @return array The parameters for data queries.
  260. */
  261. abstract protected function _getDataQueryParameters(
  262. Horde_Kolab_Storage_Data $data
  263. );
  264. /**
  265. * Create the specified data query type.
  266. *
  267. * @param string $name The query name.
  268. * @param Horde_Kolab_Storage_Data $data The data that should be queried.
  269. * @param array $params Additional parameters provided
  270. * to the query constructor.
  271. *
  272. * @return Horde_Kolab_Storage_Query A query handler.
  273. *
  274. * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
  275. */
  276. private function _createDataQuery($name, Horde_Kolab_Storage_Data $data, $params = array())
  277. {
  278. return $this->_createQuery($name, $data, $params);
  279. }
  280. /**
  281. * Create the specified query type.
  282. *
  283. * @param string $name The query name.
  284. * @param mixed $data The data that should be queried.
  285. * @param array $params Additional parameters provided
  286. * to the query constructor.
  287. *
  288. * @return Horde_Kolab_Storage_Query A query handler.
  289. *
  290. * @throws Horde_Kolab_Storage_Exception In case the requested query is not supported.
  291. */
  292. private function _createQuery($name, $data, $params = array())
  293. {
  294. if (class_exists($name)) {
  295. $constructor_params = array_merge(
  296. array('factory' => $this->_factory), $params
  297. );
  298. $query = new $name($data, $constructor_params);
  299. } else {
  300. throw new Horde_Kolab_Storage_Exception(sprintf('No such query "%s"!', $name));
  301. }
  302. return $query;
  303. }
  304. }