Passed
Push — main ( 47cff4...b1808e )
by torrua
07:25 queued 12s
created

loglan_db.model_db.addons.addon_key_getter   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 48
Duplicated Lines 41.67 %

Importance

Changes 0
Metric Value
eloc 28
dl 20
loc 48
rs 10
c 0
b 0
f 0
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A AddonKeyGetter._filter_event() 0 5 1
A AddonKeyGetter.by_event() 20 20 4

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
2
from typing import Union
3
4
from flask_sqlalchemy import BaseQuery
5
from sqlalchemy import or_
6
7
from loglan_db.model_db.base_key import db
8
from loglan_db.model_db.base_event import BaseEvent
9
from loglan_db.model_db.base_word import BaseWord
10
from loglan_db.model_db.base_definition import BaseDefinition
11
from loglan_db.model_db.base_connect_tables import t_connect_keys
12
13
14
class AddonKeyGetter:
15
    """AddonKeyGetter model"""
16
17
    query: BaseQuery = None
18
    word: db.Column = None
19
    event_start_id: db.Column = None
20
    event_end_id: db.Column = None
21
22 View Code Duplication
    @classmethod
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
23
    def by_event(
24
            cls, event_id: Union[BaseEvent, int] = None,
25
            add_to: BaseQuery = None) -> BaseQuery:
26
        """Query filtered by specified Event (latest by default)
27
28
        Args:
29
          event_id: Union[BaseEvent, int]: Event object or Event.id (int) (Default value = None)
30
          add_to:
31
        Returns:
32
          BaseQuery
33
34
        """
35
        if not event_id:
36
            event_id = BaseEvent.latest().id
37
38
        event_id = BaseEvent.id if isinstance(event_id, BaseEvent) else int(event_id)
39
40
        request = add_to if add_to else cls.query
41
        return cls._filter_event(event_id, request)
42
43
    @classmethod
44
    def _filter_event(cls, event_id: Union[BaseEvent, int], add_to: BaseQuery) -> BaseQuery:
45
        return add_to.join(t_connect_keys).join(BaseDefinition).join(BaseWord) \
46
            .filter(BaseWord.event_start_id <= event_id) \
47
            .filter(or_(BaseWord.event_end_id > event_id, BaseWord.event_end_id.is_(None)))
48