polars-df 0.15.0 → 0.26.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +274 -0
  3. data/Cargo.lock +1465 -867
  4. data/Cargo.toml +3 -0
  5. data/LICENSE.txt +2 -2
  6. data/README.md +87 -37
  7. data/ext/polars/Cargo.toml +47 -16
  8. data/ext/polars/src/c_api/allocator.rs +7 -0
  9. data/ext/polars/src/c_api/mod.rs +1 -0
  10. data/ext/polars/src/catalog/mod.rs +1 -0
  11. data/ext/polars/src/catalog/unity.rs +470 -0
  12. data/ext/polars/src/conversion/any_value.rs +99 -84
  13. data/ext/polars/src/conversion/categorical.rs +30 -0
  14. data/ext/polars/src/conversion/chunked_array.rs +71 -62
  15. data/ext/polars/src/conversion/datetime.rs +63 -0
  16. data/ext/polars/src/conversion/mod.rs +796 -312
  17. data/ext/polars/src/dataframe/construction.rs +6 -18
  18. data/ext/polars/src/dataframe/export.rs +30 -39
  19. data/ext/polars/src/dataframe/general.rs +294 -362
  20. data/ext/polars/src/dataframe/io.rs +33 -150
  21. data/ext/polars/src/dataframe/map.rs +175 -0
  22. data/ext/polars/src/dataframe/mod.rs +37 -5
  23. data/ext/polars/src/dataframe/serde.rs +23 -8
  24. data/ext/polars/src/error.rs +44 -7
  25. data/ext/polars/src/exceptions.rs +21 -8
  26. data/ext/polars/src/expr/array.rs +86 -22
  27. data/ext/polars/src/expr/binary.rs +50 -1
  28. data/ext/polars/src/expr/bitwise.rs +39 -0
  29. data/ext/polars/src/expr/categorical.rs +20 -0
  30. data/ext/polars/src/expr/datatype.rs +51 -0
  31. data/ext/polars/src/expr/datetime.rs +99 -41
  32. data/ext/polars/src/expr/extension.rs +12 -0
  33. data/ext/polars/src/expr/general.rs +252 -128
  34. data/ext/polars/src/expr/list.rs +56 -60
  35. data/ext/polars/src/expr/meta.rs +30 -35
  36. data/ext/polars/src/expr/mod.rs +28 -6
  37. data/ext/polars/src/expr/name.rs +29 -14
  38. data/ext/polars/src/expr/rolling.rs +111 -3
  39. data/ext/polars/src/expr/selector.rs +219 -0
  40. data/ext/polars/src/expr/serde.rs +28 -0
  41. data/ext/polars/src/expr/string.rs +118 -20
  42. data/ext/polars/src/expr/struct.rs +14 -1
  43. data/ext/polars/src/file.rs +194 -86
  44. data/ext/polars/src/functions/aggregation.rs +13 -12
  45. data/ext/polars/src/functions/business.rs +2 -3
  46. data/ext/polars/src/functions/eager.rs +3 -2
  47. data/ext/polars/src/functions/io.rs +90 -18
  48. data/ext/polars/src/functions/lazy.rs +267 -118
  49. data/ext/polars/src/functions/meta.rs +8 -7
  50. data/ext/polars/src/functions/misc.rs +1 -1
  51. data/ext/polars/src/functions/mod.rs +2 -1
  52. data/ext/polars/src/functions/range.rs +88 -31
  53. data/ext/polars/src/functions/strings.rs +6 -0
  54. data/ext/polars/src/functions/utils.rs +8 -0
  55. data/ext/polars/src/interop/arrow/mod.rs +52 -1
  56. data/ext/polars/src/interop/arrow/{to_ruby.rs → to_rb.rs} +37 -7
  57. data/ext/polars/src/interop/arrow/to_rust.rs +43 -0
  58. data/ext/polars/src/interop/numo/to_numo_df.rs +1 -1
  59. data/ext/polars/src/interop/numo/to_numo_series.rs +72 -50
  60. data/ext/polars/src/io/cloud_options.rs +107 -0
  61. data/ext/polars/src/io/mod.rs +4 -0
  62. data/ext/polars/src/io/scan_options.rs +113 -0
  63. data/ext/polars/src/io/sink_options.rs +46 -0
  64. data/ext/polars/src/io/sink_output.rs +21 -0
  65. data/ext/polars/src/lazyframe/exitable.rs +39 -0
  66. data/ext/polars/src/lazyframe/general.rs +846 -368
  67. data/ext/polars/src/lazyframe/mod.rs +58 -5
  68. data/ext/polars/src/lazyframe/optflags.rs +59 -0
  69. data/ext/polars/src/lazyframe/serde.rs +36 -4
  70. data/ext/polars/src/lazyframe/sink.rs +46 -0
  71. data/ext/polars/src/lazygroupby.rs +38 -9
  72. data/ext/polars/src/lib.rs +574 -165
  73. data/ext/polars/src/map/lazy.rs +44 -74
  74. data/ext/polars/src/map/mod.rs +18 -254
  75. data/ext/polars/src/map/series.rs +241 -1087
  76. data/ext/polars/src/on_startup.rs +192 -9
  77. data/ext/polars/src/prelude.rs +1 -0
  78. data/ext/polars/src/rb_modules.rs +10 -57
  79. data/ext/polars/src/ruby/exceptions.rs +26 -0
  80. data/ext/polars/src/ruby/gvl.rs +104 -0
  81. data/ext/polars/src/ruby/lazy.rs +46 -0
  82. data/ext/polars/src/ruby/mod.rs +11 -0
  83. data/ext/polars/src/ruby/numo.rs +52 -0
  84. data/ext/polars/src/ruby/plan_callback.rs +198 -0
  85. data/ext/polars/src/ruby/rb_modules.rs +16 -0
  86. data/ext/polars/src/ruby/ruby_convert_registry.rs +51 -0
  87. data/ext/polars/src/ruby/ruby_function.rs +11 -0
  88. data/ext/polars/src/ruby/ruby_udf.rs +164 -0
  89. data/ext/polars/src/ruby/thread.rs +65 -0
  90. data/ext/polars/src/ruby/utils.rs +39 -0
  91. data/ext/polars/src/series/aggregation.rs +116 -91
  92. data/ext/polars/src/series/arithmetic.rs +16 -22
  93. data/ext/polars/src/series/comparison.rs +101 -222
  94. data/ext/polars/src/series/construction.rs +80 -70
  95. data/ext/polars/src/series/export.rs +98 -56
  96. data/ext/polars/src/series/general.rs +323 -440
  97. data/ext/polars/src/series/import.rs +22 -5
  98. data/ext/polars/src/series/map.rs +103 -0
  99. data/ext/polars/src/series/mod.rs +57 -15
  100. data/ext/polars/src/series/scatter.rs +139 -82
  101. data/ext/polars/src/sql.rs +16 -9
  102. data/ext/polars/src/testing/frame.rs +31 -0
  103. data/ext/polars/src/testing/mod.rs +5 -0
  104. data/ext/polars/src/testing/series.rs +31 -0
  105. data/ext/polars/src/timeout.rs +105 -0
  106. data/ext/polars/src/utils.rs +105 -4
  107. data/lib/polars/array_expr.rb +500 -22
  108. data/lib/polars/array_name_space.rb +384 -10
  109. data/lib/polars/batched_csv_reader.rb +48 -66
  110. data/lib/polars/binary_expr.rb +217 -0
  111. data/lib/polars/binary_name_space.rb +155 -1
  112. data/lib/polars/cat_expr.rb +224 -0
  113. data/lib/polars/cat_name_space.rb +132 -32
  114. data/lib/polars/catalog/unity/catalog_info.rb +20 -0
  115. data/lib/polars/catalog/unity/column_info.rb +31 -0
  116. data/lib/polars/catalog/unity/namespace_info.rb +21 -0
  117. data/lib/polars/catalog/unity/table_info.rb +50 -0
  118. data/lib/polars/catalog.rb +448 -0
  119. data/lib/polars/collect_batches.rb +22 -0
  120. data/lib/polars/config.rb +3 -3
  121. data/lib/polars/convert.rb +201 -36
  122. data/lib/polars/data_frame.rb +2851 -1017
  123. data/lib/polars/data_frame_plot.rb +173 -0
  124. data/lib/polars/data_type_expr.rb +52 -0
  125. data/lib/polars/data_type_group.rb +6 -0
  126. data/lib/polars/data_types.rb +118 -18
  127. data/lib/polars/date_time_expr.rb +426 -84
  128. data/lib/polars/date_time_name_space.rb +384 -111
  129. data/lib/polars/dynamic_group_by.rb +102 -10
  130. data/lib/polars/exceptions.rb +50 -5
  131. data/lib/polars/expr.rb +2159 -915
  132. data/lib/polars/extension_expr.rb +39 -0
  133. data/lib/polars/extension_name_space.rb +39 -0
  134. data/lib/polars/functions/aggregation/horizontal.rb +11 -6
  135. data/lib/polars/functions/aggregation/vertical.rb +2 -3
  136. data/lib/polars/functions/as_datatype.rb +290 -8
  137. data/lib/polars/functions/business.rb +95 -0
  138. data/lib/polars/functions/col.rb +6 -5
  139. data/lib/polars/functions/datatype.rb +62 -0
  140. data/lib/polars/functions/eager.rb +426 -24
  141. data/lib/polars/functions/escape_regex.rb +21 -0
  142. data/lib/polars/functions/lazy.rb +813 -195
  143. data/lib/polars/functions/lit.rb +21 -10
  144. data/lib/polars/functions/range/int_range.rb +74 -2
  145. data/lib/polars/functions/range/linear_space.rb +195 -0
  146. data/lib/polars/functions/range/time_range.rb +1 -1
  147. data/lib/polars/functions/repeat.rb +7 -12
  148. data/lib/polars/functions/whenthen.rb +2 -2
  149. data/lib/polars/group_by.rb +188 -58
  150. data/lib/polars/iceberg_dataset.rb +108 -0
  151. data/lib/polars/in_process_query.rb +37 -0
  152. data/lib/polars/io/cloud.rb +18 -0
  153. data/lib/polars/io/csv.rb +336 -128
  154. data/lib/polars/io/database.rb +19 -4
  155. data/lib/polars/io/delta.rb +134 -0
  156. data/lib/polars/io/iceberg.rb +34 -0
  157. data/lib/polars/io/ipc.rb +63 -63
  158. data/lib/polars/io/json.rb +16 -0
  159. data/lib/polars/io/lines.rb +172 -0
  160. data/lib/polars/io/ndjson.rb +176 -20
  161. data/lib/polars/io/parquet.rb +173 -95
  162. data/lib/polars/io/scan_options.rb +55 -0
  163. data/lib/polars/io/sink_options.rb +27 -0
  164. data/lib/polars/io/utils.rb +17 -0
  165. data/lib/polars/lazy_frame.rb +3017 -622
  166. data/lib/polars/lazy_group_by.rb +436 -2
  167. data/lib/polars/list_expr.rb +551 -59
  168. data/lib/polars/list_name_space.rb +465 -51
  169. data/lib/polars/meta_expr.rb +146 -24
  170. data/lib/polars/name_expr.rb +87 -2
  171. data/lib/polars/query_opt_flags.rb +264 -0
  172. data/lib/polars/rolling_group_by.rb +90 -5
  173. data/lib/polars/scan_cast_options.rb +86 -0
  174. data/lib/polars/schema.rb +128 -0
  175. data/lib/polars/selector.rb +245 -0
  176. data/lib/polars/selectors.rb +1048 -201
  177. data/lib/polars/series.rb +2522 -774
  178. data/lib/polars/series_plot.rb +72 -0
  179. data/lib/polars/slice.rb +1 -1
  180. data/lib/polars/sql_context.rb +13 -6
  181. data/lib/polars/string_cache.rb +19 -72
  182. data/lib/polars/string_expr.rb +561 -107
  183. data/lib/polars/string_name_space.rb +781 -109
  184. data/lib/polars/struct_expr.rb +139 -18
  185. data/lib/polars/struct_name_space.rb +19 -1
  186. data/lib/polars/testing.rb +24 -273
  187. data/lib/polars/utils/constants.rb +2 -0
  188. data/lib/polars/utils/construction/data_frame.rb +410 -0
  189. data/lib/polars/utils/construction/series.rb +350 -0
  190. data/lib/polars/utils/construction/utils.rb +9 -0
  191. data/lib/polars/utils/convert.rb +18 -8
  192. data/lib/polars/utils/deprecation.rb +11 -0
  193. data/lib/polars/utils/parse.rb +62 -9
  194. data/lib/polars/utils/reduce_balanced.rb +43 -0
  195. data/lib/polars/utils/serde.rb +22 -0
  196. data/lib/polars/utils/unstable.rb +19 -0
  197. data/lib/polars/utils/various.rb +86 -1
  198. data/lib/polars/utils.rb +63 -48
  199. data/lib/polars/version.rb +1 -1
  200. data/lib/polars.rb +85 -2
  201. metadata +80 -28
  202. data/ext/polars/src/allocator.rs +0 -13
  203. data/ext/polars/src/batched_csv.rs +0 -138
  204. data/ext/polars/src/functions/string_cache.rs +0 -25
  205. data/ext/polars/src/map/dataframe.rs +0 -338
  206. data/lib/polars/plot.rb +0 -109
