@@ -49,6 +49,11 @@ pub enum Node {
49
49
Binding { children : Vec < Node > } ,
50
50
FunctionBinding { children : Vec < Node > } ,
51
51
Function { name : Vec < char > , children : Vec < Node > } ,
52
+ UserFunction { children : Vec < Node > } ,
53
+ FunctionBody { children : Vec < Node > } ,
54
+ FunctionArgs { children : Vec < Node > } ,
55
+ FunctionInput { children : Vec < Node > } ,
56
+ FunctionOutput { children : Vec < Node > } ,
52
57
Define { name : Vec < char > , id : u64 } ,
53
58
DotIndex { children : Vec < Node > } ,
54
59
Swizzle { children : Vec < Node > } ,
@@ -76,6 +81,7 @@ pub enum Node {
76
81
Add ,
77
82
Subtract ,
78
83
Multiply ,
84
+ MatrixMultiply ,
79
85
Divide ,
80
86
Exponent ,
81
87
LessThan ,
@@ -112,6 +118,8 @@ pub enum Node {
112
118
InlineMechCode { children : Vec < Node > } ,
113
119
MechCodeBlock { children : Vec < Node > } ,
114
120
Null ,
121
+ Transpose ,
122
+ TransposeSelect { children : Vec < Node > } ,
115
123
}
116
124
117
125
impl fmt:: Debug for Node {
@@ -163,6 +171,12 @@ pub fn print_recurse(node: &Node, level: usize, f: &mut fmt::Formatter) {
163
171
Node :: Range => { write ! ( f, "Range\n " ) . ok ( ) ; None } ,
164
172
Node :: Expression { children} => { write ! ( f, "Expression\n " ) . ok ( ) ; Some ( children) } ,
165
173
Node :: Function { name, children} => { write ! ( f, "Function({:?})\n " , name) . ok ( ) ; Some ( children) } ,
174
+ Node :: UserFunction { children} => { write ! ( f, "UserFunction\n " ) . ok ( ) ; Some ( children) } ,
175
+ Node :: FunctionBody { children} => { write ! ( f, "FunctionBody\n " ) . ok ( ) ; Some ( children) } ,
176
+ Node :: FunctionArgs { children} => { write ! ( f, "FunctionArgs\n " ) . ok ( ) ; Some ( children) } ,
177
+ Node :: UserFunction { children} => { write ! ( f, "Expression\n " ) . ok ( ) ; Some ( children) } ,
178
+ Node :: FunctionInput { children} => { write ! ( f, "FunctionInput\n " ) . ok ( ) ; Some ( children) } ,
179
+ Node :: FunctionOutput { children} => { write ! ( f, "FunctionOutput\n " ) . ok ( ) ; Some ( children) } ,
166
180
Node :: MathExpression { children} => { write ! ( f, "MathExpression\n " ) . ok ( ) ; Some ( children) } ,
167
181
Node :: Comment { children} => { write ! ( f, "Comment\n " ) . ok ( ) ; Some ( children) } ,
168
182
Node :: SelectExpression { children} => { write ! ( f, "SelectExpression\n " ) . ok ( ) ; Some ( children) } ,
@@ -190,13 +204,16 @@ pub fn print_recurse(node: &Node, level: usize, f: &mut fmt::Formatter) {
190
204
Node :: Add => { write ! ( f, "Add\n " ) . ok ( ) ; None } ,
191
205
Node :: Subtract => { write ! ( f, "Subtract\n " ) . ok ( ) ; None } ,
192
206
Node :: Multiply => { write ! ( f, "Multiply\n " ) . ok ( ) ; None } ,
207
+ Node :: MatrixMultiply => { write ! ( f, "MatrixMultiply\n " ) . ok ( ) ; None } ,
193
208
Node :: Divide => { write ! ( f, "Divide\n " ) . ok ( ) ; None } ,
194
209
Node :: Exponent => { write ! ( f, "Exponent\n " ) . ok ( ) ; None } ,
195
210
Node :: AddUpdate => { write ! ( f, "AddUpdate\n " ) . ok ( ) ; None } ,
196
211
Node :: SubtractUpdate => { write ! ( f, "SubtractUpdate\n " ) . ok ( ) ; None } ,
197
212
Node :: MultiplyUpdate => { write ! ( f, "MultiplyUpdate\n " ) . ok ( ) ; None } ,
198
213
Node :: DivideUpdate => { write ! ( f, "DivideUpdate\n " ) . ok ( ) ; None } ,
199
214
Node :: ExponentUpdate => { write ! ( f, "ExponentUpdate\n " ) . ok ( ) ; None } ,
215
+ Node :: Transpose => { write ! ( f, "Transpose\n " ) . ok ( ) ; None } ,
216
+ Node :: TransposeSelect { children} => { write ! ( f, "TransposeSelect\n " ) . ok ( ) ; Some ( children) } ,
200
217
// Markdown Nodes
201
218
Node :: Title { text} => { write ! ( f, "Title({:?})\n " , text) . ok ( ) ; None } ,
202
219
Node :: ParagraphText { text} => { write ! ( f, "ParagraphText({:?})\n " , text) . ok ( ) ; None } ,
@@ -305,6 +322,8 @@ impl Ast {
305
322
reversed. reverse ( ) ;
306
323
let mut select_data_children: Vec < Node > = vec ! [ ] ;
307
324
325
+ let mut transpose = false ;
326
+
308
327
for node in reversed {
309
328
match node {
310
329
Node :: Table { name, id} => {
@@ -318,7 +337,13 @@ impl Ast {
318
337
if select_data_children. is_empty ( ) {
319
338
select_data_children = vec ! [ Node :: Null ; 1 ] ;
320
339
}
321
- compiled. push ( Node :: SelectData { name, id : TableId :: Local ( id) , children : select_data_children. clone ( ) } ) ;
340
+ select_data_children. reverse ( ) ;
341
+ let select = Node :: SelectData { name, id : TableId :: Local ( id) , children : select_data_children. clone ( ) } ;
342
+ if transpose {
343
+ compiled. push ( Node :: TransposeSelect { children : vec ! [ select] } ) ;
344
+ } else {
345
+ compiled. push ( select) ;
346
+ }
322
347
} ,
323
348
Node :: DotIndex { children} => {
324
349
let mut reversed = children. clone ( ) ;
@@ -337,6 +362,9 @@ impl Ast {
337
362
Node :: ReshapeColumn => {
338
363
select_data_children. push ( Node :: ReshapeColumn ) ;
339
364
}
365
+ Node :: Transpose => {
366
+ transpose = true ;
367
+ }
340
368
_ => ( ) ,
341
369
}
342
370
}
@@ -796,6 +824,7 @@ impl Ast {
796
824
Node :: Add => "math/add" . chars ( ) . collect ( ) ,
797
825
Node :: Subtract => "math/subtract" . chars ( ) . collect ( ) ,
798
826
Node :: Multiply => "math/multiply" . chars ( ) . collect ( ) ,
827
+ Node :: MatrixMultiply => "matrix/multiply" . chars ( ) . collect ( ) ,
799
828
Node :: Divide => "math/divide" . chars ( ) . collect ( ) ,
800
829
Node :: Exponent => "math/exponent" . chars ( ) . collect ( ) ,
801
830
Node :: GreaterThan => "compare/greater-than" . chars ( ) . collect ( ) ,
@@ -821,6 +850,26 @@ impl Ast {
821
850
let result = self . compile_nodes ( children) ;
822
851
compiled. push ( Node :: Function { name : "math/negate" . chars ( ) . collect ( ) , children : result} ) ;
823
852
} ,
853
+ parser:: Node :: UserFunction { children} => {
854
+ let result = self . compile_nodes ( children) ;
855
+ compiled. push ( Node :: UserFunction { children : result. clone ( ) } ) ;
856
+ }
857
+ parser:: Node :: FunctionArgs { children} => {
858
+ let result = self . compile_nodes ( children) ;
859
+ compiled. push ( Node :: FunctionArgs { children : result. clone ( ) } ) ;
860
+ }
861
+ parser:: Node :: FunctionInput { children} => {
862
+ let result = self . compile_nodes ( children) ;
863
+ compiled. push ( Node :: FunctionInput { children : result. clone ( ) } ) ;
864
+ }
865
+ parser:: Node :: FunctionOutput { children} => {
866
+ let result = self . compile_nodes ( children) ;
867
+ compiled. push ( Node :: FunctionOutput { children : result. clone ( ) } ) ;
868
+ }
869
+ parser:: Node :: FunctionBody { children} => {
870
+ let result = self . compile_nodes ( children) ;
871
+ compiled. push ( Node :: FunctionBody { children : result. clone ( ) } ) ;
872
+ }
824
873
parser:: Node :: Function { children} => {
825
874
let result = self . compile_nodes ( children) ;
826
875
let mut children: Vec < Node > = Vec :: new ( ) ;
@@ -873,6 +922,9 @@ impl Ast {
873
922
parser:: Node :: True => {
874
923
compiled. push ( Node :: True ) ;
875
924
} ,
925
+ parser:: Node :: Transpose => {
926
+ compiled. push ( Node :: Transpose ) ;
927
+ } ,
876
928
parser:: Node :: False => {
877
929
compiled. push ( Node :: False ) ;
878
930
} ,
@@ -934,6 +986,7 @@ impl Ast {
934
986
parser:: Node :: Add => compiled. push ( Node :: Add ) ,
935
987
parser:: Node :: Subtract => compiled. push ( Node :: Subtract ) ,
936
988
parser:: Node :: Multiply => compiled. push ( Node :: Multiply ) ,
989
+ parser:: Node :: MatrixMultiply => compiled. push ( Node :: MatrixMultiply ) ,
937
990
parser:: Node :: Divide => compiled. push ( Node :: Divide ) ,
938
991
parser:: Node :: Exponent => compiled. push ( Node :: Exponent ) ,
939
992
parser:: Node :: And => compiled. push ( Node :: And ) ,
0 commit comments