sequel-impala 1.0.1 → 1.1.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/lib/impala.rb +14 -6
  4. data/lib/impala/connection.rb +46 -23
  5. data/lib/impala/cursor.rb +48 -4
  6. data/lib/impala/progress_reporter.rb +40 -0
  7. data/lib/impala/protocol/beeswax_constants.rb +1 -1
  8. data/lib/impala/protocol/beeswax_service.rb +1 -20
  9. data/lib/impala/protocol/beeswax_types.rb +1 -1
  10. data/lib/impala/protocol/exec_stats_constants.rb +13 -0
  11. data/lib/impala/protocol/exec_stats_types.rb +133 -0
  12. data/lib/impala/protocol/facebook_service.rb +3 -3
  13. data/lib/impala/protocol/fb303_constants.rb +1 -1
  14. data/lib/impala/protocol/fb303_types.rb +1 -1
  15. data/lib/impala/protocol/hive_metastore_constants.rb +1 -1
  16. data/lib/impala/protocol/hive_metastore_types.rb +1 -1
  17. data/lib/impala/protocol/impala_hive_server2_service.rb +111 -3
  18. data/lib/impala/protocol/impala_service.rb +67 -1
  19. data/lib/impala/protocol/impala_service_constants.rb +1 -1
  20. data/lib/impala/protocol/impala_service_types.rb +109 -7
  21. data/lib/impala/protocol/status_constants.rb +1 -1
  22. data/lib/impala/protocol/status_types.rb +1 -1
  23. data/lib/impala/protocol/t_c_l_i_service.rb +884 -724
  24. data/lib/impala/protocol/t_c_l_i_service_constants.rb +72 -0
  25. data/lib/impala/protocol/t_c_l_i_service_types.rb +1799 -0
  26. data/lib/impala/protocol/thrift_hive_metastore.rb +1 -1
  27. data/lib/impala/protocol/types_constants.rb +13 -0
  28. data/lib/impala/protocol/types_types.rb +332 -0
  29. data/lib/impala/sasl_transport.rb +117 -0
  30. data/lib/impala/thrift_patch.rb +42 -0
  31. data/lib/rbhive/connection.rb +25 -25
  32. data/lib/rbhive/explain_result.rb +9 -9
  33. data/lib/rbhive/schema_definition.rb +12 -12
  34. data/lib/rbhive/t_c_l_i_connection.rb +28 -26
  35. data/lib/rbhive/t_c_l_i_schema_definition.rb +1 -1
  36. data/lib/rbhive/table_schema.rb +1 -1
  37. data/lib/sequel/adapters/impala.rb +63 -6
  38. data/lib/sequel/adapters/jdbc/hive2.rb +1 -1
  39. data/lib/sequel/adapters/rbhive.rb +3 -2
  40. data/lib/sequel/adapters/shared/impala.rb +133 -25
  41. data/lib/thrift/sasl_client_transport.rb +2 -2
  42. data/lib/thrift/thrift_hive.rb +2 -2
  43. data/lib/thrift/thrift_hive_metastore.rb +2 -2
  44. data/spec/dataset_test.rb +85 -85
  45. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +1 -1
  46. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +1 -1
  47. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +1 -1
  48. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +1 -1
  49. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +1 -1
  50. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +1 -1
  51. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +1 -1
  52. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +1 -1
  53. data/spec/files/integer_migrations/001_create_sessions.rb +1 -1
  54. data/spec/files/integer_migrations/002_create_nodes.rb +1 -1
  55. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +1 -1
  56. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +1 -1
  57. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +1 -1
  58. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +1 -1
  59. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +1 -1
  60. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +1 -1
  61. data/spec/migrator_test.rb +2 -2
  62. data/spec/prepared_statement_test.rb +12 -12
  63. data/spec/schema_test.rb +6 -6
  64. data/spec/type_test.rb +8 -8
  65. metadata +30 -11
  66. data/CHANGELOG +0 -19
  67. data/lib/impala/protocol/cli_service_constants.rb +0 -60
  68. data/lib/impala/protocol/cli_service_types.rb +0 -1452
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03ea5f2607bc4908064302d49640df3a4e34eaa3
4
- data.tar.gz: 18c93756bb5918f32cb6f32612856963f634e966
3
+ metadata.gz: 8c663975ad49b8b733ca3dc6df8bb14960f52844
4
+ data.tar.gz: 6d044a81b67c39eb7176dc5fd1422427713d3ac0
5
5
  SHA512:
