Skip to content

Commit 0ff0e19

Browse files
author
user
committed
add .all()
1 parent 05d3170 commit 0ff0e19

11 files changed

Lines changed: 201 additions & 197 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 2.0.1
4+
5+
- remove `extended_save` method
6+
- add `Model.all()` method on model to get all Model data
7+
38

49
## 2.0.0 (**Breaking changes**)
510

RSO/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.0.0"
1+
__version__ = "2.0.1"

RSO/asyncio/model.py

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
from datetime import date, datetime
2-
from enum import Enum
3-
from typing import Union
1+
from typing import List, Optional, Union
42

5-
from aioredis import __version__ as aioredis_version
63
from aioredis.client import Redis, Pipeline
74
from redis.asyncio.client import Redis as Redis2, Pipeline as Pipeline2
85

96
from RSO.base import BaseModel
10-
from .index import ListIndex
117

128

139
class Model(BaseModel):
@@ -30,47 +26,8 @@ async def save(self, redis: Union[Pipeline, Pipeline2, Redis, Redis2]):
3026
if not isinstance(redis, (Pipeline, Pipeline2)):
3127
await pipe.execute()
3228

33-
# async def extended_save(self, redis: Union[Pipeline, Pipeline2, Redis, Redis2]):
34-
# """
35-
# Extender of `save` method to avoid saving our key value
36-
# to be saved multiple times on ListIndex
37-
# """
38-
# list_index_map = {}
39-
# for index_class in self.__indexes__ or []:
40-
# if not issubclass(index_class, ListIndex):
41-
# continue
42-
# model_key_value = getattr(self, self.__key__, None)
43-
# if model_key_value is None:
44-
# exist_on_index = False
45-
# else:
46-
# exist_on_index = await index_class.has_member_value(
47-
# redis, model_key_value
48-
# )
49-
# list_index_map[index] = exist_on_index
50-
#
51-
# if not isinstance(redis, (Pipeline, Pipeline2)):
52-
# pipe = redis
53-
# else:
54-
# pipe = redis.pipeline()
55-
#
56-
# pipe.hset(self.redis_key, mapping=self.to_redis())
57-
#
58-
# for index_class in self.__indexes__:
59-
# if getattr(self, index_class.__key__, None) is None:
60-
# continue
61-
# await index_class.save(pipe, self)
62-
#
63-
# # remove duplicate on index queue list
64-
# for index, exist_on_index in list_index_map.items():
65-
# if exist_on_index is True:
66-
# model_key_value = getattr(self, self.__key__)
67-
# await index.remove_from_list(pipe, model_key_value)
68-
#
69-
# if not isinstance(redis, (Pipeline, Pipeline2)):
70-
# await pipe.execute()
71-
7229
@classmethod
73-
async def search(cls, redis: Redis, value):
30+
async def search(cls, redis: Redis, value) -> Optional['Model']:
7431
redis_key = cls.redis_key_from_value(value)
7532
if bool(await redis.exists(redis_key)) is True:
7633
fields = cls.get_fields()
@@ -80,6 +37,32 @@ async def search(cls, redis: Redis, value):
8037
else:
8138
return None
8239

40+
@classmethod
41+
async def all(cls, redis: [Redis, Redis2]) -> List['Model']:
42+
redis_key = cls.redis_key_from_value('*')
43+
members = await redis.keys(redis_key)
44+
indexes = []
45+
for index_class in cls.__indexes__:
46+
indexes.append(
47+
f'::{index_class.__index_name__}::{index_class.__key__}'
48+
)
49+
async with redis.pipeline(transaction=True) as pipe:
50+
for member in members:
51+
is_index = False
52+
for index in indexes:
53+
if index in member:
54+
is_index = True
55+
break
56+
if not is_index:
57+
pipe.hgetall(member)
58+
result_data = await pipe.execute()
59+
60+
result = []
61+
for data in result_data:
62+
result.append(cls(**data))
63+
return result
64+
65+
8366
async def delete(self, redis: [Pipeline, Pipeline2, Redis, Redis2]) -> None:
8467
if isinstance(redis, (Pipeline, Pipeline2)):
8568
pipe = redis

RSO/model.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Union
1+
from typing import List, Optional, Union
22

33
from redis.client import Pipeline, Redis
44

@@ -25,7 +25,7 @@ def save(self, redis: Union[Pipeline, Redis]):
2525
pipe.execute()
2626

2727
@classmethod
28-
def search(cls, redis: Redis, value):
28+
def search(cls, redis: Redis, value) -> Optional['Model']:
2929
redis_key = cls.redis_key_from_value(value)
3030
if bool(redis.exists(redis_key)):
3131
fields = cls.get_fields()
@@ -35,6 +35,31 @@ def search(cls, redis: Redis, value):
3535
else:
3636
return None
3737

38+
@classmethod
39+
def all(cls, redis: Redis) -> List['Model']:
40+
redis_key = cls.redis_key_from_value('*')
41+
members = redis.keys(redis_key)
42+
indexes = []
43+
for index_class in cls.__indexes__:
44+
indexes.append(
45+
f'::{index_class.__index_name__}::{index_class.__key__}'
46+
)
47+
with redis.pipeline(transaction=True) as pipe:
48+
for member in members:
49+
is_index = False
50+
for index in indexes:
51+
if index in member:
52+
is_index = True
53+
break
54+
if not is_index:
55+
pipe.hgetall(member)
56+
result_data = pipe.execute()
57+
58+
result = []
59+
for data in result_data:
60+
result.append(cls(**data))
61+
return result
62+
3863
def delete(self, redis: Union[Pipeline, Redis]):
3964
if isinstance(redis, Pipeline):
4065
pipe = redis

