MDL-26414 gloosary - fix wrong init introduced by MDL-26371
[moodle.git] / mod / glossary / sql.php
1 <?php
3 /**
4  * SQL.PHP
5  *    This file is include from view.php and print.php
6  * @copyright 2003
7  **/
9 /// Creating the SQL statements
11 /// Initialise some variables
12     $sqlorderby = '';
13     $sqlsortkey = NULL;
14     $textlib = textlib_get_instance();
16     // For cases needing inner view
17     $sqlwrapheader = '';
18     $sqlwrapfooter = '';
20 /// Calculate the SQL sortkey to be used by the SQL statements later
21     switch ( $sortkey ) {
22         case "CREATION":
23             $sqlsortkey = "timecreated";
24             break;
25         case "UPDATE":
26             $sqlsortkey = "timemodified";
27             break;
28         case "FIRSTNAME":
29             $sqlsortkey = "firstname";
30             break;
31         case "LASTNAME":
32             $sqlsortkey = "lastname";
33             break;
34     }
35     $sqlsortorder = $sortorder;
37 /// Pivot is the field that set the break by groups (category, initial, author name, etc)
39 /// fullpivot indicate if the whole pivot should be compared agasint the db or just the first letter
40 /// printpivot indicate if the pivot should be printed or not
42     $fullpivot = 1;
43     $params = array('gid1'=>$glossary->id, 'gid2'=>$glossary->id, 'myid'=>$USER->id, 'hook'=>$hook);
45     $userid = '';
46     if ( isloggedin() ) {
47         $userid = "OR ge.userid = :myid";
48     }
49     switch ($tab) {
50     case GLOSSARY_CATEGORY_VIEW:
51         if ($hook == GLOSSARY_SHOW_ALL_CATEGORIES  ) {
53             $sqlselect = "SELECT gec.id AS cid, ge.*, gec.entryid, gc.name AS glossarypivot";
54             $sqlfrom   = "FROM {glossary_entries} ge,
55                                {glossary_entries_categories} gec,
56                                {glossary_categories} gc";
57             $sqlwhere  = "WHERE (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
58                           ge.id = gec.entryid AND gc.id = gec.categoryid AND
59                           (ge.approved <> 0 $userid)";
61             $sqlorderby = ' ORDER BY gc.name, ge.concept';
63         } elseif ($hook == GLOSSARY_SHOW_NOT_CATEGORISED ) {
65             $printpivot = 0;
66             $sqlselect = "SELECT ge.*, concept AS glossarypivot";
67             $sqlfrom   = "FROM {glossary_entries} ge LEFT JOIN {glossary_entries_categories} gec
68                                ON ge.id = gec.entryid";
69             $sqlwhere  = "WHERE (glossaryid = :gid1 OR sourceglossaryid = :gid2) AND
70                           (ge.approved <> 0 $userid) AND gec.entryid IS NULL";
73             $sqlorderby = ' ORDER BY concept';
75         } else {
77             $printpivot = 0;
78             $sqlselect  = "SELECT ge.*, ce.entryid, c.name AS glossarypivot";
79             $sqlfrom    = "FROM {glossary_entries} ge, {glossary_entries_categories} ce, {glossary_categories} c";
80             $sqlwhere   = "WHERE ge.id = ce.entryid AND ce.categoryid = :hook AND
81                                  ce.categoryid = c.id AND ge.approved != 0 AND
82                                  (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
83                           (ge.approved <> 0 $userid)";
85             $sqlorderby = ' ORDER BY c.name, ge.concept';
87         }
88     break;
89     case GLOSSARY_AUTHOR_VIEW:
91         $where = '';
92         $params['hookup'] = $textlib->strtoupper($hook);
94         if ( $sqlsortkey == 'firstname' ) {
95             $usernamefield = $DB->sql_fullname('u.firstname' , 'u.lastname');
96         } else {
97             $usernamefield = $DB->sql_fullname('u.lastname' , 'u.firstname');
98         }
99         $where = "AND " . $DB->sql_substr("upper($usernamefield)", 1, $textlib->strlen($hook)) . " = :hookup";
101         if ( $hook == 'ALL' ) {
102             $where = '';
103         }
105         $sqlselect  = "SELECT ge.*, $usernamefield AS glossarypivot, 1 AS userispivot ";
106         $sqlfrom    = "FROM {glossary_entries} ge, {user} u";
107         $sqlwhere   = "WHERE ge.userid = u.id  AND
108                              (ge.approved <> 0 $userid)
109                              $where AND
110                              (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2)";
111         $sqlorderby = "ORDER BY $usernamefield $sqlsortorder, ge.concept";
112     break;
113     case GLOSSARY_APPROVAL_VIEW:
114         $fullpivot = 0;
115         $printpivot = 0;
117         $where = '';
118         $params['hookup'] = $textlib->strtoupper($hook);
120         if ($hook != 'ALL' and $hook != 'SPECIAL') {
121             $where = "AND " . $DB->sql_substr("upper(concept)", 1, $textlib->strlen($hook)) . " = :hookup";
122         }
124         $sqlselect  = "SELECT ge.*, ge.concept AS glossarypivot";
125         $sqlfrom    = "FROM {glossary_entries} ge";
126         $sqlwhere   = "WHERE (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
127                              ge.approved = 0 $where";
129         if ( $sqlsortkey ) {
130             $sqlorderby = "ORDER BY $sqlsortkey $sqlsortorder";
131         } else {
132             $sqlorderby = "ORDER BY ge.concept";
133         }
134     break;
135     case GLOSSARY_DATE_VIEW:
136         $printpivot = 0;
137     case GLOSSARY_STANDARD_VIEW:
138     default:
139         $sqlselect  = "SELECT ge.*, ge.concept AS glossarypivot";
140         $sqlfrom    = "FROM {glossary_entries} ge";
142         $where = '';
143         $fullpivot = 0;
145         switch ( $mode ) {
146         case 'search':
148             if ($DB->sql_regex_supported()) {
149                 $REGEXP    = $DB->sql_regex(true);
150                 $NOTREGEXP = $DB->sql_regex(false);
151             }
153             $searchcond = array();
154             $alcond     = array();
155             //$params     = array();
156             $i = 0;
158             $concat = $DB->sql_concat('ge.concept', "' '", 'ge.definition',"' '", "COALESCE(al.alias, '')");
160             $searchterms = explode(" ",$hook);
162             foreach ($searchterms as $searchterm) {
163                 $i++;
165                 $NOT = false; /// Initially we aren't going to perform NOT LIKE searches, only MSSQL and Oracle
166                            /// will use it to simulate the "-" operator with LIKE clause
168             /// Under Oracle and MSSQL, trim the + and - operators and perform
169             /// simpler LIKE (or NOT LIKE) queries
170                 if (!$DB->sql_regex_supported()) {
171                     if (substr($searchterm, 0, 1) == '-') {
172                         $NOT = true;
173                     }
174                     $searchterm = trim($searchterm, '+-');
175                 }
177                 if (substr($searchterm,0,1) == '+') {
178                     $searchterm = trim($searchterm, '+-');
179                     if ($textlib->strlen($searchterm) < 2) {
180                         continue;
181                     }
182                     $searchterm = preg_quote($searchterm, '|');
183                     $searchcond[] = "$concat $REGEXP :ss$i";
184                     $params['ss'.$i] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
186                 } else if (substr($searchterm,0,1) == "-") {
187                     $searchterm = trim($searchterm, '+-');
188                     if ($textlib->strlen($searchterm) < 2) {
189                         continue;
190                     }
191                     $searchterm = preg_quote($searchterm, '|');
192                     $searchcond[] = "$concat $NOTREGEXP :ss$i";
193                     $params['ss'.$i] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
195                 } else {
196                     if ($textlib->strlen($searchterm) < 2) {
197                         continue;
198                     }
199                     $searchcond[] = $DB->sql_like($concat, ":ss$i", false, true, $NOT);
200                     $params['ss'.$i] = "%$searchterm%";
201                 }
202             }
204             if (empty($searchcond)) {
205                 $where = "AND 1=2 "; // no search result
207             } else {
208                 $searchcond = implode(" AND ", $searchcond);
210                 // Need one inner view here to avoid distinct + text
211                 $sqlwrapheader = 'SELECT ge.*, ge.concept AS glossarypivot
212                                     FROM {glossary_entries} ge
213                                     JOIN ( ';
214                 $sqlwrapfooter = ' ) gei ON (ge.id = gei.id)';
216                 $sqlselect  = "SELECT DISTINCT ge.id";
217                 $sqlfrom    = "FROM {glossary_entries} ge
218                                LEFT JOIN {glossary_alias} al ON al.entryid = ge.id";
219                 $where      = "AND ($searchcond)";
220             }
222         break;
224         case 'term':
225             $params['hook2'] = $hook;
226             $printpivot = 0;
227             $sqlfrom .= " LEFT JOIN {glossary_alias} ga on ge.id = ga.entryid";
228             $where = "AND (ge.concept = :hook OR ga.alias = :hook2) ";
229         break;
231         case 'entry':
232             $printpivot = 0;
233             $where = "AND ge.id = :hook";
234         break;
236         case 'letter':
237             if ($hook != 'ALL' and $hook != 'SPECIAL') {
238                 $params['hookup'] = $textlib->strtoupper($hook);
239                 $where = "AND " . $DB->sql_substr("upper(concept)", 1, $textlib->strlen($hook)) . " = :hookup";
240             }
241             if ($hook == 'SPECIAL') {
242                 //Create appropiate IN contents
243                 $alphabet = explode(",", get_string('alphabet', 'langconfig'));
244                 list($nia, $aparams) = $DB->get_in_or_equal($alphabet, SQL_PARAMS_NAMED, $start='a0', false);
245                 $params = array_merge($params, $aparams);
246                 $where = "AND " . $DB->sql_substr("upper(concept)", 1, 1) . " $nia";
247             }
248         break;
249         }
251         $sqlwhere   = "WHERE (ge.glossaryid = :gid1 or ge.sourceglossaryid = :gid2) AND
252                              (ge.approved <> 0 $userid)
253                               $where";
254         switch ( $tab ) {
255         case GLOSSARY_DATE_VIEW:
256             $sqlorderby = "ORDER BY $sqlsortkey $sqlsortorder";
257         break;
259         case GLOSSARY_STANDARD_VIEW:
260             $sqlorderby = "ORDER BY ge.concept";
261         default:
262         break;
263         }
264     break;
265     }
266     $count = $DB->count_records_sql("SELECT COUNT(DISTINCT(ge.id)) $sqlfrom $sqlwhere", $params);
268     $limitfrom = $offset;
269     $limitnum = 0;
271     if ( $offset >= 0 ) {
272         $limitnum = $entriesbypage;
273     }
275     $query = "$sqlwrapheader $sqlselect $sqlfrom $sqlwhere $sqlwrapfooter $sqlorderby";
276     $allentries = $DB->get_records_sql($query, $params, $limitfrom, $limitnum);