5
5
import decimal
6
6
from abc import ABC , abstractmethod
7
7
from collections import OrderedDict , namedtuple
8
- from collections .abc import Iterable
8
+ from collections .abc import Mapping
9
9
from decimal import Decimal
10
10
from enum import Enum
11
- from typing import Any , Dict , List , Optional , Union
11
+ from typing import Any , Dict , List , Optional , Union , Sequence
12
12
import re
13
13
14
14
import lz4 .frame
@@ -458,8 +458,15 @@ def escape_string(self, item):
458
458
return "'{}'" .format (item .replace ("\\ " , "\\ \\ " ).replace ("'" , "\\ '" ))
459
459
460
460
def escape_sequence (self , item ):
461
- l = map (str , map (self .escape_item , item ))
462
- return "(" + "," .join (l ) + ")"
461
+ l = map (self .escape_item , item )
462
+ return "ARRAY(" + "," .join (l ) + ")"
463
+
464
+ def escape_mapping (self , item ):
465
+ l = map (
466
+ self .escape_item ,
467
+ (element for key , value in item .items () for element in (key , value )),
468
+ )
469
+ return "MAP(" + "," .join (l ) + ")"
463
470
464
471
def escape_datetime (self , item , format , cutoff = 0 ):
465
472
dt_str = item .strftime (format )
@@ -476,14 +483,16 @@ def escape_item(self, item):
476
483
return self .escape_number (item )
477
484
elif isinstance (item , str ):
478
485
return self .escape_string (item )
479
- elif isinstance (item , Iterable ):
480
- return self .escape_sequence (item )
481
486
elif isinstance (item , datetime .datetime ):
482
487
return self .escape_datetime (item , self ._DATETIME_FORMAT )
483
488
elif isinstance (item , datetime .date ):
484
489
return self .escape_datetime (item , self ._DATE_FORMAT )
485
490
elif isinstance (item , decimal .Decimal ):
486
491
return self .escape_decimal (item )
492
+ elif isinstance (item , Sequence ):
493
+ return self .escape_sequence (item )
494
+ elif isinstance (item , Mapping ):
495
+ return self .escape_mapping (item )
487
496
else :
488
497
raise exc .ProgrammingError ("Unsupported object {}" .format (item ))
489
498
0 commit comments