Skip to content

Commit cc939fc

Browse files
authored
feat: implement new features introduced in Substrait 0.7.0 (#26)
* feat: implement new type parameter metatypes introduced by Substrait 0.7.0 * feat: implement type parameters for user-defined types in type system * feat: implement new messages for compound extension types added in Substrait 0.7.0 BREAKING CHANGE: the Parameter enum has new values, and the Unsigned(u64) variant was replaced with Integer(i64).
1 parent 48f5941 commit cc939fc

13 files changed

Lines changed: 464 additions & 104 deletions

File tree

proto/substrait/validator/validator.proto

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ syntax = "proto3";
44
package substrait.validator;
55

66
import "google/protobuf/any.proto";
7+
import "google/protobuf/empty.proto";
78

89
option csharp_namespace = "Substrait.Validator.Protobuf";
910
option java_multiple_files = true;
@@ -50,7 +51,7 @@ message Node {
5051

5152
// This node is inserted as a placeholder when a required oneof field was
5253
// not populated in the input.
53-
Empty proto_missing_oneof = 3;
54+
google.protobuf.Empty proto_missing_oneof = 3;
5455

5556
// Special case of proto_primitive for references to anchors defined
5657
// elsewhere in the plan.
@@ -63,11 +64,11 @@ message Node {
6364

6465
// This node represents a YAML map/object. The keys are represented using
6566
// Field messages in data.
66-
Empty yaml_map = 6;
67+
google.protobuf.Empty yaml_map = 6;
6768

6869
// This node represents a YAML array. The elements are represented using
6970
// ArrayElement messages in data.
70-
Empty yaml_array = 7;
71+
google.protobuf.Empty yaml_array = 7;
7172

7273
// This node represents a YAML primitive.
7374
PrimitiveData yaml_primitive = 8;
@@ -299,20 +300,20 @@ message Comment {
299300
Span span = 1;
300301

301302
// A newline, i.e. the next span should start on the next line.
302-
Empty new_line = 2;
303+
google.protobuf.Empty new_line = 2;
303304

304305
// Opens a new unordered list. The next span is the start of the text for
305306
// the next item. list_next elements are used to advance to the next list
306307
// item; newlines can be used to add paragraphs without bullet points.
307308
// Each list_open should be matched with a list_close. Lists may be
308309
// nested.
309-
Empty list_open = 3;
310+
google.protobuf.Empty list_open = 3;
310311

311312
// Advances to the next list item.
312-
Empty list_next = 4;
313+
google.protobuf.Empty list_next = 4;
313314

314315
// Closes the current list.
315-
Empty list_close = 5;
316+
google.protobuf.Empty list_close = 5;
316317
}
317318
}
318319

@@ -343,7 +344,7 @@ message DataType {
343344
// Type variation, if any.
344345
oneof variation {
345346
UserDefinedVariation user_defined_variation = 9;
346-
Empty unresolved_variation = 15;
347+
google.protobuf.Empty unresolved_variation = 15;
347348
}
348349

349350
// Type parameters for non-simple types.
@@ -355,7 +356,7 @@ message DataType {
355356
Simple simple = 1;
356357
Compound compound = 2;
357358
UserDefinedType user_defined_type = 3;
358-
Empty unresolved_type = 7;
359+
google.protobuf.Empty unresolved_type = 7;
359360
}
360361
}
361362

@@ -445,7 +446,7 @@ message DataType {
445446
oneof base_type {
446447
Class physical = 1;
447448
UserDefinedVariation logical = 2;
448-
Empty unresolved = 7;
449+
google.protobuf.Empty unresolved = 7;
449450
}
450451

451452
// Function behavior for this type variation.
@@ -470,8 +471,26 @@ message DataType {
470471
// Named data type parameter, for example N:T in NSTRUCT<N:T>.
471472
Named named_type = 2;
472473

473-
// Unsigned integer parameter, for example the L in VARCHAR<L>.
474-
uint64 unsigned = 3;
474+
// Boolean paramater, used only for extension types.
475+
bool boolean = 4;
476+
477+
// Integer parameter, for example the L in VARCHAR<L>.
478+
int64 integer = 5;
479+
480+
// Enumeration parameter, used only for extension types.
481+
string enumeration = 6;
482+
483+
// String parameter, used only for extension types.
484+
string string = 7;
485+
486+
// Used to skip optional parameters.
487+
google.protobuf.Empty null = 8;
488+
489+
// Used when the value of a parameter could not be resolved.
490+
google.protobuf.Empty unresolved = 9;
491+
492+
// Replaced by `integer`.
493+
uint64 unsigned = 3 [deprecated = true];
475494
}
476495
}
477496

@@ -484,6 +503,3 @@ message DataType {
484503
DataType data_type = 2;
485504
}
486505
}
487-
488-
// Used for oneof field variants that have no data associated with them.
489-
message Empty {}

rs/src/export/html/mod.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::output::diagnostic;
99
use crate::output::parse_result;
1010
use crate::output::path;
1111
use crate::output::tree;
12+
use crate::util;
1213
use std::sync::Arc;
1314

1415
const HEADER1: &str = concat!(
@@ -463,15 +464,32 @@ fn format_data_type(prefix: &str, data_type: &Arc<data_type::DataType>) -> Vec<S
463464
.parameter_name(index)
464465
.unwrap_or_else(|| "?".to_string());
465466
match parameter {
467+
data_type::Parameter::Unresolved => {
468+
html.push(format_data_type_card(&format!(".{name}: !")))
469+
}
470+
data_type::Parameter::Null => {
471+
html.push(format_data_type_card(&format!(".{name}: null")))
472+
}
473+
data_type::Parameter::Boolean(b) => {
474+
html.push(format_data_type_card(&format!(".{name}: {b}")))
475+
}
476+
data_type::Parameter::Integer(i) => {
477+
html.push(format_data_type_card(&format!(".{name}: {i}")))
478+
}
479+
data_type::Parameter::Enum(e) => html.push(format_data_type_card(&format!(
480+
".{name}: {}",
481+
util::string::as_ident_or_string(e)
482+
))),
483+
data_type::Parameter::String(s) => html.push(format_data_type_card(&format!(
484+
".{name}: {}",
485+
util::string::as_quoted_string(s)
486+
))),
466487
data_type::Parameter::Type(t) => {
467488
html.extend(format_data_type(&format!(".{name}"), t))
468489
}
469490
data_type::Parameter::NamedType(n, t) => {
470491
html.extend(format_data_type(&format!(".{n}"), t))
471492
}
472-
data_type::Parameter::Unsigned(i) => {
473-
html.push(format_data_type_card(&format!(".{name}: {i}")))
474-
}
475493
}
476494
}
477495
html.push("</details>".to_string());

rs/src/export/proto.rs

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -133,18 +133,10 @@ impl From<&comment::Element> for validator::comment::Element {
133133
comment::Element::Span(span) => {
134134
validator::comment::element::Kind::Span(span.into())
135135
}
136-
comment::Element::NewLine => {
137-
validator::comment::element::Kind::NewLine(validator::Empty {})
138-
}
139-
comment::Element::ListOpen => {
140-
validator::comment::element::Kind::ListOpen(validator::Empty {})
141-
}
142-
comment::Element::ListNext => {
143-
validator::comment::element::Kind::ListNext(validator::Empty {})
144-
}
145-
comment::Element::ListClose => {
146-
validator::comment::element::Kind::ListClose(validator::Empty {})
147-
}
136+
comment::Element::NewLine => validator::comment::element::Kind::NewLine(()),
137+
comment::Element::ListOpen => validator::comment::element::Kind::ListOpen(()),
138+
comment::Element::ListNext => validator::comment::element::Kind::ListNext(()),
139+
comment::Element::ListClose => validator::comment::element::Kind::ListClose(()),
148140
}),
149141
}
150142
}
@@ -182,9 +174,7 @@ impl From<&tree::NodeType> for validator::node::NodeType {
182174
data: Some(data.into()),
183175
})
184176
}
185-
tree::NodeType::ProtoMissingOneOf => {
186-
validator::node::NodeType::ProtoMissingOneof(validator::Empty::default())
187-
}
177+
tree::NodeType::ProtoMissingOneOf => validator::node::NodeType::ProtoMissingOneof(()),
188178
tree::NodeType::NodeReference(anchor, node) => {
189179
validator::node::NodeType::NodeReference(validator::node::NodeReference {
190180
value: *anchor,
@@ -196,12 +186,8 @@ impl From<&tree::NodeType> for validator::node::NodeType {
196186
uri: info.uri.name().unwrap_or_default().to_string(),
197187
})
198188
}
199-
tree::NodeType::YamlMap => {
200-
validator::node::NodeType::YamlMap(validator::Empty::default())
201-
}
202-
tree::NodeType::YamlArray => {
203-
validator::node::NodeType::YamlArray(validator::Empty::default())
204-
}
189+
tree::NodeType::YamlMap => validator::node::NodeType::YamlMap(()),
190+
tree::NodeType::YamlArray => validator::node::NodeType::YamlArray(()),
205191
tree::NodeType::YamlPrimitive(data) => {
206192
validator::node::NodeType::YamlPrimitive(data.into())
207193
}
@@ -308,7 +294,7 @@ impl From<&data_type::Class> for validator::data_type::Class {
308294
validator::data_type::class::Kind::UserDefinedType(user_defined.as_ref().into())
309295
}
310296
data_type::Class::Unresolved => {
311-
validator::data_type::class::Kind::UnresolvedType(validator::Empty {})
297+
validator::data_type::class::Kind::UnresolvedType(())
312298
}
313299
}),
314300
}
@@ -393,7 +379,7 @@ impl From<&extension::Reference<extension::TypeVariation>> for validator::data_t
393379
},
394380
)
395381
} else {
396-
validator::data_type::Variation::UnresolvedVariation(validator::Empty {})
382+
validator::data_type::Variation::UnresolvedVariation(())
397383
}
398384
}
399385
}
@@ -425,6 +411,22 @@ impl From<&data_type::Parameter> for validator::data_type::Parameter {
425411
fn from(node: &data_type::Parameter) -> Self {
426412
Self {
427413
kind: Some(match node {
414+
data_type::Parameter::Unresolved => {
415+
validator::data_type::parameter::Kind::Unresolved(())
416+
}
417+
data_type::Parameter::Null => validator::data_type::parameter::Kind::Null(()),
418+
data_type::Parameter::Boolean(x) => {
419+
validator::data_type::parameter::Kind::Boolean(*x)
420+
}
421+
data_type::Parameter::Integer(x) => {
422+
validator::data_type::parameter::Kind::Integer(*x)
423+
}
424+
data_type::Parameter::Enum(x) => {
425+
validator::data_type::parameter::Kind::Enumeration(x.clone())
426+
}
427+
data_type::Parameter::String(x) => {
428+
validator::data_type::parameter::Kind::String(x.clone())
429+
}
428430
data_type::Parameter::Type(data_type) => {
429431
validator::data_type::parameter::Kind::DataType(data_type.as_ref().into())
430432
}
@@ -434,9 +436,6 @@ impl From<&data_type::Parameter> for validator::data_type::Parameter {
434436
data_type: Some(data_type.as_ref().into()),
435437
})
436438
}
437-
data_type::Parameter::Unsigned(unsigned) => {
438-
validator::data_type::parameter::Kind::Unsigned(*unsigned)
439-
}
440439
}),
441440
}
442441
}

0 commit comments

Comments
 (0)