skydb 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/bin/sky +85 -0
  2. data/lib/ext/hash.rb +11 -0
  3. data/lib/ext/treetop.rb +19 -0
  4. data/lib/skydb.rb +10 -3
  5. data/lib/skydb/client.rb +92 -28
  6. data/lib/skydb/import.rb +7 -0
  7. data/lib/skydb/import/importer.rb +258 -0
  8. data/lib/skydb/import/transforms/sky.yml +20 -0
  9. data/lib/skydb/import/transforms/snowplow.yml +1 -0
  10. data/lib/skydb/import/translator.rb +119 -0
  11. data/lib/skydb/message.rb +17 -12
  12. data/lib/skydb/message/create_table.rb +64 -0
  13. data/lib/skydb/message/delete_table.rb +66 -0
  14. data/lib/skydb/message/get_table.rb +74 -0
  15. data/lib/skydb/message/lookup.rb +79 -0
  16. data/lib/skydb/property.rb +5 -5
  17. data/lib/skydb/query.rb +198 -0
  18. data/lib/skydb/query/after.rb +103 -0
  19. data/lib/skydb/query/ast/selection_field_syntax_node.rb +26 -0
  20. data/lib/skydb/query/ast/selection_fields_syntax_node.rb +16 -0
  21. data/lib/skydb/query/ast/selection_group_syntax_node.rb +16 -0
  22. data/lib/skydb/query/ast/selection_groups_syntax_node.rb +16 -0
  23. data/lib/skydb/query/selection.rb +268 -0
  24. data/lib/skydb/query/selection_field.rb +74 -0
  25. data/lib/skydb/query/selection_fields_grammar.treetop +46 -0
  26. data/lib/skydb/query/selection_fields_parse_error.rb +30 -0
  27. data/lib/skydb/query/selection_group.rb +57 -0
  28. data/lib/skydb/query/selection_groups_grammar.treetop +31 -0
  29. data/lib/skydb/query/selection_groups_parse_error.rb +30 -0
  30. data/lib/skydb/query/validation_error.rb +8 -0
  31. data/lib/skydb/table.rb +69 -0
  32. data/lib/skydb/version.rb +1 -1
  33. data/test/import/importer_test.rb +42 -0
  34. data/test/import/translator_test.rb +88 -0
  35. data/test/message/add_event_message_test.rb +1 -1
  36. data/test/message/add_property_message_test.rb +2 -2
  37. data/test/message/create_table_message_test.rb +34 -0
  38. data/test/message/delete_table_message_test.rb +34 -0
  39. data/test/message/get_table_message_test.rb +19 -0
  40. data/test/message/lookup_message_test.rb +27 -0
  41. data/test/message_test.rb +1 -1
  42. data/test/query/after_test.rb +71 -0
  43. data/test/query/selection_test.rb +273 -0
  44. data/test/query_test.rb +156 -0
  45. data/test/test_helper.rb +3 -0
  46. metadata +129 -3
@@ -12,7 +12,7 @@ class TestMessageAddEvent < MiniTest::Unit::TestCase
12
12
 
13
13
  def test_encode
14
14
  buffer = StringIO.new
