Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boto/dynamodb2/results.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/dynamodb2/results.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -class ResultSet(object): - """ - A class used to lazily handle page-to-page navigation through a set of - results. - - It presents a transparent iterator interface, so that all the user has - to do is use it in a typical ``for`` loop (or list comprehension, etc.) - to fetch results, even if they weren't present in the current page of - results. - - This is used by the ``Table.query`` & ``Table.scan`` methods. - - Example:: - - >>> users = Table('users') - >>> results = ResultSet() - >>> results.to_call(users.query, username__gte='johndoe') - # Now iterate. When it runs out of results, it'll fetch the next page. - >>> for res in results: - ... print res['username'] - - """ - def __init__(self, max_page_size=None): - super(ResultSet, self).__init__() - self.the_callable = None - self.call_args = [] - self.call_kwargs = {} - self._results = [] - self._offset = -1 - self._results_left = True - self._last_key_seen = None - self._fetches = 0 - self._max_page_size = max_page_size - self._limit = None - - @property - def first_key(self): - return 'exclusive_start_key' - - def _reset(self): - """ - Resets the internal state of the ``ResultSet``. - - This prevents results from being cached long-term & consuming - excess memory. - - Largely internal. - """ - self._results = [] - self._offset = 0 - - def __iter__(self): - return self - - def __next__(self): - self._offset += 1 - - if self._offset >= len(self._results): - if self._results_left is False: - raise StopIteration() - - self.fetch_more() - - # It's possible that previous call to ``fetch_more`` may not return - # anything useful but there may be more results. Loop until we get - # something back, making sure we guard for no results left. - while not len(self._results) and self._results_left: - self.fetch_more() - - if self._offset < len(self._results): - if self._limit is not None: - self._limit -= 1 - - if self._limit < 0: - raise StopIteration() - - return self._results[self._offset] - else: - raise StopIteration() - - next = __next__ - - def to_call(self, the_callable, *args, **kwargs): - """ - Sets up the callable & any arguments to run it with. - - This is stored for subsequent calls so that those queries can be - run without requiring user intervention. - - Example:: - - # Just an example callable. - >>> def squares_to(y): - ... for x in range(1, y): - ... yield x**2 - >>> rs = ResultSet() - # Set up what to call & arguments. - >>> rs.to_call(squares_to, y=3) - - """ - if not callable(the_callable): - raise ValueError( - 'You must supply an object or function to be called.' - ) - - # We pop the ``limit``, if present, to track how many we should return - # to the user. This isn't the same as the ``limit`` that the low-level - # DDB api calls use (which limit page size, not the overall result set). - self._limit = kwargs.pop('limit', None) - - if self._limit is not None and self._limit < 0: - self._limit = None - - self.the_callable = the_callable - self.call_args = args - self.call_kwargs = kwargs - - def fetch_more(self): - """ - When the iterator runs out of results, this method is run to re-execute - the callable (& arguments) to fetch the next page. - - Largely internal. - """ - self._reset() - - args = self.call_args[:] - kwargs = self.call_kwargs.copy() - - if self._last_key_seen is not None: - kwargs[self.first_key] = self._last_key_seen - - # If the page size is greater than limit set them - # to the same value - if self._limit and self._max_page_size and self._max_page_size > self._limit: - self._max_page_size = self._limit - - # Put in the max page size. - if self._max_page_size is not None: - kwargs['limit'] = self._max_page_size - elif self._limit is not None: - # If max_page_size is not set and limit is available - # use it as the page size - kwargs['limit'] = self._limit - - results = self.the_callable(*args, **kwargs) - self._fetches += 1 - new_results = results.get('results', []) - self._last_key_seen = results.get('last_key', None) - - if len(new_results): - self._results.extend(results['results']) - - # Check the limit, if it's present. - if self._limit is not None and self._limit >= 0: - limit = self._limit - limit -= len(results['results']) - # If we've exceeded the limit, we don't have any more - # results to look for. - if limit <= 0: - self._results_left = False - - if self._last_key_seen is None: - self._results_left = False - - -class BatchGetResultSet(ResultSet): - def __init__(self, *args, **kwargs): - self._keys_left = kwargs.pop('keys', []) - self._max_batch_get = kwargs.pop('max_batch_get', 100) - super(BatchGetResultSet, self).__init__(*args, **kwargs) - - def fetch_more(self): - self._reset() - - args = self.call_args[:] - kwargs = self.call_kwargs.copy() - - # Slice off the max we can fetch. - kwargs['keys'] = self._keys_left[:self._max_batch_get] - self._keys_left = self._keys_left[self._max_batch_get:] - - if len(self._keys_left) <= 0: - self._results_left = False - - results = self.the_callable(*args, **kwargs) - - if not len(results.get('results', [])): - return - - self._results.extend(results['results']) - - for offset, key_data in enumerate(results.get('unprocessed_keys', [])): - # We've got an unprocessed key. Reinsert it into the list. - # DynamoDB only returns valid keys, so there should be no risk of - # missing keys ever making it here. - self._keys_left.insert(offset, key_data) - - if len(self._keys_left) > 0: - self._results_left = True - - # Decrease the limit, if it's present. - if self.call_kwargs.get('limit'): - self.call_kwargs['limit'] -= len(results['results'])
