view BiodbEntry.R @ 3:f61ce21ed17c draft

planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit 476a081c0da66822f4e77070f5ce59d9f14511f4-dirty
author prog
date Thu, 02 Mar 2017 11:07:56 -0500
parents 20d69a062da3
children
line wrap: on
line source

#############
# CONSTANTS #
#############

BIODB.BASIC.CLASSES <- c('character', 'integer', 'double', 'logical')

########################
# ENTRY ABSTRACT CLASS #
########################

BiodbEntry <- methods::setRefClass("BiodbEntry", fields = list(.fields ='list', .factory = "ANY"))

###############
# CONSTRUCTOR #
###############

BiodbEntry$methods( initialize = function(...) {

	.fields <<- list()
	.factory <<- NULL

	callSuper(...) # calls super-class initializer with remaining parameters
})

###################
# SET FIELD VALUE #
###################

BiodbEntry$methods(	setFieldValue = function(field, value) {

	class = .self$getFieldClass(field)

	# Secific case to handle objects.
	if ( class ==" object" & !(isS4(value) & methods::is(value, "refClass")))
	  stop(paste0('Cannot set a non RC instance to field "', field, '" in BiodEntry.'))
	
	# Check cardinality
	if (class != 'data.frame' && .self$getFieldCardinality(field) == BIODB.CARD.ONE && length(value) > 1)
		stop(paste0('Cannot set more that one value to single value field "', field, '" in BiodEntry.'))

	# Check value class
	value <- switch(class,
		   'character' = as.character(value),
		   'double' = as.double(value),
		   'integer' = as.integer(value),
		   'logical' = as.logical(value),
		   value)
	# TODO check value class

	.self$.fields[[field]] <- value
})

###################
# GET FIELD NAMES #
###################

BiodbEntry$methods(	getFieldNames = function(field) {
	return(names(.self$.fields))
})

#############
# HAS FIELD #
#############

BiodbEntry$methods(	hasField = function(field) {
	return(field %in% names(.self$.fields))
})

###################
# GET FIELD CLASS #
###################

BiodbEntry$methods(	getFieldClass = function(field) {

	if ( ! field %in% BIODB.FIELDS[['name']])
		stop(paste0('Unknown field "', field, '" in BiodEntry.'))

	field.class <- BIODB.FIELDS[which(field == BIODB.FIELDS[['name']]), 'class']

	return(field.class)
})

#########################
# FIELD HAS BASIC CLASS #
#########################

BiodbEntry$methods(	fieldHasBasicClass = function(field) {
	return(.self$getFieldClass(field) %in% BIODB.BASIC.CLASSES)
})

#########################
# GET FIELD CARDINALITY #
#########################

BiodbEntry$methods(	getFieldCardinality = function(field) {

	if ( ! field %in% BIODB.FIELDS[['name']])
		stop(paste0('Unknown field "', field, '" in BiodEntry.'))

	field.card <- BIODB.FIELDS[which(field == BIODB.FIELDS[['name']]), 'cardinality']

	return(field.card)
})

###################
# GET FIELD VALUE #
###################

BiodbEntry$methods(	getFieldValue = function(field, compute = TRUE) {

	if ( ! field %in% BIODB.FIELDS[['name']])
		stop(paste0('Unknown field "', field, '" in BiodEntry.'))

	if (field %in% names(.self$.fields))
		return(.self$.fields[[field]])
	else if (compute && .self$.compute.field(field))
		return(.self$.fields[[field]])

	# Return NULL or NA
	class = .self$getFieldClass(field)
	return(if (class %in% BIODB.BASIC.CLASSES) as.vector(NA, mode = class) else NULL)
})

#################
# COMPUTE FIELD #
##################

BiodbEntry$methods(	.compute.field = function(field) {

	if ( ! is.null(.self$.factory) && field %in% names(BIODB.FIELD.COMPUTING)) {
		for (db in BIODB.FIELD.COMPUTING[[field]]) {
			db.id <- .self$getField(paste0(db, 'id'))
			if ( ! is.na(db.id)) {
				db.entry <- .self$.factory$createEntry(db, id = db.id)
				if ( ! is.null(db.entry)) {
					.self$setField(field, db.entry$getField(field))
					return(TRUE)
				}
			}
		}
	}

	return(FALSE)
})

############################
# GET FIELDS AS DATA FRAME #
############################
###TODO add a limiting option to get some fields.
BiodbEntry$methods(	getFieldsAsDataFrame = function() {
	df <- data.frame()
	# Loop on all fields
	for (f in names(.self$.fields))

		# If field class is a basic type
		if (.self$getFieldClass(f) %in% c('character', 'logical', 'integer', 'double')  &
			length(.self$getFieldValue(f)) == 1)
			df[1, f] <- .self$getFieldValue(f)

	return(df)
})

###########
# FACTORY #
###########

BiodbEntry$methods(	setFactory = function(factory) {
	is.null(factory) || inherits(factory, "BiodbFactory") || stop("The factory instance must inherit from BiodbFactory class.")
	.factory <<- factory
})

##############
# DEPRECATED #
##############

BiodbEntry$methods(	getField = function(field) {
	return(.self$getFieldValue(field))
})

BiodbEntry$methods(	setField = function(field, value) {
	.self$setFieldValue(field, value)
})