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.
Files changed (84) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +165 -1
  3. data/lib/skydb.rb +18 -61
  4. data/lib/skydb/client.rb +186 -186
  5. data/lib/skydb/event.rb +47 -76
  6. data/lib/skydb/property.rb +34 -67
  7. data/lib/skydb/table.rb +121 -41
  8. data/lib/skydb/version.rb +1 -1
  9. data/test/integration/client_test.rb +88 -0
  10. data/test/test_helper.rb +3 -51
  11. data/test/unit/client_test.rb +135 -32
  12. metadata +17 -278
  13. data/bin/sky +0 -89
  14. data/lib/ext/hash.rb +0 -11
  15. data/lib/ext/string.rb +0 -11
  16. data/lib/ext/treetop.rb +0 -19
  17. data/lib/skydb/action.rb +0 -76
  18. data/lib/skydb/import.rb +0 -7
  19. data/lib/skydb/import/importer.rb +0 -435
  20. data/lib/skydb/import/transforms/apache.yml +0 -4
  21. data/lib/skydb/import/transforms/sky.yml +0 -28
  22. data/lib/skydb/import/transforms/snowplow.yml +0 -1
  23. data/lib/skydb/import/translator.rb +0 -119
  24. data/lib/skydb/message.rb +0 -146
  25. data/lib/skydb/message/add_action.rb +0 -53
  26. data/lib/skydb/message/add_event.rb +0 -72
  27. data/lib/skydb/message/add_property.rb +0 -55
  28. data/lib/skydb/message/create_table.rb +0 -64
  29. data/lib/skydb/message/delete_table.rb +0 -66
  30. data/lib/skydb/message/get_action.rb +0 -55
  31. data/lib/skydb/message/get_actions.rb +0 -38
  32. data/lib/skydb/message/get_properties.rb +0 -38
  33. data/lib/skydb/message/get_property.rb +0 -55
  34. data/lib/skydb/message/get_table.rb +0 -74
  35. data/lib/skydb/message/get_tables.rb +0 -43
  36. data/lib/skydb/message/lookup.rb +0 -79
  37. data/lib/skydb/message/lua/aggregate.rb +0 -63
  38. data/lib/skydb/message/multi.rb +0 -57
  39. data/lib/skydb/message/next_actions.rb +0 -55
  40. data/lib/skydb/message/ping.rb +0 -32
  41. data/lib/skydb/property/type.rb +0 -40
  42. data/lib/skydb/query.rb +0 -183
  43. data/lib/skydb/query/after_condition.rb +0 -104
  44. data/lib/skydb/query/ast/selection_field_syntax_node.rb +0 -26
  45. data/lib/skydb/query/ast/selection_fields_syntax_node.rb +0 -16
  46. data/lib/skydb/query/ast/selection_group_syntax_node.rb +0 -16
  47. data/lib/skydb/query/ast/selection_groups_syntax_node.rb +0 -16
  48. data/lib/skydb/query/condition.rb +0 -113
  49. data/lib/skydb/query/on_condition.rb +0 -53
  50. data/lib/skydb/query/selection.rb +0 -398
  51. data/lib/skydb/query/selection_field.rb +0 -99
  52. data/lib/skydb/query/selection_fields_grammar.treetop +0 -46
  53. data/lib/skydb/query/selection_fields_parse_error.rb +0 -30
  54. data/lib/skydb/query/selection_group.rb +0 -78
  55. data/lib/skydb/query/selection_groups_grammar.treetop +0 -31
  56. data/lib/skydb/query/selection_groups_parse_error.rb +0 -30
  57. data/lib/skydb/query/validation_error.rb +0 -8
  58. data/lib/skydb/timestamp.rb +0 -22
  59. data/test/integration/query_test.rb +0 -102
  60. data/test/unit/event_test.rb +0 -32
  61. data/test/unit/import/importer_test.rb +0 -208
  62. data/test/unit/import/translator_test.rb +0 -88
  63. data/test/unit/message/add_action_message_test.rb +0 -34
  64. data/test/unit/message/add_event_message_test.rb +0 -35
  65. data/test/unit/message/add_property_message_test.rb +0 -41
  66. data/test/unit/message/create_table_message_test.rb +0 -34
  67. data/test/unit/message/delete_table_message_test.rb +0 -34
  68. data/test/unit/message/get_action_message_test.rb +0 -34
  69. data/test/unit/message/get_actions_message_test.rb +0 -18
  70. data/test/unit/message/get_properties_message_test.rb +0 -18
  71. data/test/unit/message/get_property_message_test.rb +0 -34
  72. data/test/unit/message/get_table_message_test.rb +0 -19
  73. data/test/unit/message/get_tables_message_test.rb +0 -18
  74. data/test/unit/message/lookup_message_test.rb +0 -27
  75. data/test/unit/message/lua_aggregate_message_test.rb +0 -19
  76. data/test/unit/message/multi_message_test.rb +0 -22
  77. data/test/unit/message/next_action_message_test.rb +0 -34
  78. data/test/unit/message/ping_message_test.rb +0 -18
  79. data/test/unit/message_test.rb +0 -15
  80. data/test/unit/query/after_test.rb +0 -89
  81. data/test/unit/query/on_test.rb +0 -71
  82. data/test/unit/query/selection_test.rb +0 -273
  83. data/test/unit/query_test.rb +0 -182
  84. data/test/unit/skydb_test.rb +0 -20