6
- metadata.gz: 72ca2b1c7177ecc8c2db06e8b266f4a1ff67085cf7ef77d464e6b7667ce896870d905a691acf4fc2b34e67c90777dc3767cc9b3a1e3a2a9252967beaf507b566
7
- data.tar.gz: fb15a8bf19c03e54179666df88da7ffc0f0be90d48a65ada20722da03f46c4fa26d910a2f3c554a93149ea29f92f565fa3bbeb43b875c8ceacfcf413b64aa161
6
+ metadata.gz: 9fd026394ec7f9fce434ff4490b2aa78d8a00237cb338af52bf0b58a11d4da1cd28aefdfd7d1c8a62c607bdc9c2a80b945377540683f4456af91ecb67998971f
7
+ data.tar.gz: 5e14cdd9f9fcee4ef7ecf89176e96dc3feece4f530b862be6e0b44bac801a9d71ad5cc65327b0145591fc5e9533f8d46d797f676422fc1f2970f3424c6a62168
@@ -0,0 +1,45 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [1.1.0] - 2016-11-08
5
+
6
+ ### Added
7
+ - Database#compute_stats
8
+ - Database#values
9
+ - Database#refresh
10
+ - Database#invalidate_search_path
11
+ - Database#set
12
+ - Database#{profile/profile_for} (jeremyevans)
13
+ - Database#except_strategy (jeremyevans)
14
+ - Support for Kerberizing impala-ruby (colinmarc)
15
+ - Support for QueryID from impala-ruby
16
+ - Support for Sequel::Mock
17
+ - Experimental support for progress
18
+
19
+ ### Changed
20
+ - Change types of integer/biginteger to int/bigint
21
+ - Enable keepalive on connection to database
22
+ - Format of this [CHANGELOG](http://keepachangelog.com/en/0.3.0/)
23
+ - Updated thrift (colinmarc)
24
+ - Intersect uses INNER JOIN
25
+
26
+ ## [1.0.1] - 2016-09-20
27
+
28
+ ### Added
29
+ - rbhive adapter (jeremyevans)
30
+ - :empty_null=>:ruby option to csv_to_parquet extension, which can support quoted CSV cells (jeremyevans)
31
+
32
+ ### Fixed
33
+ - Disconnect detection in impala and rbhive adapters (jeremyevans)
34
+ - :search_path option handling when using Sequel::SQL::AliasedExpressions (jeremyevans)
35
+ - Make implicit qualify return an SQL::Identifier if given an unqualified string (jeremyevans)
36
+ - Speed up multi_insert and import (jeremyevans)
37
+ - Optimize csv_to_parquet extension by not spawning shells or unnecessary processes (jeremyevans)
38
+
39
+ ### Changed
40
+ - Transfer ownership of gem over to Outcomes Insights (aguynamedryan)
41
+
42
+ ## [1.0.0] - 2015-12-04
43
+
44
+ ### Added
45
+ - Initial public release
@@ -10,16 +10,24 @@ require 'impala/version'
10
10
  require 'thrift'
11
11
  require 'time'
12
12
  require 'impala/protocol'
13
+ begin
14
+ require 'impala/sasl_transport'
15
+ rescue LoadError
16
+ # gssapi not supported by operating system, continue as impala adapter
17
+ # can be used in buffered (non-SASL) mode.
18
+ end
19
+ require 'impala/progress_reporter'
13
20
  require 'impala/cursor'
14
21
  require 'impala/connection'
22
+ require 'impala/thrift_patch'
15
23
 
16
24
  module Impala
17
25
  DEFAULT_HOST = 'localhost'
18
26
  DEFAULT_PORT = 21000
19
- class Error < StandardError; end
20
- class InvalidQueryError < Error; end
21
- class ConnectionError < Error; end
22
- class CursorError < Error; end
27
+ class InvalidQueryError < StandardError; end
28
+ class ConnectionError < StandardError; end
29
+ class CursorError < StandardError; end
30
+ class ParsingError < StandardError; end
23
31
 
24
32
  # Connect to an Impala server. If a block is given, it will close the
25
33
  # connection after yielding the connection to the block.
@@ -29,8 +37,8 @@ module Impala
29
37
  # finishes
30
38
  # @return [Connection] the open connection, or, if a block is
31
39
  # passed, the return value of the block
32
- def self.connect(host=DEFAULT_HOST, port=DEFAULT_PORT)
33
- connection = Connection.new(host, port)
40
+ def self.connect(host=DEFAULT_HOST, port=DEFAULT_PORT, options={})
41
+ connection = Connection.new(host, port, options)
34
42
 
35
43
  if block_given?
36
44
  begin
@@ -2,13 +2,15 @@ module Impala
2
2
  # This object represents a connection to an Impala server. It can be used to
3
3
  # perform queries on the database.
4
4
  class Connection
5
- LOG_CONTEXT_ID = "impala-ruby"
5
+ attr_accessor :host, :port
6
6
 
7
7
  # Don't instantiate Connections directly; instead, use {Impala.connect}.
8
- def initialize(host, port)
8
+ def initialize(host, port, options={})
9
9
  @host = host
10
10
  @port = port
11
11
  @connected = false
12
+ @options = options.dup
13
+ @options[:transport] ||= :buffered
12
14
  open
13
15
  end
14
16
 
@@ -20,9 +22,7 @@ module Impala
20
22
  def open
21
23
  return if @connected
22
24
 
23
- socket = Thrift::Socket.new(@host, @port)
24
-
25
- @transport = Thrift::BufferedTransport.new(socket)
25
+ @transport = thrift_transport(host, port)
26
26
  @transport.open
27
27
 
28
28
  proto = Thrift::BinaryProtocol.new(@transport)
@@ -30,6 +30,39 @@ module Impala
30
30
  @connected = true
31
31
  end
32
32
 
33
+ def thrift_transport(server, port)
34
+ socket = thrift_socket(server, port, @options[:timeout])
35
+
36
+ case @options[:transport]
37
+ when :buffered
38
+ return Thrift::BufferedTransport.new(socket)
39
+ when :sasl
40
+ opts = parse_sasl_params(@options[:sasl_params])
41
+ mechanism = opts.delete(:mechanism)
42
+ return SASLTransport.new(socket, mechanism, opts)
43
+ else
44
+ raise "Unrecognised transport type '#{@options[:transport]}'"
45
+ end
46
+ end
47
+
48
+ def thrift_socket(server, port, timeout)
49
+ socket = Thrift::Socket.new(server, port)
50
+ socket.timeout = timeout
51
+ socket
52
+ end
53
+
54
+ # Processes SASL connection params and returns a hash with symbol keys or a nil
55
+ def parse_sasl_params(sasl_params)
56
+ # Symbilize keys in a hash
57
+ if sasl_params.kind_of?(Hash)
58
+ return sasl_params.inject({}) do |memo,(k,v)|
59
+ memo[k.to_sym] = v;
60
+ memo
61
+ end
62
+ end
63
+ return nil
64
+ end
65
+
33
66
  # Close this connection. It can still be reopened with {#open}.
34
67
  def close
35
68
  return unless @connected
@@ -73,8 +106,13 @@ module Impala
73
106
  query = sanitize_query(raw_query)
74
107
  handle = send_query(query, query_options)
75
108
 
76
- check_result(handle)
77
- Cursor.new(handle, @service)
109
+ cursor = Cursor.new(handle, @service, @options)
110
+ cursor.wait!
111
+ cursor
112
+ end
113
+
114
+ def close_handle(handle)
115
+ @service.close(handle)
78
116
  end
79
117
 
80
118
  private
@@ -96,22 +134,7 @@ module Impala
96
134
  "#{key.upcase}=#{value}"
97
135
  end
98
136
 
99
- @service.executeAndWait(query, LOG_CONTEXT_ID)
100
- end
101
-
102
- def check_result(handle)
103
- state = @service.get_state(handle)
104
- if state == Protocol::Beeswax::QueryState::EXCEPTION
105
- close_handle(handle)
106
- raise ConnectionError.new("The query was aborted")
107
- end
108
- rescue
109
- close_handle(handle)
110
- raise
111
- end
112
-
113
- def close_handle(handle)
114
- @service.close(handle)
137
+ @service.query(query)
115
138
  end
116
139
  end
117
140
  end
@@ -39,11 +39,11 @@ module Impala
39
39
 
40
40
  NULL = 'NULL'.freeze
41
41
 
42
- attr_reader :columns
43
-
44
42
  attr_reader :typecast_map
45
43
 
46
- def initialize(handle, service)
44
+ attr_reader :handle
45
+
46
+ def initialize(handle, service, options = {})
47
47
  @handle = handle
48
48
  @service = service
49
49
 
@@ -52,7 +52,13 @@ module Impala
52
52
  @done = false
53
53
  @open = true
54
54
  @typecast_map = TYPECAST_MAP.dup
55
- @columns = metadata.schema.fieldSchemas.map(&:name)
55
+ @options = options.dup
56
+ @progress_reporter = ProgressReporter.new(self, @options)
57
+ @poll_every = options.fetch(:poll_every, 0.1)
58
+ end
59
+
60
+ def columns
61
+ @columns ||= metadata.schema.fieldSchemas.map(&:name)
56
62
  end
57
63
 
58
64
  def inspect
@@ -100,6 +106,22 @@ module Impala
100
106
  @open
101
107
  end
102
108
 
109
+ # Returns true if the query is done running, and results can be fetched.
110
+ def query_done?
111
+ [
112
+ Protocol::Beeswax::QueryState::EXCEPTION,
113
+ Protocol::Beeswax::QueryState::FINISHED
114
+ ].include?(@service.get_state(@handle))
115
+ end
116
+
117
+ # Blocks until the query done running.
118
+ def wait!
119
+ until query_done?
120
+ periodic_callback
121
+ sleep @poll_every
122
+ end
123
+ end
124
+
103
125
  # Returns true if there are any more rows to fetch.
104
126
  def has_more?
105
127
  !@done || !@row_buffer.empty?
@@ -109,8 +131,25 @@ module Impala
109
131
  @service.GetRuntimeProfile(@handle)
110
132
  end
111
133
 
134
+ def exec_summary
135
+ @service.GetExecSummary(@handle)
136
+ end
137
+
138
+ # Returns the progress for the query.
139
+ def progress
140
+ summary = exec_summary
141
+ summary.progress.num_completed_scan_ranges.to_f / summary.progress.total_scan_ranges.to_f
142
+ end
143
+
112
144
  private
113
145
 
146
+ attr :progress_reporter
147
+
148
+ def periodic_callback
149
+ return unless progress_reporter.show?
150
+ progress_reporter.report
151
+ end
152
+
114
153
  def metadata
115
154
  @metadata ||= @service.get_results_metadata(@handle)
116
155
  end
@@ -119,8 +158,13 @@ module Impala
119
158
  fetch_batch until @done || @row_buffer.count >= BUFFER_SIZE
120
159
  end
121
160
 
161
+ def exceptional?
162
+ @service.get_state(@handle) == Protocol::Beeswax::QueryState::EXCEPTION
163
+ end
164
+
122
165
  def fetch_batch
123
166
  raise CursorError.new("Cursor has expired or been closed") unless @open
167
+ raise ConnectionError.new("The query was aborted") if exceptional?
124
168
 
125
169
  begin
126
170
  res = @service.fetch(@handle, false, BUFFER_SIZE)
@@ -0,0 +1,40 @@
1
+ module Impala
2
+ class ProgressReporter
3
+ def initialize(cursor, options = {})
4
+ @cursor = cursor
5
+ @progress_every = options.fetch(:progress_every, 60).to_f
6
+ @show_progress = options.fetch(:show_progress, false)
7
+ @start_time = @last_progress = Time.now
8
+ end
9
+
10
+ def show?
11
+ @show_progress
12
+ end
13
+
14
+ def report
15
+ return unless enough_time_elapsed?
16
+ @last_progress = Time.now
17
+ message = sprintf("Progress %.02f%% after %.02f seconds",
18
+ cursor.progress * 100,
19
+ total_time_elapsed)
20
+ progress_stream.puts message
21
+ end
22
+
23
+ private
24
+
25
+ attr :cursor, :show_progress, :last_progress, :progress_every, :start_time
26
+
27
+ def progress_stream
28
+ return show_progress if show_progress.is_a?(IO)
29
+ STDERR
30
+ end
31
+
32
+ def enough_time_elapsed?
33
+ (Time.now - last_progress) > progress_every
34
+ end
35
+
36
+ def total_time_elapsed
37
+ (Time.now - start_time)
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Autogenerated by Thrift Compiler (0.9.1)
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
3
  #
4
4
  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
5
  #
@@ -1,5 +1,5 @@
1
1
  #
2
- # Autogenerated by Thrift Compiler (0.9.1)
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
3
  #
4
4
  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
5
  #
@@ -30,25 +30,6 @@ module Impala
30
30
  raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'query failed: unknown result')
