Skip to content

Commit 3f8dfe8

Browse files
committed
UDT request
Adds support for converting JS UDT type into Rust UDT type.
1 parent 8406dc3 commit 3f8dfe8

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

lib/types/cql-utils.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,24 @@ function encodeTuple(value, type) {
117117
return res;
118118
}
119119

120+
/**
121+
* Encodes UDT into QueryParameterWrapper
122+
* @param {Object} value
123+
* @param {rust.ComplexType} complexType
124+
* @returns {Array}
125+
*/
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();
134+
}
135+
return [names, values];
136+
}
137+
120138
/**
121139
* Wrap value into MaybeUnsetQueryParameterWrapper based on the type
122140
* @param {rust.ComplexType} type
@@ -143,7 +161,7 @@ function getWrapped(type, value) {
143161
* @returns {rust.QueryParameterWrapper}
144162
*/
145163
function wrapValueBasedOnType(type, value) {
146-
let encodedElement;
164+
let encodedElement, name, keyspace, names, values;
147165
let tmpElement;
148166
// To increase clarity of the error messages, in case value is of different type then expected,
149167
// when we call some methods on value variable, type is checked explicitly.
@@ -198,6 +216,18 @@ function wrapValueBasedOnType(type, value) {
198216
} */
199217
encodedElement = encodeListLike(value, type.getFirstSupportType());
200218
return rust.QueryParameterWrapper.fromSet(encodedElement);
219+
case rust.CqlType.UserDefinedType:
220+
name = type.getUdtName();
221+
keyspace = type.getUdtKeyspace();
222+
encodedElement = encodeUdt(value, type);
223+
names = encodedElement[0];
224+
values = encodedElement[1];
225+
return rust.QueryParameterWrapper.fromUdt(
226+
name,
227+
keyspace,
228+
names,
229+
values,
230+
);
201231
case rust.CqlType.Text:
202232
return rust.QueryParameterWrapper.fromText(value);
203233
case rust.CqlType.Timestamp:
@@ -293,7 +323,7 @@ function wrapValueBasedOnType(type, value) {
293323
default:
294324
// Or not yet implemented type
295325
throw new ReferenceError(
296-
`[INTERNAL DRIVER ERROR] Unknown type: ${type}`,
326+
`[INTERNAL DRIVER ERROR] Unknown type: ${type.baseType}`,
297327
);
298328
}
299329
}

src/requests/parameter_wrappers.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,26 @@ impl QueryParameterWrapper {
140140
}
141141
}
142142

143+
#[napi]
144+
pub fn from_udt(
145+
name: String,
146+
keyspace: String,
147+
names: Vec<String>,
148+
values: Vec<&QueryParameterWrapper>,
149+
) -> QueryParameterWrapper {
150+
QueryParameterWrapper {
151+
parameter: CqlValue::UserDefinedType {
152+
keyspace,
153+
name,
154+
fields: names
155+
.iter()
156+
.zip(values.iter())
157+
.map(|(name, value)| (name.clone(), Some(value.parameter.clone())))
158+
.collect(),
159+
},
160+
}
161+
}
162+
143163
#[napi]
144164
pub fn from_map(
145165
val: Vec<(&QueryParameterWrapper, &QueryParameterWrapper)>,

0 commit comments

Comments
 (0)