@@ -6,14 +6,12 @@ class SkyDB
6
6
  #
7
7
  ##########################################################################
8
8
 
9
- # Initializes an event object.
9
+ # Initializes the event.
10
10
  def initialize(options={})
11
- self.object_id = options[:object_id]
12
- self.timestamp = options[:timestamp]
13
- self.action = options[:action]
14
- self.data = options[:data]
11
+ self.timestamp = options[:timestamp] || DateTime.now
12
+ self.data = options[:data] || {}
15
13
  end
16
-
14
+
17
15
 
18
16
  ##########################################################################
19
17
  #
@@ -21,90 +19,63 @@ class SkyDB
21
19
  #
22
20
  ##########################################################################
23
21
 
24
- ##################################
25
- # Object ID
26
- ##################################
22
+ # The moment the event occurred.
23
+ attr_accessor :timestamp
27
24
 
28
- # The object identifier.
29
- attr_accessor :object_id
30
-
31
- ##################################
32
- # Timestamp
33
- ##################################
25
+ # The data associated with the event.
26
+ attr_accessor :data
34
27
 
35
- # The timestamp of when the event occurred.
36
- attr_reader :timestamp
37
-
38
- def timestamp=(value)
39
- @timestamp = value.to_time if value.class.method_defined?(:to_time)
28
+ # The timestamp as ISO8601 formatted string with fractional seconds.
29
+ def formatted_timestamp()
30
+ return SkyDB.format_timestamp(timestamp)
40
31
  end
41
32
 
42
- ##################################
43
- # Action
44
- ##################################
45
33
 
46
- # The hash containing action related information (including the name of
47
- # the action being performed).
48
- attr_reader :action
49
-
50
- def action=(value)
51
- clone = {}
34
+ ##########################################################################
35
+ #
36
+ # Methods
37
+ #
38
+ ##########################################################################
52
39
 
53
- # Copy over keys
54
- if !value.nil?
55
- value.each_pair do |k, v|
56
- # Only copy keys with valid value types.
57
- if v.is_a?(String) || v.is_a?(Fixnum) || v.is_a?(Float) || v == true || v == false
58
- clone[k] = value[k]
59
- end
60
- end
61
- end
40
+ ####################################
41
+ # Encoding
42
+ ####################################
62
43
 
63
- # Only set the data if we have keys.
64
- @action = clone.keys.length > 0 ? clone : nil
44
+ # Encodes the event into a hash.
45
+ def to_hash(*a)
46
+ {
47
+ 'timestamp' => formatted_timestamp,
48
+ 'data' => data
49
+ }
65
50
  end
66
51
 
67
- ##################################
68
- # Data
69
- ##################################
70
-
71
- # A hash of data properties to set on the event. Properties can only be
72
- # a String, Fixnum, Float or Boolean.
73
- attr_reader :data
74
-
75
- def data=(value)
76
- clone = {}
77
-
78
- # Copy over keys
79
- if !value.nil?
80
- value.each_pair do |k, v|
81
- # Only copy keys with valid value types.
82
- if v.is_a?(String) || v.is_a?(Fixnum) || v.is_a?(Float) || v == true || v == false
83
- clone[k] = value[k]
84
- end
85
- end
86
- end
87
-
88
- # Only set the data if we have keys.
89
- @data = clone.keys.length > 0 ? clone : nil
52
+ # Decodes a hash into a event.
53
+ def from_hash(hash, *a)
54
+ self.timestamp = !hash.nil? ? parse_timestamp(hash['timestamp']) : Time.now.utc.to_datetime()
55
+ self.data = !hash.nil? ? hash['data'] : {}
56
+ return self
90
57
  end
91
58
 
59
+ def as_json(*a); return to_hash(*a); end
60
+ def to_json(*a); return as_json(*a).to_json; end
92
61
 
93
- ##########################################################################
62
+ ####################################
63
+ # Timestamp
64
+ ####################################
65
+
66
+ # Parses an ISO8601 date string with fractional seconds.
94
67
  #
95
- # Methods
68
+ # @param [String] str The date string to parse.
96
69
  #
97
- ##########################################################################
98
-
99
- # Encodes the event into MsgPack format.
100
- def to_msgpack
101
- obj = {
102
- :objectId => object_id.to_msgpack,
103
- :timestamp => SkyDB::Timestamp.to_timestamp(timestamp)
104
- }
105
- obj[:action] = action unless action.nil? || action.empty?
106
- obj[:data] = data unless data.nil? || data.empty?
107
- return obj.to_msgpack
70
+ # @return [DateTime] The parsed date.
71
+ def parse_timestamp(str)
72
+ # Try to parse with fractional seconds first and then fallback to
73
+ # a regular ISO8601 format.
74
+ begin
75
+ return DateTime.strptime(str, '%Y-%m-%dT%H:%M:%S.%NZ')
76
+ rescue ArgumentError
77
+ return DateTime.strptime(str, '%Y-%m-%dT%H:%M:%SZ')
78
+ end
108
79
  end
109
80
  end
110
81
  end
@@ -1,5 +1,3 @@
1
- require 'skydb/property/type'
2
-
3
1
  class SkyDB
4
2
  class Property
5
3
  ##########################################################################
@@ -10,10 +8,10 @@ class SkyDB
10
8
 
11
9
  # Initializes the property.
12
10
  def initialize(options={})
13
- self.id = options[:id]
14
- self.type = options[:type]
15
- self.data_type = options[:data_type]
11
+ self.id = options[:id].to_i
16
12
  self.name = options[:name]
13
+ self.transient = options[:transient] || false
14
+ self.data_type = options[:data_type] || "string"
17
15
  end
18
16
 
19
17
 
@@ -23,55 +21,17 @@ class SkyDB
23
21
  #
24
22
  ##########################################################################
25
23
 
26
- ##################################
27
- # ID
28
- ##################################
29
-
30
24
  # The property identifier.
31
- attr_reader :id
32
-
33
- def id=(value)
34
- @id = value.to_i
35
- end
36
-
37
-
38
- ##################################
39
- # Type
40
- ##################################
41
-
42
- # The property type. This can be either :object or :action.
43
- attr_reader :type
44
-
45
- def type=(value)
46
- value = :object unless [:object, :action].index(value)
47
- @type = value
48
- end
49
-
50
-
51
- ##################################
52
- # Data Type
53
- ##################################
54
-
55
- # The property data type. This can be either 'String', 'Int', 'Float',
56
- # or 'Boolean'.
57
- attr_reader :data_type
58
-
59
- def data_type=(value)
60
- value = nil unless ['String', 'Int', 'Float', 'Boolean'].index(value)
61
- @data_type = value
62
- end
25
+ attr_accessor :id
63
26
 
27
+ # The name of the property.
28
+ attr_accessor :name
64
29
 
