Improved cpl query

This commit is contained in:
Sven Heidemann 2023-04-04 21:05:53 +02:00
parent af94a0c52d
commit 2c6367a408
3 changed files with 32 additions and 35 deletions

View File

@ -1,5 +1,4 @@
from collections.abc import Callable from collections.abc import Callable
from typing import Self
from cpl_query.base.ordered_queryable_abc import OrderedQueryableABC from cpl_query.base.ordered_queryable_abc import OrderedQueryableABC
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
@ -12,7 +11,7 @@ class OrderedQueryable(OrderedQueryableABC):
def __init__(self, _t: type, _values: Iterable = None, _func: Callable = None): def __init__(self, _t: type, _values: Iterable = None, _func: Callable = None):
OrderedQueryableABC.__init__(self, _t, _values, _func) OrderedQueryableABC.__init__(self, _t, _values, _func)
def then_by(self, _func: Callable) -> Self: def then_by(self, _func: Callable) -> OrderedQueryableABC:
if self is None: if self is None:
raise ArgumentNoneException(ExceptionArgument.list) raise ArgumentNoneException(ExceptionArgument.list)
@ -23,7 +22,7 @@ class OrderedQueryable(OrderedQueryableABC):
return OrderedQueryable(self.type, sorted(self, key=lambda *args: [f(*args) for f in self._funcs]), _func) return OrderedQueryable(self.type, sorted(self, key=lambda *args: [f(*args) for f in self._funcs]), _func)
def then_by_descending(self, _func: Callable) -> Self: def then_by_descending(self, _func: Callable) -> OrderedQueryableABC:
if self is None: if self is None:
raise ArgumentNoneException(ExceptionArgument.list) raise ArgumentNoneException(ExceptionArgument.list)

View File

@ -1,6 +1,8 @@
from __future__ import annotations
from abc import abstractmethod from abc import abstractmethod
from collections.abc import Callable from collections.abc import Callable
from typing import Iterable, Self from typing import Iterable
from cpl_query.base.queryable_abc import QueryableABC from cpl_query.base.queryable_abc import QueryableABC
@ -14,7 +16,7 @@ class OrderedQueryableABC(QueryableABC):
self._funcs.append(_func) self._funcs.append(_func)
@abstractmethod @abstractmethod
def then_by(self, func: Callable) -> Self: def then_by(self, func: Callable) -> OrderedQueryableABC:
r"""Sorts OrderedList in ascending order by function r"""Sorts OrderedList in ascending order by function
Parameter: Parameter:
@ -26,7 +28,7 @@ class OrderedQueryableABC(QueryableABC):
pass pass
@abstractmethod @abstractmethod
def then_by_descending(self, func: Callable) -> Self: def then_by_descending(self, func: Callable) -> OrderedQueryableABC:
r"""Sorts OrderedList in descending order by function r"""Sorts OrderedList in descending order by function
Parameter: Parameter:

View File

