Skip to content

Commit 11907c9

Browse files
committed
UDT ComplexType
Expand ComplexType to include UDTs.
1 parent 3f8dfe8 commit 11907c9

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

lib/types/cql-utils.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,26 @@ function encodeTuple(value, type) {
120120
/**
121121
* Encodes UDT into QueryParameterWrapper
122122
* @param {Object} value
123-
* @param {rust.ComplexType} complexType
123+
* @param {rust.ComplexType} type
124124
* @returns {Array}
125125
*/
126-
function encodeUdt(value, complexType) {
127-
let names = [];
128-
let values = [];
129-
while (complexType) {
130-
let name = complexType.getFieldName();
131-
names.push(name);
132-
values.push(getWrapped(complexType.getFirstSupportType(), value[name]));
133-
complexType = complexType.getSecondSupportType();
126+
function encodeUdt(value, type) {
127+
let names = type.getFieldNames();
128+
let types = type.getInnerTypes();
129+
let encodedElements = [];
130+
131+
if (names.length != types.length) {
132+
throw new TypeError(
133+
`Expected ${types.length} names in UDT, obtained ${names.length} names`,
134+
);
135+
}
136+
137+
for (let i = 0; i < names.length; i++) {
138+
if (value.hasOwnProperty(names[i])) {
139+
encodedElements.push(getWrapped(types[i], value[names[i]]));
140+
}
134141
}
135-
return [names, values];
142+
return [names, encodedElements];
136143
}
137144

138145
/**

src/result.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,14 @@ pub(crate) fn map_column_type_to_complex_type(typ: &ColumnType) -> ComplexType {
505505
),
506506
other => unimplemented!("Missing implementation for CQL Collection type {:?}", other),
507507
},
508-
ColumnType::UserDefinedType { .. } => ComplexType::simple_type(CqlType::UserDefinedType),
508+
ColumnType::UserDefinedType {
509+
frozen: _,
510+
definition,
511+
} => ComplexType::from_udt(
512+
definition.field_types.as_slice(),
513+
definition.name.to_string(),
514+
definition.keyspace.to_string(),
515+
),
509516
ColumnType::Tuple(t) => ComplexType::from_tuple(t.as_slice()),
510517
ColumnType::Vector {
511518
typ: _,

src/types/type_wrappers.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::borrow::Cow;
2+
13
use crate::result::map_column_type_to_complex_type;
24
use scylla::frame::response::result::ColumnType;
35

@@ -42,6 +44,9 @@ pub struct ComplexType {
4244
pub(crate) support_type_1: Option<Box<ComplexType>>,
4345
pub(crate) support_type_2: Option<Box<ComplexType>>,
4446
pub(crate) inner_types: Vec<ComplexType>, // Used by Tuple and UDT
47+
pub(crate) field_names: Vec<String>,
48+
pub(crate) udt_keyspace: Option<String>,
49+
pub(crate) udt_name: Option<String>,
4550
}
4651

4752
#[napi]
@@ -61,6 +66,22 @@ impl ComplexType {
6166
// Batch query to NAPI minimizes number of calls
6267
self.inner_types.clone()
6368
}
69+
70+
#[napi]
71+
pub fn get_field_names(&self) -> Vec<String> {
72+
// Batch query to NAPI minimizes number of calls
73+
self.field_names.clone()
74+
}
75+
76+
#[napi]
77+
pub fn get_udt_keyspace(&self) -> Option<String> {
78+
self.udt_keyspace.clone()
79+
}
80+
81+
#[napi]
82+
pub fn get_udt_name(&self) -> Option<String> {
83+
self.udt_name.clone()
84+
}
6485
}
6586

6687
impl ComplexType {
@@ -85,6 +106,9 @@ impl ComplexType {
85106
support_type_1: support1.map(Box::new),
86107
support_type_2: support2.map(Box::new),
87108
inner_types: vec![],
109+
field_names: vec![],
110+
udt_keyspace: None,
111+
udt_name: None,
88112
}
89113
}
90114

@@ -97,6 +121,28 @@ impl ComplexType {
97121
.iter()
98122
.map(|column| map_column_type_to_complex_type(column))
99123
.collect(),
124+
field_names: vec![],
125+
udt_keyspace: None,
126+
udt_name: None,
127+
}
128+
}
129+
130+
pub(crate) fn from_udt(
131+
items: &[(Cow<str>, ColumnType)],
132+
name: String,
133+
keyspace: String,
134+
) -> Self {
135+
ComplexType {
136+
base_type: CqlType::UserDefinedType,
137+
support_type_1: None,
138+
support_type_2: None,
139+
inner_types: items
140+
.iter()
141+
.map(|(_, column)| map_column_type_to_complex_type(column))
142+
.collect(),
143+
field_names: items.iter().map(|(name, _)| name.to_string()).collect(),
144+
udt_keyspace: Some(keyspace),
145+
udt_name: Some(name),
100146
}
101147
}
102148
}

0 commit comments

Comments
 (0)