RSO/txredisapi/index.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,13 @@ def save(
153153
):
154154
if isinstance(redis, BaseRedisProtocol):
155155
redis.sadd(
156-
cls.redis_key(model_obj),
157-
cls.model_key_value(model_obj)
156+
key=cls.redis_key(model_obj),
157+
members=cls.model_key_value(model_obj)
158158
)
159159
returnValue(None)
160160
else:
161161
yield redis.sadd(
162-
cls.redis_key(model_obj),
162+
key=cls.redis_key(model_obj),
163163
members=cls.model_key_value(model_obj)
164164
)
165165

@@ -169,7 +169,7 @@ def remove(
169169
cls, redis: Union[BaseRedisProtocol, ConnectionHandler], model_obj: T
170170
):
171171
yield redis.srem(
172-
cls.redis_key(model_obj),
172+
key=cls.redis_key(model_obj),
173173
members=cls.model_key_value(model_obj)
174174
)
175175

RSO/txredisapi/model.py

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
from typing import Union
1+
from typing import List, Optional, Union
22

3-
from dataclasses import asdict
43
from txredisapi import BaseRedisProtocol, ConnectionHandler
54
from twisted.internet.defer import inlineCallbacks
65

76
from RSO.base import BaseModel
8-
from .index import ListIndex
97

108

119
class Model(BaseModel):
@@ -33,7 +31,7 @@ def save(self, redis: Union[BaseRedisProtocol, ConnectionHandler]):
3331

3432
@classmethod
3533
@inlineCallbacks
36-
def search(cls, redis: ConnectionHandler, value):
34+
def search(cls, redis: ConnectionHandler, value) -> Optional['Model']:
3735
redis_key = cls.redis_key_from_value(value)
3836
result = yield redis.exists(redis_key)
3937
if bool(result):
@@ -43,6 +41,33 @@ def search(cls, redis: ConnectionHandler, value):
4341
return cls(**dict_data)
4442
return
4543

44+
@classmethod
45+
@inlineCallbacks
46+
def all(cls, redis: ConnectionHandler) -> List['Model']:
47+
redis_key = cls.redis_key_from_value('*')
48+
members = yield redis.keys(redis_key)
49+
indexes = []
50+
for index_class in cls.__indexes__:
51+
indexes.append(
52+
f'::{index_class.__index_name__}::{index_class.__key__}'
53+
)
54+
55+
pipe = yield redis.multi()
56+
for member in members:
57+
is_index = False
58+
for index in indexes:
59+
if index in member:
60+
is_index = True
61+
break
62+
if not is_index:
63+
yield pipe.hgetall(member)
64+
result_data = yield pipe.commit()
65+
66+
result = []
67+
for data in result_data:
68+
result.append(cls(**data))
69+
return result
70+
4671
@inlineCallbacks
4772
def delete(self, redis: Union[BaseRedisProtocol, ConnectionHandler]):
4873
if isinstance(redis, ConnectionHandler):
@@ -56,48 +81,6 @@ def delete(self, redis: Union[BaseRedisProtocol, ConnectionHandler]):
5681
if getattr(self, index_class.__key__) is None:
5782
continue
5883
index_class.remove(pipe, self)
59-
pipe.delete(self.redis_key)
84+
yield pipe.delete(self.redis_key)
6085
if do_commit:
6186
yield pipe.commit()
62-
63-
# @inlineCallbacks
64-
# def extended_save(
65-
# self, redis: Union[BaseRedisProtocol, ConnectionHandler]
66-
# ):
67-
# """Extended save function to avoid multiple push on list index
68-
#
69-
# Note: Use this method if you use List Index
70-
# """
71-
# list_index_map = {}
72-
# for index_class in self.__indexes__ or []:
73-
# if not issubclass(index_class, ListIndex):
74-
# continue
75-
# index = index_class.create_from_model_class(self)
76-
# model_key_value = getattr(self, self.__key__, None)
77-
# if model_key_value is None:
78-
# exist_on_index = False
79-
# else:
80-
# exist_on_index = yield index.is_exist_on_list(
81-
# redis, model_key_value
82-
# )
83-
# list_index_map[index] = exist_on_index
84-
#
85-
# if isinstance(redis, ConnectionHandler):
86-
# pipe = yield redis.multi()
87-
# else:
88-
# raise NotImplementedError
89-
#
90-
# pipe.hmset(self.redis_key, self.to_redis())
91-
# for index_class in self.__indexes__ or []:
92-
# if getattr(self, index_class.__key__, None) is None:
93-
# continue
94-
# index = index_class.create_from_model_class(self)
95-
# yield index.save_index(pipe)
96-
#
97-
# # remove duplicate on index queue list
98-
# for index, exist_on_index in list_index_map.items():
99-
# if exist_on_index is True:
100-
# model_key_value = getattr(self, self.__key__)
101-
# yield index.remove_from_list(pipe, model_key_value)
102-
#
103-
# yield pipe.commit()

0 commit comments

Comments
 (0)