rffdb 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rffdb/document.rb +31 -3
- data/lib/rffdb/index.rb +53 -0
- data/lib/rffdb/storage_engine.rb +9 -0
- data/lib/rffdb/version.rb +1 -1
- data/lib/rffdb.rb +2 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b46b42ee1876f919030207416134f7cf94b4250a
|
4
|
+
data.tar.gz: 9c232c54e21b2939b651bfb8c758dff486fbe107
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbef6842d8e3b86a1317dca7e5a0a5f2ff4453a45abd382210511780ae2d349c1870045f1fae38c31779303572ab4cd7bb8f9e41488bbc567807e4a5fc02389c
|
7
|
+
data.tar.gz: 6d326d41d2daade93ffe1da82d043fb18385bda30ac80e4605edf0c1377f970ef685fc0522d3ac690eead523e17f92bb8464fb34204242c2fff7c4fcfd548b8f
|
data/lib/rffdb/document.rb
CHANGED
@@ -36,7 +36,9 @@ module RubyFFDB
|
|
36
36
|
def commit
|
37
37
|
@read_lock.synchronize do
|
38
38
|
@write_lock.synchronize do
|
39
|
-
|
39
|
+
unless @saved
|
40
|
+
storage.store(self.class, @id, @data.dup)
|
41
|
+
end
|
40
42
|
@saved = true
|
41
43
|
end
|
42
44
|
end
|
@@ -115,6 +117,8 @@ module RubyFFDB
|
|
115
117
|
options.key?(:validate) ? [*options[:validate]] : []
|
116
118
|
@structure[name.to_sym][:unique] =
|
117
119
|
options.key?(:unique) == true ? true : false
|
120
|
+
@structure[name.to_sym][:index] =
|
121
|
+
options.key?(:index) == true ? true : false
|
118
122
|
end
|
119
123
|
|
120
124
|
# This DSL method is used to setup the backend {StorageEngine} class and
|
@@ -199,7 +203,14 @@ module RubyFFDB
|
|
199
203
|
# Query for Documents based on an attribute
|
200
204
|
# @see DocumentCollection#where
|
201
205
|
def self.where(attribute, value, comparison_method = '==')
|
202
|
-
|
206
|
+
if comparison_method.to_s == '==' && indexed_column?(attribute)
|
207
|
+
DocumentCollection.new(
|
208
|
+
storage.index(self, attribute).get(value).collect { |did| load(did) },
|
209
|
+
self
|
210
|
+
)
|
211
|
+
else
|
212
|
+
all.where(attribute, value, comparison_method)
|
213
|
+
end
|
203
214
|
end
|
204
215
|
|
205
216
|
# Compare two documents
|
@@ -207,6 +218,17 @@ module RubyFFDB
|
|
207
218
|
id <=> other.id
|
208
219
|
end
|
209
220
|
|
221
|
+
# Should this column be indexed?
|
222
|
+
# @return [Boolean]
|
223
|
+
def self.indexed_column?(column)
|
224
|
+
csym = column.to_sym
|
225
|
+
structure.key?(csym) && structure[csym][:index] == true
|
226
|
+
end
|
227
|
+
|
228
|
+
def indexed_column?(column)
|
229
|
+
self.class.send('indexed_column?'.to_sym, column)
|
230
|
+
end
|
231
|
+
|
210
232
|
# Uses the defined schema to setup getter and setter methods. Runs
|
211
233
|
# validations, format checking, and type checking on setting methods.
|
212
234
|
# @todo refactor and comment better
|
@@ -237,9 +259,14 @@ module RubyFFDB
|
|
237
259
|
@read_lock.synchronize { committed? }
|
238
260
|
@read_lock.synchronize do
|
239
261
|
@write_lock.synchronize do
|
240
|
-
|
262
|
+
if valid
|
263
|
+
storage.index(self.class, key).delete(@data[key.to_s], id) if indexed_column?(key)
|
264
|
+
@data[key.to_s] = args.last
|
265
|
+
storage.index(self.class, key).put(args.last, id) if indexed_column?(key)
|
266
|
+
end
|
241
267
|
end
|
242
268
|
end
|
269
|
+
commit if indexed_column?(key) # indexed columns always cause commits
|
243
270
|
else
|
244
271
|
fail Exceptions::InvalidInput
|
245
272
|
end
|
@@ -282,5 +309,6 @@ module RubyFFDB
|
|
282
309
|
end
|
283
310
|
end
|
284
311
|
end
|
312
|
+
|
285
313
|
end
|
286
314
|
end
|
data/lib/rffdb/index.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module RubyFFDB
|
2
|
+
class Index
|
3
|
+
def initialize(type, column)
|
4
|
+
@type = type
|
5
|
+
@column = column
|
6
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
7
|
+
GDBM.open(file_path, 0664, GDBM::WRCREAT) do
|
8
|
+
# Index initialized
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def file_path
|
13
|
+
File.join(
|
14
|
+
DB_DATA,
|
15
|
+
@type.to_s.gsub('::', '__'),
|
16
|
+
'indexes',
|
17
|
+
@column.to_s + '.index'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(key)
|
22
|
+
GDBM.open(file_path, 0664, GDBM::READER) do |index|
|
23
|
+
Marshal.load index.fetch(key.to_s, Marshal.dump([]))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def put(key, value)
|
28
|
+
previous = get(key)
|
29
|
+
GDBM.open(file_path, 0664, GDBM::WRCREAT) do |index|
|
30
|
+
index[key.to_s] = Marshal.dump((previous + [value]).uniq)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(key, value)
|
35
|
+
previous = get(key)
|
36
|
+
GDBM.open(file_path, 0664, GDBM::WRCREAT) do |index|
|
37
|
+
index[key.to_s] = Marshal.dump((previous - [value]).uniq)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def truncate(key)
|
42
|
+
GDBM.open(file_path, 0664, GDBM::WRCREAT) do |index|
|
43
|
+
index.delete(key.to_s)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def keys
|
48
|
+
GDBM.open(file_path, 0664, GDBM::READER) do |index|
|
49
|
+
index.keys
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/rffdb/storage_engine.rb
CHANGED
@@ -130,5 +130,14 @@ module RubyFFDB
|
|
130
130
|
@caches ||= {}
|
131
131
|
@caches[type] ||= CacheProviders::LRUCache.new
|
132
132
|
end
|
133
|
+
|
134
|
+
# Allows direct access to an index for a Document type and column
|
135
|
+
# @param type [Document] the document type
|
136
|
+
# @param column [String,Symbol] the column / attribute for the index
|
137
|
+
def self.index(type, column)
|
138
|
+
@indexes ||= {}
|
139
|
+
@indexes[type] ||= {}
|
140
|
+
@indexes[type][column.to_sym] ||= Index.new(type, column.to_sym)
|
141
|
+
end
|
133
142
|
end
|
134
143
|
end
|
data/lib/rffdb/version.rb
CHANGED
data/lib/rffdb.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ostruct'
|
2
|
+
require 'gdbm'
|
2
3
|
require 'rffdb/version'
|
3
4
|
require 'rffdb/constants'
|
4
5
|
require 'rffdb/exception'
|
@@ -6,6 +7,7 @@ require 'rffdb/exceptions/cache_exceptions'
|
|
6
7
|
require 'rffdb/exceptions/document_exceptions'
|
7
8
|
require 'rffdb/cache_provider'
|
8
9
|
require 'rffdb/cache_providers/lru_cache'
|
10
|
+
require 'rffdb/index'
|
9
11
|
require 'rffdb/storage_engine'
|
10
12
|
require 'rffdb/storage_engines/yaml_engine'
|
11
13
|
require 'rffdb/document'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rffdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Gnagy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/rffdb/exception.rb
|
43
43
|
- lib/rffdb/exceptions/cache_exceptions.rb
|
44
44
|
- lib/rffdb/exceptions/document_exceptions.rb
|
45
|
+
- lib/rffdb/index.rb
|
45
46
|
- lib/rffdb/storage_engine.rb
|
46
47
|
- lib/rffdb/storage_engines/json_engine.rb
|
47
48
|
- lib/rffdb/storage_engines/yaml_engine.rb
|