-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGeneticMapSearch.inc
289 lines (256 loc) · 8.3 KB
/
GeneticMapSearch.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
<?php
/**
* Provides a search for chado featuremap-based Tripal Content.
*
*/
class GeneticMapSearch 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 = 'Genetic Map 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' => 'search/genetic-maps',
// @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' => 'featuremap',
'id_column' => 'featuremap_id'
],
],
'pop_name' => [
'title' => 'Name'
],
'pop_type' => [
'title' => 'Type'
],
'pop_size' => [
'title' => 'Size'
],
'species' => [
'title' => 'Source Species',
'entity_link' => [
'chado_table' => 'organism',
'id_column' => 'organism_id'
],
],
],
// 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 of the population the genetic map was created for (e.g. Lens culinaris).',
'default' => 'Lens',
],
'species' => [
'title' => 'Species',
'help' => '',
],
'pop_type' => [
'title' => 'Population Type',
'help' => 'The type of population the genetic map was made for.',
],
'pop_name' => [
'title' => 'Population Name',
'help' => 'The name of population the genetic map was made for.',
],
'name' => [
'title' => 'Map Name',
'help' => 'The name of the map 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);
// Make the Population type filter a drop-down.
$options = chado_query("SELECT value
FROM {featuremapprop}
WHERE type_id=6591
ORDER BY value ASC")->fetchAllKeyed(0,0);
$form['pop_type']['#type'] = 'select';
$form['pop_type']['#options'] = $options;
$form['pop_type']['#empty_option'] = ' - Select -';
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');
$query = "
SELECT
map.featuremap_id, map.name,
o.organism_id, o.genus||' '||o.species as species,
pop_name.value as pop_name,
pop_type.value as pop_type,
pop_size.value as pop_size
FROM {featuremap} map
LEFT JOIN {featuremap_organism} forg ON forg.featuremap_id=map.featuremap_id
LEFT JOIN {organism} o ON o.organism_id=forg.organism_id
LEFT JOIN {featuremapprop} pop_name ON pop_name.featuremap_id=map.featuremap_id AND pop_name.type_id=6590
LEFT JOIN {featuremapprop} pop_type ON pop_type.featuremap_id=map.featuremap_id AND pop_type.type_id=6591
LEFT JOIN {featuremapprop} pop_size ON pop_size.featuremap_id=map.featuremap_id AND pop_size.type_id=6592";
$where = [];
$joins = [];
// -- Genus.
if ($filter_results['genus'] != '') {
$where[] = "o.genus ~* :genus";
$args[':genus'] = $filter_results['genus'];
}
// -- Species.
if ($filter_results['species'] != '') {
$where[] = "o.species ~* :species";
$args[':species'] = $filter_results['species'];
}
// -- Population Type.
if ($filter_results['pop_type'] != '') {
$where[] = "pop_type.value = :pop_type";
$args[':pop_type'] = $filter_results['pop_type'];
}
// -- Population Name.
if ($filter_results['pop_name'] != '') {
$where[] = "pop_name.value ~ :pop_name";
$args[':pop_name'] = $filter_results['pop_name'];
}
// -- Name.
if ($filter_results['name'] != '') {
$where[] = "map.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 map.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) {
parent::formatResults($form, $results);
if (isset($form['results'])) {
$header1 = [
'name' => '',
'pop' => [
'data' => 'Population',
'colspan' => 4,
'style' => 'text-align: center',
],
];
$header2 = $form['results']['#header'];
foreach ($header2 as $key => $label) {
$header2[$key] = [
'data' => $label,
'header' => TRUE,
];
}
$form['results']['#header'] = $header1;
array_unshift($form['results']['#rows'], $header2);
}
}
}