omf_rete 0.5 → 0.6.1

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.
@@ -8,42 +8,41 @@ include OMF::Rete
8
8
  include OMF::Rete::Planner
9
9
 
10
10
  class TestPlanner < Test::Unit::TestCase
11
-
11
+
12
12
  def test_create_plan_builder
13
13
  plan = [[:x?, :b, :c]]
14
14
  store = Store.create(3)
15
15
  pb = PlanBuilder.new(plan, store)
16
16
  end
17
-
17
+
18
18
  def _test_plan(plan, storeSize, expected = nil, inTuples = nil, outTuples = nil, outPattern = nil)
19
19
  store = Store.create(storeSize)
20
20
 
21
- # pb = PlanBuilder.new(plan, store)
22
- # pb.build
23
- # #pb.describe
24
- # resT = []
25
- # result = pb.materialize(outPattern) do |t|
26
- # resT << t
27
- # end
28
-
21
+ # with empty store
29
22
  resT = []
30
23
  result = store.subscribe(:test, plan, outPattern) do |t|
31
- resT << t
24
+ resT << t.to_a
32
25
  end
33
-
34
-
26
+
35
27
  out = StringIO.new
36
28
  #result.describe(out, 0, 0, '|')
37
29
  result.describe(out)
38
30
  assert_equal(expected, out.string) if expected
39
-
31
+
40
32
  if (inTuples)
33
+
41
34
  inTuples.each do |t|
42
35
  store.addTuple(t)
43
36
  end
44
37
  assert_equal(outTuples, resT)
38
+
39
+ # same test with already full store
40
+ resT2 = []
41
+ result2 = store.subscribe(:test2, plan, outPattern) do |t|
42
+ resT2 << t.to_a
43
+ end
44
+ assert_equal(outTuples, resT2)
45
45
  end
46
- result
47
46
  end
48
47
 
49
48
  def test_build_simple_plan
@@ -56,7 +55,7 @@ out: [x?]
56
55
  resT = [[:a]]
57
56
  _test_plan plan, 3, exp, inT, resT
58
57
  end
59
-
58
+
60
59
  def test_build_simple_plan_loaded
61
60
  plan = [[:x?, :b, :c]]
