skydb 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README.md +165 -1
- data/lib/skydb.rb +18 -61
- data/lib/skydb/client.rb +186 -186
- data/lib/skydb/event.rb +47 -76
- data/lib/skydb/property.rb +34 -67
- data/lib/skydb/table.rb +121 -41
- data/lib/skydb/version.rb +1 -1
- data/test/integration/client_test.rb +88 -0
- data/test/test_helper.rb +3 -51
- data/test/unit/client_test.rb +135 -32
- metadata +17 -278
- data/bin/sky +0 -89
- data/lib/ext/hash.rb +0 -11
- data/lib/ext/string.rb +0 -11
- data/lib/ext/treetop.rb +0 -19
- data/lib/skydb/action.rb +0 -76
- data/lib/skydb/import.rb +0 -7
- data/lib/skydb/import/importer.rb +0 -435
- data/lib/skydb/import/transforms/apache.yml +0 -4
- data/lib/skydb/import/transforms/sky.yml +0 -28
- data/lib/skydb/import/transforms/snowplow.yml +0 -1
- data/lib/skydb/import/translator.rb +0 -119
- data/lib/skydb/message.rb +0 -146
- data/lib/skydb/message/add_action.rb +0 -53
- data/lib/skydb/message/add_event.rb +0 -72
- data/lib/skydb/message/add_property.rb +0 -55
- data/lib/skydb/message/create_table.rb +0 -64
- data/lib/skydb/message/delete_table.rb +0 -66
- data/lib/skydb/message/get_action.rb +0 -55
- data/lib/skydb/message/get_actions.rb +0 -38
- data/lib/skydb/message/get_properties.rb +0 -38
- data/lib/skydb/message/get_property.rb +0 -55
- data/lib/skydb/message/get_table.rb +0 -74
- data/lib/skydb/message/get_tables.rb +0 -43
- data/lib/skydb/message/lookup.rb +0 -79
- data/lib/skydb/message/lua/aggregate.rb +0 -63
- data/lib/skydb/message/multi.rb +0 -57
- data/lib/skydb/message/next_actions.rb +0 -55
- data/lib/skydb/message/ping.rb +0 -32
- data/lib/skydb/property/type.rb +0 -40
- data/lib/skydb/query.rb +0 -183
- data/lib/skydb/query/after_condition.rb +0 -104
- data/lib/skydb/query/ast/selection_field_syntax_node.rb +0 -26
- data/lib/skydb/query/ast/selection_fields_syntax_node.rb +0 -16
- data/lib/skydb/query/ast/selection_group_syntax_node.rb +0 -16
- data/lib/skydb/query/ast/selection_groups_syntax_node.rb +0 -16
- data/lib/skydb/query/condition.rb +0 -113
- data/lib/skydb/query/on_condition.rb +0 -53
- data/lib/skydb/query/selection.rb +0 -398
- data/lib/skydb/query/selection_field.rb +0 -99
- data/lib/skydb/query/selection_fields_grammar.treetop +0 -46
- data/lib/skydb/query/selection_fields_parse_error.rb +0 -30
- data/lib/skydb/query/selection_group.rb +0 -78
- data/lib/skydb/query/selection_groups_grammar.treetop +0 -31
- data/lib/skydb/query/selection_groups_parse_error.rb +0 -30
- data/lib/skydb/query/validation_error.rb +0 -8
- data/lib/skydb/timestamp.rb +0 -22
- data/test/integration/query_test.rb +0 -102
- data/test/unit/event_test.rb +0 -32
- data/test/unit/import/importer_test.rb +0 -208
- data/test/unit/import/translator_test.rb +0 -88
- data/test/unit/message/add_action_message_test.rb +0 -34
- data/test/unit/message/add_event_message_test.rb +0 -35
- data/test/unit/message/add_property_message_test.rb +0 -41
- data/test/unit/message/create_table_message_test.rb +0 -34
- data/test/unit/message/delete_table_message_test.rb +0 -34
- data/test/unit/message/get_action_message_test.rb +0 -34
- data/test/unit/message/get_actions_message_test.rb +0 -18
- data/test/unit/message/get_properties_message_test.rb +0 -18
- data/test/unit/message/get_property_message_test.rb +0 -34
- data/test/unit/message/get_table_message_test.rb +0 -19
- data/test/unit/message/get_tables_message_test.rb +0 -18
- data/test/unit/message/lookup_message_test.rb +0 -27
- data/test/unit/message/lua_aggregate_message_test.rb +0 -19
- data/test/unit/message/multi_message_test.rb +0 -22
- data/test/unit/message/next_action_message_test.rb +0 -34
- data/test/unit/message/ping_message_test.rb +0 -18
- data/test/unit/message_test.rb +0 -15
- data/test/unit/query/after_test.rb +0 -89
- data/test/unit/query/on_test.rb +0 -71
- data/test/unit/query/selection_test.rb +0 -273
- data/test/unit/query_test.rb +0 -182
- data/test/unit/skydb_test.rb +0 -20
@@ -1,63 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class Lua
|
4
|
-
class Aggregate < SkyDB::Message
|
5
|
-
########################################################################
|
6
|
-
#
|
7
|
-
# Constructor
|
8
|
-
#
|
9
|
-
########################################################################
|
10
|
-
|
11
|
-
# Initializes the 'lua::aggregate' message.
|
12
|
-
#
|
13
|
-
# @param [String] source the Lua source to execute.
|
14
|
-
def initialize(source=nil, options={})
|
15
|
-
super('lua::aggregate')
|
16
|
-
self.source = source
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
##########################################################################
|
21
|
-
#
|
22
|
-
# Attributes
|
23
|
-
#
|
24
|
-
##########################################################################
|
25
|
-
|
26
|
-
##################################
|
27
|
-
# Source
|
28
|
-
##################################
|
29
|
-
|
30
|
-
# The Lua source code.
|
31
|
-
attr_reader :source
|
32
|
-
|
33
|
-
def source=(value)
|
34
|
-
@source = value.to_s
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
##########################################################################
|
39
|
-
#
|
40
|
-
# Methods
|
41
|
-
#
|
42
|
-
##########################################################################
|
43
|
-
|
44
|
-
####################################
|
45
|
-
# Encoding
|
46
|
-
####################################
|
47
|
-
|
48
|
-
# Encodes the message body.
|
49
|
-
#
|
50
|
-
# @param [IO] buffer the buffer to write the header to.
|
51
|
-
def encode_body(buffer)
|
52
|
-
buffer << {
|
53
|
-
:source => source
|
54
|
-
}.to_msgpack
|
55
|
-
end
|
56
|
-
|
57
|
-
def process_response(response)
|
58
|
-
return response['data']
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/skydb/message/multi.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class Multi < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'multi' message.
|
11
|
-
def initialize(options={})
|
12
|
-
super('multi')
|
13
|
-
self.messages = []
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
##########################################################################
|
18
|
-
#
|
19
|
-
# Attributes
|
20
|
-
#
|
21
|
-
##########################################################################
|
22
|
-
|
23
|
-
##################################
|
24
|
-
# Messages
|
25
|
-
##################################
|
26
|
-
|
27
|
-
# A list of message to send to the server.
|
28
|
-
attr_accessor :messages
|
29
|
-
|
30
|
-
|
31
|
-
##########################################################################
|
32
|
-
#
|
33
|
-
# Methods
|
34
|
-
#
|
35
|
-
##########################################################################
|
36
|
-
|
37
|
-
####################################
|
38
|
-
# Encoding
|
39
|
-
####################################
|
40
|
-
|
41
|
-
# Encodes the message body.
|
42
|
-
#
|
43
|
-
# @param [IO] buffer the buffer to write to.
|
44
|
-
def encode_body(buffer)
|
45
|
-
# Encode the message count.
|
46
|
-
buffer << {
|
47
|
-
:count => messages.length
|
48
|
-
}.to_msgpack
|
49
|
-
|
50
|
-
# Encode all the messages.
|
51
|
-
messages.each do |message|
|
52
|
-
message.encode(buffer)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class NextActions < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'next action' message.
|
11
|
-
#
|
12
|
-
# @param [Array] prior_action_ids the prior action ids.
|
13
|
-
def initialize(prior_action_ids=nil, options={})
|
14
|
-
super('next_actions')
|
15
|
-
self.prior_action_ids = prior_action_ids
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
##########################################################################
|
20
|
-
#
|
21
|
-
# Attributes
|
22
|
-
#
|
23
|
-
##########################################################################
|
24
|
-
|
25
|
-
##################################
|
26
|
-
# Prior Action IDs
|
27
|
-
##################################
|
28
|
-
|
29
|
-
# The prior action ids.
|
30
|
-
attr_reader :prior_action_ids
|
31
|
-
|
32
|
-
def prior_action_ids=(value)
|
33
|
-
@prior_action_ids = value.is_a?(Array) ? value : []
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
##########################################################################
|
38
|
-
#
|
39
|
-
# Methods
|
40
|
-
#
|
41
|
-
##########################################################################
|
42
|
-
|
43
|
-
####################################
|
44
|
-
# Encoding
|
45
|
-
####################################
|
46
|
-
|
47
|
-
# Encodes the message body.
|
48
|
-
#
|
49
|
-
# @param [IO] buffer the buffer to write the header to.
|
50
|
-
def encode_body(buffer)
|
51
|
-
buffer << prior_action_ids.to_msgpack
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/lib/skydb/message/ping.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class Ping < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'ping' message.
|
11
|
-
def initialize(options={})
|
12
|
-
super('ping')
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
########################################################################
|
17
|
-
#
|
18
|
-
# Methods
|
19
|
-
#
|
20
|
-
########################################################################
|
21
|
-
|
22
|
-
##################################
|
23
|
-
# Validation
|
24
|
-
##################################
|
25
|
-
|
26
|
-
# A flag stating if the table is required for this type of message.
|
27
|
-
def require_table?
|
28
|
-
return false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/skydb/property/type.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Property
|
3
|
-
class Type
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constants
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
OBJECT = 1
|
11
|
-
|
12
|
-
ACTION = 2
|
13
|
-
|
14
|
-
|
15
|
-
########################################################################
|
16
|
-
#
|
17
|
-
# Static Methods
|
18
|
-
#
|
19
|
-
########################################################################
|
20
|
-
|
21
|
-
# Encodes the type into it's numeric enum value.
|
22
|
-
#
|
23
|
-
# @param type [Symbol] the type.
|
24
|
-
# @return [Fixnum] the enum value for the property type.
|
25
|
-
def self.encode(type)
|
26
|
-
return nil unless [:object, :action].index(type)
|
27
|
-
return type == :object ? OBJECT : ACTION
|
28
|
-
end
|
29
|
-
|
30
|
-
# Decodes the numeric enum value into its symbol.
|
31
|
-
#
|
32
|
-
# @param value [Fixnum] the numeric enum value.
|
33
|
-
# @return [Symbol] the type symbol.
|
34
|
-
def self.decode(value)
|
35
|
-
return nil unless [OBJECT, ACTION].index(value)
|
36
|
-
return value == OBJECT ? :object : :action
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/skydb/query.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
require 'skydb/query/selection'
|
2
|
-
require 'skydb/query/condition'
|
3
|
-
require 'skydb/query/after_condition'
|
4
|
-
require 'skydb/query/on_condition'
|
5
|
-
require 'skydb/query/validation_error'
|
6
|
-
|
7
|
-
class SkyDB
|
8
|
-
# The Query object represents a high level abstraction of how data is
|
9
|
-
# processed and retrieved from the database. It is inspired by ActiveRecord
|
10
|
-
# in the sense that commands can be chained together.
|
11
|
-
#
|
12
|
-
# The query is not executed until the execute() method is called.
|
13
|
-
class Query
|
14
|
-
##########################################################################
|
15
|
-
#
|
16
|
-
# Constructor
|
17
|
-
#
|
18
|
-
##########################################################################
|
19
|
-
|
20
|
-
def initialize(options={})
|
21
|
-
self.client = options[:client]
|
22
|
-
self.selection = options[:selection]
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
##########################################################################
|
27
|
-
#
|
28
|
-
# Attributes
|
29
|
-
#
|
30
|
-
##########################################################################
|
31
|
-
|
32
|
-
# The client that is used for executing the query.
|
33
|
-
attr_accessor :client
|
34
|
-
|
35
|
-
# The properties that should be selected from the database.
|
36
|
-
attr_reader :selection
|
37
|
-
|
38
|
-
def selection=(value)
|
39
|
-
@selection = value
|
40
|
-
value.query = self unless value.nil?
|
41
|
-
return value
|
42
|
-
end
|
43
|
-
|
44
|
-
# The number of idle seconds that separates sessions.
|
45
|
-
attr_accessor :session_idle_time
|
46
|
-
|
47
|
-
|
48
|
-
##########################################################################
|
49
|
-
#
|
50
|
-
# Methods
|
51
|
-
#
|
52
|
-
##########################################################################
|
53
|
-
|
54
|
-
####################################
|
55
|
-
# Helpers
|
56
|
-
####################################
|
57
|
-
|
58
|
-
# Creates and appends a new selection to the query.
|
59
|
-
#
|
60
|
-
# @param [String] fields A list of fields to add to the selection.
|
61
|
-
#
|
62
|
-
# @return [Selection] The newly created selection object is returned.
|
63
|
-
def select(*fields)
|
64
|
-
self.selection = SkyDB::Query::Selection.new()
|
65
|
-
selection.select(*fields)
|
66
|
-
return selection
|
67
|
-
end
|
68
|
-
|
69
|
-
# Sets the session idle seconds and returns the query object.
|
70
|
-
#
|
71
|
-
# @param [Fixnum] seconds The number of idle seconds.
|
72
|
-
#
|
73
|
-
# @return [Query] The query object is returned.
|
74
|
-
def session(seconds)
|
75
|
-
self.session_idle_time = seconds
|
76
|
-
return self
|
77
|
-
end
|
78
|
-
|
79
|
-
|
80
|
-
####################################
|
81
|
-
# Execution
|
82
|
-
####################################
|
83
|
-
|
84
|
-
# Executes the query and returns the resulting data.
|
85
|
-
def execute
|
86
|
-
# Generate the Lua code for this query.
|
87
|
-
code = codegen()
|
88
|
-
|
89
|
-
# Send it to the server.
|
90
|
-
results = client.aggregate(code)
|
91
|
-
|
92
|
-
# Return the results.
|
93
|
-
return results
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
####################################
|
98
|
-
# Validation
|
99
|
-
####################################
|
100
|
-
|
101
|
-
# Validates that all the elements of the query are valid.
|
102
|
-
def validate!
|
103
|
-
selection.validate!
|
104
|
-
end
|
105
|
-
|
106
|
-
|
107
|
-
####################################
|
108
|
-
# Codegen
|
109
|
-
####################################
|
110
|
-
|
111
|
-
# Generates the Lua code that represents the query.
|
112
|
-
def codegen
|
113
|
-
# Lookup all actions & properties.
|
114
|
-
lookup_identifiers()
|
115
|
-
|
116
|
-
# Validate everything in query before proceeding.
|
117
|
-
validate!
|
118
|
-
|
119
|
-
# Generate selection.
|
120
|
-
code = []
|
121
|
-
code << selection.codegen()
|
122
|
-
|
123
|
-
# Generate aggregate() function.
|
124
|
-
code << "function aggregate(cursor, data)"
|
125
|
-
code << " cursor:set_session_idle(#{session_idle_time.to_i})" if session_idle_time.to_i > 0
|
126
|
-
code << " select_all(cursor, data)"
|
127
|
-
code << "end"
|
128
|
-
code << ""
|
129
|
-
|
130
|
-
return code.join("\n")
|
131
|
-
end
|
132
|
-
|
133
|
-
|
134
|
-
####################################
|
135
|
-
# Serialization
|
136
|
-
####################################
|
137
|
-
|
138
|
-
# Serializes the query object into a JSON string.
|
139
|
-
def to_json(*a); to_hash.to_json(*a); end
|
140
|
-
|
141
|
-
# Serializes the query object into a hash.
|
142
|
-
def to_hash(*a)
|
143
|
-
hash = {}
|
144
|
-
hash['selections'] = [selection.to_hash(*a)] unless selection.nil?
|
145
|
-
hash['sessionIdleTime'] = session_idle_time.to_i
|
146
|
-
hash
|
147
|
-
end
|
148
|
-
|
149
|
-
# Deserializes the query object into a hash.
|
150
|
-
def from_hash(hash, *a)
|
151
|
-
return if hash.nil?
|
152
|
-
selection_hash, x = *hash['selections']
|
153
|
-
self.selection = SkyDB::Query::Selection.new.from_hash(selection_hash)
|
154
|
-
self.session_idle_time = hash['sessionIdleTime'].to_i
|
155
|
-
return self
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
####################################
|
160
|
-
# Utility
|
161
|
-
####################################
|
162
|
-
|
163
|
-
# Generates a sequence number used for uniquely naming objects and
|
164
|
-
# functions in the query.
|
165
|
-
def nextseq
|
166
|
-
@sequence = (@sequence || 0) + 1
|
167
|
-
end
|
168
|
-
|
169
|
-
# Looks up all actions and properties that are missing an identifier.
|
170
|
-
def lookup_identifiers
|
171
|
-
# Find all the actions on the selection that are missing an id.
|
172
|
-
actions = []
|
173
|
-
actions.concat(selection.get_identifiers())
|
174
|
-
|
175
|
-
# Lookup all the actions.
|
176
|
-
if actions.length > 0
|
177
|
-
client.lookup(:actions => actions)
|
178
|
-
end
|
179
|
-
|
180
|
-
return nil
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Query
|
3
|
-
# The 'after' condition filters out selection only after the condition
|
4
|
-
# has been fulfilled.
|
5
|
-
class AfterCondition < SkyDB::Query::Condition
|
6
|
-
##########################################################################
|
7
|
-
#
|
8
|
-
# Constructor
|
9
|
-
#
|
10
|
-
##########################################################################
|
11
|
-
|
12
|
-
def initialize(action=nil, options={})
|
13
|
-
options.merge!(action.is_a?(Hash) ? action : {:action => action})
|
14
|
-
super(options)
|
15
|
-
self.within = options[:within]
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
##########################################################################
|
20
|
-
#
|
21
|
-
# Attributes
|
22
|
-
#
|
23
|
-
##########################################################################
|
24
|
-
|
25
|
-
attr_accessor :within
|
26
|
-
|
27
|
-
|
28
|
-
##########################################################################
|
29
|
-
#
|
30
|
-
# Methods
|
31
|
-
#
|
32
|
-
##########################################################################
|
33
|
-
|
34
|
-
##################################
|
35
|
-
# Validation
|
36
|
-
##################################
|
37
|
-
|
38
|
-
# Validates that the object is correct before executing a codegen.
|
39
|
-
def validate!
|
40
|
-
# Do not allow the :enter action. That is reserved for the 'On'
|
41
|
-
# condition.
|
42
|
-
if action == :enter
|
43
|
-
raise SkyDB::Query::ValidationError.new("Enter actions cannot be used with an 'after' condition. Please use an 'on' condition instead.")
|
44
|
-
end
|
45
|
-
|
46
|
-
super
|
47
|
-
|
48
|
-
return nil
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
##################################
|
53
|
-
# Codegen
|
54
|
-
##################################
|
55
|
-
|
56
|
-
# Generates Lua code to match a given action.
|
57
|
-
def codegen(options={})
|
58
|
-
header, body, footer = "function #{function_name.to_s}(cursor, data)\n", [], "end\n"
|
59
|
-
within_unit = (within.nil? ? nil : within[:unit])
|
60
|
-
|
61
|
-
# Find the matching event and then move to the next one for selection.
|
62
|
-
body << "if cursor:eos() or cursor:eof() then return false end"
|
63
|
-
body << "remaining = #{within[:quantity].to_i}" if within_unit == 'step'
|
64
|
-
body << "repeat"
|
65
|
-
body << " if remaining <= 0 then return false end" if within_unit == 'step'
|
66
|
-
body << " if cursor.event.action_id == #{action.id.to_i} then"
|
67
|
-
body << " cursor:next()"
|
68
|
-
body << " return true"
|
69
|
-
body << " end"
|
70
|
-
body << " remaining = remaining - 1" if within_unit == 'step'
|
71
|
-
body << "until not cursor:next()"
|
72
|
-
body << "return false"
|
73
|
-
|
74
|
-
# Indent body and return.
|
75
|
-
body.map! {|line| " " + line}
|
76
|
-
return header + body.join("\n") + "\n" + footer
|
77
|
-
end
|
78
|
-
|
79
|
-
|
80
|
-
####################################
|
81
|
-
# Serialization
|
82
|
-
####################################
|
83
|
-
|
84
|
-
# Serializes the condition into a hash.
|
85
|
-
def to_hash(*a)
|
86
|
-
json = super(*a)
|
87
|
-
json['within'] = within.to_hash(*a) unless within.nil?
|
88
|
-
json
|
89
|
-
end
|
90
|
-
|
91
|
-
# Deserializes the condition from a hash.
|
92
|
-
def from_hash(hash, *a)
|
93
|
-
super(hash, *a)
|
94
|
-
return nil if hash.nil?
|
95
|
-
|
96
|
-
hash['within']._symbolize_keys! unless hash['within'].nil?
|
97
|
-
self.within = hash['within']
|
98
|
-
|
99
|
-
return self
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|