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,28 +0,0 @@
|
|
1
|
-
fields:
|
2
|
-
object_id: object_id
|
3
|
-
timestamp: timestamp:date
|
4
|
-
|
5
|
-
translate: |
|
6
|
-
def process(_input, _output)
|
7
|
-
_input.each_pair do |k, v|
|
8
|
-
if v.is_a?(Hash)
|
9
|
-
_output[k] = {}
|
10
|
-
process(v, _output[k])
|
11
|
-
else
|
12
|
-
m, prefix, field, data_type = *k.match(/^(?:(action|data)\.)?(\w+)(?:\:(\w+))?$/)
|
13
|
-
next unless ["object_id", "timestamp"].index(field).nil?
|
14
|
-
|
15
|
-
_output[prefix] ||= {} unless prefix.nil?
|
16
|
-
target = prefix.nil? ? _output : _output[prefix]
|
17
|
-
|
18
|
-
target[field] = case data_type.to_s.downcase
|
19
|
-
when "int" then v.to_i
|
20
|
-
when "float" then v.to_f
|
21
|
-
when "boolean" then (v.downcase == "true" || v.downcase == "yes" || v.downcase == "y")
|
22
|
-
when "date" then Chronic.parse(v)
|
23
|
-
else v.to_s
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
process(input, output)
|
@@ -1 +0,0 @@
|
|
1
|
-
fields:
|
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'chronic'
|
2
|
-
|
3
|
-
class SkyDB
|
4
|
-
class Import
|
5
|
-
class Translator
|
6
|
-
##########################################################################
|
7
|
-
#
|
8
|
-
# Constructor
|
9
|
-
#
|
10
|
-
##########################################################################
|
11
|
-
|
12
|
-
# Initializes the translator.
|
13
|
-
def initialize(options={})
|
14
|
-
self.input_field = options[:input_field]
|
15
|
-
self.output_field = options[:output_field]
|
16
|
-
self.format = options[:format]
|
17
|
-
self.translate_function = options[:translate_function]
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
##########################################################################
|
22
|
-
#
|
23
|
-
# Attributes
|
24
|
-
#
|
25
|
-
##########################################################################
|
26
|
-
|
27
|
-
# The name of the input field to read from.
|
28
|
-
attr_accessor :input_field
|
29
|
-
|
30
|
-
# The name of the output field to write to.
|
31
|
-
attr_accessor :output_field
|
32
|
-
|
33
|
-
# The format of the field (String, Integer, Float, Date).
|
34
|
-
attr_reader :format
|
35
|
-
|
36
|
-
def format=(value)
|
37
|
-
value = 'string' if value.nil?
|
38
|
-
value = 'int' if value == 'integer'
|
39
|
-
@format = value.to_s.downcase
|
40
|
-
end
|
41
|
-
|
42
|
-
# The translation function to execute. This can be a Proc or it can be
|
43
|
-
# a String that is evaluated into a proc with "input" and "output"
|
44
|
-
# arguments.
|
45
|
-
attr_reader :translate_function
|
46
|
-
|
47
|
-
def translate_function=(value)
|
48
|
-
# Only allow nils, procs & strings.
|
49
|
-
if !value.nil? && !value.is_a?(Proc) && !value.is_a?(String)
|
50
|
-
raise "Unable to convert #{value.class} to a translation function."
|
51
|
-
end
|
52
|
-
|
53
|
-
# If this is a string then eval it into a proc.
|
54
|
-
if value.is_a?(String)
|
55
|
-
# If there's no output field set then it's free form.
|
56
|
-
if output_field.nil?
|
57
|
-
@translate_function = eval("lambda { |input,output| #{value} }")
|
58
|
-
|
59
|
-
# If there is an output field set then make the lamda an assignment.
|
60
|
-
else
|
61
|
-
keys = output_field.is_a?(Array) ? output_field : [output_field]
|
62
|
-
keys.map! {|key| "['" + key.gsub("'", "\\'") + "']"}
|
63
|
-
@translate_function = eval("lambda { |input,output| output#{keys.join('')} = #{value.to_s} }")
|
64
|
-
end
|
65
|
-
|
66
|
-
# If this is a proc or a nil then just pass it through.
|
67
|
-
else
|
68
|
-
@translate_function = value
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
##########################################################################
|
74
|
-
#
|
75
|
-
# Methods
|
76
|
-
#
|
77
|
-
##########################################################################
|
78
|
-
|
79
|
-
# Translate a field from the input hash into a field into the
|
80
|
-
# output hash.
|
81
|
-
#
|
82
|
-
# @param [Hash] the input data.
|
83
|
-
# @param [Hash] the output data.
|
84
|
-
def translate(input, output)
|
85
|
-
# If a translation function is set then use it.
|
86
|
-
if !translate_function.nil?
|
87
|
-
translate_function.call(input, output)
|
88
|
-
|
89
|
-
# If the input field and output field are set then apply them.
|
90
|
-
elsif !input_field.nil? && !output_field.nil?
|
91
|
-
value = input[input_field]
|
92
|
-
|
93
|
-
# Navigate down to nested output hash if necessary.
|
94
|
-
if output_field.is_a?(Array)
|
95
|
-
output_field[0..-2].each do |field|
|
96
|
-
output[field] = {} unless output.has_key?(field)
|
97
|
-
output = output[field]
|
98
|
-
end
|
99
|
-
|
100
|
-
output_field = self.output_field.last
|
101
|
-
else
|
102
|
-
output_field = self.output_field
|
103
|
-
end
|
104
|
-
|
105
|
-
# Convert type.
|
106
|
-
output[output_field] = case format
|
107
|
-
when "int" then value.to_i
|
108
|
-
when "float" then value.to_f
|
109
|
-
when "boolean" then (value.downcase == "true" || value.downcase == "yes" || value.downcase == "y")
|
110
|
-
when "date" then Chronic.parse(value)
|
111
|
-
else value.to_s
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
return nil
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
data/lib/skydb/message.rb
DELETED
@@ -1,146 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
##########################################################################
|
4
|
-
#
|
5
|
-
# Constants
|
6
|
-
#
|
7
|
-
##########################################################################
|
8
|
-
|
9
|
-
# The version of the message. This must be compatible with the server's
|
10
|
-
# version for the client to work.
|
11
|
-
VERSION = 1
|
12
|
-
|
13
|
-
|
14
|
-
##########################################################################
|
15
|
-
#
|
16
|
-
# Constructor
|
17
|
-
#
|
18
|
-
##########################################################################
|
19
|
-
|
20
|
-
# Initializes the message.
|
21
|
-
def initialize(message_name)
|
22
|
-
@message_name = message_name
|
23
|
-
@table_name = ""
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
##########################################################################
|
28
|
-
#
|
29
|
-
# Attributes
|
30
|
-
#
|
31
|
-
##########################################################################
|
32
|
-
|
33
|
-
####################################
|
34
|
-
# Name
|
35
|
-
####################################
|
36
|
-
|
37
|
-
# The name of message being sent. This is defined by the subclass.
|
38
|
-
attr_reader :message_name
|
39
|
-
|
40
|
-
|
41
|
-
####################################
|
42
|
-
# Table Name
|
43
|
-
####################################
|
44
|
-
|
45
|
-
# The name of the table the message is being sent to/from.
|
46
|
-
attr_accessor :table_name
|
47
|
-
|
48
|
-
def table_name=(value)
|
49
|
-
@table_name = value.to_s
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
##########################################################################
|
54
|
-
#
|
55
|
-
# Methods
|
56
|
-
#
|
57
|
-
##########################################################################
|
58
|
-
|
59
|
-
####################################
|
60
|
-
# Validation
|
61
|
-
####################################
|
62
|
-
|
63
|
-
# A flag stating if the table is required for this type of message.
|
64
|
-
def require_table?
|
65
|
-
return true
|
66
|
-
end
|
67
|
-
|
68
|
-
# Validates that the message is ready to be sent. If any validation issues
|
69
|
-
# are found then an error is raised.
|
70
|
-
def validate!
|
71
|
-
if require_table? && (table_name.nil? || table_name.empty?)
|
72
|
-
raise SkyDB::TableRequiredError.new('Table name required')
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
####################################
|
78
|
-
# Encoding
|
79
|
-
####################################
|
80
|
-
|
81
|
-
# Encodes the message contents to a buffer.
|
82
|
-
#
|
83
|
-
# @param [IO] buffer the buffer to write to.
|
84
|
-
def encode(buffer)
|
85
|
-
buffer.set_encoding(Encoding::BINARY, Encoding::BINARY)
|
86
|
-
|
87
|
-
# Encode the header and body.
|
88
|
-
encode_header(buffer)
|
89
|
-
encode_body(buffer)
|
90
|
-
|
91
|
-
return nil
|
92
|
-
end
|
93
|
-
|
94
|
-
# Encodes the message header.
|
95
|
-
#
|
96
|
-
# @param [IO] buffer the buffer to write the header to.
|
97
|
-
def encode_header(buffer)
|
98
|
-
buffer << [
|
99
|
-
SkyDB::Message::VERSION,
|
100
|
-
message_name,
|
101
|
-
table_name
|
102
|
-
].to_msgpack
|
103
|
-
end
|
104
|
-
|
105
|
-
# Encodes the message body.
|
106
|
-
#
|
107
|
-
# @param [IO] buffer the buffer to write the header to.
|
108
|
-
def encode_body(buffer)
|
109
|
-
# To be implemented by the subclass.
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
####################################
|
114
|
-
# Response processing
|
115
|
-
####################################
|
116
|
-
|
117
|
-
# Performs any necessary post-processing on the response.
|
118
|
-
#
|
119
|
-
# @param [Object] response
|
120
|
-
def process_response(response)
|
121
|
-
return response
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
require 'skydb/message/create_table'
|
127
|
-
require 'skydb/message/delete_table'
|
128
|
-
require 'skydb/message/get_table'
|
129
|
-
require 'skydb/message/get_tables'
|
130
|
-
|
131
|
-
require 'skydb/message/add_action'
|
132
|
-
require 'skydb/message/get_action'
|
133
|
-
require 'skydb/message/get_actions'
|
134
|
-
|
135
|
-
require 'skydb/message/add_property'
|
136
|
-
require 'skydb/message/get_property'
|
137
|
-
require 'skydb/message/get_properties'
|
138
|
-
|
139
|
-
require 'skydb/message/add_event'
|
140
|
-
require 'skydb/message/next_actions'
|
141
|
-
|
142
|
-
require 'skydb/message/lua/aggregate'
|
143
|
-
|
144
|
-
require 'skydb/message/ping'
|
145
|
-
require 'skydb/message/lookup'
|
146
|
-
require 'skydb/message/multi'
|
@@ -1,53 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class AddAction < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'action add' message.
|
11
|
-
def initialize(action=nil, options={})
|
12
|
-
super('add_action')
|
13
|
-
self.action = action
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
##########################################################################
|
18
|
-
#
|
19
|
-
# Attributes
|
20
|
-
#
|
21
|
-
##########################################################################
|
22
|
-
|
23
|
-
##################################
|
24
|
-
# Action
|
25
|
-
##################################
|
26
|
-
|
27
|
-
# The action to add.
|
28
|
-
attr_reader :action
|
29
|
-
|
30
|
-
def action=(value)
|
31
|
-
@action = value if value.is_a?(Action)
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
##########################################################################
|
36
|
-
#
|
37
|
-
# Methods
|
38
|
-
#
|
39
|
-
##########################################################################
|
40
|
-
|
41
|
-
####################################
|
42
|
-
# Encoding
|
43
|
-
####################################
|
44
|
-
|
45
|
-
# Encodes the message body.
|
46
|
-
#
|
47
|
-
# @param [IO] buffer the buffer to write the header to.
|
48
|
-
def encode_body(buffer)
|
49
|
-
buffer << action.to_msgpack
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class AddEvent < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'event add' message.
|
11
|
-
#
|
12
|
-
# @param [Event] event the event to add.
|
13
|
-
def initialize(event=nil, options={})
|
14
|
-
super('add_event')
|
15
|
-
self.event = event
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
##########################################################################
|
20
|
-
#
|
21
|
-
# Attributes
|
22
|
-
#
|
23
|
-
##########################################################################
|
24
|
-
|
25
|
-
##################################
|
26
|
-
# Event
|
27
|
-
##################################
|
28
|
-
|
29
|
-
# The event to add.
|
30
|
-
attr_reader :event
|
31
|
-
|
32
|
-
def event=(value)
|
33
|
-
@event = value if value.is_a?(Event)
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
##########################################################################
|
38
|
-
#
|
39
|
-
# Methods
|
40
|
-
#
|
41
|
-
##########################################################################
|
42
|
-
|
43
|
-
####################################
|
44
|
-
# Validation
|
45
|
-
####################################
|
46
|
-
|
47
|
-
def validate!
|
48
|
-
super
|
49
|
-
|
50
|
-
if event.object_id.nil?
|
51
|
-
raise SkyDB::ObjectIdRequiredError.new('Object ID required')
|
52
|
-
end
|
53
|
-
|
54
|
-
if event.timestamp.nil?
|
55
|
-
raise SkyDB::TimestampRequiredError.new('Timestamp required')
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
####################################
|
61
|
-
# Encoding
|
62
|
-
####################################
|
63
|
-
|
64
|
-
# Encodes the message body.
|
65
|
-
#
|
66
|
-
# @param [IO] buffer the buffer to write the header to.
|
67
|
-
def encode_body(buffer)
|
68
|
-
buffer << event.to_msgpack
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
class SkyDB
|
2
|
-
class Message
|
3
|
-
class AddProperty < SkyDB::Message
|
4
|
-
########################################################################
|
5
|
-
#
|
6
|
-
# Constructor
|
7
|
-
#
|
8
|
-
########################################################################
|
9
|
-
|
10
|
-
# Initializes the 'property add' message.
|
11
|
-
#
|
12
|
-
# @param [Property] property the property to add.
|
13
|
-
def initialize(property=nil, options={})
|
14
|
-
super('add_property')
|
15
|
-
self.property = property
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
##########################################################################
|
20
|
-
#
|
21
|
-
# Attributes
|
22
|
-
#
|
23
|
-
##########################################################################
|
24
|
-
|
25
|
-
##################################
|
26
|
-
# Property
|
27
|
-
##################################
|
28
|
-
|
29
|
-
# The property to add.
|
30
|
-
attr_reader :property
|
31
|
-
|
32
|
-
def property=(value)
|
33
|
-
@property = value if value.is_a?(Property)
|
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 << property.to_msgpack
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|