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