Class OpenWFE::Extras::DbExpressionStorage
In: lib/openwfe/extras/expool/dbexpstorage.rb
Parent: Object

Storing OpenWFE flow expressions in a database.

Methods

Included Modules

MonitorMixin OpenWFE::ServiceMixin OpenWFE::OwfeServiceLocator OpenWFE::ExpressionStorageBase

Public Class methods

Constructor.

[Source]

     # 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

Public Instance methods

Retrieves a flow expression.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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.

[Source]

     # 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
length()

Alias for size

Danger ! Will remove all the expressions in the database.

[Source]

     # 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.

[Source]

     # File lib/openwfe/extras/expool/dbexpstorage.rb, line 175
175:         def size
176: 
177:             Expression.count
178:         end

Protected Instance methods

[Source]

     # 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().

[Source]

     # 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.

[Source]

     # 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).

[Source]

     # 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

[Validate]