@@ -17,7 +17,7 @@ use super::{
1717use crate :: {
1818 common:: {
1919 error:: TypeQLError ,
20- token:: { Order , ReduceOperator } ,
20+ token:: { Order , ReduceOperatorCollect , ReduceOperatorStat } ,
2121 Spanned ,
2222 } ,
2323 parser:: define:: function:: visit_function_block,
@@ -28,7 +28,7 @@ use crate::{
2828 delete:: { Deletable , DeletableKind } ,
2929 fetch:: FetchSome ,
3030 modifier:: { Distinct , Limit , Offset , OrderedVariable , Require , Select , Sort } ,
31- reduce:: { Count , Reducer , Stat } ,
31+ reduce:: { Collect , Count , Reducer , Stat } ,
3232 Delete , Fetch , Insert , Match , Operator , Put , Reduce , Stage , Update ,
3333 } ,
3434 Preamble ,
@@ -411,32 +411,41 @@ pub(crate) fn visit_reducer(node: Node<'_>) -> Reducer {
411411 let keyword = children. consume_any ( ) ;
412412 match keyword. as_rule ( ) {
413413 Rule :: COUNT => Reducer :: Count ( Count :: new ( span, children. try_consume_expected ( Rule :: var) . map ( visit_var) ) ) ,
414- Rule :: MAX => {
415- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Max , visit_var ( children. consume_expected ( Rule :: var) ) ) )
414+ Rule :: reducer_stat => {
415+ let operator = visit_reducer_stat ( keyword) ;
416+ Reducer :: Stat ( Stat :: new ( span, operator, visit_var ( children. consume_expected ( Rule :: var) ) ) )
416417 }
417- Rule :: MIN => {
418- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Min , visit_var ( children. consume_expected ( Rule :: var) ) ) )
419- }
420- Rule :: MEAN => {
421- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Mean , visit_var ( children. consume_expected ( Rule :: var) ) ) )
422- }
423- Rule :: MEDIAN => {
424- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Median , visit_var ( children. consume_expected ( Rule :: var) ) ) )
425- }
426- Rule :: STD => {
427- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Std , visit_var ( children. consume_expected ( Rule :: var) ) ) )
428- }
429- Rule :: SUM => {
430- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: Sum , visit_var ( children. consume_expected ( Rule :: var) ) ) )
431- }
432- Rule :: LIST => {
433- // TODO vvvv rename
434- Reducer :: Stat ( Stat :: new ( span, ReduceOperator :: List , visit_var ( children. consume_expected ( Rule :: var) ) ) )
418+ Rule :: reducer_collect => {
419+ let operator = visit_reducer_collect ( keyword) ;
420+ Reducer :: Collect ( Collect :: new ( span, operator, visit_var ( children. consume_expected ( Rule :: var) ) ) )
435421 }
436422 _ => unreachable ! ( "{}" , TypeQLError :: IllegalGrammar { input: keyword. as_str( ) . to_owned( ) } ) ,
437423 }
438424}
439425
426+ fn visit_reducer_stat ( node : Node < ' _ > ) -> ReduceOperatorStat {
427+ debug_assert_eq ! ( node. as_rule( ) , Rule :: reducer_stat) ;
428+ let child = node. into_child ( ) ;
429+ match child. as_rule ( ) {
430+ Rule :: MAX => ReduceOperatorStat :: Max ,
431+ Rule :: MIN => ReduceOperatorStat :: Min ,
432+ Rule :: MEAN => ReduceOperatorStat :: Mean ,
433+ Rule :: MEDIAN => ReduceOperatorStat :: Median ,
434+ Rule :: STD => ReduceOperatorStat :: Std ,
435+ Rule :: SUM => ReduceOperatorStat :: Sum ,
436+ _ => unreachable ! ( "{}" , TypeQLError :: IllegalGrammar { input: child. as_str( ) . to_owned( ) } ) ,
437+ }
438+ }
439+
440+ fn visit_reducer_collect ( node : Node < ' _ > ) -> ReduceOperatorCollect {
441+ debug_assert_eq ! ( node. as_rule( ) , Rule :: reducer_collect) ;
442+ let child = node. into_child ( ) ;
443+ match child. as_rule ( ) {
444+ Rule :: LIST => ReduceOperatorCollect :: List ,
445+ _ => unreachable ! ( "{}" , TypeQLError :: IllegalGrammar { input: child. as_str( ) . to_owned( ) } ) ,
446+ }
447+ }
448+
440449fn visit_operator_select ( node : Node < ' _ > ) -> Select {
441450 debug_assert_eq ! ( node. as_rule( ) , Rule :: operator_select) ;
442451 let span = node. span ( ) ;
0 commit comments