@@ -359,10 +359,13 @@ class MapUpdateClause(ContainerUpdateClause):
359359 col_type = columns .Map
360360
361361 _updates = None
362+ _removals = None
362363
363364 def _analyze (self ):
364365 if self ._operation == "update" :
365366 self ._updates = self .value .keys ()
367+ elif self ._operation == "remove" :
368+ self ._removals = {v for v in self .value .keys ()}
366369 else :
367370 if self .previous is None :
368371 self ._updates = sorted ([k for k , v in self .value .items ()])
@@ -373,12 +376,14 @@ def _analyze(self):
373376 def get_context_size (self ):
374377 if self .is_assignment :
375378 return 1
376- return len (self ._updates or []) * 2
379+ return int (( len (self ._updates or []) * 2 ) + int ( bool ( self . _removals )))
377380
378381 def update_context (self , ctx ):
379382 ctx_id = self .context_id
380383 if self .is_assignment :
381384 ctx [str (ctx_id )] = {}
385+ elif self ._removals is not None :
386+ ctx [str (ctx_id )] = self ._removals
382387 else :
383388 for key in self ._updates or []:
384389 val = self .value .get (key )
@@ -390,14 +395,17 @@ def update_context(self, ctx):
390395 def is_assignment (self ):
391396 if not self ._analyzed :
392397 self ._analyze ()
393- return self .previous is None and not self ._updates
398+ return self .previous is None and not self ._updates and not self . _removals
394399
395400 def __unicode__ (self ):
396401 qs = []
397402
398403 ctx_id = self .context_id
399404 if self .is_assignment :
400405 qs += ['"{0}" = %({1})s' .format (self .field , ctx_id )]
406+ elif self ._removals is not None :
407+ qs += ['"{0}" = "{0}" - %({1})s' .format (self .field , ctx_id )]
408+ ctx_id += 1
401409 else :
402410 for _ in self ._updates or []:
403411 qs += ['"{0}"[%({1})s] = %({2})s' .format (self .field , ctx_id , ctx_id + 1 )]
0 commit comments