65
- ##################################
66
- # Name
67
- ##################################
30
+ # A flag stating if the value of the property only exists for a single moment.
31
+ attr_accessor :transient
68
32
 
69
- # The name of the property.
70
- attr_reader :name
71
-
72
- def name=(value)
73
- @name = value.to_s
74
- end
33
+ # The property's data type.
34
+ attr_accessor :data_type
75
35
 
76
36
 
77
37
  ##########################################################################
@@ -79,25 +39,32 @@ class SkyDB
79
39
  # Methods
80
40
  #
81
41
  ##########################################################################
82
-
83
- # Encodes the property into MsgPack format.
84
- def to_msgpack
85
- return {
86
- id:id,
87
- type:SkyDB::Property::Type.encode(type),
88
- dataType:data_type,
89
- name:name
90
- }.to_msgpack
91
- end
92
42
 
93
- # Encodes the property into JSON format.
94
- def to_json(*a)
95
- {
96
- 'id' => id,
97
- 'type' => type,
43
+ ####################################
44
+ # Encoding
45
+ ####################################
46
+
47
+ # Encodes the property into a hash.
48
+ def to_hash(*a)
49
+ hash = {
50
+ 'name' => name,
51
+ 'transient' => transient,
98
52
  'dataType' => data_type,
99
- 'name' => name
100
- }.to_json(*a)
53
+ }
54
+ hash['id'] = id if id < 0 || id > 0
55
+ return hash
101
56
  end
57
+
58
+ # Decodes a hash into a property.
59
+ def from_hash(hash, *a)
60
+ self.id = !hash.nil? ? hash['id'].to_i : 0
61
+ self.name = !hash.nil? ? hash['name'] : ''
62
+ self.transient = !hash.nil? ? hash['transient'] : false
63
+ self.data_type = !hash.nil? ? hash['dataType'] : ''
64
+ return self
65
+ end
66
+
67
+ def as_json(*a); return to_hash(*a); end
68
+ def to_json(*a); return as_json(*a).to_json; end
102
69
  end
103
70
  end
@@ -2,75 +2,155 @@ class SkyDB
2
2
  class Table
3
3
  ##########################################################################
4
4
  #
5
- # Constants
5
+ # Constructor
6
6
  #
7
7
  ##########################################################################
8
8
 
9
- DEFAULT_TABLET_COUNT = 4
9
+ # Initializes the table.
10
+ def initialize(options={})
11
+ self.client = options[:client]
12
+ self.name = options[:name]
13
+ end
10
14
 
11
15
 
12
16
  ##########################################################################
13
17
  #
14
- # Constructor
18
+ # Attributes
15
19
  #
16
20
  ##########################################################################
17
21
 
18
- # Initializes the table.
19
- def initialize(name='', options={})
20
- self.name = name
21
- self.tablet_count = options[:tablet_count].to_i
22
- end
23
-
22
+ # The client this table is associated with.
23
+ attr_accessor :client
24
+
25
+ # The name of the table.
26
+ attr_accessor :name
27
+
24
28
 
25
29
  ##########################################################################
26
30
  #
27
- # Attributes
31
+ # Methods
28
32
  #
29
33
  ##########################################################################
30
34
 
31
- ##################################
32
- # Name
33
- ##################################
35
+ ####################################
36
+ # Property API
37
+ ####################################
34
38
 
35
- # The name of the table.
36
- attr_reader :name
37
-
38
- def name=(value)
39
- @name = value.to_s
39
+ # Retrieves a list of all properties for the table.
40
+ #
41
+ # @return [Array] the list of properties on the table.
42
+ def get_properties(options={})
43
+ raise ArgumentError.new("Table not associated with client") if client.nil?
44
+ return client.get_properties(self, options)
40
45
  end
41
46
 
47
+ # Retrieves a single property by name from the table.
48
+ #
49
+ # @param [String] name The name of the property to retrieve.
50
+ #
51
+ # @return [Array] the list of properties on the table.
52
+ def get_property(name, options={})
53
+ raise ArgumentError.new("Table not associated with client") if client.nil?
54
+ return client.get_property(self, name, options)
55
+ end
42
56
 
