andromeda 0.1.2 → 0.1.3
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 +1 -29
- data/Gemfile.lock +27 -71
- data/README.md +4 -4
- data/ROADMAP.md +7 -8
- data/andromeda.gemspec +17 -1
- data/lib/andromeda.rb +34 -34
- data/lib/andromeda/atom.rb +76 -76
- data/lib/andromeda/cmd.rb +239 -239
- data/lib/andromeda/error.rb +1 -1
- data/lib/andromeda/guide.rb +2 -2
- data/lib/andromeda/guide_track.rb +2 -3
- data/lib/andromeda/id.rb +13 -13
- data/lib/andromeda/impl/class_attr.rb +2 -2
- data/lib/andromeda/impl/id.rb +89 -0
- data/lib/andromeda/impl/proto_plan.rb +34 -25
- data/lib/andromeda/impl_base.rb +48 -0
- data/lib/andromeda/kit.rb +169 -169
- data/lib/andromeda/map_reduce.rb +1 -1
- data/lib/andromeda/patch/array_bin_search.rb +83 -0
- data/lib/andromeda/plan.rb +4 -4
- data/lib/andromeda/spot.rb +3 -3
- data/lib/andromeda/sugar.rb +13 -13
- data/lib/andromeda/sync.rb +5 -3
- data/lib/andromeda/version.rb +1 -1
- data/yard_extensions/andromeda.rb +2 -2
- metadata +119 -6
data/lib/andromeda/map_reduce.rb
CHANGED
@@ -0,0 +1,83 @@
|
|
1
|
+
class ::Array
|
2
|
+
|
3
|
+
class Tag
|
4
|
+
attr_reader :key
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
def initialize(key, value = nil)
|
8
|
+
@key = key
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def untagged ; value end
|
13
|
+
|
14
|
+
def <=>(other)
|
15
|
+
return key <=> other.key
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"Tag(#{key.to_s} => #{value.to_s})"
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_method :inspect, :to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
# Binary search for the first elem that is leq elem in this array in the range
|
26
|
+
# (low..high-1)
|
27
|
+
#
|
28
|
+
# The array is expected to be sorted in descending order.
|
29
|
+
#
|
30
|
+
# @param [Object] elem elem to search for
|
31
|
+
# @param [Fixnum] low lower bound (inclusive)
|
32
|
+
# @param [Fixnum] high upper bound (inclusive, -1 for last element)
|
33
|
+
# @return [Fixnum] index of first occurence leq than elem in self, or -1 if not found
|
34
|
+
#
|
35
|
+
def bin_search(elem, low = 0, high = -1)
|
36
|
+
high = size - 1 if high < 0
|
37
|
+
_bin_search elem, low, high
|
38
|
+
end
|
39
|
+
|
40
|
+
# Wraps all objects in self into ::Array::Tag instances using
|
41
|
+
# the provided block to extract a key
|
42
|
+
#
|
43
|
+
# @return [self]
|
44
|
+
#
|
45
|
+
def tag! ; map! { |e| Tag.new (yield e), e } end
|
46
|
+
|
47
|
+
# Untags Array::Tag instances, i.e. replaces them with their value
|
48
|
+
#
|
49
|
+
# @return [self]
|
50
|
+
#
|
51
|
+
def untag! ; map! { |e| e.untagged } end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def _bin_search(elem, low, high)
|
56
|
+
last = -1
|
57
|
+
while low <= high
|
58
|
+
sz = high - low
|
59
|
+
# On 2012 cpus, linear search is slightly faster than binary search
|
60
|
+
# if the number of searched elements is in the range of 50-100 elts
|
61
|
+
return _lin_search elem, low, high if (sz >> 6)
|
62
|
+
mid_index = low + (sz >> 1)
|
63
|
+
if (elem <=> self[mid_index]) == -1
|
64
|
+
low = mid_index + 1
|
65
|
+
else
|
66
|
+
last = mid_index
|
67
|
+
high = mid_index - 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
return last
|
71
|
+
end
|
72
|
+
|
73
|
+
def _lin_search(elem, low, high)
|
74
|
+
cur_index = low
|
75
|
+
while cur_index <= high
|
76
|
+
if (elem <=> self[cur_index]) == -1
|
77
|
+
then cur_index += 1
|
78
|
+
else return cur_index end
|
79
|
+
end
|
80
|
+
return -1
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
data/lib/andromeda/plan.rb
CHANGED
@@ -2,8 +2,8 @@ module Andromeda
|
|
2
2
|
|
3
3
|
class Plan < Impl::ProtoPlan
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
spot_meth :enter
|
6
|
+
spot_attr :errors
|
7
7
|
|
8
8
|
signal_spot :errors
|
9
9
|
|
@@ -37,9 +37,9 @@ module Andromeda
|
|
37
37
|
def log ; @log = DefaultLogger.instance end
|
38
38
|
def mark ; @mark = Id.zero unless @mark ; @mark end
|
39
39
|
|
40
|
-
def on_enter(
|
40
|
+
def on_enter(key, val)
|
41
41
|
exit_ = exit
|
42
|
-
exit_ <<
|
42
|
+
exit_ << val if exit_
|
43
43
|
end
|
44
44
|
|
45
45
|
def to_short_s
|
data/lib/andromeda/spot.rb
CHANGED
@@ -31,7 +31,7 @@ module Andromeda
|
|
31
31
|
def initialize(plan, name, here, dest = nil)
|
32
32
|
raise ArgumentError, "#{plan} is not a Plan" unless plan.is_a? Plan
|
33
33
|
raise ArgumentError, "#{name} is not a Symbol" unless name.is_a? Symbol
|
34
|
-
unless plan.
|
34
|
+
unless plan.spot_meth_name?(name)
|
35
35
|
raise ArgumentError, "#{name} is not a known method spot name of #{plan}"
|
36
36
|
end
|
37
37
|
unless dest.nil? || dest.is_a?(Symbol)
|
@@ -114,8 +114,8 @@ module Andromeda
|
|
114
114
|
|
115
115
|
def >>(target)
|
116
116
|
return (plan >> target) unless dest_name
|
117
|
-
unless plan.
|
118
|
-
raise ArgumentError, "#{dest_name} is not an
|
117
|
+
unless plan.spot_attr_name?(dest_name)
|
118
|
+
raise ArgumentError, "#{dest_name} is not an spot_attr_name"
|
119
119
|
end
|
120
120
|
plan.send :"#{dest_name}=", target.entry
|
121
121
|
plan.public_spot(dest_name)
|
data/lib/andromeda/sugar.rb
CHANGED
@@ -6,25 +6,25 @@ module Andromeda
|
|
6
6
|
|
7
7
|
module Guides
|
8
8
|
|
9
|
-
def self.default
|
10
|
-
|
9
|
+
def self.default=(new_guide)
|
10
|
+
DefaultGuideHolder.instance.guide = new_guide
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.default ; DefaultGuideHolder.instance.guide end
|
14
|
+
|
15
|
+
def self.single ; SinglePoolGuide end
|
16
|
+
def self.shared_single ; SharedSinglePoolGuide end
|
17
|
+
def self.pool ; PoolGuide end
|
11
18
|
def self.shared_pool ; SharedPoolGuide end
|
12
|
-
def self.pool ; SharedPoolGuide.new end
|
13
19
|
def self.local ; LocalGuide end
|
14
|
-
def self.shared_single ; SharedSinglePoolGuide end
|
15
20
|
|
16
|
-
class
|
21
|
+
class DefaultGuideHolder
|
17
22
|
include Singleton
|
18
23
|
|
19
|
-
|
20
|
-
super LocalGuide.instance
|
21
|
-
end
|
24
|
+
attr_accessor :guide
|
22
25
|
|
23
|
-
def
|
24
|
-
|
25
|
-
new_instance = new_instance.instance
|
26
|
-
end
|
27
|
-
instance.__setobj__ new_instance
|
26
|
+
def initialize
|
27
|
+
@guide = LocalGuide
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
data/lib/andromeda/sync.rb
CHANGED
@@ -53,12 +53,14 @@ module Andromeda
|
|
53
53
|
|
54
54
|
# Passes all input and waits for the associated scope to return to the start value
|
55
55
|
# (will only work if there is no concurrent modification to the associated scope)
|
56
|
-
class
|
56
|
+
class Bracket < Plan
|
57
57
|
|
58
|
-
def
|
58
|
+
def init_guide ; ::Andromeda::Guides::LocalGuide end
|
59
|
+
|
60
|
+
def on_enter(key, val)
|
59
61
|
scope_ = current_scope
|
60
62
|
value_ = scope_.value
|
61
|
-
super
|
63
|
+
super key, val
|
62
64
|
scope_.wait_until_eq value_
|
63
65
|
end
|
64
66
|
end
|
data/lib/andromeda/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'yard'
|
2
2
|
|
3
3
|
class MethSpotHandler < YARD::Handlers::Ruby::AttributeHandler
|
4
|
-
handles method_call(:
|
4
|
+
handles method_call(:spot_meth)
|
5
5
|
namespace_only
|
6
6
|
|
7
7
|
def process
|
@@ -10,7 +10,7 @@ class MethSpotHandler < YARD::Handlers::Ruby::AttributeHandler
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class AttrSpotHandler < YARD::Handlers::Ruby::AttributeHandler
|
13
|
-
handles method_call(:
|
13
|
+
handles method_call(:spot_attr)
|
14
14
|
namespace_only
|
15
15
|
|
16
16
|
def process
|
metadata
CHANGED
@@ -1,16 +1,126 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: andromeda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Stefan Plantikow
|
9
9
|
autorequire:
|
10
10
|
bindir: script
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-05-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
requirement: &9592 !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
none: false
|
21
|
+
type: :runtime
|
22
|
+
version_requirements: *9592
|
23
|
+
name: json
|
24
|
+
prerelease: false
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
requirement: &9656 !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
none: false
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *9656
|
34
|
+
name: atomic
|
35
|
+
prerelease: false
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
requirement: &9700 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
none: false
|
43
|
+
type: :runtime
|
44
|
+
version_requirements: *9700
|
45
|
+
name: facter
|
46
|
+
prerelease: false
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
requirement: &9744 !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
none: false
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *9744
|
56
|
+
name: statval
|
57
|
+
prerelease: false
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
requirement: &9788 !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
none: false
|
65
|
+
type: :runtime
|
66
|
+
version_requirements: *9788
|
67
|
+
name: threadpool
|
68
|
+
prerelease: false
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
requirement: &9832 !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
none: false
|
76
|
+
type: :development
|
77
|
+
version_requirements: *9832
|
78
|
+
name: rspec
|
79
|
+
prerelease: false
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
requirement: &9876 !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
none: false
|
87
|
+
type: :development
|
88
|
+
version_requirements: *9876
|
89
|
+
name: simplecov
|
90
|
+
prerelease: false
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
requirement: &9920 !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
none: false
|
98
|
+
type: :development
|
99
|
+
version_requirements: *9920
|
100
|
+
name: rake
|
101
|
+
prerelease: false
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
requirement: &9964 !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
none: false
|
109
|
+
type: :development
|
110
|
+
version_requirements: *9964
|
111
|
+
name: yard
|
112
|
+
prerelease: false
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
requirement: &10008 !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
none: false
|
120
|
+
type: :development
|
121
|
+
version_requirements: *10008
|
122
|
+
name: redcarpet
|
123
|
+
prerelease: false
|
14
124
|
description: Andromeda is a light weight framework for complex event processing on
|
15
125
|
multicore architectures. Andromeda users construct networks of plans that are interconnected
|
16
126
|
via endpoint spots, describe how plans are scheduled onto threads, and process data
|
@@ -42,11 +152,14 @@ files:
|
|
42
152
|
- lib/andromeda/id.rb
|
43
153
|
- lib/andromeda/impl/atom.rb
|
44
154
|
- lib/andromeda/impl/class_attr.rb
|
155
|
+
- lib/andromeda/impl/id.rb
|
45
156
|
- lib/andromeda/impl/proto_plan.rb
|
46
157
|
- lib/andromeda/impl/to_s.rb
|
47
158
|
- lib/andromeda/impl/xor_id.rb
|
159
|
+
- lib/andromeda/impl_base.rb
|
48
160
|
- lib/andromeda/kit.rb
|
49
161
|
- lib/andromeda/map_reduce.rb
|
162
|
+
- lib/andromeda/patch/array_bin_search.rb
|
50
163
|
- lib/andromeda/plan.rb
|
51
164
|
- lib/andromeda/pool_guide.rb
|
52
165
|
- lib/andromeda/spot.rb
|
@@ -63,23 +176,23 @@ rdoc_options: []
|
|
63
176
|
require_paths:
|
64
177
|
- lib
|
65
178
|
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
179
|
requirements:
|
68
180
|
- - ! '>='
|
69
181
|
- !ruby/object:Gem::Version
|
70
182
|
version: '0'
|
71
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
183
|
none: false
|
184
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
185
|
requirements:
|
74
186
|
- - ! '>='
|
75
187
|
- !ruby/object:Gem::Version
|
76
188
|
version: '0'
|
189
|
+
none: false
|
77
190
|
requirements: []
|
78
191
|
rubyforge_project: andromeda
|
79
192
|
rubygems_version: 1.8.12
|
80
193
|
signing_key:
|
81
194
|
specification_version: 3
|
82
|
-
summary: light
|
195
|
+
summary: light weight framework for complex event processing based on a dataflow DSL
|
83
196
|
test_files:
|
84
197
|
- spec/spec_helper.rb
|
85
198
|
has_rdoc:
|