@@ -6,8 +6,8 @@ use partiql_ast::ast;
6
6
use partiql_ast:: ast:: {
7
7
Assignment , Bag , Between , BinOp , BinOpKind , Call , CallAgg , CallArg , CallArgNamed ,
8
8
CaseSensitivity , CreateIndex , CreateTable , Ddl , DdlOp , Delete , Dml , DmlOp , DropIndex ,
9
- DropTable , FromClause , FromLet , FromLetKind , GroupByExpr , GroupKey , GroupingStrategy , Insert ,
10
- InsertValue , Item , Join , JoinKind , JoinSpec , Like , List , Lit , NodeId , NullOrderingSpec ,
9
+ DropTable , Expr , FromClause , FromLet , FromLetKind , GroupByExpr , GroupKey , GroupingStrategy ,
10
+ Insert , InsertValue , Item , Join , JoinKind , JoinSpec , Like , List , Lit , NodeId , NullOrderingSpec ,
11
11
OnConflict , OrderByExpr , OrderingSpec , Path , PathStep , ProjectExpr , Projection , ProjectionKind ,
12
12
Query , QuerySet , Remove , SearchedCase , Select , Set , SetExpr , SetQuantifier , Sexp , SimpleCase ,
13
13
SortSpec , Struct , SymbolPrimitive , UniOp , UniOpKind , VarRef ,
@@ -979,48 +979,12 @@ impl<'a, 'ast> Visitor<'ast> for AstToLogical<'a> {
979
979
980
980
// Values & Value Constructors
981
981
982
- fn enter_lit ( & mut self , _lit : & ' ast Lit ) -> Traverse {
983
- let val = match _lit {
984
- Lit :: Null => Value :: Null ,
985
- Lit :: Missing => Value :: Missing ,
986
- Lit :: Int8Lit ( n) => Value :: Integer ( * n as i64 ) ,
987
- Lit :: Int16Lit ( n) => Value :: Integer ( * n as i64 ) ,
988
- Lit :: Int32Lit ( n) => Value :: Integer ( * n as i64 ) ,
989
- Lit :: Int64Lit ( n) => Value :: Integer ( * n) ,
990
- Lit :: DecimalLit ( d) => Value :: Decimal ( * d) ,
991
- Lit :: NumericLit ( n) => Value :: Decimal ( * n) ,
992
- Lit :: RealLit ( f) => Value :: Real ( OrderedFloat :: from ( * f as f64 ) ) ,
993
- Lit :: FloatLit ( f) => Value :: Real ( OrderedFloat :: from ( * f as f64 ) ) ,
994
- Lit :: DoubleLit ( f) => Value :: Real ( OrderedFloat :: from ( * f) ) ,
995
- Lit :: BoolLit ( b) => Value :: Boolean ( * b) ,
996
- Lit :: IonStringLit ( s) => match parse_embedded_ion_str ( s) {
997
- Ok ( v) => v,
998
- Err ( e) => {
999
- // Report error but allow visitor to continue
1000
- self . errors . push ( e) ;
1001
- Value :: Missing
1002
- }
1003
- } ,
1004
- Lit :: CharStringLit ( s) => Value :: String ( Box :: new ( s. clone ( ) ) ) ,
1005
- Lit :: NationalCharStringLit ( s) => Value :: String ( Box :: new ( s. clone ( ) ) ) ,
1006
- Lit :: BitStringLit ( _) => {
1007
- // Report error but allow visitor to continue
1008
- not_yet_implemented_err ! ( self , "Lit::BitStringLit" . to_string( ) ) ;
1009
- Value :: Missing
1010
- }
1011
- Lit :: HexStringLit ( _) => {
1012
- // Report error but allow visitor to continue
1013
- not_yet_implemented_err ! ( self , "Lit::HexStringLit" . to_string( ) ) ;
1014
- Value :: Missing
1015
- }
1016
- Lit :: CollectionLit ( _) => {
982
+ fn enter_lit ( & mut self , lit : & ' ast Lit ) -> Traverse {
983
+ let val = match lit_to_value ( lit) {
984
+ Ok ( v) => v,
985
+ Err ( e) => {
1017
986
// Report error but allow visitor to continue
1018
- not_yet_implemented_err ! ( self , "Lit::CollectionLit" . to_string( ) ) ;
1019
- Value :: Missing
1020
- }
1021
- Lit :: TypedLit ( _, _) => {
1022
- // Report error but allow visitor to continue
1023
- not_yet_implemented_err ! ( self , "Lit::TypedLit" . to_string( ) ) ;
987
+ self . errors . push ( e) ;
1024
988
Value :: Missing
1025
989
}
1026
990
} ;
@@ -1714,6 +1678,90 @@ impl<'a, 'ast> Visitor<'ast> for AstToLogical<'a> {
1714
1678
}
1715
1679
}
1716
1680
1681
+ fn lit_to_value ( lit : & Lit ) -> Result < Value , LowerError > {
1682
+ fn expect_lit ( v : & Expr ) -> Result < Value , LowerError > {
1683
+ match v {
1684
+ Expr :: Lit ( l) => lit_to_value ( & l. node ) ,
1685
+ _ => Err ( LowerError :: IllegalState (
1686
+ "non literal in literal aggregate" . to_string ( ) ,
1687
+ ) ) ,
1688
+ }
1689
+ }
1690
+
1691
+ fn tuple_pair ( pair : & ast:: ExprPair ) -> Option < Result < ( String , Value ) , LowerError > > {
1692
+ let key = match expect_lit ( pair. first . as_ref ( ) ) {
1693
+ Ok ( Value :: String ( s) ) => s. as_ref ( ) . clone ( ) ,
1694
+ Ok ( _) => {
1695
+ return Some ( Err ( LowerError :: IllegalState (
1696
+ "non string literal in literal struct key" . to_string ( ) ,
1697
+ ) ) )
1698
+ }
1699
+ Err ( e) => return Some ( Err ( e) ) ,
1700
+ } ;
1701
+
1702
+ match expect_lit ( pair. second . as_ref ( ) ) {
1703
+ Ok ( Value :: Missing ) => None ,
1704
+ Ok ( val) => Some ( Ok ( ( key, val) ) ) ,
1705
+ Err ( e) => Some ( Err ( e) ) ,
1706
+ }
1707
+ }
1708
+
1709
+ let val = match lit {
1710
+ Lit :: Null => Value :: Null ,
1711
+ Lit :: Missing => Value :: Missing ,
1712
+ Lit :: Int8Lit ( n) => Value :: Integer ( * n as i64 ) ,
1713
+ Lit :: Int16Lit ( n) => Value :: Integer ( * n as i64 ) ,
1714
+ Lit :: Int32Lit ( n) => Value :: Integer ( * n as i64 ) ,
1715
+ Lit :: Int64Lit ( n) => Value :: Integer ( * n) ,
1716
+ Lit :: DecimalLit ( d) => Value :: Decimal ( * d) ,
1717
+ Lit :: NumericLit ( n) => Value :: Decimal ( * n) ,
1718
+ Lit :: RealLit ( f) => Value :: Real ( OrderedFloat :: from ( * f as f64 ) ) ,
1719
+ Lit :: FloatLit ( f) => Value :: Real ( OrderedFloat :: from ( * f as f64 ) ) ,
1720
+ Lit :: DoubleLit ( f) => Value :: Real ( OrderedFloat :: from ( * f) ) ,
1721
+ Lit :: BoolLit ( b) => Value :: Boolean ( * b) ,
1722
+ Lit :: IonStringLit ( s) => parse_embedded_ion_str ( s) ?,
1723
+ Lit :: CharStringLit ( s) => Value :: String ( Box :: new ( s. clone ( ) ) ) ,
1724
+ Lit :: NationalCharStringLit ( s) => Value :: String ( Box :: new ( s. clone ( ) ) ) ,
1725
+ Lit :: BitStringLit ( _) => {
1726
+ return Err ( LowerError :: NotYetImplemented (
1727
+ "Lit::BitStringLit" . to_string ( ) ,
1728
+ ) )
1729
+ }
1730
+ Lit :: HexStringLit ( _) => {
1731
+ return Err ( LowerError :: NotYetImplemented (
1732
+ "Lit::HexStringLit" . to_string ( ) ,
1733
+ ) )
1734
+ }
1735
+ Lit :: BagLit ( b) => {
1736
+ let bag: Result < partiql_value:: Bag , _ > = b
1737
+ . node
1738
+ . values
1739
+ . iter ( )
1740
+ . map ( |l| expect_lit ( l. as_ref ( ) ) )
1741
+ . collect ( ) ;
1742
+ Value :: from ( bag?)
1743
+ }
1744
+ Lit :: ListLit ( l) => {
1745
+ let l: Result < partiql_value:: List , _ > = l
1746
+ . node
1747
+ . values
1748
+ . iter ( )
1749
+ . map ( |l| expect_lit ( l. as_ref ( ) ) )
1750
+ . collect ( ) ;
1751
+ Value :: from ( l?)
1752
+ }
1753
+ Lit :: StructLit ( s) => {
1754
+ let tuple: Result < partiql_value:: Tuple , _ > =
1755
+ s. node . fields . iter ( ) . filter_map ( tuple_pair) . collect ( ) ;
1756
+ Value :: from ( tuple?)
1757
+ }
1758
+ Lit :: TypedLit ( _, _) => {
1759
+ return Err ( LowerError :: NotYetImplemented ( "Lit::TypedLit" . to_string ( ) ) )
1760
+ }
1761
+ } ;
1762
+ Ok ( val)
1763
+ }
1764
+
1717
1765
fn parse_embedded_ion_str ( contents : & str ) -> Result < Value , LowerError > {
1718
1766
fn lit_err ( literal : & str , err : impl std:: error:: Error ) -> LowerError {
1719
1767
LowerError :: Literal {
0 commit comments