omf_rete 0.6.1 → 0.6.2
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/.gitignore +2 -1
- data/lib/omf_rete/abstract_tuple_set.rb +28 -14
- data/lib/omf_rete/indexed_tuple_set.rb +4 -0
- data/lib/omf_rete/join_op.rb +9 -0
- data/lib/omf_rete/planner/final_plan.rb +27 -0
- data/lib/omf_rete/planner/plan_builder.rb +9 -3
- data/lib/omf_rete/planner/source_plan.rb +3 -6
- data/lib/omf_rete/store.rb +39 -1
- data/lib/omf_rete/store/alpha/alpha_element.rb +5 -4
- data/lib/omf_rete/store/alpha/alpha_inner_element.rb +4 -4
- data/lib/omf_rete/store/alpha/alpha_leaf_element.rb +10 -5
- data/lib/omf_rete/store/alpha_store.rb +18 -1
- data/lib/omf_rete/store/named_alpha_store.rb +1 -0
- data/lib/omf_rete/store/object_store.rb +1 -0
- data/lib/omf_rete/store/predicate_store.rb +1 -0
- data/lib/omf_rete/tuple_stream.rb +7 -0
- data/lib/omf_rete/version.rb +1 -1
- data/tests/test_filter.rb +6 -7
- data/tests/test_planner.rb +3 -1
- metadata +50 -38
data/.gitignore
CHANGED
@@ -6,37 +6,51 @@ module OMF::Rete
|
|
6
6
|
# being called whenever a tuple is added or
|
7
7
|
# removed.
|
8
8
|
#
|
9
|
-
# The TupleSet is defined by a +description+.
|
9
|
+
# The TupleSet is defined by a +description+.
|
10
10
|
#
|
11
11
|
# The +description+ is an array of the
|
12
12
|
# same length as the tuples maintained. Each element,
|
13
13
|
# if not nil, names the binding variable associated with it.
|
14
|
-
# The position of a binding can be retrieved with
|
14
|
+
# The position of a binding can be retrieved with
|
15
15
|
# +index_for_binding+.
|
16
16
|
#
|
17
17
|
class AbstractTupleSet
|
18
|
-
|
18
|
+
|
19
19
|
attr_reader :description
|
20
20
|
attr_accessor :source
|
21
|
-
|
21
|
+
|
22
22
|
def initialize(description, source = nil)
|
23
23
|
@description = description
|
24
24
|
@source = source
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
|
+
def register_with_store(store, description)
|
28
|
+
@store = store
|
29
|
+
raise "BUG ALERT" unless description == @description
|
30
|
+
store.registerTSet(self, description)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Detach all streams from each other as they are no longer in use
|
34
|
+
#
|
35
|
+
def detach()
|
36
|
+
@source.detach if @source
|
37
|
+
puts ">>> UNREGISTER"
|
38
|
+
@store.unregisterTSet(self) if @store
|
39
|
+
end
|
40
|
+
|
27
41
|
def addTuple(tuple)
|
28
42
|
raise 'Abstract class'
|
29
43
|
end
|
30
|
-
|
44
|
+
|
31
45
|
def removeTuple(tuple)
|
32
46
|
raise 'Abstract class'
|
33
47
|
end
|
34
|
-
|
48
|
+
|
35
49
|
# Call block for every tuple stored in this set currently and
|
36
50
|
# in the future. In other words, the block may be called even after this
|
37
|
-
# method returns.
|
51
|
+
# method returns.
|
38
52
|
#
|
39
|
-
# The block will be called with one parameters, the
|
53
|
+
# The block will be called with one parameters, the
|
40
54
|
# tuple added.
|
41
55
|
#
|
42
56
|
def on_add(&block)
|
@@ -47,7 +61,7 @@ module OMF::Rete
|
|
47
61
|
def to_a
|
48
62
|
raise 'Abstract class'
|
49
63
|
end
|
50
|
-
|
64
|
+
|
51
65
|
# Retunr the index into the tuple for the binding variable +bname+.
|
52
66
|
#
|
53
67
|
# Note: This index is different to the set index used in +IndexedTupleSet+
|
@@ -57,7 +71,7 @@ module OMF::Rete
|
|
57
71
|
el == bname
|
58
72
|
end
|
59
73
|
end
|
60
|
-
|
74
|
+
|
61
75
|
def binding_at(index)
|
62
76
|
@description[index]
|
63
77
|
end
|
@@ -65,8 +79,8 @@ module OMF::Rete
|
|
65
79
|
def describe(out = STDOUT, offset = 0, incr = 2, sep = "\n")
|
66
80
|
raise 'Abstract class'
|
67
81
|
end
|
68
|
-
|
69
|
-
|
70
|
-
end # class
|
82
|
+
|
83
|
+
|
84
|
+
end # class
|
71
85
|
end # module
|
72
86
|
|
@@ -85,6 +85,8 @@ module OMF::Rete
|
|
85
85
|
@index = {}
|
86
86
|
end
|
87
87
|
|
88
|
+
|
89
|
+
|
88
90
|
# Call block for every tuple stored in this set currently and
|
89
91
|
# in the future. In other words, the block may be called even after this
|
90
92
|
# method returns.
|
@@ -182,6 +184,8 @@ module OMF::Rete
|
|
182
184
|
a
|
183
185
|
end
|
184
186
|
|
187
|
+
|
188
|
+
|
185
189
|
def describe(out = STDOUT, offset = 0, incr = 2, sep = "\n")
|
186
190
|
out.write(" " * offset)
|
187
191
|
desc = @description.collect do |e| e || '*' end
|
data/lib/omf_rete/join_op.rb
CHANGED
@@ -101,6 +101,15 @@ module OMF::Rete
|
|
101
101
|
return false
|
102
102
|
end
|
103
103
|
|
104
|
+
# Detach all streams from each other as they are no longer in use
|
105
|
+
#
|
106
|
+
def detach()
|
107
|
+
@left.detach
|
108
|
+
@right.detach
|
109
|
+
@results.clear
|
110
|
+
end
|
111
|
+
|
112
|
+
|
104
113
|
def description()
|
105
114
|
@resultSet.description
|
106
115
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
module OMF::Rete::Planner
|
3
|
+
|
4
|
+
# This plan holds the final result stream from which all other streams can be
|
5
|
+
# discovered and if necessary, freed.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
class FinalPlan
|
9
|
+
|
10
|
+
def initialize(result_stream)
|
11
|
+
@result_stream = result_stream
|
12
|
+
end
|
13
|
+
|
14
|
+
def materialize(indexPattern, resultSet, opts, &block)
|
15
|
+
raise "Shouldn't be called - THis is just a place holder"
|
16
|
+
end
|
17
|
+
|
18
|
+
def describe(out = STDOUT, offset = 0, incr = 2, sep = "\n")
|
19
|
+
@result_stream.describe(out, offset, incr, sep)
|
20
|
+
end
|
21
|
+
|
22
|
+
def detach()
|
23
|
+
@result_stream.detach()
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module
|
@@ -18,6 +18,7 @@ module OMF::Rete
|
|
18
18
|
class PlannerException < Exception; end
|
19
19
|
|
20
20
|
require 'omf_rete/planner/source_plan'
|
21
|
+
require 'omf_rete/planner/final_plan'
|
21
22
|
require 'omf_rete/planner/plan_level_builder'
|
22
23
|
require 'omf_rete/planner/plan_set'
|
23
24
|
require 'omf_rete/planner/filter_plan'
|
@@ -88,6 +89,9 @@ module OMF::Rete
|
|
88
89
|
# set.
|
89
90
|
#
|
90
91
|
def materialize(projectPattern = nil, plan = nil, opts = nil, &block)
|
92
|
+
unless block
|
93
|
+
raise PlannerException.new("Missing block to process result tuples with")
|
94
|
+
end
|
91
95
|
unless plan
|
92
96
|
plan = best_plan()
|
93
97
|
end
|
@@ -96,7 +100,9 @@ module OMF::Rete
|
|
96
100
|
end
|
97
101
|
if (plan.is_a?(SourcePlan))
|
98
102
|
# This is really just a simple pattern on the store
|
99
|
-
|
103
|
+
#plan = SimpleSourcePlan.new(plan)
|
104
|
+
#plan.materialize(projectPattern, opts, &block)
|
105
|
+
endS = _materialize_simple_plan(projectPattern, plan, opts, &block)
|
100
106
|
else
|
101
107
|
# this is the root of the plan
|
102
108
|
if projectPattern
|
@@ -106,8 +112,9 @@ module OMF::Rete
|
|
106
112
|
end
|
107
113
|
frontS, endS = _materialize_result_stream(plan, projectPattern, opts, &block)
|
108
114
|
plan.materialize(nil, frontS, opts, &block)
|
109
|
-
endS
|
115
|
+
#endS
|
110
116
|
end
|
117
|
+
FinalPlan.new(endS)
|
111
118
|
end
|
112
119
|
|
113
120
|
|
@@ -267,7 +274,6 @@ module OMF::Rete
|
|
267
274
|
frontS.source = src
|
268
275
|
|
269
276
|
@store.registerTSet(src, plan.description) if @store
|
270
|
-
|
271
277
|
endS
|
272
278
|
end
|
273
279
|
|
@@ -51,7 +51,8 @@ module OMF::Rete
|
|
51
51
|
else
|
52
52
|
@source_set = OMF::Rete::IndexedTupleSet.new(@description, indexPattern)
|
53
53
|
end
|
54
|
-
|
54
|
+
#@store.registerTSet(@source_set, @description) if @store
|
55
|
+
@source_set.register_with_store(@store, @description)
|
55
56
|
end
|
56
57
|
|
57
58
|
# Return the cost of this plan.
|
@@ -69,11 +70,7 @@ module OMF::Rete
|
|
69
70
|
|
70
71
|
|
71
72
|
def describe(out = STDOUT, offset = 0, incr = 2, sep = "\n")
|
72
|
-
|
73
|
-
desc = @description.collect do |e| e || '*' end
|
74
|
-
# index = @result_set.to_a.sort
|
75
|
-
# out.write("src: [#{desc.join(', ')}] index: [#{index.join(', ')}] cost: #{cost}#{sep}")
|
76
|
-
out.write("src: [#{desc.join(', ')}] cost: #{cost}#{sep}")
|
73
|
+
@source_set.describe(out, offset, incr, sep) if @source_set
|
77
74
|
end
|
78
75
|
|
79
76
|
end # SourcePlan
|
data/lib/omf_rete/store.rb
CHANGED
@@ -7,6 +7,7 @@ module OMF::Rete::Store
|
|
7
7
|
class StoreException < Exception; end
|
8
8
|
|
9
9
|
class NotImplementedException < StoreException; end
|
10
|
+
class UnknownSubscriptionException < StoreException; end
|
10
11
|
|
11
12
|
DEF_TYPE = :alpha
|
12
13
|
|
@@ -36,14 +37,46 @@ module OMF::Rete::Store
|
|
36
37
|
# end
|
37
38
|
|
38
39
|
def subscribe(name, query, out_pattern = nil, &block)
|
40
|
+
if name && @plans[name]
|
41
|
+
raise StoreException.new "Already have subscription '#{name}'."
|
42
|
+
end
|
43
|
+
|
39
44
|
require 'omf_rete/planner/plan_builder'
|
40
45
|
|
41
46
|
pb = OMF::Rete::Planner::PlanBuilder.new(query, self)
|
42
47
|
pb.build
|
43
|
-
pb.materialize(out_pattern, &block)
|
48
|
+
plan = pb.materialize(out_pattern, &block)
|
49
|
+
if name
|
50
|
+
@plans[name] = plan
|
51
|
+
end
|
52
|
+
plan
|
44
53
|
end
|
45
54
|
alias :add_rule :subscribe
|
46
55
|
|
56
|
+
def unsubscribe(name_or_plan)
|
57
|
+
if name_or_plan.is_a? OMF::Rete::Planner::FinalPlan
|
58
|
+
plan = name_or_plan
|
59
|
+
else
|
60
|
+
plan = @plans.delete(name_or_plan)
|
61
|
+
end
|
62
|
+
unless plan
|
63
|
+
raise UnknownSubscriptionException.new("Unknown subscription '#{name_or_plan}'")
|
64
|
+
end
|
65
|
+
plan.detach
|
66
|
+
end
|
67
|
+
|
68
|
+
# Run a query against the store. This is essentially a short lived subscription
|
69
|
+
# may not be catch everything if there are inserts at the same time.
|
70
|
+
#
|
71
|
+
def query(query, out_pattern = nil)
|
72
|
+
result = []
|
73
|
+
plan = subscribe(null, query, out_pattern) do |t|
|
74
|
+
result << t
|
75
|
+
end
|
76
|
+
unsubscribe(plan)
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
47
80
|
def addTuple(tarray)
|
48
81
|
raise NotImplementedException.new
|
49
82
|
end
|
@@ -98,5 +131,10 @@ module OMF::Rete::Store
|
|
98
131
|
tuple.is_a?(Array) && tuple.length == @length
|
99
132
|
end
|
100
133
|
|
134
|
+
protected
|
135
|
+
def store_initialize()
|
136
|
+
@plans = {}
|
137
|
+
end
|
138
|
+
|
101
139
|
|
102
140
|
end
|
@@ -5,17 +5,18 @@ module OMF::Rete::Store::Alpha
|
|
5
5
|
#
|
6
6
|
class AlphaElement
|
7
7
|
|
8
|
-
def self.create(level, length)
|
8
|
+
def self.create(level, length, store)
|
9
9
|
rem = length - level
|
10
10
|
if (rem > 1)
|
11
|
-
AlphaInnerElement.new(level, length)
|
11
|
+
AlphaInnerElement.new(level, length, store)
|
12
12
|
else
|
13
|
-
AlphaLeafElement.new(level)
|
13
|
+
AlphaLeafElement.new(level, store)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def initialize(level)
|
17
|
+
def initialize(level, store)
|
18
18
|
@level = level
|
19
|
+
@store = store
|
19
20
|
end
|
20
21
|
|
21
22
|
end
|
@@ -4,12 +4,12 @@ module OMF::Rete::Store::Alpha
|
|
4
4
|
|
5
5
|
class AlphaInnerElement < AlphaElement
|
6
6
|
|
7
|
-
def initialize(level, length)
|
8
|
-
super(level)
|
7
|
+
def initialize(level, length, store)
|
8
|
+
super(level, store)
|
9
9
|
@length = length
|
10
10
|
@children = {}
|
11
11
|
if (level < length)
|
12
|
-
@wildChild = AlphaElement.create(level + 1, length)
|
12
|
+
@wildChild = AlphaElement.create(level + 1, length, store)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -18,7 +18,7 @@ module OMF::Rete::Store::Alpha
|
|
18
18
|
def registerTSet(tset, pattern)
|
19
19
|
pitem = pattern[@level]
|
20
20
|
if (pitem) # not nil
|
21
|
-
child = (@children[pitem] ||= AlphaElement.create(@level + 1, @length))
|
21
|
+
child = (@children[pitem] ||= AlphaElement.create(@level + 1, @length, @store))
|
22
22
|
child.registerTSet(tset, pattern)
|
23
23
|
else # wildcard
|
24
24
|
@wildChild.registerTSet(tset, pattern)
|
@@ -7,7 +7,7 @@ module OMF::Rete::Store::Alpha
|
|
7
7
|
#
|
8
8
|
class AlphaLeafElement < AlphaElement
|
9
9
|
|
10
|
-
def initialize(level)
|
10
|
+
def initialize(level, store)
|
11
11
|
super
|
12
12
|
@tsetIndex = {}
|
13
13
|
@tsetWildcards = []
|
@@ -18,11 +18,16 @@ module OMF::Rete::Store::Alpha
|
|
18
18
|
def registerTSet(tset, pattern)
|
19
19
|
pitem = pattern[@level]
|
20
20
|
leaf = (@level == @length)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
a = pitem ? (@tsetIndex[pitem] ||= []) : @tsetWildcards
|
22
|
+
a << tset
|
23
|
+
@store.onUnregisterTSet(tset) do
|
24
|
+
a.delete(tset)
|
25
25
|
end
|
26
|
+
# if (pitem) # not nil
|
27
|
+
# (@tsetIndex[pitem] ||= []) << tset
|
28
|
+
# else # wildcard
|
29
|
+
# @tsetWildcards << tset
|
30
|
+
# end
|
26
31
|
end
|
27
32
|
|
28
33
|
def addTuple(tarray)
|
@@ -16,8 +16,10 @@ module OMF::Rete::Store
|
|
16
16
|
# fixed length +length+.
|
17
17
|
#
|
18
18
|
def initialize(length, opts = {})
|
19
|
+
store_initialize()
|
19
20
|
@length = length
|
20
|
-
@root = Alpha::AlphaInnerElement.new(0, length)
|
21
|
+
@root = Alpha::AlphaInnerElement.new(0, length, self)
|
22
|
+
@unregisterHandler = {}
|
21
23
|
@index = []
|
22
24
|
length.times do @index << {} end
|
23
25
|
end
|
@@ -39,6 +41,14 @@ module OMF::Rete::Store
|
|
39
41
|
tset
|
40
42
|
end
|
41
43
|
|
44
|
+
def unregisterTSet(tset)
|
45
|
+
(@unregisterHandler[tset] || []).each do |proc|
|
46
|
+
proc.call
|
47
|
+
end
|
48
|
+
@unregisterHandler.delete(tset)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
42
52
|
def createTSet(description, indexPattern)
|
43
53
|
tset = Moana::Filter::IndexedTupleSet.new(description, indexPattern)
|
44
54
|
registerTSet(tset, description)
|
@@ -114,5 +124,12 @@ module OMF::Rete::Store
|
|
114
124
|
def to_s()
|
115
125
|
"Store"
|
116
126
|
end
|
127
|
+
|
128
|
+
# Register a block to call whenever a TSet is being unregistered
|
129
|
+
#
|
130
|
+
def onUnregisterTSet(tset, &block)
|
131
|
+
(@unregisterHandler[tset] ||= []) << block
|
132
|
+
end
|
133
|
+
|
117
134
|
end # Store
|
118
135
|
end # Moana
|
@@ -28,6 +28,13 @@ module OMF::Rete
|
|
28
28
|
raise "Method 'check_for_tuple' is not implemented"
|
29
29
|
end
|
30
30
|
|
31
|
+
# Detach all streams from each other as they are no longer in use
|
32
|
+
#
|
33
|
+
def detach()
|
34
|
+
@source.detach if @source
|
35
|
+
@source = nil
|
36
|
+
end
|
37
|
+
|
31
38
|
def describe(out = STDOUT, offset = 0, incr = 2, sep = "\n")
|
32
39
|
out.write(" " * offset)
|
33
40
|
_describe(out, sep)
|
data/lib/omf_rete/version.rb
CHANGED
data/tests/test_filter.rb
CHANGED
@@ -9,7 +9,7 @@ include OMF::Rete
|
|
9
9
|
include OMF::Rete::Planner
|
10
10
|
|
11
11
|
class TestFilter < Test::Unit::TestCase
|
12
|
-
|
12
|
+
|
13
13
|
|
14
14
|
def _test_plan(plan, storeSize, expected = nil, inTuples = nil, outTuples = nil, outPattern = nil)
|
15
15
|
store = Store.create(storeSize)
|
@@ -22,12 +22,11 @@ class TestFilter < Test::Unit::TestCase
|
|
22
22
|
result = pb.materialize(outPattern) do |t|
|
23
23
|
resT << t.to_a
|
24
24
|
end
|
25
|
-
|
26
25
|
out = StringIO.new
|
27
26
|
#result.describe(out, 0, 0, '|')
|
28
27
|
result.describe(out)
|
29
28
|
assert_equal(expected, out.string) if expected
|
30
|
-
|
29
|
+
|
31
30
|
if (inTuples)
|
32
31
|
inTuples.each do |t|
|
33
32
|
store.addTuple(t)
|
@@ -36,10 +35,10 @@ class TestFilter < Test::Unit::TestCase
|
|
36
35
|
end
|
37
36
|
result
|
38
37
|
end
|
39
|
-
|
38
|
+
|
40
39
|
def test_theshold_test
|
41
40
|
plan = [
|
42
|
-
[:x?],
|
41
|
+
[:x?],
|
43
42
|
OMF::Rete.filter(:x?) do |x|
|
44
43
|
x > 2
|
45
44
|
end
|
@@ -53,10 +52,10 @@ out: [x?]
|
|
53
52
|
resT = [[3], [4]]
|
54
53
|
_test_plan plan, 1, exp, inT, resT
|
55
54
|
end
|
56
|
-
|
55
|
+
|
57
56
|
def test_theshold_test2
|
58
57
|
plan = [
|
59
|
-
[:x?, :y?],
|
58
|
+
[:x?, :y?],
|
60
59
|
OMF::Rete::filter(:x?) do |x|
|
61
60
|
x > 2
|
62
61
|
end,
|
data/tests/test_planner.rb
CHANGED
@@ -20,7 +20,7 @@ class TestPlanner < Test::Unit::TestCase
|
|
20
20
|
|
21
21
|
# with empty store
|
22
22
|
resT = []
|
23
|
-
result = store.subscribe(
|
23
|
+
result = store.subscribe(nil, plan, outPattern) do |t|
|
24
24
|
resT << t.to_a
|
25
25
|
end
|
26
26
|
|
@@ -29,6 +29,8 @@ class TestPlanner < Test::Unit::TestCase
|
|
29
29
|
result.describe(out)
|
30
30
|
assert_equal(expected, out.string) if expected
|
31
31
|
|
32
|
+
#store.unsubscribe(result)
|
33
|
+
|
32
34
|
if (inTuples)
|
33
35
|
|
34
36
|
inTuples.each do |t|
|
metadata
CHANGED
@@ -1,39 +1,44 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_rete
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 6
|
8
|
+
- 2
|
9
|
+
version: 0.6.2
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- NICTA
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2014-01-02 00:00:00 +11:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
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
22
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
30
32
|
description: Tuple store with query and filter functionality.
|
31
|
-
email:
|
33
|
+
email:
|
32
34
|
- omf-user@lists.nicta.com.au
|
33
35
|
executables: []
|
36
|
+
|
34
37
|
extensions: []
|
38
|
+
|
35
39
|
extra_rdoc_files: []
|
36
|
-
|
40
|
+
|
41
|
+
files:
|
37
42
|
- .gitignore
|
38
43
|
- README.md
|
39
44
|
- Rakefile
|
@@ -43,6 +48,7 @@ files:
|
|
43
48
|
- lib/omf_rete/join_op.rb
|
44
49
|
- lib/omf_rete/planner/abstract_plan.rb
|
45
50
|
- lib/omf_rete/planner/filter_plan.rb
|
51
|
+
- lib/omf_rete/planner/final_plan.rb
|
46
52
|
- lib/omf_rete/planner/join_plan.rb
|
47
53
|
- lib/omf_rete/planner/plan_builder.rb
|
48
54
|
- lib/omf_rete/planner/plan_level_builder.rb
|
@@ -71,29 +77,35 @@ files:
|
|
71
77
|
- tests/test_predicate_store.rb
|
72
78
|
- tests/test_readme.rb
|
73
79
|
- tests/test_store.rb
|
80
|
+
has_rdoc: true
|
74
81
|
homepage: https://www.mytestbed.net
|
75
82
|
licenses: []
|
83
|
+
|
76
84
|
post_install_message:
|
77
85
|
rdoc_options: []
|
78
|
-
|
86
|
+
|
87
|
+
require_paths:
|
79
88
|
- lib
|
80
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
92
103
|
requirements: []
|
104
|
+
|
93
105
|
rubyforge_project: omf_rete
|
94
|
-
rubygems_version: 1.
|
106
|
+
rubygems_version: 1.3.6
|
95
107
|
signing_key:
|
96
108
|
specification_version: 3
|
97
109
|
summary: A Rete implementation.
|
98
110
|
test_files: []
|
99
|
-
|
111
|
+
|