Skip to content

Instantly share code, notes, and snippets.

@vryazanov
Created June 6, 2020 05:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vryazanov/6d7d8a977f7f048e001592d44af46f95 to your computer and use it in GitHub Desktop.
Save vryazanov/6d7d8a977f7f048e001592d44af46f95 to your computer and use it in GitHub Desktop.
"""Query interface."""
from __future__ import annotations
import abc
import sqlalchemy.orm.query
from crawler.constants import RunStatus
class BaseQuery(metaclass=abc.ABCMeta):
"""Base query builder."""
@abc.abstractmethod
def query(self):
"""Return encapsulated query."""
@abc.abstractmethod
def limit(self, limit: int) -> BaseQuery:
"""Limit for entities."""
@abc.abstractmethod
def offset(self, offset: int) -> BaseQuery:
"""Offset for entities."""
class BaseDBQuery(metaclass=abc.ABCMeta):
"""Add db related features."""
@abc.abstractmethod
def lock(self) -> BaseRunQuery:
"""Lock runs in case if it's a db query."""
class BaseRunQuery(BaseQuery):
"""Base query for Run entity."""
@abc.abstractmethod
def status(self, status: RunStatus) -> BaseRunQuery:
"""Filter runs by status."""
class AlchemyRunQuery(BaseDBQuery, BaseQuery):
"""Run query that works with SQLAlchemy session."""
def __init__(self, query: sqlalchemy.orm.Query):
"""Primary constructor.
Args:
query: instance of SQLAlchemy query.
"""
self._query = query
def query(self) -> sqlalchemy.orm.Query:
"""Return SQL Alchemy query."""
return self._query
def limit(self, limit: int):
"""Limit for runs."""
return AlchemyRunQuery(self._query.limit(limit))
def offset(self, offset: int):
"""Offset for runs."""
return AlchemyRunQuery(self._query.offset(offset))
def status(self, status: RunStatus):
"""Filter runs by status."""
return AlchemyRunQuery(self._query.filter_by(status=status))
def lock(self):
"""Lock rows in the db."""
return self
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment