impala 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +2 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +28 -0
  5. data/Rakefile +15 -0
  6. data/impala.gemspec +25 -0
  7. data/lib/impala.rb +33 -0
  8. data/lib/impala/connection.rb +93 -0
  9. data/lib/impala/cursor.rb +86 -0
  10. data/lib/impala/protocol.rb +6 -0
  11. data/lib/impala/protocol/beeswax_constants.rb +14 -0
  12. data/lib/impala/protocol/beeswax_service.rb +747 -0
  13. data/lib/impala/protocol/beeswax_types.rb +192 -0
  14. data/lib/impala/protocol/data_constants.rb +12 -0
  15. data/lib/impala/protocol/data_sinks_constants.rb +12 -0
  16. data/lib/impala/protocol/data_sinks_types.rb +107 -0
  17. data/lib/impala/protocol/data_types.rb +77 -0
  18. data/lib/impala/protocol/descriptors_constants.rb +12 -0
  19. data/lib/impala/protocol/descriptors_types.rb +266 -0
  20. data/lib/impala/protocol/exprs_constants.rb +12 -0
  21. data/lib/impala/protocol/exprs_types.rb +345 -0
  22. data/lib/impala/protocol/facebook_service.rb +706 -0
  23. data/lib/impala/protocol/fb303_constants.rb +14 -0
  24. data/lib/impala/protocol/fb303_types.rb +24 -0
  25. data/lib/impala/protocol/frontend_constants.rb +12 -0
  26. data/lib/impala/protocol/frontend_types.rb +347 -0
  27. data/lib/impala/protocol/hive_metastore_constants.rb +52 -0
  28. data/lib/impala/protocol/hive_metastore_types.rb +697 -0
  29. data/lib/impala/protocol/impala_internal_service.rb +244 -0
  30. data/lib/impala/protocol/impala_internal_service_constants.rb +12 -0
  31. data/lib/impala/protocol/impala_internal_service_types.rb +362 -0
  32. data/lib/impala/protocol/impala_plan_service.rb +310 -0
  33. data/lib/impala/protocol/impala_plan_service_constants.rb +12 -0
  34. data/lib/impala/protocol/impala_plan_service_types.rb +36 -0
  35. data/lib/impala/protocol/impala_service.rb +260 -0
  36. data/lib/impala/protocol/impala_service_constants.rb +12 -0
  37. data/lib/impala/protocol/impala_service_types.rb +46 -0
  38. data/lib/impala/protocol/java_constants_constants.rb +42 -0
  39. data/lib/impala/protocol/java_constants_types.rb +14 -0
  40. data/lib/impala/protocol/opcodes_constants.rb +12 -0
  41. data/lib/impala/protocol/opcodes_types.rb +309 -0
  42. data/lib/impala/protocol/partitions_constants.rb +12 -0
  43. data/lib/impala/protocol/partitions_types.rb +44 -0
  44. data/lib/impala/protocol/plan_nodes_constants.rb +12 -0
  45. data/lib/impala/protocol/plan_nodes_types.rb +345 -0
  46. data/lib/impala/protocol/planner_constants.rb +12 -0
  47. data/lib/impala/protocol/planner_types.rb +78 -0
  48. data/lib/impala/protocol/runtime_profile_constants.rb +12 -0
  49. data/lib/impala/protocol/runtime_profile_types.rb +97 -0
  50. data/lib/impala/protocol/state_store_service.rb +244 -0
  51. data/lib/impala/protocol/state_store_service_constants.rb +12 -0
  52. data/lib/impala/protocol/state_store_service_types.rb +185 -0
  53. data/lib/impala/protocol/state_store_subscriber_service.rb +82 -0
  54. data/lib/impala/protocol/state_store_subscriber_service_constants.rb +12 -0
  55. data/lib/impala/protocol/state_store_subscriber_service_types.rb +67 -0
  56. data/lib/impala/protocol/statestore_types_constants.rb +12 -0
  57. data/lib/impala/protocol/statestore_types_types.rb +77 -0
  58. data/lib/impala/protocol/status_constants.rb +12 -0
  59. data/lib/impala/protocol/status_types.rb +44 -0
  60. data/lib/impala/protocol/thrift_hive_metastore.rb +4707 -0
  61. data/lib/impala/protocol/types_constants.rb +12 -0
  62. data/lib/impala/protocol/types_types.rb +86 -0
  63. data/lib/impala/version.rb +3 -0
  64. data/thrift/Data.thrift +52 -0
  65. data/thrift/DataSinks.thrift +61 -0
  66. data/thrift/Descriptors.thrift +115 -0
  67. data/thrift/Exprs.thrift +134 -0
  68. data/thrift/Frontend.thrift +193 -0
  69. data/thrift/ImpalaInternalService.thrift +265 -0
  70. data/thrift/ImpalaPlanService.thrift +44 -0
  71. data/thrift/ImpalaService.thrift +105 -0
  72. data/thrift/JavaConstants.thrift +60 -0
  73. data/thrift/Opcodes.thrift +317 -0
  74. data/thrift/Partitions.thrift +41 -0
  75. data/thrift/PlanNodes.thrift +184 -0
  76. data/thrift/Planner.thrift +72 -0
  77. data/thrift/RuntimeProfile.thrift +58 -0
  78. data/thrift/StateStoreService.thrift +121 -0
  79. data/thrift/StateStoreSubscriberService.thrift +64 -0
  80. data/thrift/StatestoreTypes.thrift +50 -0
  81. data/thrift/Status.thrift +31 -0
  82. data/thrift/Types.thrift +71 -0
  83. data/thrift/beeswax.thrift +175 -0
  84. data/thrift/fb303.thrift +112 -0
  85. data/thrift/hive_metastore.thrift +528 -0
  86. metadata +206 -0
