912473bbd8d4a752f0ac30883bdeb325e8439be1
[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 /// Calculate the SQL sortkey to be used by the SQL statements later
17     switch ( $sortkey ) {
18         case "CREATION":
19             $sqlsortkey = "timecreated";
20             break;
21         case "UPDATE":
22             $sqlsortkey = "timemodified";
23             break;
24         case "FIRSTNAME":
25             $sqlsortkey = "firstname";
26             break;
27         case "LASTNAME":
28             $sqlsortkey = "lastname";
29             break;
30     }
31     $sqlsortorder = $sortorder;
33 /// Pivot is the field that set the break by groups (category, initial, author name, etc)
35 /// fullpivot indicate if the whole pivot should be compared agasint the db or just the first letter
36 /// printpivot indicate if the pivot should be printed or not
38     $fullpivot = 1;
39     $params = array('gid1'=>$glossary->id, 'gid2'=>$glossary->id, 'myid'=>$USER->id, 'hook'=>$hook);
41     $userid = '';
42     if ( isloggedin() ) {
43         $userid = "OR ge.userid = :myid";
44     }
45     switch ($tab) {
46     case GLOSSARY_CATEGORY_VIEW:
47         if ($hook == GLOSSARY_SHOW_ALL_CATEGORIES  ) {
49             $sqlselect = "SELECT gec.id AS cid, ge.*, gec.entryid, gc.name AS glossarypivot";
50             $sqlfrom   = "FROM {glossary_entries} ge,
51                                {glossary_entries_categories} gec,
52                                {glossary_categories} gc";
53             $sqlwhere  = "WHERE (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
54                           ge.id = gec.entryid AND gc.id = gec.categoryid AND
55                           (ge.approved <> 0 $userid)";
57             $sqlorderby = ' ORDER BY gc.name, ge.concept';
59         } elseif ($hook == GLOSSARY_SHOW_NOT_CATEGORISED ) {
61             $printpivot = 0;
62             $sqlselect = "SELECT ge.*, concept AS glossarypivot";
63             $sqlfrom   = "FROM {glossary_entries} ge LEFT JOIN {glossary_entries_categories} gec
64                                ON ge.id = gec.entryid";
65             $sqlwhere  = "WHERE (glossaryid = :gid1 OR sourceglossaryid = :gid2) AND
66                           (ge.approved <> 0 $userid) AND gec.entryid IS NULL";
69             $sqlorderby = ' ORDER BY concept';
71         } else {
73             $printpivot = 0;
74             $sqlselect  = "SELECT ge.*, ce.entryid, c.name AS glossarypivot";
75             $sqlfrom    = "FROM {glossary_entries} ge, {glossary_entries_categories} ce, {glossary_categories} c";
76             $sqlwhere   = "WHERE ge.id = ce.entryid AND ce.categoryid = :hook AND
77                                  ce.categoryid = c.id AND ge.approved != 0 AND
78                                  (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
79                           (ge.approved <> 0 $userid)";
81             $sqlorderby = ' ORDER BY c.name, ge.concept';
83         }
84     break;
85     case GLOSSARY_AUTHOR_VIEW:
87         $where = '';
88         $params['hookup'] = $textlib->strtoupper($hook);
90         if ( $sqlsortkey == 'firstname' ) {
91             $usernamefield = $DB->sql_fullname('u.firstname' , 'u.lastname');
92         } else {
93             $usernamefield = $DB->sql_fullname('u.lastname' , 'u.firstname');
94         }
95         $where = "AND " . $DB->sql_substr("upper($usernamefield)", 1, $textlib->strlen($hook)) . " = :hookup";
97         if ( $hook == 'ALL' ) {
98             $where = '';
99         }
101         $sqlselect  = "SELECT ge.*, $usernamefield AS glossarypivot, 1 AS userispivot ";
102         $sqlfrom    = "FROM {glossary_entries} ge, {user} u";
103         $sqlwhere   = "WHERE ge.userid = u.id  AND
104                              (ge.approved <> 0 $userid)
105                              $where AND
106                              (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2)";
107         $sqlorderby = "ORDER BY $usernamefield $sqlsortorder, ge.concept";
108     break;
109     case GLOSSARY_APPROVAL_VIEW:
110         $fullpivot = 0;
111         $printpivot = 0;
113         $where = '';
114         $params['hookup'] = $textlib->strtoupper($hook);
116         if ($hook != 'ALL' and $hook != 'SPECIAL') {
117             $where = "AND " . $DB->sql_substr("upper(concept)", 1, $textlib->strlen($hook)) . " = :hookup";
118         }
120         $sqlselect  = "SELECT ge.*, ge.concept AS glossarypivot";
121         $sqlfrom    = "FROM {glossary_entries} ge";
122         $sqlwhere   = "WHERE (ge.glossaryid = :gid1 OR ge.sourceglossaryid = :gid2) AND
123                              ge.approved = 0 $where";
125         if ( $sqlsortkey ) {
126             $sqlorderby = "ORDER BY $sqlsortkey $sqlsortorder";
127         } else {
128             $sqlorderby = "ORDER BY ge.concept";
129         }
130     break;
131     case GLOSSARY_DATE_VIEW:
132         $printpivot = 0;
133     case GLOSSARY_STANDARD_VIEW:
134     default:
135         $sqlselect  = "SELECT ge.*, ge.concept AS glossarypivot";
136         $sqlfrom    = "FROM {glossary_entries} ge";
138         $where = '';
139         $fullpivot = 0;
141         switch ( $mode ) {
142         case 'search':
144             if ($DB->sql_regex_supported()) {
145                 $REGEXP    = $DB->sql_regex(true);
146                 $NOTREGEXP = $DB->sql_regex(false);
147             }
149             $searchcond = array();
150             $alcond     = array();
151             //$params     = array();
152             $i = 0;
154             $concat = $DB->sql_concat('ge.concept', "' '", 'ge.definition',"' '", "COALESCE(al.alias, '')");
156             $searchterms = explode(" ",$hook);
158             foreach ($searchterms as $searchterm) {
159                 $i++;
161                 $NOT = false; /// Initially we aren't going to perform NOT LIKE searches, only MSSQL and Oracle
162                            /// will use it to simulate the "-" operator with LIKE clause
164             /// Under Oracle and MSSQL, trim the + and - operators and perform
165             /// simpler LIKE (or NOT LIKE) queries
166                 if (!$DB->sql_regex_supported()) {
167                     if (substr($searchterm, 0, 1) == '-') {
168                         $NOT = true;
169                     }
170                     $searchterm = trim($searchterm, '+-');
171                 }
173                 if (substr($searchterm,0,1) == '+') {
174                     $searchterm = trim($searchterm, '+-');
175                     if ($textlib->strlen($searchterm) < 2) {
176                         continue;
177                     }
178                     $searchterm = preg_quote($searchterm, '|');
179                     $searchcond[] = "$concat $REGEXP :ss$i";
180                     $params['ss'.$i] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
182                 } else if (substr($searchterm,0,1) == "-") {
183                     $searchterm = trim($searchterm, '+-');
184                     if ($textlib->strlen($searchterm) < 2) {
185                         continue;
186                     }
187                     $searchterm = preg_quote($searchterm, '|');
188                     $searchcond[] = "$concat $NOTREGEXP :ss$i";
189                     $params['ss'.$i] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
191                 } else {
192                     if ($textlib->strlen($searchterm) < 2) {
193                         continue;
194                     }
195                     $searchcond[] = $DB->sql_like($concat, ":ss$i", false, true, $NOT);
196                     $params['ss'.$i] = "%$searchterm%";
197                 }
198             }
200             if (empty($searchcond)) {
201                 $where = "AND 1=2 "; // no search result
203             } else {
204                 $searchcond = implode(" AND ", $searchcond);
206                 $sqlselect  = "SELECT DISTINCT ge.*, ge.concept AS glossarypivot";
207                 $sqlfrom    = "FROM {glossary_entries} ge
208                                LEFT JOIN {glossary_alias} al ON al.entryid = ge.id";
209                 $where      = "AND ($searchcond)";
210             }
212         break;
214         case 'term':
215             $params['hook2'] = $hook;
216             $printpivot = 0;
217             $sqlfrom .= " LEFT JOIN {glossary_alias} ga on ge.id = ga.entryid";
218             $where = "AND (ge.concept = :hook OR ga.alias = :hook2) ";
219         break;
221         case 'entry':
222             $printpivot = 0;
223             $where = "AND ge.id = :hook";
224         break;
226         case 'letter':
227             if ($hook != 'ALL' and $hook != 'SPECIAL') {
228                 $params['hookup'] = $textlib->strtoupper($hook);
229                 $where = "AND " . $DB->sql_substr("upper(concept)", 1, $textlib->strlen($hook)) . " = :hookup";
230             }
231             if ($hook == 'SPECIAL') {
232                 //Create appropiate IN contents
233                 $alphabet = explode(",", get_string('alphabet', 'langconfig'));
234                 list($nia, $aparams) = $DB->get_in_or_equal($alphabet, SQL_PARAMS_NAMED, $start='a0', false);
235                 $params = array_merge($params, $aparams);
236                 $where = "AND " . $DB->sql_substr("upper(concept)", 1, 1) . " $nia";
237             }
238         break;
239         }
241         $sqlwhere   = "WHERE (ge.glossaryid = :gid1 or ge.sourceglossaryid = :gid2) AND
242                              (ge.approved <> 0 $userid)
243                               $where";
244         switch ( $tab ) {
245         case GLOSSARY_DATE_VIEW:
246             $sqlorderby = "ORDER BY $sqlsortkey $sqlsortorder";
247         break;
249         case GLOSSARY_STANDARD_VIEW:
250             $sqlorderby = "ORDER BY ge.concept";
251         default:
252         break;
253         }
254     break;
255     }
256     $count = $DB->count_records_sql("SELECT COUNT(DISTINCT(ge.id)) $sqlfrom $sqlwhere", $params);
258     $limitfrom = $offset;
259     $limitnum = 0;
261     if ( $offset >= 0 ) {
262         $limitnum = $entriesbypage;
263     }
265     $allentries = $DB->get_records_sql("$sqlselect $sqlfrom $sqlwhere $sqlorderby", $params, $limitfrom, $limitnum);