-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResearchStudySearch.inc
292 lines (258 loc) · 8.29 KB
/
ResearchStudySearch.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
<?php
/**
* Provides a search for chado project-based Tripal Content associated with the "Study" Content Type.
*
*/
class ResearchStudySearch extends KPSEARCH {
/**
* The human readable title of this search. This will be used in listings
* and shown on the search page as the title.
*/
public static $title = 'Research Study Search';
/**
* The machine name of the module providing this search.
*/
public static $module = 'kp_searches';
/**
* A description of this search. This is shown at the top of the search page
* and used for the menu item.
*/
public static $description = '';
/**
* The machine names of the permissions with access to this search. This is
* used to map your search to existing permissions. It must be an array and
* is used in hook_menu(). Some examples include 'access content'
* and 'administer tripal'.
*/
public static $permissions = ['access content'];
/**
* If TRUE, this search will require the submit button to be clicked before
* executing the query; whereas, if FALSE it will be executed on the
* first page load without parameters.
*
* NOTE: to control the results without parameters check $this->submitted
* in getQuery() and if FALSE return your pre-submit query.
*/
public static $require_submit = FALSE;
/**
* Add a pager to search results
* with $num_items_per_page results on a single page.
* NOTE: Your query has to handle paging.
*/
public static $pager = TRUE;
public static $num_items_per_page = 50;
/**
* This defined the hook_menu definition for this search. At a minimum the
* path is required.
*/
public static $menu = [
'path' => 'research/studies',
// @todo support menu items.
];
/**
* Add CSS/JS to the form/results page.
* NOTE: paths supplied should be relative to $module.
*/
public static $attached = [
'css' => [
'css/all_kp_searches.css',
],
'js' => [],
];
/**
* Information regarding the fields and filters for this search.
*/
public static $info = [
// Lists the columns in your results table.
'fields' => [
'name' => [
'title' => 'Name',
'entity_link' => [
'chado_table' => 'project',
'id_column' => 'project_id'
],
],
'genus' => [
'title' => 'Genus',
],
'year' => [
'title' => 'Dates',
],
'category' => [
'title' => 'Category',
],
],
// The filter criteria available to the user.
// This is used to generate a search form which can be altered.
'filters' => [
'genus' => [
'title' => 'Genus',
'help' => 'The legume species the research study is focused on (e.g. Lens culinaris).',
'default' => 'Lens',
],
'species' => [
'title' => 'Species',
'help' => '',
],
'name' => [
'title' => 'Name',
'help' => 'The name of the research study you are interested in (partial names are accepted).',
],
],
];
/**
* Text that should appear on the button at the bottom of the importer
* form.
*/
public static $button_text = 'Search';
/**
* Generate the filter form.
*
* The base class will generate textfields for each filter defined in $info,
* set defaults, labels and descriptions, as well as, create the search
* button.
*
* Extend this method to alter the filter form.
*/
public function form($form, $form_state) {
$form = parent::form($form, $form_state);
// Add a crop selector.
$this->addCropFormElement($form, $form_state);
// Add a Scientific name selector.
$this->addSpeciesFormElement($form, $form_state);
// @todo: add species to the database in a consistent manner.
$form['scientific_name']['species']['#disabled'] = TRUE;
return $form;
}
/**
* Allows custom searches to validate the form results.
* Use form_set_error() to signal invalid values.
*/
public function validateForm($form, $form_state) {
//$values = $form_state['values'];
}
/**
* Determine the query for the genetic marker search.
*
* @param string $query
* The full SQL query to execute. This will be executed using chado_query()
* so use curly brackets appropriately. Use :placeholders for any values.
* @param array $args
* An array of arguments to pass to chado_query(). Keys must be the
* placeholders in the query and values should be what you want them set to.
*/
public function getQuery(&$query, &$args, $offset) {
// Retrieve the filter results already set.
$filter_results = $this->values;
// @debug dpm($filter_results, '$filter_results');
// @todo Collaborators: 5311
$query = "
SELECT
exp.name, exp.project_id,
exp.description,
genus.value as genus,
yr.value as year,
cat.value as category
FROM {project} exp
LEFT JOIN {projectprop} genus ON genus.project_id=exp.project_id
AND genus.type_id=4032 AND genus.rank=0
LEFT JOIN {projectprop} yr ON yr.project_id=exp.project_id
AND yr.type_id=6364 AND yr.rank=0
LEFT JOIN {projectprop} cat ON cat.project_id=exp.project_id
AND cat.type_id=6365 AND cat.rank=0
LEFT JOIN {projectprop} re ON re.project_id=exp.project_id
AND re.type_id=4310 AND re.rank=0";
$where = [];
$joins = [];
$where[] = "re.value = :content_type";
$args[':content_type'] = 'SIO:Study';
// -- Genus.
if ($filter_results['genus'] != '') {
$where[] = "genus.value ~* :genus";
$args[':genus'] = $filter_results['genus'];
}
// -- Species.
if ($filter_results['species'] != '') {
$where[] = "species.value ~* :species";
$args[':species'] = $filter_results['species'];
}
// -- Name.
if ($filter_results['name'] != '') {
$where[] = "exp.name ~* :name";
$args[':name'] = $filter_results['name'];
}
// Finally, add it to the query.
if (!empty($joins)) {
$query .= implode("\n",$joins);
}
if (!empty($where)) {
$query .= "\n" . ' WHERE ' . implode(' AND ',$where);
}
// Sort even though it is SLOW b/c ppl expect it.
$query .= "\n" . ' ORDER BY substring(yr.value, 6, 9) DESC, exp.name ASC';
// Handle paging.
$limit = $this::$num_items_per_page + 1;
$query .= "\n" . ' LIMIT ' . $limit . ' OFFSET ' . $offset;
// @debug dpm(strtr(str_replace(['{','}'], ['chado.', ''], $query), $args), 'query');
}
/**
* Format the results within the $form array.
*
* The base class will format the results as a table.
*
* @param array $form
* The current form array.
* @param array $results
* The results to format. This will be an array of standard objects where
* the keys map to the keys in $info['fields'].
*/
public function formatResults(&$form, $results) {
$list = [];
foreach ($results as $r) {
// Add a link to the title.
$title = $r->name;
$id = NULL;
if ($r->project_id) {
$id = chado_get_record_entity_by_table('project', $r->project_id);
if ($id) {
$title = l($r->name, 'bio_data/'.$id);
}
}
// Substring the description.
$description = strip_tags($r->description);
if (preg_match('/^.{1,300}\b/s', $description, $match)) {
$description = trim($match[0]);
}
if ($id && (strlen($description) > 0)){
$description .= ' ' . l('[Read more]', 'bio_data/'.$id);
}
$markup = '
<div class="result-row">
<div class="result-left">
<div class="result-title">'.$title.'</div>
<div class="result-description">'.$description.'</div>
</div>
<div class="result-right">';
if ($r->year) {
$markup .= '<div class="result-year" title="Year(s) of Funding">'.$r->year.'</div>';
}
if ($r->genus) {
$markup .= '<div class="result-genus" title="Genus for germplasm">'.$r->genus.'</div>';
}
if ($r->category) {
$markup .= '<div class="result-category" title="Research Category">'.$r->category.'</div>';
}
$markup .= '
</div>
</div>';
$list[] = $markup;
}
$form['results'] = [
'#theme' => 'item_list',
'#items' => $list,
'#type' => 'ul',
'#weight' => 50,
];
return $form;
}
}