@@ -0,0 +1,470 @@
1
+ use std::str::FromStr;
2
+
3
+ use magnus::value::{Lazy, ReprValue};
4
+ use magnus::{Module, RClass, RHash, RModule, Ruby, Value};
5
+ use polars::prelude::{PlHashMap, PlSmallStr, PolarsError, Schema};
6
+ use polars_core::runtime::ASYNC;
7
+ use polars_io::catalog::unity::client::{CatalogClient, CatalogClientBuilder};
8
+ use polars_io::catalog::unity::models::{
9
+ CatalogInfo, ColumnInfo, DataSourceFormat, NamespaceInfo, TableInfo, TableType,
10
+ };
11
+ use polars_io::catalog::unity::schema::parse_type_json_str;
12
+
13
+ use crate::rb_modules::polars;
14
+ use crate::ruby::gvl::GvlExt;
15
+ use crate::ruby::utils::TryIntoValue;
16
+ use crate::utils::EnterPolarsExt;
17
+ use crate::utils::to_rb_err;
18
+ use crate::{RbResult, Wrap};
19
+
20
+ macro_rules! rbdict_insert_keys {
21
+ ($dict:expr, {$a:expr}) => {
22
+ $dict.aset(stringify!($a), $a)?;
23
+ };
24
+
25
+ ($dict:expr, {$a:expr, $($args:expr),+}) => {
26
+ rbdict_insert_keys!($dict, { $a });
27
+ rbdict_insert_keys!($dict, { $($args),+ });
28
+ };
29
+
30
+ ($dict:expr, {$a:expr, $($args:expr),+,}) => {
31
+ rbdict_insert_keys!($dict, {$a, $($args),+});
32
+ };
33
+ }
34
+
35
+ static CATALOG_INFO_CLS: Lazy<RClass> = Lazy::new(|rb| {
36
+ polars(rb)
37
+ .const_get::<_, RClass>("Catalog")
38
+ .unwrap()
39
+ .const_get::<_, RModule>("Unity")
40
+ .unwrap()
41
+ .const_get("CatalogInfo")
42
+ .unwrap()
43
+ });
44
+
45
+ static NAMESPACE_INFO_CLS: Lazy<RClass> = Lazy::new(|rb| {
46
+ polars(rb)
47
+ .const_get::<_, RClass>("Catalog")
48
+ .unwrap()
49
+ .const_get::<_, RModule>("Unity")
50
+ .unwrap()
51
+ .const_get("NamespaceInfo")
52
+ .unwrap()
53
+ });
54
+
55
+ static TABLE_INFO_CLS: Lazy<RClass> = Lazy::new(|rb| {
56
+ polars(rb)
57
+ .const_get::<_, RClass>("Catalog")
58
+ .unwrap()
59
+ .const_get::<_, RModule>("Unity")
60
+ .unwrap()
61
+ .const_get("TableInfo")
62
+ .unwrap()
63
+ });
64
+
65
+ static COLUMN_INFO_CLS: Lazy<RClass> = Lazy::new(|rb| {
66
+ polars(rb)
67
+ .const_get::<_, RClass>("Catalog")
68
+ .unwrap()
69
+ .const_get::<_, RModule>("Unity")
70
+ .unwrap()
71
+ .const_get("ColumnInfo")
72
+ .unwrap()
73
+ });
74
+
75
+ #[magnus::wrap(class = "Polars::RbCatalogClient")]
76
+ pub struct RbCatalogClient(CatalogClient);
77
+
78
+ impl RbCatalogClient {
79
+ pub fn new(workspace_url: String, bearer_token: Option<String>) -> RbResult<Self> {
80
+ let builder = CatalogClientBuilder::new().with_workspace_url(workspace_url);
81
+
82
+ let builder = if let Some(bearer_token) = bearer_token {
83
+ builder.with_bearer_token(bearer_token)
84
+ } else {
85
+ builder
86
+ };
87
+
88
+ builder.build().map(RbCatalogClient).map_err(to_rb_err)
89
+ }
90
+
91
+ pub fn list_catalogs(rb: &Ruby, self_: &Self) -> RbResult<Value> {
92
+ let v = rb.enter_polars(|| ASYNC.block_in_place_on(self_.client().list_catalogs()))?;
93
+
94
+ let mut opt_err = None;
95
+
96
+ let out = rb.ary_from_iter(v.into_iter().map(|x| {
97
+ let v = catalog_info_to_rbobject(rb, x);
98
+ if let Ok(v) = v {
99
+ Some(v)
100
+ } else {
101
+ opt_err.replace(v);
102
+ None
103
+ }
104
+ }));
105
+
106
+ opt_err.transpose()?;
107
+
108
+ Ok(out.as_value())
109
+ }
110
+
111
+ pub fn list_namespaces(rb: &Ruby, self_: &Self, catalog_name: String) -> RbResult<Value> {
112
+ let v = rb.enter_polars(|| {
113
+ ASYNC.block_in_place_on(self_.client().list_namespaces(&catalog_name))
114
+ })?;
115
+
116
+ let mut opt_err = None;
117
+
118
+ let out = rb.ary_from_iter(v.into_iter().map(|x| {
119
+ let v = namespace_info_to_rbobject(rb, x);
120
+ match v {
121
+ Ok(v) => Some(v),
122
+ Err(_) => {
123
+ opt_err.replace(v);
124
+ None
125
+ }
126
+ }
127
+ }));
128
+
129
+ opt_err.transpose()?;
130
+
131
+ Ok(out.as_value())
132
+ }
133
+
134
+ pub fn list_tables(
135
+ rb: &Ruby,
136
+ self_: &Self,
137
+ catalog_name: String,
138
+ namespace: String,
139
+ ) -> RbResult<Value> {
140
+ let v = rb.enter_polars(|| {
141
+ ASYNC.block_in_place_on(self_.client().list_tables(&catalog_name, &namespace))
142
+ })?;
143
+
144
+ let mut opt_err = None;
145
+
146
+ let out = rb
147
+ .ary_from_iter(v.into_iter().map(|table_info| {
148
+ let v = table_info_to_rbobject(rb, table_info);
149
+
150
+ if let Ok(v) = v {
151
+ Some(v)
152
+ } else {
153
+ opt_err.replace(v);
154
+ None
155
+ }
156
+ }))
157
+ .as_value();
158
+
159
+ opt_err.transpose()?;
160
+
161
+ Ok(out)
162
+ }
163
+
164
+ pub fn get_table_info(
165
+ rb: &Ruby,
166
+ self_: &Self,
167
+ table_name: String,
168
+ catalog_name: String,
169
+ namespace: String,
170
+ ) -> RbResult<Value> {
171
+ let table_info = rb
172
+ .enter_polars(|| {
173
+ ASYNC.block_in_place_on(self_.client().get_table_info(
174
+ &table_name,
175
+ &catalog_name,
176
+ &namespace,
177
+ ))
178
+ })
179
+ .map_err(to_rb_err)?;
180
+
181
+ table_info_to_rbobject(rb, table_info)
182
+ }
183
+
184
+ pub fn create_catalog(
185
+ rb: &Ruby,
186
+ self_: &Self,
187
+ catalog_name: String,
188
+ comment: Option<String>,
189
+ storage_root: Option<String>,
190
+ ) -> RbResult<Value> {
191
+ let catalog_info = rb
192
+ .detach(|| {
193
+ ASYNC.block_in_place_on(self_.client().create_catalog(
194
+ &catalog_name,
195
+ comment.as_deref(),
196
+ storage_root.as_deref(),
197
+ ))
198
+ })
199
+ .map_err(to_rb_err)?;
200
+
201
+ catalog_info_to_rbobject(rb, catalog_info)
202
+ }
203
+
204
+ pub fn delete_catalog(
205
+ rb: &Ruby,
206
+ self_: &Self,
207
+ catalog_name: String,
208
+ force: bool,
209
+ ) -> RbResult<()> {
210
+ rb.detach(|| ASYNC.block_in_place_on(self_.client().delete_catalog(&catalog_name, force)))
211
+ .map_err(to_rb_err)
212
+ }
213
+
214
+ pub fn create_namespace(
215
+ rb: &Ruby,
216
+ self_: &Self,
217
+ catalog_name: String,
218
+ namespace: String,
219
+ comment: Option<String>,
220
+ storage_root: Option<String>,
221
+ ) -> RbResult<Value> {
222
+ let namespace_info = rb
223
+ .detach(|| {
224
+ ASYNC.block_in_place_on(self_.client().create_namespace(
225
+ &catalog_name,
226
+ &namespace,
227
+ comment.as_deref(),
228
+ storage_root.as_deref(),
229
+ ))
230
+ })
231
+ .map_err(to_rb_err)?;
232
+
233
+ namespace_info_to_rbobject(rb, namespace_info)
234
+ }
235
+
236
+ pub fn delete_namespace(
237
+ rb: &Ruby,
238
+ self_: &Self,
239
+ catalog_name: String,
240
+ namespace: String,
241
+ force: bool,
242
+ ) -> RbResult<()> {
243
+ rb.detach(|| {
244
+ ASYNC.block_in_place_on(self_.client().delete_namespace(
245
+ &catalog_name,
246
+ &namespace,
247
+ force,
248
+ ))
249
+ })
250
+ .map_err(to_rb_err)
251
+ }
252
+
253
+ pub fn create_table(
254
+ rb: &Ruby,
255
+ self_: &Self,
256
+ catalog_name: String,
257
+ namespace: String,
258
+ table_name: String,
259
+ schema: Option<Wrap<Schema>>,
260
+ table_type: String,
261
+ data_source_format: Option<String>,
262
+ comment: Option<String>,
263
+ storage_root: Option<String>,
264
+ properties: Vec<(String, String)>,
265
+ ) -> RbResult<Value> {
266
+ let table_info = rb
267
+ .detach(|| {
268
+ ASYNC.block_in_place_on(
269
+ self_.client().create_table(
270
+ &catalog_name,
271
+ &namespace,
272
+ &table_name,
273
+ schema.as_ref().map(|x| &x.0),
274
+ &TableType::from_str(&table_type)
275
+ .map_err(|e| PolarsError::ComputeError(e.to_string().into()))?,
276
+ data_source_format
277
+ .as_deref()
278
+ .map(DataSourceFormat::from_str)
279
+ .transpose()
280
+ .map_err(|e| PolarsError::ComputeError(e.to_string().into()))?
281
+ .as_ref(),
282
+ comment.as_deref(),
283
+ storage_root.as_deref(),
284
+ &mut properties.iter().map(|(a, b)| (a.as_str(), b.as_str())),
285
+ ),
286
+ )
287
+ })
288
+ .map_err(to_rb_err)?;
289
+
290
+ table_info_to_rbobject(rb, table_info)
291
+ }
292
+
293
+ pub fn delete_table(
294
+ rb: &Ruby,
295
+ self_: &Self,
296
+ catalog_name: String,
297
+ namespace: String,
298
+ table_name: String,
299
+ ) -> RbResult<()> {
300
+ rb.detach(|| {
301
+ ASYNC.block_in_place_on(self_.client().delete_table(
302
+ &catalog_name,
303
+ &namespace,
304
+ &table_name,
305
+ ))
306
+ })
307
+ .map_err(to_rb_err)
308
+ }
309
+
310
+ pub fn type_json_to_polars_type(rb: &Ruby, type_json: String) -> RbResult<Value> {
311
+ Wrap(parse_type_json_str(&type_json).map_err(to_rb_err)?).try_into_value_with(rb)
312
+ }
313
+ }
314
+
315
+ impl RbCatalogClient {
316
+ fn client(&self) -> &CatalogClient {
317
+ &self.0
318
+ }
319
+ }
320
+
321
+ fn catalog_info_to_rbobject(
322
+ ruby: &Ruby,
323
+ CatalogInfo {
324
+ name,
325
+ comment,
326
+ storage_location,
327
+ properties,
328
+ options,
329
+ created_at,
330
+ created_by,
331
+ updated_at,
332
+ updated_by,
333
+ }: CatalogInfo,
334
+ ) -> RbResult<Value> {
335
+ let dict = ruby.hash_new();
336
+
337
+ let properties = properties_to_rbobject(ruby, properties);
338
+ let options = properties_to_rbobject(ruby, options);
339
+
340
+ rbdict_insert_keys!(dict, {
341
+ name,
342
+ comment,
343
+ storage_location,
344
+ properties,
345
+ options,
346
+ created_at,
347
+ created_by,
348
+ updated_at,
349
+ updated_by
350
+ });
351
+
352
+ ruby.get_inner(&CATALOG_INFO_CLS).funcall("new", (dict,))
353
+ }
354
+
355
+ fn namespace_info_to_rbobject(
356
+ ruby: &Ruby,
357
+ NamespaceInfo {
358
+ name,
359
+ comment,
360
+ properties,
361
+ storage_location,
362
+ created_at,
363
+ created_by,
364
+ updated_at,
365
+ updated_by,
366
+ }: NamespaceInfo,
367
+ ) -> RbResult<Value> {
368
+ let dict = ruby.hash_new();
369
+
370
+ let properties = properties_to_rbobject(ruby, properties);
371
+
372
+ rbdict_insert_keys!(dict, {
373
+ name,
374
+ comment,
375
+ properties,
376
+ storage_location,
377
+ created_at,
378
+ created_by,
379
+ updated_at,
380
+ updated_by
381
+ });
382
+
383
+ ruby.get_inner(&NAMESPACE_INFO_CLS).funcall("new", (dict,))
384
+ }
385
+
386
+ fn table_info_to_rbobject(ruby: &Ruby, table_info: TableInfo) -> RbResult<Value> {
387
+ let TableInfo {
388
+ name,
389
+ table_id,
390
+ table_type,
391
+ comment,
392
+ storage_location,
393
+ data_source_format,
394
+ columns,
395
+ properties,
396
+ created_at,
397
+ created_by,
398
+ updated_at,
399
+ updated_by,
400
+ } = table_info;
401
+
402
+ let column_info_cls = ruby.get_inner(&COLUMN_INFO_CLS);
403
+
404
+ let columns = columns
405
+ .map(|columns| {
406
+ ruby.ary_try_from_iter(columns.into_iter().map(
407
+ |ColumnInfo {
408
+ name,
409
+ type_name,
410
+ type_text,
411
+ type_json,
412
+ position,
413
+ comment,
414
+ partition_index,
415
+ }| {
416
+ let dict = ruby.hash_new();
417
+
418
+ let name = name.as_str();
419
+ let type_name = type_name.as_str();
420
+ let type_text = type_text.as_str();
421
+
422
+ rbdict_insert_keys!(dict, {
423
+ name,
424
+ type_name,
425
+ type_text,
426
+ type_json,
427
+ position,
428
+ comment,
429
+ partition_index,
430
+ });
431
+
432
+ column_info_cls.funcall::<_, _, Value>("new", (dict,))
433
+ },
434
+ ))
435
+ })
436
+ .transpose()?;
437
+
438
+ let dict = ruby.hash_new();
439
+
440
+ let data_source_format = data_source_format.map(|x| x.to_string());
441
+ let table_type = table_type.to_string();
442
+ let properties = properties_to_rbobject(ruby, properties);
443
+
444
+ rbdict_insert_keys!(dict, {
445
+ name,
446
+ comment,
447
+ table_id,
448
+ table_type,
449
+ storage_location,
450
+ data_source_format,
451
+ columns,
452
+ properties,
453
+ created_at,
454
+ created_by,
455
+ updated_at,
456
+ updated_by,
457
+ });
458
+
459
+ ruby.get_inner(&TABLE_INFO_CLS).funcall("new", (dict,))
460
+ }
461
+
462
+ fn properties_to_rbobject(ruby: &Ruby, properties: PlHashMap<PlSmallStr, String>) -> RHash {
463
+ let dict = ruby.hash_new();
464
+
465
+ for (key, value) in properties.into_iter() {
466
+ dict.aset(key.as_str(), value).unwrap();
467
+ }
468
+
469
+ dict
470
+ }