Skip to content

Commit 1b08958

Browse files
committed
Additional parse/lex tests
1 parent ac052ae commit 1b08958

20 files changed

+979
-34
lines changed

partiql-ast/src/pretty.rs

Lines changed: 111 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::ast::*;
22
use partiql_common::pretty::{
3-
pretty_list, pretty_parenthesized_doc, pretty_prefixed_doc, pretty_seperated,
3+
pretty_doc_list, pretty_list, pretty_parenthesized_doc, pretty_prefixed_doc, pretty_seperated,
44
pretty_seperated_doc, pretty_seq, pretty_seq_doc, pretty_surrounded, pretty_surrounded_doc,
55
PrettyDoc, PRETTY_INDENT_MINOR_NEST, PRETTY_INDENT_SUBORDINATE_CLAUSE_NEST,
66
};
@@ -1032,35 +1032,139 @@ impl PrettyDoc for GraphMatch {
10321032
}
10331033

10341034
impl PrettyDoc for GraphTableRows {
1035-
fn pretty_doc<'b, D, A>(&'b self, _arena: &'b D) -> DocBuilder<'b, D, A>
1035+
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
10361036
where
10371037
D: DocAllocator<'b, A>,
10381038
D::Doc: Clone,
10391039
A: Clone,
10401040
{
1041-
todo!()
1041+
match self {
1042+
GraphTableRows::OneRowPerMatch => arena.text("ONE ROW PER MATCH"),
1043+
GraphTableRows::OneRowPerVertex { v, in_paths } => {
1044+
let prefix = arena.text("ONE ROW PER NODE");
1045+
let spec = pretty_parenthesized_doc(arena.text(&v.value), arena);
1046+
let in_paths = in_paths.as_ref().map(|paths| {
1047+
let paths = pretty_parenthesized_doc(
1048+
pretty_doc_list(paths.iter().map(|p| arena.text(&p.value)), 0, arena),
1049+
arena,
1050+
);
1051+
[arena.text("IN"), paths]
1052+
});
1053+
arena.intersperse(
1054+
[Some([prefix, spec]), in_paths]
1055+
.into_iter()
1056+
.flatten()
1057+
.flatten(),
1058+
arena.softline(),
1059+
)
1060+
}
1061+
GraphTableRows::OneRowPerStep {
1062+
v1,
1063+
e,
1064+
v2,
1065+
in_paths,
1066+
} => {
1067+
let prefix = arena.text("ONE ROW PER STEP");
1068+
let step = pretty_doc_list(
1069+
[v1, e, v2].into_iter().map(|n| arena.text(&n.value)),
1070+
0,
1071+
arena,
1072+
);
1073+
let spec = pretty_parenthesized_doc(step, arena);
1074+
let in_paths = in_paths.as_ref().map(|paths| {
1075+
let paths =
1076+
pretty_doc_list(paths.iter().map(|p| arena.text(&p.value)), 0, arena);
1077+
[arena.text("IN"), pretty_parenthesized_doc(paths, arena)]
1078+
});
1079+
arena.intersperse(
1080+
[Some([prefix, spec]), in_paths]
1081+
.into_iter()
1082+
.flatten()
1083+
.flatten(),
1084+
arena.softline(),
1085+
)
1086+
}
1087+
}
10421088
}
10431089
}
10441090

10451091
impl PrettyDoc for GraphTableColumns {
1046-
fn pretty_doc<'b, D, A>(&'b self, _arena: &'b D) -> DocBuilder<'b, D, A>
1092+
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
10471093
where
10481094
D: DocAllocator<'b, A>,
10491095
D::Doc: Clone,
10501096
A: Clone,
10511097
{
1052-
todo!()
1098+
let col_defs = pretty_list(&self.columns, 0, arena);
1099+
arena.intersperse(
1100+
[
1101+
arena.text("COLUMNS"),
1102+
pretty_parenthesized_doc(col_defs, arena),
1103+
],
1104+
arena.space(),
1105+
)
1106+
}
1107+
}
1108+
1109+
impl PrettyDoc for GraphTableColumnDef {
1110+
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
1111+
where
1112+
D: DocAllocator<'b, A>,
1113+
D::Doc: Clone,
1114+
A: Clone,
1115+
{
1116+
match self {
1117+
GraphTableColumnDef::Expr(expr, as_ident) => {
1118+
let parts = if let Some(as_ident) = as_ident {
1119+
vec![
1120+
expr.pretty_doc(arena),
1121+
arena.text("AS"),
1122+
arena.text(&as_ident.value),
1123+
]
1124+
} else {
1125+
vec![expr.pretty_doc(arena)]
1126+
};
1127+
arena.intersperse(parts, arena.space())
1128+
}
1129+
GraphTableColumnDef::AllProperties(_) => {
1130+
unreachable!()
1131+
}
1132+
}
10531133
}
10541134
}
10551135

10561136
impl PrettyDoc for GraphTableExport {
1057-
fn pretty_doc<'b, D, A>(&'b self, _arena: &'b D) -> DocBuilder<'b, D, A>
1137+
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
10581138
where
10591139
D: DocAllocator<'b, A>,
10601140
D::Doc: Clone,
10611141
A: Clone,
10621142
{
1063-
todo!()
1143+
match self {
1144+
GraphTableExport::AllSingletons { except } => {
1145+
let prefix = arena.text("EXPORT ALL SINGLETONS");
1146+
if let Some(except) = except {
1147+
let except =
1148+
pretty_doc_list(except.iter().map(|s| arena.text(&s.value)), 0, arena);
1149+
let parts = [
1150+
prefix,
1151+
arena.text("EXCEPT"),
1152+
pretty_parenthesized_doc(except, arena),
1153+
];
1154+
arena.intersperse(parts, arena.space())
1155+
} else {
1156+
prefix
1157+
}
1158+
}
1159+
GraphTableExport::Singletons { exports } => {
1160+
let prefix = arena.text("EXPORT SINGLETONS");
1161+
let exports =
1162+
pretty_doc_list(exports.iter().map(|e| arena.text(&e.value)), 0, arena);
1163+
let parts = [prefix, pretty_parenthesized_doc(exports, arena)];
1164+
arena.intersperse(parts, arena.space())
1165+
}
1166+
GraphTableExport::NoSingletons => arena.text("EXPORT NO SINGLETONS"),
1167+
}
10641168
}
10651169
}
10661170

partiql-common/src/pretty.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,18 @@ where
262262
pretty_seperated(sep, list, nest, arena)
263263
}
264264

265+
#[inline]
266+
pub fn pretty_doc_list<'b, I, D, A>(list: I, nest: isize, arena: &'b D) -> DocBuilder<'b, D, A>
267+
where
268+
I: IntoIterator<Item = DocBuilder<'b, D, A>>,
269+
D: DocAllocator<'b, A>,
270+
D::Doc: Clone,
271+
A: Clone,
272+
{
273+
let sep = arena.text(",").append(arena.softline());
274+
pretty_seperated_doc(sep, list, nest, arena)
275+
}
276+
265277
#[inline]
266278
pub fn pretty_seperated<'b, I, E, P, D, A>(
267279
sep: E,

partiql-parser/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ serde = { version = "1", features = ["derive"], optional = true }
4848
[dev-dependencies]
4949
criterion = "0.5"
5050
assert_matches = "1"
51+
insta = "1"
5152

5253
[features]
5354
default = []

