Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DOP-11904] - add has_data, raise_if_no_data methods in DBReader #203

Merged
merged 24 commits into from
Feb 1, 2024

Conversation

maxim-lixakov
Copy link
Contributor

@maxim-lixakov maxim-lixakov commented Jan 29, 2024

Change Summary

  • Add has_data, raise_error_if_no_data methods to DBReader class.
  • Customize Oracle and MSSQL get_sql_query method to handle their specific dialect with limit
  • Add following tests and documentation

Related issue number

Checklist

  • Commit message and PR title is comprehensive
  • Keep the change as small as possible
  • Unit and integration tests for the changes exist
  • Tests pass on CI and coverage does not decrease
  • Documentation reflects the changes where applicable
  • docs/changelog/next_release/<pull request or issue id>.<change type>.rst file added describing change
    (see CONTRIBUTING.rst for details.)
  • My PR is ready to review.

@maxim-lixakov maxim-lixakov added the ci:skip-changelog Add this label to skip changelog file check label Jan 29, 2024
@maxim-lixakov maxim-lixakov self-assigned this Jan 29, 2024
@dolfinus
Copy link
Member

Сделай rebase, я тесты починил

Copy link

codecov bot commented Jan 30, 2024

Codecov Report

Attention: 1 lines in your changes are missing coverage. Please review.

Comparison is base (68452e8) 94.08% compared to head (edd80ce) 94.14%.

Files Patch % Lines
onetl/db/db_reader/db_reader.py 95.23% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop     #203      +/-   ##
===========================================
+ Coverage    94.08%   94.14%   +0.06%     
===========================================
  Files          204      204              
  Lines         7798     7827      +29     
  Branches      1385     1395      +10     
===========================================
+ Hits          7337     7369      +32     
+ Misses         336      334       -2     
+ Partials       125      124       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@maxim-lixakov
Copy link
Contributor Author

maxim-lixakov commented Jan 30, 2024

Благодаря тестам обнаружилась нетривиальная проблема при вызове метода has_data если в исполняемом потоке мы используем стратегии:

При попытке обратиться к методу has_data вне менеджера контекста, код упадет с ошибкой (RuntimeError: DBReader(hwm=...) cannot be used with SnapshotStrategy), так как в StrategyManager _stack пустой (так как после выхода из контекста делается StrategyManager.pop()). В том числе мы теряем значение hwm при выходе из контекста, на этом этапе места где оно хранится - hwm_store, reader.hwmAutoDetectHWM классом).

Возможные решения:

  1. Игнорировать при вызове has_data вне контекста hwm (добавить флаг в _calculate_window_and_limit(from_has_data=False) и если метод был вызван из has_data вернуть None значения для window.

Минусы:

a) в таком случае эту будет также работать внутри контекста, где мы можем и не игнорировать hwm, иными словами след код будет выполнятся всегда:

    with IncrementalStrategy():
        while reader.has_data():
            first_df = reader.run()

б) мы можем не совпадать с ожидаемым результатом пользователя, если после IncrementalStrategy run получим пустой df, а has_data скажет что это не правда

  1. Написать в документации что has_data в случае со стратегиями можно использовать только внутри стратегий и не обращаться вне контекста.

Минусы:

a) документацию никто не прочтет и вызов has_data вне стратегии будет ронять код (как вариант - обрабатывать эту ошибку и выкидывать что мы не знаем что в df с существующим hwm и не падать)

  1. Как то извернуться и в методе has_data лезть в hwm_store напрямую если в reader есть поле hwm или брать reader.hwm и соотв изменить поведение _calculate_window_and_limit, с реализацией пока не заходил далеко, так как не знаю какой вариант лучше и возможно там тоже есть подводные камни).

@dolfinus
Copy link
Member

Я не очень представляю себе работу вариантов 1 и 3. .has_data() можно будет вызвать, но .run() в любом случае будет падать без стратегии? Какой кейс это должно исправить?

@dolfinus
Copy link
Member

Предлагаю еще в Quick start добавить .raise_if_no_data() перед .run() с соответствующим комментарием

Co-authored-by: Maxim Martynov <msmarty5@mts.ru>
@maxim-lixakov maxim-lixakov merged commit 02882b2 into develop Feb 1, 2024
43 checks passed
@maxim-lixakov maxim-lixakov deleted the feature/DOP-11904 branch February 1, 2024 08:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants