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.
- data/README.md +82 -74
- data/lib/omf_rete/abstract_tuple_set.rb +5 -1
- data/lib/omf_rete/indexed_tuple_set.rb +84 -17
- data/lib/omf_rete/join_op.rb +78 -18
- data/lib/omf_rete/planner/join_plan.rb +16 -15
- data/lib/omf_rete/planner/plan_builder.rb +52 -48
- data/lib/omf_rete/planner/source_plan.rb +14 -13
- data/lib/omf_rete/store/alpha/alpha_element.rb +3 -74
- data/lib/omf_rete/store/alpha/alpha_inner_element.rb +8 -58
- data/lib/omf_rete/store/alpha/alpha_leaf_element.rb +18 -3
- data/lib/omf_rete/store/alpha_store.rb +118 -0
- data/lib/omf_rete/store/named_alpha_store.rb +38 -0
- data/lib/omf_rete/store/object_store.rb +119 -0
- data/lib/omf_rete/store/predicate_store.rb +96 -0
- data/lib/omf_rete/store.rb +58 -13
- data/lib/omf_rete/tuple.rb +53 -0
- data/lib/omf_rete/tuple_stream.rb +89 -60
- data/lib/omf_rete/version.rb +1 -1
- data/lib/omf_rete.rb +14 -4
- data/omf_rete.gemspec +3 -0
- data/tests/test_filter.rb +1 -1
- data/tests/test_join_op.rb +30 -0
- data/tests/test_named_store.rb +36 -0
- data/tests/test_object_store.rb +150 -0
- data/tests/test_planner.rb +72 -40
- data/tests/test_predicate_store.rb +95 -0
- data/tests/test_readme.rb +66 -0
- data/tests/test_store.rb +56 -0
- metadata +30 -5
- data/lib/omf_rete/store/alpha/alpha_store.rb +0 -197
data/tests/test_planner.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
|
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.
|
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.
|
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:
|
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:
|
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/
|
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.
|
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:
|