Advertisement
Guest User

Untitled

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