Improved cpl query
This commit is contained in:
parent
af94a0c52d
commit
2c6367a408
@ -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)
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user