flockdb 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +3 -0
- data/Gemfile.lock +28 -0
- data/Rakefile +1 -20
- data/flockdb.gemspec +19 -75
- data/lib/flock.rb +17 -19
- data/lib/flock/client.rb +26 -18
- data/lib/flock/gen-rb/flock_d_b.rb +126 -0
- data/lib/flock/gen-rb/flockdb_types.rb +22 -0
- data/lib/flock/mixins/sizeable.rb +2 -6
- data/lib/flock/mock_service.rb +139 -74
- data/lib/flock/operations/execute_operation.rb +1 -1
- data/lib/flock/operations/execute_operations.rb +6 -1
- data/lib/flock/operations/query_term.rb +51 -7
- data/lib/flock/operations/select_operation.rb +0 -1
- data/lib/flock/operations/select_operations.rb +97 -0
- data/lib/flock/operations/simple_operation.rb +17 -2
- data/lib/flock/service.rb +1 -1
- data/lib/flock/version.rb +3 -0
- data/spec/execute_operations_spec.rb +4 -5
- data/spec/flock_spec.rb +114 -0
- data/spec/query_term_spec.rb +14 -2
- data/spec/simple_operation_spec.rb +2 -3
- data/spec/spec_helper.rb +1 -1
- metadata +68 -16
- data/VERSION +0 -1
@@ -0,0 +1,97 @@
|
|
1
|
+
module Flock
|
2
|
+
class SelectOperations
|
3
|
+
EMPTY = Flock::Operation.new do |page|
|
4
|
+
[[], Flock::CursorEnd, Flock::CursorEnd]
|
5
|
+
end
|
6
|
+
|
7
|
+
[:each, :to_ary, :size, :first].each do |method|
|
8
|
+
class_eval("def #{method}(*args, &block); operation.#{method}(*args, &block) end", __FILE__, __LINE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
def initialize(client)
|
14
|
+
@client = client
|
15
|
+
@service = client.service
|
16
|
+
@selecticons = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def select(*query)
|
20
|
+
selecticon = Selecticon.new(Flock::QueryTerm.new(query, @client.graphs))
|
21
|
+
@selecticons << selecticon
|
22
|
+
selecticon
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_thrift_edges
|
26
|
+
@selecticons.map do |selecticon|
|
27
|
+
selecticon.to_thrift_edges
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_thrift_ids
|
32
|
+
@selecticons.map do |selecticon|
|
33
|
+
selecticon.to_thrift_ids
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def operation
|
38
|
+
if @selecticons.any?
|
39
|
+
@service.select2(to_thrift_ids).map do |results|
|
40
|
+
# Note: pagination will not work for now.
|
41
|
+
Flock::Operation.new do |page|
|
42
|
+
[results.ids.unpack("Q*"), Flock::CursorEnd, Flock::CursorEnd]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
EMPTY
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def edges
|
51
|
+
if @selecticons.any?
|
52
|
+
@service.select_edges(to_thrift_edges).map do |results|
|
53
|
+
# Note: pagination will not work for now.
|
54
|
+
Flock::Operation.new do |page|
|
55
|
+
[results.edges, Flock::CursorEnd, Flock::CursorEnd]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
EMPTY
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Selecticon
|
64
|
+
def initialize(term)
|
65
|
+
@term = term
|
66
|
+
@count, @cursor = 20, Flock::CursorStart
|
67
|
+
end
|
68
|
+
|
69
|
+
def paginate(count, cursor = Flock::CursorStart)
|
70
|
+
@count, @cursor = count, cursor
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_thrift_ids
|
74
|
+
query = Edges::SelectQuery.new
|
75
|
+
operation = Edges::SelectOperation.new
|
76
|
+
operation.operation_type = Edges::SelectOperationType::SimpleQuery
|
77
|
+
operation.term = @term.to_thrift
|
78
|
+
query.operations = [operation]
|
79
|
+
page = Flock::Page.new
|
80
|
+
page.cursor = @cursor
|
81
|
+
page.count = @count
|
82
|
+
query.page = page
|
83
|
+
query
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_thrift_edges
|
87
|
+
query = Edges::EdgeQuery.new
|
88
|
+
query.term = @term.to_thrift
|
89
|
+
page = Flock::Page.new
|
90
|
+
page.cursor = @cursor
|
91
|
+
page.count = @count
|
92
|
+
query.page = page
|
93
|
+
query
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -2,15 +2,30 @@ module Flock
|
|
2
2
|
class SimpleOperation < SelectOperation
|
3
3
|
def initialize(client, query)
|
4
4
|
super(client)
|
5
|
-
@
|
5
|
+
@term = query
|
6
|
+
end
|
7
|
+
|
8
|
+
def edges
|
9
|
+
Flock::Operation.new do |page|
|
10
|
+
query = to_thrift_edges
|
11
|
+
query.page = page
|
12
|
+
result = @service.select_edges(Array(query)).first
|
13
|
+
[result.edges, result.next_cursor, result.prev_cursor]
|
14
|
+
end
|
6
15
|
end
|
7
16
|
|
8
17
|
def to_thrift
|
9
18
|
operation = Edges::SelectOperation.new
|
10
19
|
operation.operation_type = Edges::SelectOperationType::SimpleQuery
|
11
|
-
operation.term =
|
20
|
+
operation.term = @term.to_thrift
|
12
21
|
|
13
22
|
Array(operation)
|
14
23
|
end
|
24
|
+
|
25
|
+
def to_thrift_edges
|
26
|
+
query = Edges::EdgeQuery.new
|
27
|
+
query.term = @term.to_thrift
|
28
|
+
query
|
29
|
+
end
|
15
30
|
end
|
16
31
|
end
|
data/lib/flock/service.rb
CHANGED
@@ -3,9 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Flock::ExecuteOperations do
|
4
4
|
describe "#negate" do
|
5
5
|
it "should create a negate opperation" do
|
6
|
-
|
7
|
-
|
8
|
-
operation = Flock::ExecuteOperations.new(service, nil)
|
6
|
+
mock(Flock::ExecuteOperation).new(Flock::Edges::ExecuteOperationType::Negate, Flock::QueryTerm.new([1,1,3]), nil)
|
7
|
+
operation = Flock::ExecuteOperations.new(Flock::Client.new(Flock::MockService), nil)
|
9
8
|
operation.negate(1,1,3)
|
10
9
|
end
|
11
10
|
end
|
@@ -26,8 +25,8 @@ describe Flock::ExecuteOperations do
|
|
26
25
|
service = Flock::MockService.new
|
27
26
|
client = Flock::Client.new(service)
|
28
27
|
now = Time.now.to_i
|
29
|
-
thing = Flock::ExecuteOperation.new(1, [1, 1, 3], 12345)
|
30
|
-
mock(Flock::ExecuteOperation).new(1, [1, 1, 3], 12345) { thing}
|
28
|
+
thing = Flock::ExecuteOperation.new(1, Flock::QueryTerm.new([1, 1, 3]), 12345)
|
29
|
+
mock(Flock::ExecuteOperation).new(1, Flock::QueryTerm.new([1, 1, 3]), 12345) { thing}
|
31
30
|
client.add(1, 1, 3, Flock::Priority::High, :position => 12345)
|
32
31
|
end
|
33
32
|
end
|
data/spec/flock_spec.rb
CHANGED
@@ -145,6 +145,22 @@ describe Flock do
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
+
describe "positions" do
|
149
|
+
it "works" do
|
150
|
+
flock.add(4,5,6,:position => 7)
|
151
|
+
flock.get(4,5,6).position.should == 7
|
152
|
+
end
|
153
|
+
|
154
|
+
it "behaves like the server, not moving position on double adds, but moving position on delete-add" do
|
155
|
+
flock.add(4,5,6,:position => 7)
|
156
|
+
flock.add(4,5,6,:position => 8)
|
157
|
+
flock.get(4,5,6).position.should == 7
|
158
|
+
flock.remove(4,5,6)
|
159
|
+
flock.add(4,5,6,:position => 8)
|
160
|
+
flock.get(4,5,6).position.should == 8
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
148
164
|
describe 'select' do
|
149
165
|
attr_accessor :query
|
150
166
|
|
@@ -165,6 +181,53 @@ describe Flock do
|
|
165
181
|
flock.select(user, 1, nil).to_a.sort.should == [2, 3]
|
166
182
|
end
|
167
183
|
|
184
|
+
it "supports selecting states" do
|
185
|
+
flock.remove(5,1,1)
|
186
|
+
|
187
|
+
flock.select(5, 1, nil, 0).to_a.sort.should == []
|
188
|
+
flock.select(5, 1, nil, :positive).to_a.sort.should == []
|
189
|
+
flock.select([5, 1, nil, :positive]).to_a.sort.should == []
|
190
|
+
flock.select(5, 1, nil, 1).to_a.sort.should == [1]
|
191
|
+
flock.select(5, 1, nil, :removed).to_a.sort.should == [1]
|
192
|
+
flock.select([5, 1, nil, :removed]).to_a.sort.should == [1]
|
193
|
+
flock.select(5, 1, nil, 2).to_a.sort.should == []
|
194
|
+
flock.select(5, 1, nil, :archived).to_a.sort.should == []
|
195
|
+
flock.select([5, 1, nil, :archived]).to_a.sort.should == []
|
196
|
+
flock.select(5, 1, nil, 0, 1, 2).to_a.sort.should == [1]
|
197
|
+
flock.select(5, 1, nil, [0, 1, 2]).to_a.sort.should == [1]
|
198
|
+
flock.select(5, 1, nil, [:positive, :removed, :archived]).to_a.sort.should == [1]
|
199
|
+
flock.select([5, 1, nil, [:positive, :removed, :archived]]).to_a.sort.should == [1]
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'supports rad graphs' do
|
203
|
+
flock.select(1, :schmaph, nil).to_a.sort.should == [2, 3]
|
204
|
+
end
|
205
|
+
|
206
|
+
describe 'edges' do
|
207
|
+
it 'works' do
|
208
|
+
time = Time.now
|
209
|
+
stub(Time).now { time }
|
210
|
+
|
211
|
+
edge1 = Flock::Edges::Edge.new
|
212
|
+
edge1.source_id = 1
|
213
|
+
edge1.destination_id = 2
|
214
|
+
edge1.position = Time.now.to_i
|
215
|
+
edge1.updated_at = Time.now.to_i
|
216
|
+
edge1.count = 1
|
217
|
+
edge1.state_id = 0
|
218
|
+
|
219
|
+
edge2 = Flock::Edges::Edge.new
|
220
|
+
edge2.source_id = 1
|
221
|
+
edge2.destination_id = 3
|
222
|
+
edge2.position = Time.now.to_i
|
223
|
+
edge2.updated_at = Time.now.to_i
|
224
|
+
edge2.count = 1
|
225
|
+
edge2.state_id = 0
|
226
|
+
|
227
|
+
flock.select(1,1,nil).edges.to_a.should == [edge1, edge2]
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
168
231
|
describe 'to_a' do
|
169
232
|
it 'works' do
|
170
233
|
flock.select(1,1,nil).to_a.sort.should == [2, 3]
|
@@ -214,5 +277,56 @@ describe Flock do
|
|
214
277
|
end
|
215
278
|
end
|
216
279
|
end
|
280
|
+
|
281
|
+
describe 'multi' do
|
282
|
+
it 'works' do
|
283
|
+
results = flock.multi do |m|
|
284
|
+
m.select(1,1,nil)
|
285
|
+
m.select(nil,1,1)
|
286
|
+
end
|
287
|
+
first, second = results
|
288
|
+
first.to_a.should == [2, 3]
|
289
|
+
second.to_a.should == [2, 4]
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'works with empty multis' do
|
293
|
+
results = flock.multi { |m| }
|
294
|
+
results.to_a.should == []
|
295
|
+
end
|
296
|
+
|
297
|
+
describe 'edges' do
|
298
|
+
it 'works' do
|
299
|
+
time = Time.now
|
300
|
+
stub(Time).now { time }
|
301
|
+
|
302
|
+
prototype = Flock::Edges::Edge.new
|
303
|
+
prototype.position = Time.now.to_i
|
304
|
+
prototype.updated_at = Time.now.to_i
|
305
|
+
prototype.count = 1
|
306
|
+
prototype.state_id = 0
|
307
|
+
|
308
|
+
results = flock.multi do |m|
|
309
|
+
m.select(1,1,nil)
|
310
|
+
m.select(nil,1,1)
|
311
|
+
end.edges
|
312
|
+
first, second = results
|
313
|
+
|
314
|
+
a = prototype.dup
|
315
|
+
a.source_id, a.destination_id = 1, 2
|
316
|
+
|
317
|
+
b = prototype.dup
|
318
|
+
b.source_id, b.destination_id = 1, 3
|
319
|
+
|
320
|
+
first.to_a.should == [a, b]
|
321
|
+
|
322
|
+
c = prototype.dup
|
323
|
+
c.destination_id, c.source_id = 2, 1
|
324
|
+
|
325
|
+
d = prototype.dup
|
326
|
+
d.destination_id, d.source_id = 4, 1
|
327
|
+
second.to_a.should == [c, d]
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
217
331
|
end
|
218
332
|
end
|
data/spec/query_term_spec.rb
CHANGED
@@ -2,8 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Flock::QueryTerm do
|
4
4
|
describe '#new' do
|
5
|
-
it 'requires a query of length
|
6
|
-
lambda { Flock::QueryTerm.new([1, 1
|
5
|
+
it 'requires a query of length >= 3' do
|
6
|
+
lambda { Flock::QueryTerm.new([1, 1]) }.should raise_error(ArgumentError)
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'has a source, graph, destination, and states' do
|
@@ -62,4 +62,16 @@ describe Flock::QueryTerm do
|
|
62
62
|
@term.to_thrift.state_ids.should == [Flock::Edges::EdgeState::Positive, Flock::Edges::EdgeState::Negative]
|
63
63
|
end
|
64
64
|
end
|
65
|
+
|
66
|
+
describe 'when given symbols' do
|
67
|
+
it 'works for graphs' do
|
68
|
+
expected = Flock::QueryTerm.new([1, 1, 2, [Flock::Edges::EdgeState::Positive, Flock::Edges::EdgeState::Negative]])
|
69
|
+
qt = Flock::QueryTerm.new([1, :follows, 2, [Flock::Edges::EdgeState::Positive, Flock::Edges::EdgeState::Negative]], :follows => 1)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'works for states' do
|
73
|
+
expected = Flock::QueryTerm.new([1, 1, 2, [Flock::Edges::EdgeState::Positive, Flock::Edges::EdgeState::Negative]])
|
74
|
+
qt = Flock::QueryTerm.new([1, :follows, 2, :positive, :negative], :follows => 1)
|
75
|
+
end
|
76
|
+
end
|
65
77
|
end
|
@@ -3,9 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Flock::ExecuteOperations do
|
4
4
|
describe "#negate" do
|
5
5
|
it "should create a negate operation" do
|
6
|
-
|
7
|
-
|
8
|
-
operation = Flock::ExecuteOperations.new(Flock::Client.new(service), nil)
|
6
|
+
mock(Flock::ExecuteOperation).new(Flock::Edges::ExecuteOperationType::Negate, Flock::QueryTerm.new([1,1,3]), nil)
|
7
|
+
operation = Flock::ExecuteOperations.new(Flock::Client.new(Flock::MockService), nil)
|
9
8
|
operation.negate(1,1,3)
|
10
9
|
end
|
11
10
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flockdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 3
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt Freels
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-
|
20
|
+
date: 2011-06-16 00:00:00 -07:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -53,9 +53,57 @@ dependencies:
|
|
53
53
|
type: :runtime
|
54
54
|
version_requirements: *id002
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
prerelease: false
|
58
58
|
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 1
|
66
|
+
- 0
|
67
|
+
- 10
|
68
|
+
version: 1.0.10
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rake
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - "="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 49
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
- 8
|
83
|
+
- 7
|
84
|
+
version: 0.8.7
|
85
|
+
type: :development
|
86
|
+
version_requirements: *id004
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: rspec
|
89
|
+
prerelease: false
|
90
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ~>
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
hash: 27
|
96
|
+
segments:
|
97
|
+
- 1
|
98
|
+
- 3
|
99
|
+
- 0
|
100
|
+
version: 1.3.0
|
101
|
+
type: :development
|
102
|
+
version_requirements: *id005
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: diff-lcs
|
105
|
+
prerelease: false
|
106
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
59
107
|
none: false
|
60
108
|
requirements:
|
61
109
|
- - ">="
|
@@ -65,11 +113,11 @@ dependencies:
|
|
65
113
|
- 0
|
66
114
|
version: "0"
|
67
115
|
type: :development
|
68
|
-
version_requirements: *
|
116
|
+
version_requirements: *id006
|
69
117
|
- !ruby/object:Gem::Dependency
|
70
118
|
name: rr
|
71
119
|
prerelease: false
|
72
|
-
requirement: &
|
120
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
73
121
|
none: false
|
74
122
|
requirements:
|
75
123
|
- - ">="
|
@@ -79,7 +127,7 @@ dependencies:
|
|
79
127
|
- 0
|
80
128
|
version: "0"
|
81
129
|
type: :development
|
82
|
-
version_requirements: *
|
130
|
+
version_requirements: *id007
|
83
131
|
description: Get your flock on in Ruby.
|
84
132
|
email: freels@twitter.com
|
85
133
|
executables: []
|
@@ -87,14 +135,15 @@ executables: []
|
|
87
135
|
extensions: []
|
88
136
|
|
89
137
|
extra_rdoc_files:
|
90
|
-
- LICENSE
|
91
138
|
- README.md
|
139
|
+
- LICENSE
|
92
140
|
files:
|
93
141
|
- .gitignore
|
142
|
+
- Gemfile
|
143
|
+
- Gemfile.lock
|
94
144
|
- LICENSE
|
95
145
|
- README.md
|
96
146
|
- Rakefile
|
97
|
-
- VERSION
|
98
147
|
- flockdb.gemspec
|
99
148
|
- lib/flock.rb
|
100
149
|
- lib/flock/client.rb
|
@@ -109,9 +158,11 @@ files:
|
|
109
158
|
- lib/flock/operations/execute_operations.rb
|
110
159
|
- lib/flock/operations/query_term.rb
|
111
160
|
- lib/flock/operations/select_operation.rb
|
161
|
+
- lib/flock/operations/select_operations.rb
|
112
162
|
- lib/flock/operations/simple_operation.rb
|
113
163
|
- lib/flock/service.rb
|
114
164
|
- lib/flock/thrift.rb
|
165
|
+
- lib/flock/version.rb
|
115
166
|
- lib/flockdb.rb
|
116
167
|
- spec/execute_operations_spec.rb
|
117
168
|
- spec/flock_spec.rb
|
@@ -121,7 +172,7 @@ files:
|
|
121
172
|
- spec/spec.opts
|
122
173
|
- spec/spec_helper.rb
|
123
174
|
has_rdoc: true
|
124
|
-
homepage: http://github.com/twitter/
|
175
|
+
homepage: http://github.com/twitter/flock-client
|
125
176
|
licenses: []
|
126
177
|
|
127
178
|
post_install_message:
|
@@ -149,15 +200,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
200
|
version: "0"
|
150
201
|
requirements: []
|
151
202
|
|
152
|
-
rubyforge_project:
|
153
|
-
rubygems_version: 1.
|
203
|
+
rubyforge_project: flock-client
|
204
|
+
rubygems_version: 1.6.2
|
154
205
|
signing_key:
|
155
206
|
specification_version: 3
|
156
|
-
summary:
|
207
|
+
summary: Get your flock on in Ruby
|
157
208
|
test_files:
|
158
209
|
- spec/execute_operations_spec.rb
|
159
210
|
- spec/flock_spec.rb
|
160
211
|
- spec/mock_service_spec.rb
|
161
212
|
- spec/query_term_spec.rb
|
162
213
|
- spec/simple_operation_spec.rb
|
214
|
+
- spec/spec.opts
|
163
215
|
- spec/spec_helper.rb
|