43
- ##################################
44
- # Tablet count
45
- ##################################
57
+ # Creates a property on a table.
58
+ #
59
+ # @param [Property] property the property to create.
60
+ def create_property(property, options={})
61
+ raise ArgumentError.new("Table not associated with client") if client.nil?
62
+ return client.create_property(self, property, options)
63
+ end
46
64
 
47
- # The number of tablets the table has
48
- attr_reader :tablet_count
49
-
50
- def tablet_count=(value)
51
- @tablet_count = value.to_i || DEFAULT_TABLET_COUNT
65
+ # Updates a property on a table.
66
+ #
67
+ # @param [Property] property the property to update.
68
+ def update_property(property, options={})
69
+ raise ArgumentError.new("Table not associated with client") if client.nil?
70
+ return client.update_property(self, property, options)
52
71
  end
53
72
 
73
+ # Deletes a property on a table.
74
+ #
75
+ # @param [Property] property the property to delete.
76
+ def delete_property(property, options={})
77
+ raise ArgumentError.new("Table not associated with client") if client.nil?
78
+ return client.delete_property(self, property, options)
79
+ end
54
80
 
55
- ##########################################################################
81
+
82
+ ####################################
83
+ # Event API
84
+ ####################################
85
+
86
+ # Retrieves all events for a given object.
56
87
  #
57
- # Methods
88
+ # @return [Array] the list of events on the table.
89
+ def get_events(object_id, options={})
90
+ raise ArgumentError.new("Table not associated with client") if client.nil?
91
+ return client.get_events(self, object_id, options)
92
+ end
93
+
94
+ # Retrieves the event that occurred at a given point in time for an object.
58
95
  #
59
- ##########################################################################
60
-
61
- # Encodes the table into MsgPack format.
62
- def to_msgpack
63
- return {
64
- name: name,
65
- tablet_count: tablet_count
66
- }.to_msgpack
96
+ # @return [Event] the event.
97
+ def get_event(object_id, timestamp, options={})
98
+ raise ArgumentError.new("Table not associated with client") if client.nil?
99
+ return client.get_event(self, object_id, timestamp, options)
67
100
  end
68
101
 
69
- # Encodes the table into JSON format.
70
- def to_json(*a)
71
- {
72
- 'name' => name
73
- }.to_json(*a)
102
+ # Adds an event to an object.
103
+ #
104
+ # @param [String] object_id the object's identifier.
105
+ # @param [Event] event the event to add.
106
+ #
107
+ # @return [Event] the event.
108
+ def add_event(object_id, event, options={})
109
+ raise ArgumentError.new("Table not associated with client") if client.nil?
110
+ return client.add_event(self, object_id, event, options)
111
+ end
112
+
113
+ # Deletes an event for an object on a table.
114
+ #
115
+ # @param [String] object_id the object's identifier.
116
+ # @param [Event] event the event to delete.
117
+ def delete_event(object_id, event, options={})
118
+ raise ArgumentError.new("Table not associated with client") if client.nil?
119
+ return client.delete_event(self, object_id, event, options)
74
120
  end
121
+
122
+
123
+ ####################################
124
+ # Query API
125
+ ####################################
126
+
127
+ # Runs a query against a given table.
128
+ #
129
+ # @param [Hash] q The query definition to run.
130
+ #
131
+ # @return [Results] the results of the query.
132
+ def query(q)
133
+ raise ArgumentError.new("Table not associated with client") if client.nil?
134
+ return client.query(self, q)
135
+ end
136
+
137
+
138
+ ####################################
139
+ # Encoding
140
+ ####################################
141
+
142
+ # Encodes the table into a hash.
143
+ def to_hash(*a)
144
+ {'name' => name}
145
+ end
146
+
147
+ # Decodes a hash into a table.
148
+ def from_hash(hash, *a)
149
+ self.name = hash.nil? ? '' : hash['name']
150
+ return self
151
+ end
152
+
153
+ def as_json(*a); return to_hash(*a); end
154
+ def to_json(*a); return as_json(*a).to_json; end
75
155
  end
76
156
  end