skydb 0.2.3 → 0.3.0
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.
- 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
|
-
|