-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGenomeAssemblySearch.inc
316 lines (279 loc) · 9.23 KB
/
GenomeAssemblySearch.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
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
<?php
/**
* Provides a search for chado analysis-based Genome Assembly Pages.
*
*/
class GenomeAssemblySearch 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 = 'Genome Assemblies';
/**
* 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'];
/**
* The machine names of the permissions required to access private content
* in this search. Note: "private content" is indicated by Private Biodata
* (https://github.com/tripal/private_biodata) module.
*/
public static $private_permissions = ['administrator', 'Unpublished Genome Access', 'University of Saskatchewan'];
/**
* 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' => 'genome-assemblies',
// @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' => 'analysis',
'id_column' => 'analysis_id'
],
],
'sourcename' => [
'title' => 'Source Germplasm',
],
'date_released' => [
'title' => 'Date Released',
],
'stats' => [
'title' => 'Statistics',
],
],
// 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 genome assembly describes (e.g. Lens culinaris).',
],
'species' => [
'title' => 'Species',
'help' => '',
],
'name' => [
'title' => 'Name',
'help' => 'The name of the genome assembly 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;
$form['scientific_name']['genus']['#required'] = FALSE;
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) {
// Determine if this user has private access.
global $user;
$can_view_private = FALSE;
foreach ($this::$private_permissions as $permission_name) {
if (array_search($permission_name, $user->roles) !== FALSE) {
$can_view_private = TRUE;
}
}
// Retrieve the filter results already set.
$filter_results = $this->values;
// @debug dpm($filter_results, '$filter_results');
$query = "
SELECT
a.analysis_id,
a.name,
a.description,
a.sourcename,
a.timeexecuted as date_released,
n50.value ||'/'|| l50.value as stats,
genus.value as genus
FROM chado.analysis a
LEFT JOIN chado.analysisprop n50 ON n50.analysis_id=a.analysis_id
AND n50.type_id=6773
LEFT JOIN chado.analysisprop l50 ON l50.analysis_id=a.analysis_id
AND l50.type_id=6775
LEFT JOIN chado.analysisprop genus ON genus.analysis_id=a.analysis_id
AND genus.type_id=4032";
$where = [];
$joins = [];
$where[] = "a.analysis_id IN (
SELECT analysis_id FROM chado.analysisprop
WHERE type_id=4310 AND value=:content_type)";
$args[':content_type'] = 'genome_assembly';
// -- 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[] = "a.name ~ :name";
$args[':name'] = $filter_results['name'];
}
// -- Private Assemblies.
if ($can_view_private === FALSE) {
$joins[] = "LEFT JOIN chado_bio_data_33 bio ON bio.record_id=a.analysis_id";
$joins[] = "LEFT JOIN private_biodata ON bio.entity_id=private_biodata.entity_id";
$where[] = "private_biodata.private IS NULL";
}
// Finally, add it to the query.
if (!empty($joins)) {
$query .= "\n" . 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 a.timeexecuted DESC, a.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->analysis_id) {
$id = chado_get_record_entity_by_table('analysis', $r->analysis_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->date_released) {
$markup .= '<div class="result-year" title="Year Released">'.date('Y M j', strtotime($r->date_released)).'</div>';
}
if ($r->sourcename) {
$markup .= '<div class="result-genus" title="Source Germplasm">'.$r->sourcename.'</div>';
}
if ($r->stats) {
$markup .= '<div class="result-category" title="Scaffold N50/L50">'.$r->stats.'</div>';
}
$markup .= '
</div>
</div>';
$list[] = $markup;
}
$form['results'] = [
'#theme' => 'item_list',
'#items' => $list,
'#type' => 'ul',
'#weight' => 50,
];
return $form;
}
}