Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.30 KB | None | 0 0
  1. class OuterJoiner(Joiner):
  2.     """Join with outer strategy"""
  3.  
  4.     def __call__(self, keys: Sequence[str], rows_a: Iterable[Row], rows_b: Iterable[Row]) -> OperationResult:
  5.         a_iter = iter(rows_a)
  6.         b_iter = iter(rows_b)
  7.         try:
  8.             row_a = next(a_iter)
  9.             row_b = next(b_iter)
  10.             while True:
  11.                 indx_a = self._perform_index(row_a, keys)
  12.                 indx_b = self._perform_index(row_b, keys)
  13.  
  14.                 if indx_a == indx_b:
  15.                     yield self._concat_rows(row_a, row_b, keys)
  16.                     try:
  17.                         row_a = next(a_iter)
  18.                     except StopIteration:
  19.                         break
  20.                     try:
  21.                         row_b = next(b_iter)
  22.                     except StopIteration:
  23.                         yield row_a
  24.                         break
  25.                 if indx_a < indx_b:
  26.                     yield row_a
  27.                     row_a = next(a_iter)
  28.                 if indx_a > indx_b:
  29.                     yield row_b
  30.                     row_b = next(b_iter)
  31.         except StopIteration:
  32.             scroll_trough_iter(a_iter)
  33.             scroll_trough_iter(b_iter)
  34.  
  35.  
  36. class LeftJoiner(Joiner):
  37.     """Join with left strategy"""
  38.  
  39.     def __call__(self, keys: Sequence[str], rows_a: Iterable[Row], rows_b: Iterable[Row]) -> OperationResult:
  40.         a_iter = iter(rows_a)
  41.         b_iter = iter(rows_b)
  42.         try:
  43.             row_a = next(a_iter)
  44.             row_b = next(b_iter)
  45.             while True:
  46.                 indx_a = self._perform_index(row_a, keys)
  47.                 indx_b = self._perform_index(row_b, keys)
  48.  
  49.                 if indx_a == indx_b:
  50.                     yield self._concat_rows(row_a, row_b, keys)
  51.                     try:
  52.                         row_a = next(a_iter)
  53.                     except StopIteration:
  54.                         break
  55.                 if indx_a < indx_b:
  56.                     yield row_a
  57.                     row_a = next(a_iter)
  58.                 if indx_a > indx_b:
  59.                     try:
  60.                         row_b = next(b_iter)
  61.                     except StopIteration:
  62.                         yield row_a
  63.                         break
  64.         except StopIteration:
  65.             scroll_trough_iter(a_iter)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement