Skip to content

Commit

Permalink
allow multiple selection names fixing #1787
Browse files Browse the repository at this point in the history
  • Loading branch information
nathandunn committed Oct 13, 2017
1 parent c3835b2 commit 28a7a5a
Show file tree
Hide file tree
Showing 2 changed files with 976 additions and 964 deletions.
54 changes: 33 additions & 21 deletions grails-app/controllers/org/bbop/apollo/TrackController.groovy
Expand Up @@ -27,10 +27,10 @@ class TrackController {


def beforeInterceptor = {
if( params.action=="featuresByName"
|| params.action=="featuresByLocation"
){
response.setHeader( "Access-Control-Allow-Origin", "*")
if (params.action == "featuresByName"
|| params.action == "featuresByLocation"
) {
response.setHeader("Access-Control-Allow-Origin", "*")
}
}

Expand Down Expand Up @@ -65,7 +65,7 @@ class TrackController {
])
@Transactional
def clearOrganismCache(String organismName) {
if(organismName.toLowerCase().equals("all") && permissionService.isAdmin()){
if (organismName.toLowerCase().equals("all") && permissionService.isAdmin()) {
log.info "Deleting cache for all organisms"
JSONArray jsonArray = new JSONArray()
Organism.all.each { organism ->
Expand All @@ -76,8 +76,7 @@ class TrackController {
}

render jsonArray as JSON
}
else{
} else {
log.info "Deleting cache for ${organismName}"
if (!checkPermission(organismName)) return
int removed = TrackCache.countByOrganismName(organismName)
Expand Down Expand Up @@ -164,6 +163,21 @@ class TrackController {

}

private static Set<String> getNames(def name){
Set<String> nameSet = new HashSet<>()
if(name){
if(name instanceof String[]){
name.each {
nameSet.add(it)
}
}
else
if(name instanceof String){
nameSet.add(name)
}
}
return nameSet
}

@RestApiMethod(description = "Get track data as an JSON within an range", path = "/track/<organism name>/<track name>/<sequence name>:<fmin>..<fmax>.<type>?name=<name>&onlySelected=<onlySelected>&ignoreCache=<ignoreCache>", verb = RestApiVerb.GET)
@RestApiParams(params = [
Expand All @@ -172,25 +186,25 @@ class TrackController {
, @RestApiParam(name = "sequence", type = "string", paramType = RestApiParamType.QUERY, description = "Sequence name(required)")
, @RestApiParam(name = "fmin", type = "integer", paramType = RestApiParamType.QUERY, description = "Minimum range(required)")
, @RestApiParam(name = "fmax", type = "integer", paramType = RestApiParamType.QUERY, description = "Maximum range (required)")
, @RestApiParam(name = "name", type = "string", paramType = RestApiParamType.QUERY, description = "If top-level feature 'id' matches, then annotate with 'selected'=1")
, @RestApiParam(name = "name", type = "string / string[]", paramType = RestApiParamType.QUERY, description = "If top-level feature 'name' matches, then annotate with 'selected'=true. Multiple names can be passed in.")
, @RestApiParam(name = "onlySelected", type = "string", paramType = RestApiParamType.QUERY, description = "(default false). If 'selected'!=1 one, then exclude.")
, @RestApiParam(name = "ignoreCache", type = "boolean", paramType = RestApiParamType.QUERY, description = "(default false). Use cache for request if available.")
, @RestApiParam(name = "flatten", type = "string", paramType = RestApiParamType.QUERY, description = "Brings nested top-level components to the root level. If not provided or 'false' it will not flatten. Default is 'gene'." )
, @RestApiParam(name = "flatten", type = "string", paramType = RestApiParamType.QUERY, description = "Brings nested top-level components to the root level. If not provided or 'false' it will not flatten. Default is 'gene'.")
, @RestApiParam(name = "type", type = "string", paramType = RestApiParamType.QUERY, description = ".json or .svg")
])
@Transactional
def featuresByLocation(String organismString, String trackName, String sequence, Long fmin, Long fmax, String type) {
if (!checkPermission(organismString)) return

String name = params.name ? params.name : ""
Set<String> nameSet = getNames(params.name ? params.name : "")
Boolean onlySelected = params.onlySelected != null ? params.onlySelected : false
String flatten = params.flatten != null ? params.flatten : 'gene'
flatten = flatten == 'false' ? '' : flatten
Boolean ignoreCache = params.ignoreCache != null ? Boolean.valueOf(params.ignoreCache) : false
Map paramMap = new TreeMap<>()
paramMap.put("type", type)
if (name) {
paramMap.put("name", name)
if (nameSet) {
paramMap.put("name", nameSet)
paramMap.put("onlySelected", onlySelected)
}
if (!ignoreCache) {
Expand All @@ -199,9 +213,7 @@ class TrackController {
if (type == "json") {
render JSON.parse(responseString) as JSON
return
}
else
if (type == "svg") {
} else if (type == "svg") {
render responseString
return
}
Expand All @@ -223,14 +235,18 @@ class TrackController {
return
}

if (flatten) {
renderedArray = trackService.flattenArray(renderedArray, flatten)
}

JSONArray returnArray = new JSONArray()
for (JSONObject returnObject in renderedArray) {
// only set if true?
if (returnObject.name) {
returnObject.id = createLink(absolute: true, uri: "/track/${organism.commonName}/${trackName}/${sequence}/${returnObject.name}.json")
}
if (name) {
if (returnObject?.name == name) {
if (nameSet) {
if (returnObject.name && nameSet.contains(returnObject?.name)) {
returnObject.selected = true
if (onlySelected) {
returnArray.add(returnObject)
Expand All @@ -243,10 +259,6 @@ class TrackController {
renderedArray = returnArray
}

if(flatten){
renderedArray = trackService.flattenArray(renderedArray,flatten)
}

if (type == "json") {
trackService.cacheRequest(renderedArray.toString(), organismString, trackName, sequence, fmin, fmax, type, paramMap)
render renderedArray as JSON
Expand Down

0 comments on commit 28a7a5a

Please sign in to comment.