31
31
  end
32
32
 
33
- def recv_result()
34
- result = receive_message(Query_result)
35
- raise result.error unless result.error.nil?
36
- return result if result.ready
37
- end
38
-
39
- def executeAndWait2(query, clientCtx)
40
- send_query(query)
41
- sleep_time = 0.015625
42
- max_sleep_time = 1
43
- until result = recv_result
44
- sleep(sleep_time)
45
- sleep_time *= 2 unless sleep_time >= max_sleep_time
46
- end
47
- result.success
48
- send_executeAndWait(query, clientCtx)
49
- return recv_executeAndWait()
50
- end
51
-
52
33
  def executeAndWait(query, clientCtx)
53
34
  send_executeAndWait(query, clientCtx)
54
35
  return recv_executeAndWait()
@@ -1,5 +1,5 @@
1
1
  #
2
- # Autogenerated by Thrift Compiler (0.9.1)
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
3
  #
4
4
  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
5
  #
@@ -0,0 +1,13 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'exec_stats_types'
9
+
10
+ module Impala
11
+ module Protocol
12
+ end
13
+ end
@@ -0,0 +1,133 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'status_types'
9
+ require 'types_types'
10
+
11
+
12
+ module Impala
13
+ module Protocol
14
+ module TExecState
15
+ REGISTERED = 0
16
+ PLANNING = 1
17
+ QUEUED = 2
18
+ RUNNING = 3
19
+ FINISHED = 4
20
+ CANCELLED = 5
21
+ FAILED = 6
22
+ VALUE_MAP = {0 => "REGISTERED", 1 => "PLANNING", 2 => "QUEUED", 3 => "RUNNING", 4 => "FINISHED", 5 => "CANCELLED", 6 => "FAILED"}
23
+ VALID_VALUES = Set.new([REGISTERED, PLANNING, QUEUED, RUNNING, FINISHED, CANCELLED, FAILED]).freeze
24
+ end
25
+
26
+ class TExecStats
27
+ include ::Thrift::Struct, ::Thrift::Struct_Union
28
+ LATENCY_NS = 1
29
+ CPU_TIME_NS = 2
30
+ CARDINALITY = 3
31
+ MEMORY_USED = 4
32
+
33
+ FIELDS = {
34
+ LATENCY_NS => {:type => ::Thrift::Types::I64, :name => 'latency_ns', :optional => true},
35
+ CPU_TIME_NS => {:type => ::Thrift::Types::I64, :name => 'cpu_time_ns', :optional => true},
36
+ CARDINALITY => {:type => ::Thrift::Types::I64, :name => 'cardinality', :optional => true},
37
+ MEMORY_USED => {:type => ::Thrift::Types::I64, :name => 'memory_used', :optional => true}
38
+ }
39
+
40
+ def struct_fields; FIELDS; end
41
+
42
+ def validate
43
+ end
44
+
45
+ ::Thrift::Struct.generate_accessors self
46
+ end
47
+
48
+ class TPlanNodeExecSummary
49
+ include ::Thrift::Struct, ::Thrift::Struct_Union
50
+ NODE_ID = 1
51
+ FRAGMENT_ID = 2
52
+ LABEL = 3
53
+ LABEL_DETAIL = 4
54
+ NUM_CHILDREN = 5
55
+ ESTIMATED_STATS = 6
56
+ EXEC_STATS = 7
57
+ IS_ACTIVE = 8
58
+ IS_BROADCAST = 9
59
+
60
+ FIELDS = {
61
+ NODE_ID => {:type => ::Thrift::Types::I32, :name => 'node_id'},
62
+ FRAGMENT_ID => {:type => ::Thrift::Types::I32, :name => 'fragment_id'},
63
+ LABEL => {:type => ::Thrift::Types::STRING, :name => 'label'},
64
+ LABEL_DETAIL => {:type => ::Thrift::Types::STRING, :name => 'label_detail', :optional => true},
65
+ NUM_CHILDREN => {:type => ::Thrift::Types::I32, :name => 'num_children'},
66
+ ESTIMATED_STATS => {:type => ::Thrift::Types::STRUCT, :name => 'estimated_stats', :class => ::Impala::Protocol::TExecStats, :optional => true},
67
+ EXEC_STATS => {:type => ::Thrift::Types::LIST, :name => 'exec_stats', :element => {:type => ::Thrift::Types::STRUCT, :class => ::Impala::Protocol::TExecStats}, :optional => true},
68
+ IS_ACTIVE => {:type => ::Thrift::Types::LIST, :name => 'is_active', :element => {:type => ::Thrift::Types::BOOL}, :optional => true},
69
+ IS_BROADCAST => {:type => ::Thrift::Types::BOOL, :name => 'is_broadcast', :optional => true}
70
+ }
71
+
72
+ def struct_fields; FIELDS; end
73
+
74
+ def validate
75
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field node_id is unset!') unless @node_id
76
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field fragment_id is unset!') unless @fragment_id
77
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field label is unset!') unless @label
78
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field num_children is unset!') unless @num_children
79
+ end
80
+
81
+ ::Thrift::Struct.generate_accessors self
82
+ end
83
+
84
+ class TExecProgress
85
+ include ::Thrift::Struct, ::Thrift::Struct_Union
86
+ TOTAL_SCAN_RANGES = 1
87
+ NUM_COMPLETED_SCAN_RANGES = 2
88
+
89
+ FIELDS = {
90
+ TOTAL_SCAN_RANGES => {:type => ::Thrift::Types::I64, :name => 'total_scan_ranges', :optional => true},
91
+ NUM_COMPLETED_SCAN_RANGES => {:type => ::Thrift::Types::I64, :name => 'num_completed_scan_ranges', :optional => true}
92
+ }
93
+
94
+ def struct_fields; FIELDS; end
95
+
96
+ def validate
97
+ end
98
+
99
+ ::Thrift::Struct.generate_accessors self
100
+ end
101
+
102
+ class TExecSummary
103
+ include ::Thrift::Struct, ::Thrift::Struct_Union
104
+ STATE = 1
105
+ STATUS = 2
106
+ NODES = 3
107
+ EXCH_TO_SENDER_MAP = 4
108
+ ERROR_LOGS = 5
109
+ PROGRESS = 6
110
+
111
+ FIELDS = {
112
+ STATE => {:type => ::Thrift::Types::I32, :name => 'state', :enum_class => ::Impala::Protocol::TExecState},
113
+ STATUS => {:type => ::Thrift::Types::STRUCT, :name => 'status', :class => ::Impala::Protocol::TStatus, :optional => true},
114
+ NODES => {:type => ::Thrift::Types::LIST, :name => 'nodes', :element => {:type => ::Thrift::Types::STRUCT, :class => ::Impala::Protocol::TPlanNodeExecSummary}, :optional => true},
115
+ EXCH_TO_SENDER_MAP => {:type => ::Thrift::Types::MAP, :name => 'exch_to_sender_map', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::I32}, :optional => true},
116
+ ERROR_LOGS => {:type => ::Thrift::Types::LIST, :name => 'error_logs', :element => {:type => ::Thrift::Types::STRING}, :optional => true},
117
+ PROGRESS => {:type => ::Thrift::Types::STRUCT, :name => 'progress', :class => ::Impala::Protocol::TExecProgress, :optional => true}
118
+ }
119
+
120
+ def struct_fields; FIELDS; end
121
+
122
+ def validate
123
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field state is unset!') unless @state
124
+ unless @state.nil? || ::Impala::Protocol::TExecState::VALID_VALUES.include?(@state)
125
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field state!')
126
+ end
127
+ end
128
+
129
+ ::Thrift::Struct.generate_accessors self
130
+ end
131
+
132
+ end
133
+ end