@ -1,9 +1,9 @@
from __future__ import annotations from __future__ import annotations
from typing import Optional, Callable, Union, Iterable, Self, Any from typing import Optional, Callable, Union, Iterable, Any, TYPE_CHECKING
from typing import TYPE_CHECKING
from cpl_query._helper import is_number from cpl_query._helper import is_number
from cpl_query.base import default_lambda
if TYPE_CHECKING: if TYPE_CHECKING:
from cpl_query.base.ordered_queryable_abc import OrderedQueryableABC from cpl_query.base.ordered_queryable_abc import OrderedQueryableABC
@ -16,10 +16,6 @@ from cpl_query.exceptions import (
) )
def _default_lambda(x: object) -> object:
return x
class QueryableABC(Sequence): class QueryableABC(Sequence):
def __init__(self, t: type, values: Iterable = None): def __init__(self, t: type, values: Iterable = None):
Sequence.__init__(self, t, values) Sequence.__init__(self, t, values)
@ -37,7 +33,7 @@ class QueryableABC(Sequence):
bool bool
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
return self.count(_func) == self.count() return self.count(_func) == self.count()
@ -54,7 +50,7 @@ class QueryableABC(Sequence):
bool bool
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
return self.where(_func).count() > 0 return self.where(_func).count() > 0
@ -109,7 +105,7 @@ class QueryableABC(Sequence):
return self.where(_func).count() return self.where(_func).count()
def distinct(self, _func: Callable = None) -> Self: def distinct(self, _func: Callable = None) -> QueryableABC:
r"""Returns list without redundancies r"""Returns list without redundancies
Parameter Parameter
@ -122,7 +118,7 @@ class QueryableABC(Sequence):
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
result = [] result = []
known_values = [] known_values = []
@ -218,7 +214,7 @@ class QueryableABC(Sequence):
return self return self
def group_by(self, _func: Callable = None) -> Self: def group_by(self, _func: Callable = None) -> QueryableABC:
r"""Groups by func r"""Groups by func
Returns Returns
@ -226,7 +222,7 @@ class QueryableABC(Sequence):
Grouped list[list[any]]: any Grouped list[list[any]]: any
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
groups = {} groups = {}
for v in self: for v in self:
@ -282,7 +278,7 @@ class QueryableABC(Sequence):
raise InvalidTypeException() raise InvalidTypeException()
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
return _func(max(self, key=_func)) return _func(max(self, key=_func))
@ -294,7 +290,7 @@ class QueryableABC(Sequence):
Union[int, float] Union[int, float]
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
result = self.order_by(_func).select(_func).to_list() result = self.order_by(_func).select(_func).to_list()
length = len(result) length = len(result)
@ -317,7 +313,7 @@ class QueryableABC(Sequence):
raise InvalidTypeException() raise InvalidTypeException()
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
return _func(min(self, key=_func)) return _func(min(self, key=_func))
@ -334,7 +330,7 @@ class QueryableABC(Sequence):
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC` :class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
from cpl_query.base.ordered_queryable import OrderedQueryable from cpl_query.base.ordered_queryable import OrderedQueryable
@ -353,13 +349,13 @@ class QueryableABC(Sequence):
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC` :class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
from cpl_query.base.ordered_queryable import OrderedQueryable from cpl_query.base.ordered_queryable import OrderedQueryable
return OrderedQueryable(self.type, sorted(self, key=_func, reverse=True), _func) return OrderedQueryable(self.type, sorted(self, key=_func, reverse=True), _func)
def reverse(self) -> Self: def reverse(self) -> QueryableABC:
r"""Reverses list r"""Reverses list
Returns Returns
@ -368,7 +364,7 @@ class QueryableABC(Sequence):
""" """
return type(self)(self._type, reversed(self._values)) return type(self)(self._type, reversed(self._values))
def select(self, _func: Callable) -> Self: def select(self, _func: Callable) -> QueryableABC:
r"""Formats each element of list to a given format r"""Formats each element of list to a given format
Returns Returns
@ -376,14 +372,14 @@ class QueryableABC(Sequence):
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
_l = [_func(_o) for _o in self] _l = [_func(_o) for _o in self]
_t = type(_l[0]) if len(_l) > 0 else Any _t = type(_l[0]) if len(_l) > 0 else Any
return type(self)(_t, _l) return type(self)(_t, _l)
def select_many(self, _func: Callable) -> Self: def select_many(self, _func: Callable) -> QueryableABC:
r"""Flattens resulting lists to one r"""Flattens resulting lists to one
Returns Returns
@ -427,7 +423,7 @@ class QueryableABC(Sequence):
return self._values[0] return self._values[0]
def skip(self, _index: int) -> Self: def skip(self, _index: int) -> QueryableABC:
r"""Skips all elements from index r"""Skips all elements from index
Parameter Parameter
@ -444,7 +440,7 @@ class QueryableABC(Sequence):
return type(self)(self.type, self._values[_index:]) return type(self)(self.type, self._values[_index:])
def skip_last(self, _index: int) -> Self: def skip_last(self, _index: int) -> QueryableABC:
r"""Skips all elements after index r"""Skips all elements after index
Parameter Parameter
@ -478,7 +474,7 @@ class QueryableABC(Sequence):
raise InvalidTypeException() raise InvalidTypeException()
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
result = 0 result = 0
for x in self: for x in self:
@ -486,7 +482,7 @@ class QueryableABC(Sequence):
return result return result
def split(self, _func: Callable) -> Self: def split(self, _func: Callable) -> QueryableABC:
r"""Splits the list by given function r"""Splits the list by given function
@ -519,7 +515,7 @@ class QueryableABC(Sequence):
return type(self)(self._type, query_groups) return type(self)(self._type, query_groups)
def take(self, _index: int) -> Self: def take(self, _index: int) -> QueryableABC:
r"""Takes all elements from index r"""Takes all elements from index
Parameter Parameter
@ -536,7 +532,7 @@ class QueryableABC(Sequence):
return type(self)(self._type, self._values[:_index]) return type(self)(self._type, self._values[:_index])
def take_last(self, _index: int) -> Self: def take_last(self, _index: int) -> QueryableABC:
r"""Takes all elements after index r"""Takes all elements after index
Parameter Parameter
@ -555,7 +551,7 @@ class QueryableABC(Sequence):
return type(self)(self._type, self._values[index:]) return type(self)(self._type, self._values[index:])
def where(self, _func: Callable = None) -> Self: def where(self, _func: Callable = None) -> QueryableABC:
r"""Select element by function r"""Select element by function
Parameter Parameter
@ -571,6 +567,6 @@ class QueryableABC(Sequence):
raise ArgumentNoneException(ExceptionArgument.func) raise ArgumentNoneException(ExceptionArgument.func)
if _func is None: if _func is None:
_func = _default_lambda _func = default_lambda
return type(self)(self.type, filter(_func, self)) return type(self)(self.type, filter(_func, self))