62
61
  exp = %{\
@@ -68,7 +67,7 @@ out: [x?]
68
67
  _test_plan plan, 3, exp, inT, resT
69
68
  end
70
69
 
71
-
70
+
72
71
  def test_project
73
72
  plan = [[:x?, :b, :y?]]
74
73
  exp = %{\
@@ -79,7 +78,7 @@ out: [y?]
79
78
  resT = [[:c], [:e]]
80
79
  _test_plan plan, 3, exp, inT, resT, [:y?]
81
80
  end
82
-
81
+
83
82
  def test_simple_project
84
83
  plan = [[:x?, :b, :y?]]
85
84
  exp = %{\
@@ -90,7 +89,7 @@ out: [y?]
90
89
  resT = [[:c], [:e]]
91
90
  _test_plan plan, 3, exp, inT, resT, [:y?]
92
91
  end
93
-
92
+
94
93
  def test_simple_project2
95
94
  plan = [[:x?, :b, :y?]]
96
95
  exp = %{\
@@ -101,7 +100,7 @@ out: [x?]
101
100
  resT = [[:a], [:d]]
102
101
  _test_plan plan, 3, exp, inT, resT, [:x?]
103
102
  end
104
-
103
+
105
104
  def test_simple_project3
106
105
  plan = [[:x?, :b, :y?]]
107
106
  exp = %{\
@@ -121,11 +120,14 @@ out: [x?]
121
120
  }
122
121
  inT = [[:a, :b, :c], [:d, :b, :e]]
123
122
  resT = [[:a]]
124
- _test_plan plan, 3, exp, inT, resT
123
+ assert_raise OMF::Rete::Planner::NoBindingException do
124
+ #_test_plan plan, 3, exp, inT, resT
125
+ _test_plan plan, 3, nil, nil, nil
126
+ end
125
127
  end
126
-
128
+
127
129
  def test_build_single_join
128
- plan = [[:x?, :b, :c], [:x?, :b, :d]]
130
+ plan = [[:x?, :b, :c], [:x?, :b, :d]]
129
131
  exp = %{\
130
132
  out: [x?]
131
133
  join: [x?] => [x?]
@@ -136,9 +138,9 @@ out: [x?]
136
138
  resT = [[:a]]
137
139
  _test_plan plan, 3, exp, inT, resT
138
140
  end
139
-
141
+
140
142
  def test_build_single_join_with_project
141
- plan = [[:x?, :b, :y?], [:x?, :y?, :d]]
143
+ plan = [[:x?, :b, :y?], [:x?, :y?, :d]]
142
144
  exp = %{\
143
145
  out: [y?]
144
146
  join: [x?, y?] => [y?]
@@ -151,7 +153,7 @@ out: [y?]
151
153
  end
152
154
 
153
155
  def test_build_single_join_with_project2
154
- plan = [[:x?, :b, :y?], [:x?, :y?, :d]]
156
+ plan = [[:x?, :b, :y?], [:x?, :y?, :d]]
155
157
  exp = %{\
156
158
  out: [y?, x?]
157
159
  join: [x?, y?] => [x?, y?]
@@ -165,9 +167,9 @@ out: [y?, x?]
165
167
 
166
168
 
167
169
  def test_build_two_joins
168
- plan = [[:x?, :b, :c],
170
+ plan = [[:x?, :b, :c],
169
171
  [:y?, :d, nil],
170
- [:x?, :e, :y?]]
172
+ [:x?, :e, :y?]]
171
173
  exp = %{\
172
174
  out: [x?, y?]
173
175
  join: [y?] => [x?, y?]
@@ -184,10 +186,10 @@ out: [x?, y?]
184
186
  end
185
187
 
186
188
  def test_build_three_joins
187
- plan = [[:x?, :a, :b],
189
+ plan = [[:x?, :a, :b],
188
190
  [:y?, :c, :d],
189
191
  [:x?, :e, :z?],
190
- [:z?, :f, :y?]]
192
+ [:z?, :f, :y?]]
191
193
  exp = %{\
192
194
  out: [x?, y?, z?]
193
195
  join: [z?] => [x?, y?, z?]
@@ -204,29 +206,59 @@ out: [x?, y?, z?]
204
206
  resT = [[:x, :y, :z]]
205
207
  _test_plan plan, 3, exp, inT, resT
206
208
  end
207
-
209
+
208
210
 
209
211
  def test_siblings
210
- store = Store.create(3)
212
+ store = Store.create(3)
211
213
  store.addTuple([:a, :hasParent, :p])
212
214
  store.addTuple([:b, :hasParent, :p])
213
215
 
214
216
  resT = Set.new
215
- store.query([[:x?, :sibling_of, :y?]]) do |t|
216
- resT << t
217
+ store.subscribe(:r1, [[:x?, :sibling_of, :y?]]) do |t|
218
+ resT << t.to_a
217
219
  end
218
220
  assert_equal(Set.new, resT)
219
-
221
+
220
222
  subscription = [
221
- [:x?, :hasParent, :p?],
223
+ [:x?, :hasParent, :p?],
222
224
  [:y?, :hasParent, :p?],
223
- OMF::Rete.differ(:x?, :y?)
225
+ OMF::Rete.differ(:x?, :y?)
224
226
  ]
225
- store.query(subscription, [:x?, :y?]) do |x, y|
226
- store.addTuple([x, :sibling_of, y])
227
+ store.subscribe(:r2, subscription, [:x?, :y?]) do |t|
228
+ store.addTuple([t[:x?], :sibling_of, t[:y?]])
227
229
  end
228
230
 
229
231
  assert_equal(Set.new([[:b, :a], [:a, :b]]), resT)
230
-
232
+
233
+ end
234
+
235
+ def test_remove
236
+ store = Store.create(2)
237
+
238
+ # with empty store
239
+ resT = []
240
+ plan = [[nil, :x?], [:x?, nil]]
241
+ result = store.subscribe(:test, plan) do |t, action|
242
+ #puts "#{action}: #{t.to_a.inspect}"
243
+ action == :add ? resT << t.to_a : resT.delete(t.to_a)
244
+ end
245
+ #result.describe()
246
+ store.add(:a, :b)
247
+ store.add(:b, :c)
248
+ assert_equal([[:b]], resT)
249
+
250
+ store.remove(:a, :b)
251
+ assert_equal([], resT)
252
+
253
+ store.add(:a, :b)
254
+ store.add(:d, :b)
255
+ assert_equal([[:b]], resT)
256
+
257
+ store.remove(:a, :b)
258
+ assert_equal([[:b]], resT)
259
+
260
+ store.remove(:d, :b)
261
+ assert_equal([], resT)
262
+ #store.addTuple(:a, :b)
231
263
  end
232
264
  end
@@ -0,0 +1,95 @@
1
+ require 'omf_rete/store'
2
+
3
+ include OMF::Rete
4
+
5
+ class TestPredicateStore < Test::Unit::TestCase
6
+
7
+ def create_store()
8
+ Store.create(0, type: :predicate)
9
+ end
10
+
11
+ def test_create_store
12
+ store = create_store()
13
+ end
14
+
15
+ def test_add_tuple_to_empty
16
+ store = create_store()
17
+ assert_raise OMF::Rete::Store::UnknownPredicateException do
18
+ store.add :foo, :b, :c
19
+ end
20
+ end
21
+
22
+ def test_add_tuple_one_predicate
23
+ store = create_store()
24
+ store.registerPredicate(:foo, 3)
25
+ store.add :foo, :b, :c
26
+ end
27
+
28
+ def test_add_tuple_tow_predicates
29
+ store = create_store()
30
+ store.registerPredicate(:foo, 3)
31
+ store.registerPredicate(:goo, 4)
32
+ store.add :foo, :b, :c
33
+ store.add :goo, :b, :c, :d
34
+ end
35
+
36
+ def test_find
37
+ tuples = [[:p1, :b, :c1],
38
+ [:p1, :b, :c2],
39
+ [:p2, :f1],
40
+ [:p2, :f2]
41
+ ]
42
+
43
+ store = create_store()
44
+ store.registerPredicate(:p1, 3)
45
+ store.registerPredicate(:p2, 2)
46
+
47
+ tuples.each {|t| store.addTuple t }
48
+
49
+ r = store.find tuples[0]
50
+ assert_equal Set.new([tuples[0]]), r
51
+ r = store.find [:p1, :b, nil]
52
+ assert_equal Set.new([tuples[0], tuples[1]]), r
53
+
54
+ r = store.find tuples[2]
55
+ assert_equal Set.new([tuples[2]]), r
56
+ r = store.find [:p2, nil]
57
+ assert_equal Set.new([tuples[2], tuples[3]]), r
58
+ end
59
+
60
+ def test_find_tuple_exceptions
61
+ store = create_store()
62
+ assert_raise OMF::Rete::Store::UnknownPredicateException do
63
+ store.find [:p1, nil]
64
+ end
65
+ store.registerPredicate(:p1, 2)
66
+ assert_equal Set.new([]), store.find([:p1, nil])
67
+ assert_raise OMF::Rete::Store::UnknownPredicateException do
68
+ store.find [:p2, nil]
69
+ end
70
+ end
71
+
72
+ def test_subscribe_across_multiple_predicates
73
+
74
+ plan = [[:p1, :x?, :y?], [:p2, :y?]]
75
+ tuples = [
76
+ [:p1, 3, 4], [:p1, 4, 5], [:p1, 5, 6],
77
+ [:p2, 4], [:p2, 6]
78
+ ]
79
+ store = create_store()
80
+ store.registerPredicate(:p1, 3)
81
+ store.registerPredicate(:p2, 2)
82
+ tuples.each {|t| store.addTuple t }
83
+
84
+ resT = Set.new
85
+ result = store.subscribe(:test, plan) do |t|
86
+ resT << t.to_a
87
+ end
88
+
89
+ assert_equal Set.new([[3,4], [5,6]]), resT
90
+ end
91
+
92
+ end
93
+
94
+
95
+
@@ -0,0 +1,66 @@
1
+ require 'omf_rete/store'
2
+
3
+ #include OMF::Rete
4
+
5
+
6
+ #
7
+ # Test the eamples in teh README file
8
+ #
9
+ class TestReadme < Test::Unit::TestCase
10
+ attr_reader :eng
11
+
12
+ def setup
13
+ @eng = OMF::Rete.create_engine(tuple_length: 3)
14
+
15
+ @res = []
16
+ end
17
+
18
+ def puts(msg)
19
+ @res << msg
20
+ end
21
+
22
+ def assert_puts(expected)
23
+ assert_equal expected, @res
24
+ end
25
+
26
+ def test_example1
27
+ eng = OMF::Rete.create_engine(tuple_length: 3)
28
+ eng.add_fact('myFridge', 'contains', 'milk')
29
+ end
30
+
31
+ def test_example2
32
+ eng.add_rule(:report_problem, [
33
+ ['myFridge', 'status', 'broken']
34
+ ]) do |m|
35
+ puts "My fridge is broken"
36
+ end
37
+ eng.add_fact('myFridge', 'status', 'ok')
38
+ eng.add_fact('myFridge', 'status', 'broken')
39
+
40
+ assert_puts ["My fridge is broken"]
41
+ end
42
+
43
+ def test_example3
44
+ eng.add_fact('myFridge', 'contains', 'milk')
45
+ eng.subscribe(:save_milk, [
46
+ [:fridge?, 'status', 'broken'],
47
+ [:fridge?, 'contains', 'milk'],
48
+ ]) do |m|
49
+ puts "Save the milk from #{m.fridge?}"
50
+ end
51
+ eng.add_fact('myFridge', 'status', 'broken')
52
+
53
+ assert_puts ["Save the milk from myFridge"]
54
+ end
55
+
56
+ def test_example4
57
+ eng.subscribe(:something_broken, [
58
+ [nil, 'status', 'broken']
59
+ ]) do |m|
60
+ puts "Something is broken"
61
+ end
62
+ eng.add_fact('myFridge', 'status', 'broken')
63
+
64
+ assert_puts ["Something is broken"]
65
+ end
66
+ end
data/tests/test_store.rb CHANGED
@@ -34,12 +34,21 @@ class TestStore < Test::Unit::TestCase
34
34
  r = store.find [t1[0], nil, t1[2]]
35
35
  assert_equal r, Set.new([t1])
36
36
 
37
+ r = store.find [t1[0], :_, t1[2]]
38
+ assert_equal r, Set.new([t1])
39
+
37
40
  r = store.find [nil, nil, nil]
38
41
  assert_equal r, Set.new([t1, t2])
42
+
43
+ r = store.find [:_, :_, :_]
44
+ assert_equal r, Set.new([t1, t2])
39
45
 
40
46
  r = store.find [:b, nil, nil]
41
47
  assert_equal r, Set.new()
42
48
 
49
+ r = store.find [:b, :_, :_]
50
+ assert_equal r, Set.new()
51
+
43
52
  end
44
53
 
45
54
  def test_find_tuple2
@@ -134,6 +143,48 @@ class TestStore < Test::Unit::TestCase
134
143
  assert_equal [t1, t2], ts.tuples
135
144
  end
136
145
 
146
+ def test_tset_remove
147
+ t1 = [:a, :b, :c]
148
+
149
+ store = Store.create(3)
150
+
151
+ ts = MockTSet.new
152
+ store.registerTSet(ts, t1)
153
+
154
+ store.addTuple t1
155
+ store.removeTuple t1
156
+ assert_equal [], ts.tuples
157
+ end
158
+
159
+ def test_tset_remove_multiple_nil
160
+ t1 = [:a, :b, :c]
161
+
162
+ store = Store.create(3)
163
+
164
+ ts = MockTSet.new
165
+ store.registerTSet(ts, [nil, t1[1], nil])
166
+ store.addTuple t1
167
+
168
+ t2 = [:d, :b, :f]
169
+ store.addTuple t2
170
+
171
+ store.removeTuple t1
172
+ assert_equal [t2], ts.tuples
173
+
174
+ r = store.find t1
175
+ assert_equal r, Set.new()
176
+ r = store.find [:a, nil, nil]
177
+ assert_equal r, Set.new()
178
+
179
+ t3 = [:g, :h, :j]
180
+ store.addTuple t3
181
+ assert_equal [t2], ts.tuples
182
+
183
+ store.removeTuple t2
184
+ assert_equal [], ts.tuples
185
+
186
+ end
187
+
137
188
 
138
189
 
139
190
 
@@ -149,6 +200,11 @@ class MockTSet
149
200
  (@tuples ||= []) << t
150
201
  end
151
202
 
203
+ def removeTuple(t)
204
+ @tuples.delete t
205
+ end
206
+
207
+
152
208
  def reset()
153
209
  @tuples = nil
154
210
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omf_rete
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: 0.6.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-13 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2013-12-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: omf_base
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  description: Tuple store with query and filter functionality.
15
31
  email:
16
32
  - omf-user@lists.nicta.com.au
@@ -36,7 +52,11 @@ files:
36
52
  - lib/omf_rete/store/alpha/alpha_element.rb
37
53
  - lib/omf_rete/store/alpha/alpha_inner_element.rb
38
54
  - lib/omf_rete/store/alpha/alpha_leaf_element.rb
39
- - lib/omf_rete/store/alpha/alpha_store.rb
55
+ - lib/omf_rete/store/alpha_store.rb
56
+ - lib/omf_rete/store/named_alpha_store.rb
57
+ - lib/omf_rete/store/object_store.rb
58
+ - lib/omf_rete/store/predicate_store.rb
59
+ - lib/omf_rete/tuple.rb
40
60
  - lib/omf_rete/tuple_stream.rb
41
61
  - lib/omf_rete/version.rb
42
62
  - omf_rete.gemspec
@@ -45,7 +65,11 @@ files:
45
65
  - tests/test_filter.rb
46
66
  - tests/test_indexed_tuple_set.rb
47
67
  - tests/test_join_op.rb
68
+ - tests/test_named_store.rb
69
+ - tests/test_object_store.rb
48
70
  - tests/test_planner.rb
71
+ - tests/test_predicate_store.rb
72
+ - tests/test_readme.rb
49
73
  - tests/test_store.rb
50
74
  homepage: https://www.mytestbed.net
51
75
  licenses: []
@@ -67,8 +91,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
91
  version: '0'
68
92
  requirements: []
69
93
  rubyforge_project: omf_rete
70
- rubygems_version: 1.8.24
94
+ rubygems_version: 1.8.23
71
95
  signing_key:
72
96
  specification_version: 3
73
97
  summary: A Rete implementation.
74
98
  test_files: []
99
+ has_rdoc: