code: def _filter_row_ranges(self):
          
          new_row_ranges = []
  
          for row_range in self.message.rows.row_ranges:
              # if current end_key (open or closed) is set, return its value,
              # if not, set to empty string ('').
              # NOTE: Empty string in end_key means "end of table"
              end_key = self._end_key_set(row_range)
              # if end_key is already read, skip to the next row_range
              if end_key and self._key_already_read(end_key):
                  continue
  
              # if current start_key (open or closed) is set, return its value,
              # if not, then set to empty string ('')
              # NOTE: Empty string in start_key means "beginning of table"
              start_key = self._start_key_set(row_range)
  
              # if start_key was already read or doesn't exist,
              # create a row_range with last_scanned_key as start_key_open
              # to be passed to retry request
              retry_row_range = row_range
              if self._key_already_read(start_key):
                  retry_row_range = copy.deepcopy(row_range)
                  retry_row_range.start_key_closed = _to_bytes("")
                  retry_row_range.start_key_open = self.last_scanned_key
  
              new_row_ranges.append(retry_row_range)
  
          return new_row_ranges
docs: Helper for :meth:`build_updated_request`