15
- @message.table = "users"
15
+ @message.table_name = "users"
16
16
  @message.event = SkyDB::Event.new(
17
17
  object_id: 12,
18
18
  timestamp:DateTime.parse('2010-01-02T10:30:20Z'),
@@ -27,14 +27,14 @@ class TestMessageAddProperty < MiniTest::Unit::TestCase
27
27
 
28
28
  def test_encode_object_property
29
29
  buffer = StringIO.new
30
- @message.property = SkyDB::Property.new(0, :object, 'Int', 'foo')
30
+ @message.property = SkyDB::Property.new(:type => :object, :data_type => 'Int', :name => 'foo')
31
31
  @message.encode(buffer)
32
32
  assert_bytes "\x93\x01\xacadd_property\xa0\x84\xa2id\x00\xa4type\x01\xa8dataType\xa3Int\xa4name\xa3foo", buffer
33
33
  end
34
34
 
35
35
  def test_encode_action_property
36
36
  buffer = StringIO.new
37
- @message.property = SkyDB::Property.new(0, :action, 'Boolean', 'foo')
37
+ @message.property = SkyDB::Property.new(:type => :action, :data_type => 'Boolean', :name => 'foo')
38
38
  @message.encode(buffer)
39
39
  assert_bytes "\x93\x01\xacadd_property\xa0\x84\xa2id\x00\xa4type\x02\xa8dataType\xa7Boolean\xa4name\xa3foo", buffer
40
40
  end
@@ -0,0 +1,34 @@
1
+ # encoding: binary
2
+ require 'test_helper'
3
+
4
+ class TestMessageCreateTable < MiniTest::Unit::TestCase
5
+ def setup
6
+ @message = SkyDB::Message::CreateTable.new()
7
+ end
8
+
9
+ ######################################
10
+ # Action
11
+ ######################################
12
+
13
+ def test_table
14
+ @message.table = SkyDB::Table.new('foo')
15
+ refute_nil @message.table
16
+ end
17
+
18
+ def test_invalid_table
19
+ @message.table = "foo"
20
+ assert_nil @message.table
21
+ end
22
+
23
+
24
+ ######################################
25
+ # Encoding
26
+ ######################################
27
+
28
+ def test_encode
29
+ buffer = StringIO.new
30
+ @message.table = SkyDB::Table.new("foo", :tablet_count => 8)
31
+ @message.encode(buffer)
32
+ assert_bytes "\x93\x01\xaccreate_table\xa0\x82\xa4name\xa3foo\xactablet_count\x08", buffer
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: binary
2
+ require 'test_helper'
3
+
4
+ class TestMessageDeleteTable < MiniTest::Unit::TestCase
5
+ def setup
6
+ @message = SkyDB::Message::DeleteTable.new()
7
+ end
8
+
9
+ ######################################
10
+ # Action
11
+ ######################################
12
+
13
+ def test_table
14
+ @message.table = SkyDB::Table.new('foo')
15
+ refute_nil @message.table
16
+ end
17
+
18
+ def test_invalid_table
19
+ @message.table = "foo"
20
+ assert_nil @message.table
21
+ end
22
+
23
+
24
+ ######################################
25
+ # Encoding
26
+ ######################################
27
+
28
+ def test_encode
29
+ buffer = StringIO.new
30
+ @message.table = SkyDB::Table.new("foo")
31
+ @message.encode(buffer)
32
+ assert_bytes "\x93\x01\xacdelete_table\xa0\x81\xa4name\xa3foo", buffer
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: binary
2
+ require 'test_helper'
3
+
4
+ class TestMessageGetTable < MiniTest::Unit::TestCase
5
+ def setup
6
+ @message = SkyDB::Message::GetTable.new()
7
+ end
8
+
9
+ ######################################
10
+ # Encoding
11
+ ######################################
12
+
13
+ def test_encode
14
+ buffer = StringIO.new
15
+ @message.name = "foo"
16
+ @message.encode(buffer)
17
+ assert_bytes "\x93\x01\xa9get_table\xa0\x81\xa4name\xa3foo", buffer
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: binary
2
+ require 'test_helper'
3
+
4
+ class TestMessageLookup < MiniTest::Unit::TestCase
5
+ def setup
6
+ @message = SkyDB::Message::Lookup.new()
7
+ end
8
+
9
+ ######################################
10
+ # Encoding
11
+ ######################################
12
+
13
+ def test_encode
14
+ buffer = StringIO.new
15
+ @message.actions = [
16
+ SkyDB::Action.new(:name => 'foo'),
17
+ SkyDB::Action.new(:name => 'bar'),
18
+ ]
19
+ @message.properties = [
20
+ SkyDB::Property.new(:name => 'xxx'),
21
+ SkyDB::Property.new(:name => 'yyy'),
22
+ SkyDB::Property.new(:name => 'zzz'),
23
+ ]
24
+ @message.encode(buffer)
25
+ assert_bytes "\x93\x01\xa6lookup\xa0\x82\xabactionNames\x92\xa3foo\xa3bar\xadpropertyNames\x93\xa3xxx\xa3yyy\xa3zzz", buffer
26
+ end
27
+ end
data/test/message_test.rb CHANGED
@@ -8,7 +8,7 @@ class TestMessage < MiniTest::Unit::TestCase
8
8
 
9
9
  def test_encode
10
10
  buffer = StringIO.new
11
- @message.table = "users"
11
+ @message.table_name = "users"
12
12
  @message.encode(buffer)
13
13
  assert_bytes "\x93\x01\xa3xyz\xa5users", buffer
14
14
  end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ class TestQueryAfter < MiniTest::Unit::TestCase
4
+ ##############################################################################
5
+ #
6
+ # Setup / Teardown
7
+ #
8
+ ##############################################################################
9
+
10
+ def setup
11
+ @after = SkyDB::Query::After.new()
12
+ end
13
+
14
+
15
+ ##############################################################################
16
+ #
17
+ # Tests
18
+ #
19
+ ##############################################################################
20
+
21
+ ######################################
22
+ # Validation
23
+ ######################################
24
+
25
+ def test_validate_action
26
+ e = assert_raises(SkyDB::Query::ValidationError) do
27
+ SkyDB::Query::After.new(:function_name => "foo").validate!
28
+ end
29
+ assert_match /^Action with non-zero identifier required/, e.message
30
+ end
31
+
32
+ def test_validate_function_name
33
+ e = assert_raises(SkyDB::Query::ValidationError) do
34
+ SkyDB::Query::After.new(:action => 10).validate!
35
+ end
36
+ assert_match /^Invalid function name ''/, e.message
37
+ end
38
+
39
+
40
+ ######################################
41
+ # Code Generation
42
+ ######################################
43
+
44
+ def test_codegen
45
+ @after = SkyDB::Query::After.new(:action => 10, :function_name => "foo")
46
+ expected =
47
+ <<-BLOCK.unindent
48
+ function foo(cursor, data)
49
+ repeat
50
+ if cursor.event.action_id == 10 then
51
+ cursor:next()
52
+ return true
53
+ end
54
+ until not cursor:next()
55
+ return false
56
+ end
57
+ BLOCK
58
+ assert_equal expected, @after.codegen()
59
+ end
60
+
61
+ def test_codegen_enter
62
+ @after = SkyDB::Query::After.new(:action => :enter, :function_name => "foo")
63
+ expected =
64
+ <<-BLOCK.unindent
65
+ function foo(cursor, data)
66
+ return (cursor.session_event_index == 0)
67
+ end
68
+ BLOCK
69
+ assert_equal expected, @after.codegen()
70
+ end
71
+ end
@@ -0,0 +1,273 @@
1
+ require 'test_helper'
2
+
3
+ class TestQuerySelection < MiniTest::Unit::TestCase
4
+ ##############################################################################
5
+ #
6
+ # Setup / Teardown
7
+ #
8
+ ##############################################################################
9
+
10
+ def setup
11
+ @selection = SkyDB::Query::Selection.new()
12
+ end
13
+
14
+
15
+ ##############################################################################
16
+ #
17
+ # Tests
18
+ #
19
+ ##############################################################################
20
+
21
+ ######################################
22
+ # Field parsing
23
+ ######################################
24
+
25
+ def test_parse_single_field
26
+ fields = SkyDB::Query::Selection.parse_fields("foo")
27
+ assert_equal 1, fields.length
28
+ assert_equal "foo", fields[0].expression
29
+ end
30
+
31
+ def test_parse_multiple_fields
32
+ fields = SkyDB::Query::Selection.parse_fields(" foo , bar, baz_12 ")
33
+ assert_equal 3, fields.length
34
+ assert_equal "foo", fields[0].expression
35
+ assert_equal "bar", fields[1].expression
36
+ assert_equal "baz_12", fields[2].expression
37
+ end
38
+
39
+ def test_parse_aliased_fields
40
+ fields = SkyDB::Query::Selection.parse_fields("foo bar, baz bat")
41
+ assert_equal 2, fields.length
42
+ assert_equal "foo", fields[0].expression
43
+ assert_equal "bar", fields[0].alias_name
44
+ assert_equal "baz", fields[1].expression
45
+ assert_equal "bat", fields[1].alias_name
46
+ end
47
+
48
+ def test_parse_aggregated_fields
49
+ fields = SkyDB::Query::Selection.parse_fields("sum(foo), MIN(bar)")
50
+ assert_equal 2, fields.length
51
+ assert_equal "foo", fields[0].expression
52
+ assert_equal :sum, fields[0].aggregation_type
53
+ assert_equal "bar", fields[1].expression
54
+ assert_equal :min, fields[1].aggregation_type
55
+ end
56
+
57
+ def test_parse_aliased_aggregated_fields
58
+ fields = SkyDB::Query::Selection.parse_fields("sum(foo) baz, MIN(bar) bat")
59
+ assert_equal 2, fields.length
60
+ assert_equal "foo", fields[0].expression
61
+ assert_equal "baz", fields[0].alias_name
62
+ assert_equal :sum, fields[0].aggregation_type
63
+ assert_equal "bar", fields[1].expression
64
+ assert_equal "bat", fields[1].alias_name
65
+ assert_equal :min, fields[1].aggregation_type
66
+ end
67
+
68
+
69
+ ######################################
70
+ # Group parsing
71
+ ######################################
72
+
73
+ def test_parse_single_group
74
+ groups = SkyDB::Query::Selection.parse_groups("foo")
75
+ assert_equal 1, groups.length
76
+ assert_equal "foo", groups[0].expression
77
+ end
78
+
79
+ def test_parse_multiple_groups
80
+ groups = SkyDB::Query::Selection.parse_groups("foo, bar")
81
+ assert_equal 2, groups.length
82
+ assert_equal "foo", groups[0].expression
83
+ assert_equal "bar", groups[1].expression
84
+ end
85
+
86
+
87
+
88
+ ######################################
89
+ # Aggregation Generation
90
+ ######################################
91
+
92
+ def test_simple_codegen
93
+ @selection.fields = SkyDB::Query::Selection.parse_fields("foo, bar my_alias")
94
+ expected =
95
+ <<-BLOCK.unindent
96
+ function select(cursor, data)
97
+ target = data
98
+ target.foo = cursor.event.foo()
99
+ target.my_alias = cursor.event.bar()
100
+ end
101
+ BLOCK
102
+ assert_equal expected, @selection.codegen_select()
103
+ end
104
+
105
+ def test_count_codegen
106
+ @selection.fields = SkyDB::Query::Selection.parse_fields("count() bar")
107
+ expected =
108
+ <<-BLOCK.unindent
109
+ function select(cursor, data)
110
+ target = data
111
+ target.bar = (target.bar or 0) + 1
112
+ end
113
+ BLOCK
114
+ assert_equal expected, @selection.codegen_select()
115
+ end
116
+
117
+ def test_sum_codegen
118
+ @selection.fields = SkyDB::Query::Selection.parse_fields("SUM(foo) bar")
119
+ expected =
120
+ <<-BLOCK.unindent
121
+ function select(cursor, data)
122
+ target = data
123
+ target.bar = (target.bar or 0) + cursor.event.foo()
124
+ end
125
+ BLOCK
126
+ assert_equal expected, @selection.codegen_select()
127
+ end
128
+
129
+ def test_min_codegen
130
+ @selection.fields = SkyDB::Query::Selection.parse_fields("min(foo) bar")
131
+ expected =
132
+ <<-BLOCK.unindent
133
+ function select(cursor, data)
134
+ target = data
135
+ if(target.bar == nil or target.bar > cursor.event.foo()) then
136
+ target.bar = cursor.event.foo()
137
+ end
138
+ end
139
+ BLOCK
140
+ assert_equal expected, @selection.codegen_select()
141
+ end
142
+
143
+ def test_max_codegen
144
+ @selection.fields = SkyDB::Query::Selection.parse_fields("min(foo) bar")
145
+ expected =
146
+ <<-BLOCK.unindent
147
+ function select(cursor, data)
148
+ target = data
149
+ if(target.bar == nil or target.bar > cursor.event.foo()) then
150
+ target.bar = cursor.event.foo()
151
+ end
152
+ end
153
+ BLOCK
154
+ assert_equal expected, @selection.codegen_select()
155
+ end
156
+
157
+ def test_grouped_codegen
158
+ @selection.fields = SkyDB::Query::Selection.parse_fields("foo, bar my_alias")
159
+ @selection.groups = SkyDB::Query::Selection.parse_groups("baz")
160
+ expected =
161
+ <<-BLOCK.unindent
162
+ function select(cursor, data)
163
+ target = data
164
+
165
+ group_value = cursor.event.baz()
166
+ if target[group_value] == nil then
167
+ target[group_value] = {}
168
+ end
169
+ target = target[group_value]
170
+
171
+ target.foo = cursor.event.foo()
172
+ target.my_alias = cursor.event.bar()
173
+ end
174
+ BLOCK
175
+ assert_equal expected, @selection.codegen_select()
176
+ end
177
+
178
+ def test_multiple_group_codegen
179
+ @selection.fields = SkyDB::Query::Selection.parse_fields("foo, bar my_alias")
180
+ @selection.groups = SkyDB::Query::Selection.parse_groups("aaa, bbb, ccc")
181
+ expected =
182
+ <<-BLOCK.unindent
183
+ function select(cursor, data)
184
+ target = data
185
+
186
+ group_value = cursor.event.aaa()
187
+ if target[group_value] == nil then
188
+ target[group_value] = {}
189
+ end
190
+ target = target[group_value]
191
+
192
+ group_value = cursor.event.bbb()
193
+ if target[group_value] == nil then
194
+ target[group_value] = {}
195
+ end
196
+ target = target[group_value]
197
+
198
+ group_value = cursor.event.ccc()
199
+ if target[group_value] == nil then
200
+ target[group_value] = {}
201
+ end
202
+ target = target[group_value]
203
+
204
+ target.foo = cursor.event.foo()
205
+ target.my_alias = cursor.event.bar()
206
+ end
207
+ BLOCK
208
+ assert_equal expected, @selection.codegen_select()
209
+ end
210
+
211
+
212
+ ######################################
213
+ # Merge Codegen
214
+ ######################################
215
+
216
+ def test_simple_merge_codegen
217
+ @selection.fields = SkyDB::Query::Selection.parse_fields("foo, sum(bar) my_alias, count(), min(x), max(y)")
218
+ expected =
219
+ <<-BLOCK.unindent
220
+ function merge(results, data)
221
+ a = results
222
+ b = data
223
+ a.foo = b.foo
224
+ a.my_alias = (a.my_alias or 0) + (b.my_alias or 0)
225
+ a.count = (a.count or 0) + (b.count or 0)
226
+ if(a.x == nil or a.x > b.x) then
227
+ a.x = b.x
228
+ end
229
+ if(a.y == nil or a.y < b.y) then
230
+ a.y = b.y
231
+ end
232
+ end
233
+ BLOCK
234
+ assert_equal expected, @selection.codegen_merge()
235
+ end
236
+
237
+ def test_grouped_merge_codegen
238
+ @selection = SkyDB::Query::Selection.new.select("sum(foo), count()").group_by(:bar)
239
+ expected =
240
+ <<-BLOCK.unindent
241
+ function merge(results, data)
242
+ for k0,v0 in pairs(data) do
243
+ if results[k0] == nil then results[k0] = {} end
244
+ a = results[k0]
245
+ b = data[k0]
246
+ a.foo = (a.foo or 0) + (b.foo or 0)
247
+ a.count = (a.count or 0) + (b.count or 0)
248
+ end
249
+ end
250
+ BLOCK
251
+ assert_equal expected, @selection.codegen_merge()
252
+ end
253
+
254
+ def test_multigroup_merge_codegen
255
+ @selection = SkyDB::Query::Selection.new.select("sum(foo), count()").group_by(:bar, :baz)
256
+ expected =
257
+ <<-BLOCK.unindent
258
+ function merge(results, data)
259
+ for k0,v0 in pairs(data) do
260
+ if results[k0] == nil then results[k0] = {} end
261
+ for k1,v1 in pairs(data[k0]) do
262
+ if results[k0][k1] == nil then results[k0][k1] = {} end
263
+ a = results[k0][k1]
264
+ b = data[k0][k1]
265
+ a.foo = (a.foo or 0) + (b.foo or 0)
266
+ a.count = (a.count or 0) + (b.count or 0)
267
+ end
268
+ end
269
+ end
270
+ BLOCK
271
+ assert_equal expected, @selection.codegen_merge()
272
+ end
273
+ end