1<?php 2/* Copyright (c) 1998-2019 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4/** 5 * Class ilAccessibilityTableDatabaseDataProvider 6 */ 7abstract class ilAccessibilityTableDatabaseDataProvider implements ilAccessibilityTableDataProvider 8{ 9 /** @var ilDBInterface */ 10 protected $db; 11 12 /** 13 * ilAccessibilityTableDatabaseDataProvider constructor. 14 * @param ilDBInterface $db 15 */ 16 public function __construct(ilDBInterface $db) 17 { 18 $this->db = $db; 19 } 20 21 /** 22 * @param array $params 23 * @param array $filter 24 * @return string 25 */ 26 abstract protected function getSelectPart(array $params, array $filter) : string; 27 28 /** 29 * @param array $params 30 * @param array $filter 31 * @return string 32 */ 33 abstract protected function getFromPart(array $params, array $filter) : string; 34 35 /** 36 * @param array $params 37 * @param array $filter 38 * @return string 39 */ 40 abstract protected function getWherePart(array $params, array $filter) : string; 41 42 /** 43 * @param array $params 44 * @param array $filter 45 * @return string 46 */ 47 abstract protected function getGroupByPart(array $params, array $filter) : string; 48 49 /** 50 * @param array $params 51 * @param array $filter 52 * @return string 53 * @abstract 54 */ 55 abstract protected function getHavingPart(array $params, array $filter) : string; 56 57 /** 58 * @param array $params 59 * @param array $filter 60 * @return string 61 */ 62 abstract protected function getOrderByPart(array $params, array $filter) : string; 63 64 /** 65 * @param array $params 66 * @param array $filter 67 * @return array 68 * @throws InvalidArgumentException 69 */ 70 public function getList(array $params, array $filter) : array 71 { 72 $data = [ 73 'items' => [], 74 'cnt' => 0 75 ]; 76 77 $select = $this->getSelectPart($params, $filter); 78 $where = $this->getWherePart($params, $filter); 79 $from = $this->getFromPart($params, $filter); 80 $order = $this->getOrderByPart($params, $filter); 81 $group = $this->getGroupByPart($params, $filter); 82 $having = $this->getHavingPart($params, $filter); 83 84 if (isset($params['limit'])) { 85 if (!is_numeric($params['limit'])) { 86 throw new InvalidArgumentException('Please provide a valid numerical limit.'); 87 } 88 89 if (!isset($params['offset'])) { 90 $params['offset'] = 0; 91 } else { 92 if (!is_numeric($params['offset'])) { 93 throw new InvalidArgumentException('Please provide a valid numerical offset.'); 94 } 95 } 96 97 $this->db->setLimit($params['limit'], $params['offset']); 98 } 99 100 $where = strlen($where) ? 'WHERE ' . $where : ''; 101 $query = "SELECT {$select} FROM {$from} {$where}"; 102 103 if (strlen($group)) { 104 $query .= " GROUP BY {$group}"; 105 } 106 107 if (strlen($having)) { 108 $query .= " HAVING {$having}"; 109 } 110 111 if (strlen($order)) { 112 $query .= " ORDER BY {$order}"; 113 } 114 115 $res = $this->db->query($query); 116 while ($row = $this->db->fetchAssoc($res)) { 117 $data['items'][] = $row; 118 } 119 120 if (isset($params['limit'])) { 121 $cnt_sql = "SELECT COUNT(*) cnt FROM ({$query}) subquery"; 122 $row_cnt = $this->db->fetchAssoc($this->db->query($cnt_sql)); 123 $data['cnt'] = $row_cnt['cnt']; 124 } 125 126 return $data; 127 } 128} 129