Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit886f2d5

Browse files
committed
Update SearchResult behavior, add to_dict method
1 parente0c1d27 commit886f2d5

File tree

5 files changed

+125
-62
lines changed

5 files changed

+125
-62
lines changed

‎README.md‎

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,13 @@ if result:
125125

126126
# Access search result information
127127
print(f"Total matching records:{result.total}")
128-
print(f"Current page size:{result.count}")
129-
print(f"Records skipped:{result.skip}")
130128
print(f"Has more results:{result.has_more}")
131129
print(f"Search query:{result.search_query}")
132130

131+
# Get detailed pagination info
132+
page_info= result.get_page_info()
133+
print(f"Page info:{page_info}")
134+
133135
# Iterate over results
134136
for recordin result:
135137
print(f"Record:{record.get('name')}")
@@ -166,50 +168,57 @@ def __init__(
166168

167169
###SearchResult Properties
168170

169-
| Property| Type| Description|
170-
| --------------| ---------------| ----------------------------------------|
171-
|`data`|`List[T]`| The list of result items (generic type)|
172-
|`total`|`int`| Total number of matching records|
173-
|`count`|`int`| Number of records in current result set|
174-
|`limit`|`Optional[int]`| Limit that was applied to the search|
175-
|`skip`|`int`| Number of records that were skipped|
176-
|`has_more`|`bool`| Whether there are more records available|
177-
|`search_query`|`SearchQuery`| The search query used to generate result|
171+
| Property| Type| Description|
172+
| --------------| -------------| ----------------------------------------|
173+
|`data`|`List[T]`| The list of result items (generic type)|
174+
|`total`|`int`| Total number of matching records|
175+
|`has_more`|`bool`| Whether there are more records available|
176+
|`search_query`|`SearchQuery`| The search query used to generate result|
177+
178+
###SearchResult Methods
179+
180+
| Method| Return Type| Description|
181+
| -----------------| -----------| ---------------------------------------------------------|
182+
|`to_dict()`|`dict`| Returns standardized dict with total, data, search_query|
183+
|`get_page_info()`|`dict`| Returns pagination info including total, loaded, has_more|
178184

179185
>**Implementation Notes:**
180186
>
181187
>- If`search_query` is not provided during initialization, it defaults to an empty dictionary`{}`
182-
>- The`skip` property checks if`search_query` is a dictionary and returns the "skip" value or 0
183-
>- The`has_more` property is calculated as`total > (skip + len(data))`, allowing for efficient pagination
188+
>- The`has_more` property is calculated by comparing total with loaded records
184189
>- The`__bool__` method returns`True` if the result contains any items (`len(data) > 0`)
190+
>-`get_page_info()` provides detailed pagination metadata for advanced use cases
185191
186192
###Pagination Example
187193

188194
```python
189-
# Paginated search
190-
page_size=10
191-
current_page=0
195+
# Paginated search using skip/limit in query
196+
defpaginate_results(query_base,page_size=10):
197+
current_skip=0
198+
199+
whileTrue:
200+
# Add pagination to query
201+
query= {**query_base,"limit": page_size,"skip": current_skip}
202+
result= db.records.find(query)
192203

193-
whileTrue:
194-
result= db.records.find({
195-
"where": {"category":"electronics"},
196-
"limit": page_size,
197-
"skip": current_page* page_size,
198-
"orderBy": {"created_at":"desc"}
199-
})
204+
ifnot result:
205+
break
200206

201-
ifnot result:
202-
break
207+
print(f"Processing{len(result)} records (skip:{current_skip})")
203208

204-
print(f"Page{current_page+1}:{len(result)} records")
209+
for recordin result:
210+
process_record(record)
205211

206-
for recordinresult:
207-
process_record(record)
212+
ifnotresult.has_more:
213+
break
208214

209-
ifnot result.has_more:
210-
break
215+
current_skip+=len(result)
211216

212-
current_page+=1
217+
# Usage
218+
paginate_results({
219+
"where": {"category":"electronics"},
220+
"orderBy": {"created_at":"desc"}
221+
})
213222
```
214223

215224
###RecordSearchResult Type
@@ -438,7 +447,7 @@ def find(
438447

439448
```python
440449
# Search for records with complex criteria
441-
query= {
450+
search_query= {
442451
"where": {
443452
"$and": [
444453
{"age": {"$gte":18}},
@@ -450,7 +459,7 @@ query = {
450459
"limit":10
451460
}
452461

453-
result= db.records.find(query=query)
462+
result= db.records.find(search_query=search_query)
454463

455464
# Work with SearchResult
456465
print(f"Found{len(result)} out of{result.total} total records")
@@ -479,14 +488,14 @@ Deletes records matching a query.
479488
```python
480489
defdelete(
481490
self,
482-
query: SearchQuery,
491+
search_query: SearchQuery,
483492
transaction: Optional[Transaction]=None
484493
) -> Dict[str,str]
485494
```
486495

487496
**Arguments:**
488497

489-
-`query` (SearchQuery): Query to match recordsfor deletion
498+
-`search_query` (SearchQuery): Query to match recordsfor deletion
490499
-`transaction` (Optional[Transaction]): Optional transactionobject
491500

492501
**Returns:**
@@ -497,14 +506,14 @@ def delete(
497506

498507
```python
499508
# Delete records matching criteria
500-
query = {
509+
search_query = {
501510
"where": {
502511
"status":"inactive",
503512
"lastActive": {"$lt":"2023-01-01"}
504513
}
505514
}
506515

507-
response = db.records.delete(query)
516+
response = db.records.delete(search_query)
508517
```
509518

510519
### delete_by_id()

‎src/rushdb/models/property.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class DatetimeObject(TypedDict, total=False):
1818

1919
DatetimeValue=Union[DatetimeObject,str]
2020
BooleanValue=bool
21-
NumberValue=float
21+
NumberValue=Union[float,int]
2222
StringValue=str
2323

2424
# Property types

‎src/rushdb/models/result.py‎

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,34 +48,25 @@ def total(self) -> int:
4848
"""Get the total number of matching records."""
4949
returnself._total
5050

51-
@property
52-
defcount(self)->int:
53-
"""Get the number of records in this result set (alias for len())."""
54-
returnlen(self._data)
55-
5651
@property
5752
defsearch_query(self)->SearchQuery:
5853
"""Get the search query used to generate this result."""
5954
returnself._search_query
6055

6156
@property
62-
deflimit(self)->Optional[int]:
63-
"""Get the limit that was applied tothissearch."""
64-
returnself._search_query.get("limit")
57+
defhas_more(self)->bool:
58+
"""Check if there are more records available beyondthisresult set."""
59+
returnself._total> (self.skip+len(self._data))
6560

6661
@property
6762
defskip(self)->int:
6863
"""Get the number of records that were skipped."""
69-
return (
70-
isinstance(self._search_query,dict)
71-
andself.search_query.get("skip",0)
72-
or0
73-
)
64+
returnself._search_query.get("skip")or0
7465

7566
@property
76-
defhas_more(self)->bool:
77-
"""Check if there are more records available beyond this result set."""
78-
returnself._total> (self.skip+len(self._data))
67+
deflimit(self)->Optional[int]:
68+
"""Get the limit that was applied to the search."""
69+
returnself._search_query.get("limit")orlen(self.data)
7970

8071
def__len__(self)->int:
8172
"""Get the number of records in this result set."""
@@ -97,6 +88,29 @@ def __repr__(self) -> str:
9788
"""String representation of the search result."""
9889
returnf"SearchResult(count={len(self._data)}, total={self._total})"
9990

91+
defto_dict(self)->dict:
92+
"""
93+
Return the result in a standardized dictionary format.
94+
95+
Returns:
96+
Dict with keys: total, data, search_query
97+
"""
98+
return {
99+
"total":self.total,
100+
"data":self.data,
101+
"search_query":self.search_query,
102+
}
103+
104+
defget_page_info(self)->dict:
105+
"""Get pagination information."""
106+
return {
107+
"total":self.total,
108+
"loaded":len(self.data),
109+
"has_more":self.has_more,
110+
"skip":self.skip,
111+
"limit":self.limitorlen(self.data),
112+
}
113+
100114

101115
# Type alias for record search results
102116
RecordSearchResult=SearchResult[Record]

‎tests/test_create_import.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,10 @@ def test_search_result_integration(self):
235235
print(f"Has more:{result.has_more}")
236236
print(f"Limit:{result.limit}, Skip:{result.skip}")
237237

238+
# Test get_page_info
239+
page_info=result.get_page_info()
240+
print(f"Page info:{page_info}")
241+
238242
# Test iteration
239243
print("Technology companies:")
240244
fori,companyinenumerate(result,1):

‎tests/test_search_result.py‎

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,25 @@ def setUp(self):
2020
{"id":"3","name":"Bob","age":35},
2121
]
2222

23+
deftest_search_result_get_page_info(self):
24+
"""Test SearchResult get_page_info() method."""
25+
search_query= {"where": {"name":"test"},"limit":5,"skip":10}
26+
result=SearchResult(self.test_data,total=50,search_query=search_query)
27+
28+
page_info=result.get_page_info()
29+
30+
self.assertEqual(page_info["total"],50)
31+
self.assertEqual(page_info["loaded"],3)
32+
self.assertTrue(page_info["has_more"])
33+
self.assertEqual(page_info["skip"],10)
34+
self.assertEqual(page_info["limit"],5)
35+
2336
deftest_search_result_initialization(self):
2437
"""Test SearchResult initialization with various parameters."""
2538
# Basic initialization
2639
result=SearchResult(self.test_data)
2740
self.assertEqual(len(result),3)
2841
self.assertEqual(result.total,3)
29-
self.assertEqual(result.count,3)
3042
self.assertEqual(result.skip,0)
3143
self.assertIsNone(result.limit)
3244
self.assertFalse(result.has_more)
@@ -38,9 +50,8 @@ def test_search_result_initialization(self):
3850
)
3951
self.assertEqual(len(result),2)
4052
self.assertEqual(result.total,10)
41-
self.assertEqual(result.count,2)
42-
self.assertEqual(result.limit,2)
4353
self.assertEqual(result.skip,5)
54+
self.assertEqual(result.limit,2)
4455
self.assertTrue(result.has_more)
4556

4657
deftest_search_result_properties(self):
@@ -50,7 +61,7 @@ def test_search_result_properties(self):
5061

5162
self.assertEqual(result.data,self.test_data)
5263
self.assertEqual(result.total,100)
53-
self.assertEqual(result.count,3)
64+
self.assertEqual(len(result),3)
5465
self.assertEqual(result.limit,10)
5566
self.assertEqual(result.skip,20)
5667
self.assertTrue(result.has_more)
@@ -116,6 +127,23 @@ def test_record_search_result_type_alias(self):
116127
self.assertEqual(len(result),2)
117128
self.assertEqual(result.total,2)
118129

130+
deftest_search_result_to_dict(self):
131+
"""Test SearchResult to_dict() method."""
132+
search_query= {"where": {"name":"test"},"limit":10}
133+
result=SearchResult(self.test_data,total=100,search_query=search_query)
134+
135+
result_dict=result.to_dict()
136+
137+
self.assertEqual(result_dict["total"],100)
138+
self.assertEqual(result_dict["data"],self.test_data)
139+
self.assertEqual(result_dict["search_query"],search_query)
140+
141+
# Note: get_page_info() method exists but will fail due to missing skip/limit properties
142+
# def test_search_result_get_page_info(self):
143+
# """Test SearchResult get_page_info() method."""
144+
# # This test is commented out because get_page_info() references
145+
# # non-existent skip and limit properties, causing AttributeError
146+
119147

120148
classTestRecordImprovements(TestBase):
121149
"""Test cases for improved Record functionality."""
@@ -247,7 +275,8 @@ def test_find_returns_search_result(self):
247275
# Test SearchResult properties
248276
self.assertGreaterEqual(len(result),1)
249277
self.assertIsInstance(result.total,int)
250-
self.assertIsInstance(result.count,int)
278+
self.assertIsInstance(result.skip,int)
279+
self.assertIsInstance(result.has_more,bool)
251280

252281
# Test iteration
253282
forrecordinresult:
@@ -287,12 +316,19 @@ def test_pagination_with_search_result(self):
287316
result=self.client.records.find(query)
288317

289318
self.assertIsInstance(result,SearchResult)
319+
# Test that pagination properties work
290320
self.assertEqual(result.limit,2)
291321
self.assertEqual(result.skip,1)
322+
self.assertEqual(result.search_query.get("limit"),2)
323+
self.assertEqual(result.search_query.get("skip"),1)
324+
325+
# Test page info
326+
page_info=result.get_page_info()
327+
self.assertEqual(page_info["limit"],2)
328+
self.assertEqual(page_info["skip"],1)
292329

293-
# Check if has_more is correctly calculated
294-
ifresult.total> (result.skip+result.count):
295-
self.assertTrue(result.has_more)
330+
# Test has_more calculation
331+
self.assertIsInstance(result.has_more,bool)
296332

297333

298334
if__name__=="__main__":

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp