|
1 | 1 | use crate::ast::*;
|
2 | 2 | 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, |
4 | 4 | pretty_seperated_doc, pretty_seq, pretty_seq_doc, pretty_surrounded, pretty_surrounded_doc,
|
5 | 5 | PrettyDoc, PRETTY_INDENT_MINOR_NEST, PRETTY_INDENT_SUBORDINATE_CLAUSE_NEST,
|
6 | 6 | };
|
@@ -1032,35 +1032,139 @@ impl PrettyDoc for GraphMatch {
|
1032 | 1032 | }
|
1033 | 1033 |
|
1034 | 1034 | 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> |
1036 | 1036 | where
|
1037 | 1037 | D: DocAllocator<'b, A>,
|
1038 | 1038 | D::Doc: Clone,
|
1039 | 1039 | A: Clone,
|
1040 | 1040 | {
|
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.into_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.into_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 | + } |
1042 | 1088 | }
|
1043 | 1089 | }
|
1044 | 1090 |
|
1045 | 1091 | 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> |
1047 | 1093 | where
|
1048 | 1094 | D: DocAllocator<'b, A>,
|
1049 | 1095 | D::Doc: Clone,
|
1050 | 1096 | A: Clone,
|
1051 | 1097 | {
|
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 | + } |
1053 | 1133 | }
|
1054 | 1134 | }
|
1055 | 1135 |
|
1056 | 1136 | 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> |
1058 | 1138 | where
|
1059 | 1139 | D: DocAllocator<'b, A>,
|
1060 | 1140 | D::Doc: Clone,
|
1061 | 1141 | A: Clone,
|
1062 | 1142 | {
|
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 | + } |
1064 | 1168 | }
|
1065 | 1169 | }
|
1066 | 1170 |
|
|
0 commit comments