partiql-parser/src/lexer/mod.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,41 +84,39 @@ mod tests {
8484
fn display() -> Result<(), ParseError<'static, BytePosition>> {
8585
let symbols =
8686
"( [ { } ] ) << >> ; , < > <= >= != <> = == - + * ? % / ^ . || : --foo /*block*/";
87+
let graph_symbols =
88+
"|+| <- ~ -> <~ ~> <-[ ]- ~[ ]~ -[ ]-> <~[ ]~> <-> <-/ /- ~/ /~ -/ /-> <~/ /~>";
8789
let primitives = r#"unquoted_ident "quoted_ident" @unquoted_atident @"quoted_atident""#;
8890
let keywords =
8991
"WiTH Where Value uSiNg Unpivot UNION True Select right Preserve pivoT Outer Order Or \
9092
On Offset Nulls Null Not Natural Missing Limit Like Left Lateral Last Join \
9193
Intersect Is Inner In Having Group From For Full First False Except Escape Desc \
9294
Cross Table Time Timestamp Date By Between At As And Asc All Values Case When Then Else End \
93-
Match Any Shortest Trail Acyclic Simple";
94-
let symbols = symbols.split(' ').chain(primitives.split(' '));
95+
Match";
96+
let nonreserved_kw = "Any Simple Acyclic Bindings Bound Destination \
97+
Different Directed Edge Edges Elements label Labeled Node Paths Properties Property \
98+
PROPERTY_GRAPH_CaTalOg PROPERTY_GRAPH_NaMe PROPERTY_GRAPH_SchEma Relationship Relationships \
99+
Shortest Singletons Step Tables Trail Vertex Walk";
100+
let symbols = symbols.split(' ');
101+
let graph_symbols = graph_symbols.split(' ');
102+
let primitives = primitives.split(' ');
103+
let nonreserved_kws = nonreserved_kw.split(' ');
95104
let keywords = keywords.split(' ');
96105

97-
let text = symbols.interleave(keywords).join("\n");
106+
let text = symbols
107+
.chain(graph_symbols)
108+
.chain(primitives)
109+
.chain(keywords)
110+
.chain(nonreserved_kws)
111+
.join("\n");
98112
let s = text.as_str();
99113

100114
let mut offset_tracker = LineOffsetTracker::default();
101115
let lexer = PartiqlLexer::new(s, &mut offset_tracker);
102116
let toks: Vec<_> = lexer.collect::<Result<_, _>>().unwrap();
103117

104-
#[rustfmt::skip]
105-
let expected = vec![
106-
"(", "WITH", "[", "WHERE", "{", "VALUE", "}", "USING", "]", "UNPIVOT", ")", "UNION",
107-
"<<", "TRUE", ">>", "SELECT", ";", "RIGHT", ",", "PRESERVE", "<", "PIVOT", ">", "OUTER",
108-
"<=", "ORDER", ">=", "OR", "!=", "ON", "<>", "OFFSET", "=", "NULLS", "==", "NULL", "-",
109-
"NOT", "+", "NATURAL", "*", "MISSING", "?", "LIMIT", "%", "LIKE", "/", "LEFT", "^",
110-
"LATERAL", ".", "LAST", "||", "JOIN", ":", "INTERSECT", "--", "IS", "/**/", "INNER",
111-
"<unquoted_ident:UNQUOTED_IDENT>", "IN", "<quoted_ident:QUOTED_IDENT>", "HAVING",
112-
"<unquoted_atident:UNQUOTED_ATIDENT>", "GROUP", "<quoted_atident:QUOTED_ATIDENT>",
113-
"FROM", "FOR", "FULL", "FIRST", "FALSE", "EXCEPT", "ESCAPE", "DESC", "CROSS", "TABLE",
114-
"TIME", "TIMESTAMP", "DATE", "BY", "BETWEEN", "AT", "AS", "AND", "ASC", "ALL", "VALUES",
115-
"CASE", "WHEN", "THEN", "ELSE", "END", "MATCH", "ANY", "SHORTEST", "TRAIL", "ACYCLIC", "SIMPLE"
116-
];
117-
let displayed = toks
118-
.into_iter()
119-
.map(|(_s, t, _e)| t.to_string())
120-
.collect::<Vec<_>>();
121-
assert_eq!(expected, displayed);
118+
let toks = toks.into_iter().map(|(_s, t, _e)| t.to_string()).join("\n");
119+
insta::assert_snapshot!(toks);
122120

123121
Ok(())
124122
}
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
---
2+
source: partiql-parser/src/lexer/mod.rs
3+
expression: toks
4+
---
5+
(
6+
[
7+
{
8+
}
9+
]
10+
)
11+
<<
12+
>>
13+
;
14+
,
15+
<
16+
>
17+
<=
18+
>=
19+
!=
20+
<>
21+
=
22+
==
23+
-
24+
+
25+
*
26+
?
27+
%
28+
/
29+
^
30+
.
31+
||
32+
:
33+
--
34+
/**/
35+
|+|
36+
<-
37+
~
38+
->
39+
<~
40+
~>
41+
<-[
42+
]-
43+
~[
44+
]~
45+
-[
46+
]->
47+
<~[
48+
]~>
49+
<->
50+
<-/
51+
/-
52+
~/
53+
/~
54+
-/
55+
/->
56+
<~/
57+
/~>
58+
<unquoted_ident:UNQUOTED_IDENT>
59+
<quoted_ident:QUOTED_IDENT>
60+
<unquoted_atident:UNQUOTED_ATIDENT>
61+
<quoted_atident:QUOTED_ATIDENT>
62+
WITH
63+
WHERE
64+
VALUE
65+
USING
66+
UNPIVOT
67+
UNION
68+
TRUE
69+
SELECT
70+
RIGHT
71+
PRESERVE
72+
PIVOT
73+
OUTER
74+
ORDER
75+
OR
76+
ON
77+
OFFSET
78+
NULLS
79+
NULL
80+
NOT
81+
NATURAL
82+
MISSING
83+
LIMIT
84+
LIKE
85+
LEFT
86+
LATERAL
87+
LAST
88+
JOIN
89+
INTERSECT
90+
IS
91+
INNER
92+
IN
93+
HAVING
94+
GROUP
95+
FROM
96+
FOR
97+
FULL
98+
FIRST
99+
FALSE
100+
EXCEPT
101+
ESCAPE
102+
DESC
103+
CROSS
104+
TABLE
105+
TIME
106+
TIMESTAMP
107+
DATE
108+
BY
109+
BETWEEN
110+
AT
111+
AS
112+
AND
113+
ASC
114+
ALL
115+
VALUES
116+
CASE
117+
WHEN
118+
THEN
119+
ELSE
120+
END
121+
MATCH
122+
ANY("ANY")
123+
SIMPLE("SIMPLE")
124+
ACYCLIC("ACYCLIC")
125+
BINDINGS("BINDINGS")
126+
BOUND("BOUND")
127+
DESTINATION("DESTINATION")
128+
DIFFERENT("DIFFERENT")
129+
DIRECTED("DIRECTED")
130+
EDGE("EDGE")
131+
EDGES("EDGES")
132+
ELEMENTS("ELEMENTS")
133+
LABEL("LABEL")
134+
LABELED("LABELED")
135+
NODE("NODE")
136+
PATHS("PATHS")
137+
PROPERTIES("PROPERTIES")
138+
PROPERTY("PROPERTY")
139+
PROPERTYGRAPHCATALOG("PROPERTY_GRAPH_CATALOG")
140+
PROPERTYGRAPHNAME("PROPERTY_GRAPH_NAME")
141+
PROPERTYGRAPHSCHEMA("PROPERTY_GRAPH_SCHEMA")
142+
RELATIONSHIP("RELATIONSHIP")
143+
RELATIONSHIPS("RELATIONSHIPS")
144+
SHORTEST("SHORTEST")
145+
SINGLETONS("SINGLETONS")
146+
STEP("STEP")
147+
TABLES("TABLES")
148+
TRAIL("TRAIL")
149+
VERTEX("VERTEX")
150+
WALK("WALK")

0 commit comments

Comments
 (0)