@@ -0,0 +1,41 @@
1
+ // Copyright 2012 Cloudera Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ namespace cpp impala
16
+ namespace java com.cloudera.impala.thrift
17
+ namespace rb Impala.Protocol
18
+
19
+ include "Exprs.thrift"
20
+
21
+ enum TPartitionType {
22
+ UNPARTITIONED,
23
+
24
+ // round-robin partitioning
25
+ RANDOM,
26
+
27
+ // unordered partitioning on a set of exprs
28
+ HASH_PARTITIONED,
29
+
30
+ // ordered partitioning on a list of exprs
31
+ RANGE_PARTITIONED
32
+ }
33
+
34
+ // Specification of how a single logical data stream is partitioned.
35
+ // This leaves out the parameters that determine the physical partitioning (for hash
36
+ // partitioning, the number of partitions; for range partitioning, the partitions'
37
+ // boundaries), which need to be specified by the enclosing structure/context.
38
+ struct TDataPartition {
39
+ 1: required TPartitionType type
40
+ 2: optional list<Exprs.TExpr> partitioning_exprs
41
+ }
@@ -0,0 +1,184 @@
1
+ // Copyright 2012 Cloudera Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ //
16
+ // This file contains all structs, enums, etc., that together make up
17
+ // a plan tree. All information recorded in struct TPlan and below is independent
18
+ // of the execution parameters of any one of the backends on which it is running
19
+ // (those are recorded in TPlanFragmentExecParams).
20
+
21
+ namespace cpp impala
22
+ namespace java com.cloudera.impala.thrift
23
+ namespace rb Impala.Protocol
24
+
25
+ include "Exprs.thrift"
26
+ include "Types.thrift"
27
+
28
+ enum TPlanNodeType {
29
+ HDFS_SCAN_NODE,
30
+ HBASE_SCAN_NODE,
31
+ HASH_JOIN_NODE,
32
+ AGGREGATION_NODE,
33
+ SORT_NODE,
34
+ EXCHANGE_NODE,
35
+ MERGE_NODE
36
+ }
37
+
38
+ // The information contained in subclasses of ScanNode captured in two separate
39
+ // Thrift structs:
40
+ // - TScanRange: the data range that's covered by the scan (which varies with the
41
+ // particular partition of the plan fragment of which the scan node is a part)
42
+ // - T<subclass>: all other operational parameters that are the same across
43
+ // all plan fragments
44
+
45
+ // Specification of subsection of a single hdfs file.
46
+ struct THdfsFileSplit {
47
+ // file path
48
+ 1: required string path
49
+
50
+ // starting offset
51
+ 2: required i64 offset
52
+
53
+ // length of split
54
+ 3: required i64 length
55
+
56
+ // ID of partition in parent THdfsScanNode. Meaningful only
57
+ // in the context of a single THdfsScanNode, may not be unique elsewhere.
58
+ 4: required i64 partition_id
59
+ }
60
+
61
+ // key range for single THBaseScanNode
62
+ // TODO: does 'binary' have an advantage over string? strings can
63
+ // already store binary data
64
+ struct THBaseKeyRange {
65
+ // inclusive
66
+ 1: optional string startKey
67
+
68
+ // exclusive
69
+ 2: optional string stopKey
70
+ }
71
+
72
+ // Specification of an individual data range which is held in its entirety
73
+ // by a storage server
74
+ struct TScanRange {
75
+ // one of these must be set for every TScanRange2
76
+ 1: optional THdfsFileSplit hdfs_file_split
77
+ 2: optional THBaseKeyRange hbase_key_range
78
+ }
79
+
80
+ struct THdfsScanNode {
81
+ 1: required Types.TTupleId tuple_id
82
+ }
83
+
84
+ struct THBaseFilter {
85
+ 1: required string family
86
+ 2: required string qualifier
87
+ // Ordinal number into enum HBase CompareFilter.CompareOp.
88
+ // We don't use TExprOperator because the op is interpreted by an HBase Filter, and
89
+ // not the c++ expr eval.
90
+ 3: required i32 op_ordinal
91
+ 4: required string filter_constant
92
+ }
93
+
94
+ struct THBaseScanNode {
95
+ 1: required Types.TTupleId tuple_id
96
+
97
+ // TODO: remove this, we already have THBaseTable.tableName
98
+ 2: required string table_name
99
+
100
+ 3: optional list<THBaseFilter> filters
101
+ }
102
+
103
+ struct TEqJoinCondition {
104
+ // left-hand side of "<a> = <b>"
105
+ 1: required Exprs.TExpr left;
106
+ // right-hand side of "<a> = <b>"
107
+ 2: required Exprs.TExpr right;
108
+ }
109
+
110
+ enum TJoinOp {
111
+ INNER_JOIN,
112
+ LEFT_OUTER_JOIN,
113
+ LEFT_SEMI_JOIN,
114
+ RIGHT_OUTER_JOIN,
115
+ FULL_OUTER_JOIN
116
+ }
117
+
118
+ struct THashJoinNode {
119
+ 1: required TJoinOp join_op
120
+
121
+ // anything from the ON, USING or WHERE clauses that's an equi-join predicate
122
+ 2: required list<TEqJoinCondition> eq_join_conjuncts
123
+
124
+ // anything from the ON or USING clauses (but *not* the WHERE clause) that's not an
125
+ // equi-join predicate
126
+ 3: optional list<Exprs.TExpr> other_join_conjuncts
127
+ }
128
+
129
+ struct TAggregationNode {
130
+ 1: optional list<Exprs.TExpr> grouping_exprs
131
+ 2: required list<Exprs.TExpr> aggregate_exprs
132
+ 3: required Types.TTupleId agg_tuple_id
133
+
134
+ // Set to true if this aggregation function requires finalization to complete after all
135
+ // rows have been aggregated, and this node is not an intermediate node.
136
+ 4: required bool need_finalize
137
+ }
138
+
139
+ struct TSortNode {
140
+ 1: required list<Exprs.TExpr> ordering_exprs
141
+ 2: required list<bool> is_asc_order
142
+ // Indicates whether the backend service should use topn vs. sorting
143
+ 3: required bool use_top_n;
144
+ }
145
+
146
+ struct TMergeNode {
147
+ // List or expr lists materialized by this node.
148
+ // There is one list of exprs per query stmt feeding into this merge node.
149
+ 1: required list<list<Exprs.TExpr>> result_expr_lists
150
+ // Separate list of expr lists coming from a constant select stmts.
151
+ 2: required list<list<Exprs.TExpr>> const_expr_lists
152
+ }
153
+
154
+ // This is essentially a union of all messages corresponding to subclasses
155
+ // of PlanNode.
156
+ struct TPlanNode {
157
+ // node id, needed to reassemble tree structure
158
+ 1: required Types.TPlanNodeId node_id
159
+ 2: required TPlanNodeType node_type
160
+ 3: required i32 num_children
161
+ 4: required i64 limit
162
+ 5: required list<Types.TTupleId> row_tuples
163
+
164
+ // nullable_tuples[i] is true if row_tuples[i] is nullable
165
+ 6: required list<bool> nullable_tuples
166
+ 7: optional list<Exprs.TExpr> conjuncts
167
+
168
+ // Produce data in compact format.
169
+ 8: required bool compact_data
170
+
171
+ // one field per PlanNode subclass
172
+ 9: optional THdfsScanNode hdfs_scan_node
173
+ 10: optional THBaseScanNode hbase_scan_node
174
+ 11: optional THashJoinNode hash_join_node
175
+ 12: optional TAggregationNode agg_node
176
+ 13: optional TSortNode sort_node
177
+ 14: optional TMergeNode merge_node
178
+ }
179
+
180
+ // A flattened representation of a tree of PlanNodes, obtained by depth-first
181
+ // traversal.
182
+ struct TPlan {
183
+ 1: required list<TPlanNode> nodes
184
+ }
@@ -0,0 +1,72 @@
1
+ // Copyright 2012 Cloudera Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ //
16
+ // This file contains structures produced by the planner.
17
+
18
+ namespace cpp impala
19
+ namespace java com.cloudera.impala.thrift
20
+ namespace rb Impala.Protocol
21
+
22
+ include "Types.thrift"
23
+ include "Exprs.thrift"
24
+ include "DataSinks.thrift"
25
+ include "PlanNodes.thrift"
26
+ include "Partitions.thrift"
27
+
28
+ // TPlanFragment encapsulates info needed to execute a particular
29
+ // plan fragment, including how to produce and how to partition its output.
30
+ // It leaves out node-specific parameters neede for the actual execution.
31
+ struct TPlanFragment {
32
+ // no plan or descriptor table: query without From clause
33
+ 2: optional PlanNodes.TPlan plan
34
+
35
+ // exprs that produce values for slots of output tuple (one expr per slot);
36
+ // if not set, plan fragment materializes full rows of plan_tree
37
+ 4: optional list<Exprs.TExpr> output_exprs
38
+
39
+ // Specifies the destination of this plan fragment's output rows.
40
+ // For example, the destination could be a stream sink which forwards
41
+ // the data to a remote plan fragment, or a sink which writes to a table (for
42
+ // insert stmts).
43
+ 5: optional DataSinks.TDataSink output_sink
44
+
45
+ // Partitioning of the data created by all instances of this plan fragment;
46
+ // partitioning.type has the following meaning:
47
+ // - UNPARTITIONED: there is only one instance of the plan fragment
48
+ // - RANDOM: a particular output row is randomly assigned to any of the instances
49
+ // - HASH_PARTITIONED: output row r is produced by
50
+ // hash_value(partitioning.partitioning_exprs(r)) % #partitions
51
+ // - RANGE_PARTITIONING: currently not supported
52
+ // This is distinct from the partitioning of each plan fragment's
53
+ // output, which is specified by output_sink.output_partitioning.
54
+ 6: required Partitions.TDataPartition partition
55
+ }
56
+
57
+ // location information for a single scan range
58
+ struct TScanRangeLocation {
59
+ 1: required Types.THostPort server
60
+
61
+ // disk volume identifier of a particular scan range at 'server';
62
+ // -1 indicates an unknown volume id;
63
+ // only set for TScanRange.hdfs_file_split
64
+ 2: optional i32 volume_id = -1
65
+ }
66
+
67
+ // A single scan range plus the hosts that serve it
68
+ struct TScanRangeLocations {
69
+ 1: required PlanNodes.TScanRange scan_range
70
+ // non-empty list
71
+ 2: list<TScanRangeLocation> locations
72
+ }
@@ -0,0 +1,58 @@
1
+ // Copyright 2012 Cloudera Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ namespace cpp impala
16
+ namespace java com.cloudera.impala.thrift
17
+ namespace rb Impala.Protocol
18
+
19
+ // Counter data types.
20
+ enum TCounterType {
21
+ UNIT,
22
+ UNIT_PER_SECOND,
23
+ TIME_MS,
24
+ CPU_TICKS,
25
+ BYTES
26
+ BYTES_PER_SECOND,
27
+ }
28
+
29
+ // Counter data
30
+ struct TCounter {
31
+ 1: required string name
32
+ 2: required TCounterType type
33
+ 3: required i64 value
34
+ }
35
+
36
+ // A single runtime profile
37
+ struct TRuntimeProfileNode {
38
+ 1: required string name
39
+ 2: required i32 num_children
40
+ 3: required list<TCounter> counters
41
+ // TODO: should we make metadata a serializable struct? We only use it to
42
+ // store the node id right now so this is sufficient.
43
+ 4: required i64 metadata
44
+
45
+ // indicates whether the child will be printed with extra indentation;
46
+ // corresponds to indent param of RuntimeProfile::AddChild()
47
+ 5: required bool indent
48
+
49
+ // map of key,value info strings that capture any kind of additional information
50
+ // about the profiled object
51
+ 6: required map<string, string> info_strings
52
+ }
53
+
54
+ // A flattened tree of runtime profiles, obtained by an
55
+ // in-order traversal
56
+ struct TRuntimeProfileTree {
57
+ 1: required list<TRuntimeProfileNode> nodes
58
+ }
@@ -0,0 +1,121 @@
1
+ // Copyright 2012 Cloudera Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ namespace cpp impala
16
+ namespace java com.cloudera.impala.thrift
17
+ namespace rb Impala.Protocol
18
+
19
+ include "StatestoreTypes.thrift"
20
+ include "Status.thrift"
21
+ include "Types.thrift"
22
+
23
+ enum StateStoreServiceVersion {
24
+ V1
25
+ }
26
+
27
+ struct TRegisterServiceRequest {
28
+ 1: required StateStoreServiceVersion protocol_version =
29
+ StateStoreServiceVersion.V1
30
+
31
+ // Address where the StateStoreSubscriberService is running. Required in V1.
32
+ 2: optional Types.THostPort subscriber_address
33
+
34
+ // Service running on the node. Multiple services can be registered using multiple
35
+ // RegisterService() calls from the same subscriber. Currently, we assume that at most
36
+ // one instance of a particular service will be registered with each subscriber.
37
+ // Required in V1.
38
+ 3: optional string service_id
39
+ 4: optional Types.THostPort service_address
40
+ }
41
+
42
+ struct TRegisterServiceResponse {
43
+ // Required in V1.
44
+ 1: optional Status.TStatus status
45
+ }
46
+
47
+ struct TUnregisterServiceRequest {
48
+ 1: required StateStoreServiceVersion protocol_version =
49
+ StateStoreServiceVersion.V1
50
+
51
+ // Address of the subscriber. Required in V1.
52
+ 2: optional Types.THostPort subscriber_address
53
+
54
+ // Service that should be unregistered. Required in V1.
55
+ 3: optional string service_id
56
+ }
57
+
58
+ struct TUnregisterServiceResponse {
59
+ // Required in V1.
60
+ 1: optional Status.TStatus status
61
+ }
62
+
63
+ struct TRegisterSubscriptionRequest {
64
+ 1: required StateStoreServiceVersion protocol_version =
65
+ StateStoreServiceVersion.V1
66
+
67
+ // Address where the StateStoreSubscriberService is running. Required in V1.
68
+ 2: optional Types.THostPort subscriber_address
69
+
70
+ // Services for which updates should be pushed to the given subscriber. Required in V1.
71
+ 3: optional set<string> services
72
+
73
+ // The subscription ID to use for this request. All IDs are local to the
74
+ // subscriber, so as long as a single subscriber does not reuse IDs there is no
75
+ // danger of collision.
76
+ // Required in V1
77
+ 4: optional string subscription_id;
78
+ }
79
+
80
+ struct TRegisterSubscriptionResponse {
81
+ // Required in V1.
82
+ 1: optional Status.TStatus status
83
+ }
84
+
85
+ struct TUnregisterSubscriptionRequest {
86
+ 1: required StateStoreServiceVersion protocol_version =
87
+ StateStoreServiceVersion.V1
88
+
89
+ // Address of the subscriber. Required in V1.
90
+ 2: optional Types.THostPort subscriber_address
91
+
92
+ // Identifier for the subscription that should be unregistered. Required in V1.
93
+ 3: optional string subscription_id
94
+ }
95
+
96
+ struct TUnregisterSubscriptionResponse {
97
+ // Required in V1.
98
+ 1: optional Status.TStatus status
99
+ }
100
+
101
+ // A repository and distribution mechanism for global system state. Stored state is not
102
+ // made persistent and is considered soft-state (i.e., it needs to be re-supplied
103
+ // when a StateStore restarts). Updates to the global state are distributed to
104
+ // subscribers asynchronously and with an arbitrary (but typically reasonably small)
105
+ // delay.
106
+ service StateStoreService {
107
+ // Registers an instance of a service.
108
+ TRegisterServiceResponse RegisterService(1: TRegisterServiceRequest request);
109
+
110
+ // Unregisters an instance of a service.
111
+ TUnregisterServiceResponse UnregisterService(1: TUnregisterServiceRequest request);
112
+
113
+ // Registers to receive updates for a set of services.
114
+ TRegisterSubscriptionResponse RegisterSubscription(
115
+ 1: TRegisterSubscriptionRequest request);
116
+
117
+ // Unregisters the given subscription. A subscriber will be updated at most one more
118
+ // time after unregistering.
119
+ TUnregisterSubscriptionResponse UnregisterSubscription(
120
+ 1: TUnregisterSubscriptionRequest request);
121
+ }