| Class | OpenWFE::Extras::DbExpressionStorage |
| In: |
lib/openwfe/extras/expool/dbexpstorage.rb
|
| Parent: | Object |
Storing OpenWFE flow expressions in a database.
Constructor.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 105
105: def initialize (service_name, application_context)
106:
107: require 'openwfe/storage/yamlcustom'
108: # making sure this file has been required at this point
109: # this yamlcustom thing prevents the whole OpenWFE ecosystem
110: # to get serialized :)
111:
112: super() # absolutely necessary as we include MonitorMixin
113: service_init service_name, application_context
114:
115: observe_expool
116: end
Retrieves a flow expression.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 146
146: def [] (fei)
147:
148: e = Expression.find_by_fei fei.to_s
149: return nil unless e
150:
151: as_owfe_expression e
152: end
Stores an expression.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 121
121: def []= (fei, flow_expression)
122:
123: ldebug { "[]= storing #{fei.to_s}" }
124:
125: synchronize do
126:
127: e = Expression.find_by_fei fei.to_s
128:
129: unless e
130: e = Expression.new
131: e.fei = fei.to_s
132: e.wfid = fei.wfid
133: #e.wfname = fei.wfname
134: end
135:
136: e.exp_class = flow_expression.class.name
137: e.svalue = flow_expression
138:
139: e.save!
140: end
141: end
Deletes a flow expression.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 165
165: def delete (fei)
166:
167: synchronize do
168: Expression.delete_all ["fei = ?", fei.to_s]
169: end
170: end
Fetches the root of a process instance.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 218
218: def fetch_root (wfid)
219:
220: params = {}
221:
222: params[:conditions] = [
223: "wfid = ? AND exp_class = ?", wfid, DefineExpression.to_s
224: ]
225:
226: exps = Expression.find(:all, params)
227:
228: e = exps.sort { |fe1, fe2| fe1.fei.expid <=> fe2.fei.expid }[0]
229: #
230: # find the one with the smallest expid
231:
232: as_owfe_expression e
233: end
Gather expressions matching certain parameters.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 193
193: def find_expressions (options={})
194:
195: conditions = determine_conditions options
196: # note : this call modifies the options hash...
197:
198: #
199: # maximize usage of SQL querying
200:
201: exps = Expression.find :all, :conditions => conditions
202:
203: #
204: # do the rest of the filtering
205:
206: exps = exps.collect do |exp|
207: as_owfe_expression exp
208: end
209:
210: exps.find_all do |fexp|
211: does_match? options, fexp
212: end
213: end
Returns true if there is a FlowExpression stored with the given id.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 157
157: def has_key? (fei)
158:
159: (Expression.find_by_fei(fei.to_s) != nil)
160: end
Danger ! Will remove all the expressions in the database.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 185
185: def purge
186:
187: Expression.delete_all
188: end
Returns the count of expressions currently stored.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 175
175: def size
176:
177: Expression.count
178: end
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 287
287: def acc (classes, query, conditions, join)
288:
289: return if classes.size < 1
290:
291: classes = classes.collect do |kind|
292: get_expression_map.get_expression_classes kind
293: end
294: classes = classes.flatten
295:
296: quer = []
297: cond = []
298: classes.each do |cl|
299:
300: quer << if join == "AND"
301: "exp_class != ?"
302: else
303: "exp_class = ?"
304: end
305:
306: cond << cl.to_s
307: end
308: quer = quer.join " #{join} "
309:
310: query << "(#{quer})"
311: conditions << cond
312: end
Used by determine_conditions().
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 275
275: def add_class_conditions (options, query, conditions)
276:
277: ic = options.delete :include_classes
278: ic = Array(ic)
279:
280: ec = options.delete :exclude_classes
281: ec = Array(ec)
282:
283: acc ic, query, conditions, "OR"
284: acc ec, query, conditions, "AND"
285: end
Extracts the OpenWFE FlowExpression instance from the active record and makes sure its application_context is set.
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 318
318: def as_owfe_expression (record)
319:
320: return nil unless record
321:
322: fe = record.svalue
323: fe.application_context = @application_context
324: fe
325: end
Grabs the options to build a conditions array for use by find().
Note : this method, modifies the options hash (it removes the args it needs).
# File lib/openwfe/extras/expool/dbexpstorage.rb, line 244
244: def determine_conditions (options)
245:
246: wfid = options.delete :wfid
247: wfid_prefix = options.delete :wfid_prefix
248: #parent_wfid = options.delete :parent_wfid
249:
250: query = []
251: conditions = []
252:
253: if wfid
254: query << "wfid = ?"
255: conditions << wfid
256: elsif wfid_prefix
257: query << "wfid LIKE ?"
258: conditions << "#{wfid_prefix}%"
259: end
260:
261: add_class_conditions options, query, conditions
262:
263: conditions = conditions.flatten
264:
265: if conditions.size < 1
266: nil
267: else
268: conditions.insert 0, query.join(" AND ")
269: end
270: end