R/gmql_order.R

Defines functions .check_opt_value .check_option .ordering_meta gmql_order arrange.GMQLDataset

arrange.GMQLDataset <- function(.data, metadata_ordering = NULL, 
        regions_ordering = NULL, fetch_opt = "", num_fetch = 0L, 
        reg_fetch_opt = "", reg_num_fetch = 0L)
{
    ptr_data <- value(.data)
    gmql_order(ptr_data, metadata_ordering, regions_ordering, 
                fetch_opt, num_fetch, reg_fetch_opt, reg_num_fetch)
}

#' Method arrange
#' 
#' @description Wrapper to GMQL ORDER operator
#' 
#' @description It is used to order either samples or sample regions or both, 
#' according to a set of metadata and/or region attributes.
#' Order can be specified as ascending / descending for every attribute. 
#' The number of samples and their regions remain the same 
#' (unless fetching options are specified), as well as their attributes, but 
#' a new ordering metadata and/or region attribute is added. Sorted 
#' samples or regions have a new attribute "_order", added to their metadata, 
#' or "order" added to their regions, or to both of them as specified in input.
#'
#' @importFrom rJava J .jnull .jarray
#' @importFrom dplyr arrange
#' 
#' @param .data GMQLDataset class object
#' @param metadata_ordering list of ordering functions containing name of 
#' metadata attribute.
#' The functions available are: \code{\link{ASC}}, \code{\link{DESC}}. 
#' If NULL, fetch_opt and num_fetch are not considered
#' @param fetch_opt string indicating the option used to fetch the 
#' first k samples; it can assume the values:
#' \itemize{
#' \item{mtop: it fetches the first k samples}
#' \item{mtopp: it fetches the first k percentage of samples.}
#' \item{mtopg: it fetches the first k samples in each group.}
#' 
#' }
#' if NULL, \emph{num_fetch} is not considered 
#' 
#' @param num_fetch integer value identifying the number of samples to fetch;
#' by default it is 0, that means all samples are fetched
#' 
#' @param regions_ordering list of ordering functions containing name of 
#' region attribute.
#' The functions available are: \code{\link{ASC}}, \code{\link{DESC}}.
#' If NULL, reg_fetch_opt and reg_num_fetch are not considered
#' 
#' @param reg_fetch_opt string indicating the option used to fetch the 
#' first k regions; it can assume the values:
#' \itemize{
#' \item{rtop: it fetches the first k regions.}
#' \item{rtopp: it fetches the first k percentage of regions.}
#' \item{rtopg: it fetches the first k regions in each group.}
#' }
#' if NULL, \emph{reg_num_fetch} is not considered 
#' 
#' @param reg_num_fetch integer value identifying the number of regions to 
#' fetch; by default it is 0, that means all regions are fetched
#' 
#' @return GMQLDataset object. It contains the value to use as input 
#' for the subsequent GMQLDataset method
#'
#' @examples
#' 
#' ## This statement initializes and runs the GMQL server for local execution 
#' ## and creation of results on disk. Then, with system.file() it defines 
#' ## the path to the folder "DATASET" in the subdirectory "example"
#' ## of the package "RGMQL" and opens such file as a GMQL dataset named 
#' ## "data" using CustomParser
#' 
#' init_gmql()
#' test_path <- system.file("example", "DATASET", package = "RGMQL")
#' data = read_gmql(test_path)
#' 
#' ## The following statement orders the samples according to the Region_Count 
#' ## metadata attribute and takes the two samples that have the highest count. 
#'
#' o = arrange(data, list(ASC("Region_Count")), fetch_opt = "mtop", 
#'     num_fetch = 2)
#' 
#' @name arrange
#' @rdname arrange
#' @aliases arrange,GMQLDataset-method
#' @aliases arrange-method
#' @export
setMethod("arrange", "GMQLDataset", arrange.GMQLDataset)

gmql_order <- function(input_data, metadata_ordering, regions_ordering,
                    fetch_opt, num_fetch, reg_fetch_opt, reg_num_fetch)
{
    if(!is.null(fetch_opt) && !identical(fetch_opt,""))
        fetch_opt <- .check_option(fetch_opt)
    else
        fetch_opt <- .jnull("java/lang/String")
    
    if(!is.null(num_fetch))
        .check_opt_value(num_fetch)
    else
        num_fetch <- 0L
    
    if(!is.null(reg_num_fetch))
        .check_opt_value(reg_num_fetch)
    else
        reg_num_fetch <- 0L
    
    if(!is.null(reg_fetch_opt) && !identical(reg_fetch_opt,""))
        reg_fetch_opt <- .check_option(reg_fetch_opt)
    else
        reg_fetch_opt <- .jnull("java/lang/String")
    
    if(!is.null(metadata_ordering))
    {
        meta_matrix <- .ordering_meta(metadata_ordering)
        meta_matrix <- .jarray(meta_matrix, dispatch = TRUE)
    }
    else
    {
        num_fetch <- 0L
        fetch_opt <- .jnull("java/lang/String")
        meta_matrix <- .jnull("java/lang/String")
    }
    
    if(!is.null(regions_ordering))
    {
        region_matrix <- .ordering_meta(regions_ordering)
        region_matrix <- .jarray(region_matrix, dispatch = TRUE)
    }
    else
    {
        reg_num_fetch <- 0L
        reg_fetch_opt <- .jnull("java/lang/String")
        region_matrix <- .jnull("java/lang/String")
    }
    
    WrappeR <- J("it/polimi/genomics/r/Wrapper")
    response <- WrappeR$order(meta_matrix, fetch_opt, as.integer(num_fetch), 
                        reg_fetch_opt, as.integer(reg_num_fetch), 
                        region_matrix, input_data)
    error <- strtoi(response[1])
    val <- response[2]
    if(error)
        stop(val)
    else
        GMQLDataset(val)
}

.ordering_meta <- function(ordering)
{
    order_matrix <- do.call(rbind, ordering)
    order_matrix
}

.check_option <- function(opt)
{
    opt <- tolower(opt)
    if(!opt %in% c("mtop", "mtopp", "mtopg", "rtop", "rtopp", "rtopg"))
        stop("option not admissable")
    opt
}

.check_opt_value <- function(opt_value)
{
    if(!is.numeric(opt_value))
        stop("no valid data")
    
    if(length(opt_value)>1)
        stop("no multiple value")
}

Try the RGMQL package in your browser

Any scripts or data that you put into this service are public.

RGMQL documentation built on Nov. 8, 2020, 5:59 p.m.