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,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
|