audrey 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,373 @@
1
+ #===============================================================================
2
+ # Audrey::Query::Q0
3
+ #
4
+ class Audrey::Query::Q0 < Audrey::Query
5
+ attr_reader :db
6
+ attr_accessor :fields
7
+ attr_accessor :fclass
8
+ attr_accessor :limit
9
+ attr_accessor :offset
10
+
11
+ #---------------------------------------------------------------------------
12
+ # initialize
13
+ #
14
+ def initialize(p_db)
15
+ # check that we got a Audrey object
16
+ if not p_db.is_a?(Audrey)
17
+ raise 'db-not-audrey: ' + pdb.class.to_s
18
+ end
19
+
20
+ @db = p_db
21
+ @engine = @db.engine
22
+ @fclass = nil
23
+ @fields = Audrey::Query::Q0::Fields.new()
24
+ end
25
+ #
26
+ # initialize
27
+ #---------------------------------------------------------------------------
28
+
29
+
30
+ #---------------------------------------------------------------------------
31
+ # each
32
+ #
33
+ def each(opts={})
34
+ # $tm.hrm
35
+ equery = @engine.q0(self)
36
+
37
+ # loop through equery results
38
+ equery.each(opts) do |pk|
39
+ yield @db.object_from_pk(pk)
40
+ end
41
+ end
42
+ #
43
+ # each
44
+ #---------------------------------------------------------------------------
45
+
46
+
47
+ #---------------------------------------------------------------------------
48
+ # sample
49
+ #
50
+ def sample
51
+ # $tm.hrm
52
+ cl = self.clone()
53
+ cl.limit = 1
54
+ cl.offset = rand(self.count)
55
+ return cl.first
56
+ end
57
+ #
58
+ # sample
59
+ #---------------------------------------------------------------------------
60
+
61
+
62
+ #---------------------------------------------------------------------------
63
+ # samples
64
+ # KLUDGE: This routine could be more efficient by not creating an object
65
+ # out of every sample until it's determined that we don't already have the
66
+ # object.
67
+ #
68
+ def samples(count)
69
+ rv = {}
70
+
71
+ # loop until we get enough objects
72
+ while rv.length < count
73
+ obj = sample()
74
+
75
+ if not rv[obj.audrey.pk]
76
+ rv[obj.audrey.pk] = obj
77
+ end
78
+ end
79
+
80
+ # return
81
+ return rv.values
82
+ end
83
+ #
84
+ # sample
85
+ #---------------------------------------------------------------------------
86
+
87
+
88
+ #---------------------------------------------------------------------------
89
+ # count
90
+ #
91
+ def count
92
+ return @engine.q0(self).count
93
+ end
94
+ #
95
+ # count
96
+ #---------------------------------------------------------------------------
97
+
98
+
99
+ #---------------------------------------------------------------------------
100
+ # sum
101
+ #
102
+ def sum(fname)
103
+ total = 0
104
+
105
+ # optimize the query by cloning and add Defined
106
+ qopt = self.clone
107
+ qopt.fields.add 'calls', qopt.defined
108
+
109
+ # loop through records
110
+ qopt.run do |record|
111
+ field = record.audrey[fname]
112
+
113
+ if field.is_a?(Numeric)
114
+ total += field
115
+ end
116
+ end
117
+
118
+ # return
119
+ return total
120
+ end
121
+ #
122
+ # sum
123
+ #---------------------------------------------------------------------------
124
+
125
+
126
+ #---------------------------------------------------------------------------
127
+ # first
128
+ # returns the first record in the query, or nil if the query didn't find
129
+ # anything
130
+ #
131
+ def first
132
+ each() do |obj|
133
+ return obj
134
+ end
135
+
136
+ return nil
137
+ end
138
+ #
139
+ # first
140
+ #---------------------------------------------------------------------------
141
+
142
+
143
+ #---------------------------------------------------------------------------
144
+ # defined
145
+ #
146
+ def defined
147
+ return Audrey::Query::Q0::Defined
148
+ end
149
+ #
150
+ # defined
151
+ #---------------------------------------------------------------------------
152
+
153
+
154
+ #---------------------------------------------------------------------------
155
+ # fclasses
156
+ #
157
+ def fclasses
158
+ # $tm.hrm
159
+
160
+ # early exit: no fclass
161
+ if not @fclass
162
+ return nil
163
+ end
164
+
165
+ # initialize
166
+ fcs = [*@fclass]
167
+
168
+ # early exit: fclass is an empty array
169
+ # NOTE: An empty array would mean that not records are returned, so
170
+ # we'll interpret it to mean all records.
171
+ if not fcs.any?
172
+ return nil
173
+ end
174
+
175
+ # initialize
176
+ rv = {}
177
+
178
+ # build fclasses
179
+ fcs.each do |fclass|
180
+ fclass.fclasses.each do |desc|
181
+ rv[desc] = nil
182
+ end
183
+ end
184
+
185
+ # return
186
+ return rv.keys
187
+ end
188
+ #
189
+ # fclasses
190
+ #---------------------------------------------------------------------------
191
+
192
+
193
+ #---------------------------------------------------------------------------
194
+ # clone
195
+ #
196
+ def clone
197
+ # $tm.hrm
198
+ rv = self.class.new(@db)
199
+
200
+ # fclass
201
+ if @fclass.is_a?(Array)
202
+ rv.fclass = @fclass.clone
203
+ else
204
+ rv.fclass = @fclass
205
+ end
206
+
207
+ # fields
208
+ rv.fields = @fields.clone
209
+
210
+ # return
211
+ return rv
212
+ end
213
+ #
214
+ # clone
215
+ #---------------------------------------------------------------------------
216
+
217
+
218
+ #---------------------------------------------------------------------------
219
+ # iterator
220
+ #
221
+ def iterator
222
+ # $tm.hrm
223
+ return Audrey::Query::Q0::Iterator.new(self, @engine.q0(self).iterator)
224
+ end
225
+ #
226
+ # iterator
227
+ #---------------------------------------------------------------------------
228
+ end
229
+ #
230
+ # Audrey::Query::Q0
231
+ #===============================================================================
232
+
233
+
234
+ #===============================================================================
235
+ # Audrey::Query::Q0::Defined
236
+ # This module doesn't do anything. It's just a way of inidicating in a query
237
+ # that any defined hash value is acceptable.
238
+ #
239
+ module Audrey::Query::Q0::Defined
240
+ end
241
+ #
242
+ # Audrey::Query::Q0::Defined
243
+ #===============================================================================
244
+
245
+
246
+ #===============================================================================
247
+ # Audrey::Query::Q0::Fields
248
+ #
249
+ class Audrey::Query::Q0::Fields
250
+ extend Forwardable
251
+
252
+ #---------------------------------------------------------------------------
253
+ # delegate hash functions to @root
254
+ #
255
+ delegate(%w(
256
+ [] []= each length keys values delete clear == <= >= ===
257
+ has_key? any?
258
+ ) => :@hsh);
259
+ #
260
+ # delegate hash functions to @root
261
+ #---------------------------------------------------------------------------
262
+
263
+
264
+ #---------------------------------------------------------------------------
265
+ # initialize
266
+ #
267
+ def initialize
268
+ @hsh = {}
269
+ end
270
+ #
271
+ # initialize
272
+ #---------------------------------------------------------------------------
273
+
274
+
275
+ #---------------------------------------------------------------------------
276
+ # add
277
+ #
278
+ def add(key, val)
279
+ if not @hsh[key].is_a?(Array)
280
+ @hsh[key] = [@hsh[key]]
281
+ end
282
+
283
+ @hsh[key].push val
284
+ end
285
+ #
286
+ # add
287
+ #---------------------------------------------------------------------------
288
+
289
+
290
+ #---------------------------------------------------------------------------
291
+ # clone
292
+ #
293
+ def clone
294
+ rv = self.class.new()
295
+
296
+ # fields
297
+ @hsh.each do |k,v|
298
+ if v.is_a?(Array)
299
+ rv[k] = v.clone
300
+ else
301
+ rv[k] = v
302
+ end
303
+ end
304
+
305
+ # return
306
+ return rv
307
+ end
308
+ #
309
+ # clone
310
+ #---------------------------------------------------------------------------
311
+ end
312
+ #
313
+ # Audrey::Query::Q0::Fields
314
+ #===============================================================================
315
+
316
+
317
+ #===============================================================================
318
+ # Audrey::Query::Q0::Iterator
319
+ #
320
+ class Audrey::Query::Q0::Iterator
321
+ attr_reader :pk
322
+ attr_reader :eiterator
323
+
324
+ #---------------------------------------------------------------------------
325
+ # initialize
326
+ #
327
+ def initialize(q0, eiterator)
328
+ @pk = Audrey::Util.randstr
329
+ @q0 = q0
330
+ @db = @q0.db
331
+ @eiterator = eiterator
332
+ @q0.db.closers[@pk] = self
333
+ end
334
+ #
335
+ # initialize
336
+ #---------------------------------------------------------------------------
337
+
338
+
339
+ #---------------------------------------------------------------------------
340
+ # next
341
+ #
342
+ def next
343
+ # $tm.hrm
344
+
345
+ # if we get a next record
346
+ if row = @eiterator.next
347
+ return @db.object_from_pk(row['pk'])
348
+
349
+ # else close
350
+ else
351
+ close()
352
+ return nil
353
+ end
354
+ end
355
+ #
356
+ # next
357
+ #---------------------------------------------------------------------------
358
+
359
+
360
+ #---------------------------------------------------------------------------
361
+ # close
362
+ #
363
+ def close
364
+ @eiterator.close
365
+ @q0.db.closers.delete(@pk)
366
+ end
367
+ #
368
+ # close
369
+ #---------------------------------------------------------------------------
370
+ end
371
+ #
372
+ # Audrey::Query::Q0::Iterator
373
+ #===============================================================================
data/lib/audrey.rb CHANGED
@@ -15,7 +15,7 @@ class Audrey
15
15
  @@current_db = nil
16
16
 
17
17
  # version
18
- VERSION = '0.2'
18
+ VERSION = '0.3'
19
19
 
20
20
  #---------------------------------------------------------------------------
21
21
  # delegate
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audrey
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike O'Sullivan
@@ -47,6 +47,10 @@ extra_rdoc_files: []
47
47
  files:
48
48
  - README.md
49
49
  - lib/audrey.rb
50
+ - lib/audrey/engine/sqlite3.rb
51
+ - lib/audrey/engine/sqlite3/init.rb
52
+ - lib/audrey/engine/sqlite3/query/q0.rb
53
+ - lib/audrey/query/q0.rb
50
54
  homepage: https://rubygems.org/gems/audrey
51
55
  licenses:
52
56
  - MIT