Mercurial > repos > prog > lcmsmatching
comparison BiodbEntry.R @ 0:e66bb061af06 draft
planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit 3529b25417f8e1a5836474c9adec4b696d35099d-dirty
author | prog |
---|---|
date | Tue, 12 Jul 2016 12:02:37 -0400 |
parents | |
children | 253d531a0193 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e66bb061af06 |
---|---|
1 if ( ! exists('BiodbEntry')) { # Do not load again if already loaded | |
2 | |
3 source('biodb-common.R') | |
4 | |
5 ######################## | |
6 # ENTRY ABSTRACT CLASS # | |
7 ######################## | |
8 | |
9 BiodbEntry <- setRefClass("BiodbEntry", fields = list(.fields ='list', .factory = "ANY")) | |
10 | |
11 ############### | |
12 # CONSTRUCTOR # | |
13 ############### | |
14 | |
15 BiodbEntry$methods( initialize = function(...) { | |
16 | |
17 .fields <<- list() | |
18 .factory <<- NULL | |
19 | |
20 callSuper(...) # calls super-class initializer with remaining parameters | |
21 }) | |
22 | |
23 ############# | |
24 # SET FIELD # | |
25 ############# | |
26 | |
27 BiodbEntry$methods( setField = function(field, value) { | |
28 | |
29 class = .self$getFieldClass(field) | |
30 | |
31 # Check cardinality | |
32 if (class != 'data.frame' && .self$getFieldCardinality(field) == RBIODB.CARD.ONE && length(value) > 1) | |
33 stop(paste0('Cannot set more that one value to single value field "', field, '" in BiodEntry.')) | |
34 | |
35 # Check value class | |
36 value <- switch(class, | |
37 'character' = as.character(value), | |
38 'double' = as.double(value), | |
39 'integer' = as.integer(value), | |
40 'logical' = as.logical(value), | |
41 value) | |
42 # TODO check value class | |
43 | |
44 .self$.fields[[field]] <- value | |
45 }) | |
46 | |
47 ################### | |
48 # GET FIELD CLASS # | |
49 ################### | |
50 | |
51 BiodbEntry$methods( getFieldClass = function(field) { | |
52 | |
53 if ( ! field %in% RBIODB.FIELDS[['name']]) | |
54 stop(paste0('Unknown field "', field, '" in BiodEntry.')) | |
55 | |
56 field.class <- RBIODB.FIELDS[which(field == RBIODB.FIELDS[['name']]), 'class'] | |
57 | |
58 return(field.class) | |
59 }) | |
60 | |
61 ######################### | |
62 # GET FIELD CARDINALITY # | |
63 ######################### | |
64 | |
65 BiodbEntry$methods( getFieldCardinality = function(field) { | |
66 | |
67 if ( ! field %in% RBIODB.FIELDS[['name']]) | |
68 stop(paste0('Unknown field "', field, '" in BiodEntry.')) | |
69 | |
70 field.card <- RBIODB.FIELDS[which(field == RBIODB.FIELDS[['name']]), 'cardinality'] | |
71 | |
72 return(field.card) | |
73 }) | |
74 | |
75 ############# | |
76 # GET FIELD # | |
77 ############# | |
78 | |
79 BiodbEntry$methods( getField = function(field) { | |
80 | |
81 if ( ! field %in% RBIODB.FIELDS[['name']]) | |
82 stop(paste0('Unknown field "', field, '" in BiodEntry.')) | |
83 | |
84 if (field %in% names(.self$.fields)) | |
85 return(.self$.fields[[field]]) | |
86 else if (.self$.compute.field(field)) | |
87 return(.self$.fields[[field]]) | |
88 | |
89 # Return NULL or NA | |
90 class = .self$getFieldClass(field) | |
91 return(if (class %in% c('character', 'integer', 'double', 'logical')) as.vector(NA, mode = class) else NULL) | |
92 }) | |
93 | |
94 ################# | |
95 # COMPUTE FIELD # | |
96 ################## | |
97 | |
98 BiodbEntry$methods( .compute.field = function(field) { | |
99 | |
100 if ( ! is.null(.self$.factory) && field %in% names(RBIODB.FIELD.COMPUTING)) { | |
101 for (db in RBIODB.FIELD.COMPUTING[[field]]) { | |
102 db.id <- .self$getField(paste0(db, 'id')) | |
103 if ( ! is.na(db.id)) { | |
104 db.compound <- .self$.factory$createEntry(db, type = RBIODB.COMPOUND, id = db.id) | |
105 if ( ! is.null(db.compound)) { | |
106 .self$setField(field, db.compound$getField(field)) | |
107 return(TRUE) | |
108 } | |
109 } | |
110 } | |
111 } | |
112 | |
113 return(FALSE) | |
114 }) | |
115 | |
116 ########### | |
117 # FACTORY # | |
118 ########### | |
119 | |
120 BiodbEntry$methods( setFactory = function(factory) { | |
121 | |
122 is.null(factory) || inherits(factory, "BiodbFactory") || stop("The factory instance must inherit from BiodbFactory class.") | |
123 .factory <<- factory | |
124 }) | |
125 } |