Skip to content

Commit 72c43fc

Browse files
committed
optimze search_response
1 parent 0fd9079 commit 72c43fc

File tree

8 files changed

+109
-18
lines changed

8 files changed

+109
-18
lines changed

CHANGELOG.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ TableStore SDK for Python 版本记录
33

44
Python SDK的版本号遵循 `Semantic Versioning <http://semver.org/>`_ 规则。
55

6+
Version 5.2.1
7+
-------------
8+
9+
- Opimize SearchResponse
10+
611
Version 5.2.0
712
-------------
813

README.rst

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Aliyun TableStore SDK for Python
1+
Aliyun Tablestore SDK for Python
22
==================================
33

44
.. image:: https://img.shields.io/badge/license-apache2-brightgreen.svg
@@ -11,13 +11,13 @@ Aliyun TableStore SDK for Python
1111
概述
1212
----
1313

14-
- 此Python SDK基于 `阿里云表格存储服务 <http://www.aliyun.com/product/ots/>`_ API构建
15-
- 阿里云表格存储是构建在阿里云飞天分布式系统之上的NoSQL数据存储服务,提供海量结构化数据的存储和实时访问。
14+
- 此Python SDK基于 `阿里云表格存储服务 <http://www.aliyun.com/product/ots/>`_ API 构建
15+
- 阿里云表格存储是构建在阿里云飞天分布式系统之上的 NoSQL 数据存储服务,提供海量结构化数据的存储和实时访问。
1616

1717
运行环境
1818
---------
1919

20-
- 安装Python即可运行,支持python2.6、Python2.7、python3.3、python3.4、python3.5和python3.6。
20+
- 安装Python即可运行,支持python2.6、Python2.7、python3.3、python3.4、python3.5 和 python3.6。
2121

2222
安装方法
2323
---------
@@ -69,13 +69,13 @@ Github安装
6969
- `批量读(从多张表,一次性读出多行数据) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/batch_get_row.py>`_
7070
- `范围扫描(给定一个范围,扫描出该范围内的所有数据) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/get_range.py>`_
7171
- `主键自增列(主键自动生成一个递增ID) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/pk_auto_incr.py>`_
72+
- `全局二级索引 <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/secondary_index_operations.py>`_
73+
- `局部事务(提交事务) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/transaction_and_commit.py>`_
74+
- `局部事务(舍弃事务) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/transaction_and_abort.py>`_
7275
- `Search <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/search_index.py>`_
7376
- `Parallel Scan <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/parallel_scan.py>`_
7477
- `Max/Min/Sum/Avg/Count/DistinctCount <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/agg.py>`_
7578
- `GroupBy <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/group_by.py>`_
76-
- `全局二级索引 <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/secondary_index_operations.py>`_
77-
- `局部事务(提交事务) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/transaction_and_commit.py>`_
78-
- `局部事务(舍弃事务) <https://github.com/aliyun/aliyun-tablestore-python-sdk/blob/master/examples/transaction_and_abort.py>`_
7979

8080
执行测试
8181
---------
@@ -105,10 +105,10 @@ Github安装
105105
106106
贡献代码
107107
--------
108-
- 我们非常欢迎大家为TableStore Python SDK以及其他TableStore SDK贡献代码。
109-
- 感谢 `@Wall-ee <https://github.com/Wall-ee>`_ 对4.3.0版本的贡献。
108+
- 我们非常欢迎大家为Tablestore Python SDK以及其他Tablestore SDK贡献代码。
109+
- 非常感谢 `@Wall-ee <https://github.com/Wall-ee>`_ 对4.3.0版本的贡献。
110110

111111
联系我们
112112
--------
113-
- `阿里云TableStore官方网站 <http://www.aliyun.com/product/ots>`_
113+
- `阿里云Tablestore官方网站 <http://www.aliyun.com/product/ots>`_
114114
- `阿里云官网联系方式 <https://help.aliyun.com/document_detail/61890.html>`_

examples/search_index.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,23 @@
1010
nested_index_name = 'nested_search_index'
1111
client = None
1212

13+
def term_query_with_multiple_version_response(table_name, index_name):
14+
query = TermQuery('k', 'key000')
15+
search_response = client.search(table_name, index_name,
16+
SearchQuery(query, limit=100, get_total_count=True),
17+
ColumnsToGet(return_type=ColumnReturnType.ALL))
18+
19+
print ("***** 1.0.0 ~ 5.1.0 version: tuple *****")
20+
items = search_response.v1_response()
21+
print(items)
22+
23+
print("***** 1.0.0 ~ 5.1.0 version: iter *****")
24+
for item in search_response:
25+
print(item)
26+
27+
print ("***** 5.2.0 version *****")
28+
print(search_response.rows)
29+
1330
def match_all_query(table_name, index_name):
1431
# simple queries: match all query and scan to get all data with next token
1532
query = MatchAllQuery()
@@ -174,6 +191,7 @@ def function_score_query(table_name, index_name):
174191

175192
_print_rows(search_response.rows, search_response.total_count)
176193

194+
177195
def prepare_data(rows_count):
178196
print ('Begin prepare data: %d' % rows_count)
179197
for i in range(rows_count):
@@ -268,6 +286,7 @@ def delete_search_index(index_name):
268286
describe_search_index()
269287

270288
# perform queries
289+
term_query_with_multiple_version_response(table_name, index_name)
271290
match_all_query(table_name, index_name)
272291
match_query(table_name, index_name)
273292
match_phrase_query(table_name, index_name)

tablestore/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf8 -*-
22

3-
__version__ = '5.2.0'
3+
__version__ = '5.2.1'
44
__all__ = [
55
'OTSClient',
66

tablestore/metadata.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -900,25 +900,51 @@ def __init__(self, column_names=[], return_type=ColumnReturnType.NONE):
900900
self.column_names = column_names
901901
self.return_type = return_type
902902

903-
class SearchResponse(object):
903+
class IterableResponse(object):
904+
def __init__(self):
905+
self.index = 0
906+
self.response = tuple()
907+
908+
def __iter__(self):
909+
return iter(self.response)
910+
911+
def _add_response(self, *responses):
912+
self.response = tuple(responses)
913+
914+
def v1_response(self):
915+
return self.response
916+
917+
class SearchResponse(IterableResponse):
904918

905919
def __init__(self, rows, agg_results, group_by_results, next_token, is_all_succeed, total_count):
920+
super(SearchResponse, self).__init__()
921+
906922
self.rows = rows
907923
self.agg_results = agg_results
908924
self.group_by_results = group_by_results
909925
self.next_token = next_token
910926
self.is_all_succeed = is_all_succeed
911927
self.total_count = total_count
912928

913-
class ComputeSplitsResponse(object):
929+
self._add_response(self.rows, self.next_token, self.total_count, self.is_all_succeed,
930+
self.agg_results, self.group_by_results)
931+
932+
class ComputeSplitsResponse(IterableResponse):
914933

915934
def __init__(self, session_id, splits_size):
935+
super(ComputeSplitsResponse, self).__init__()
936+
916937
self.session_id = session_id
917938
self.splits_size = splits_size
918939

940+
self._add_response(self.session_id, self.splits_size)
919941

920-
class ParallelScanResponse(object):
942+
class ParallelScanResponse(IterableResponse):
921943

922944
def __init__(self, rows, next_token):
945+
super(ParallelScanResponse, self).__init__()
946+
923947
self.rows = rows
924948
self.next_token = next_token
949+
950+
self._add_response(self.rows, self.next_token)

tablestore/protocol.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ def parse_response(self, api_name, status, headers, body):
248248
error_message = 'Response format is invalid, %s, RequestID: %s, " \
249249
"HTTP status: %s, Body: %s.' % (str(e), request_id, status, body)
250250
self.logger.error(error_message)
251-
#raise OTSClientError(error_message, status)
252251
raise e
253252

254253
if self.logger.level <= logging.DEBUG:

tests/parallel_scan_test.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,45 @@ def test_compute_splits_with_tablename_is_not_exist(self):
9090
self.assert_error(e, 400, "OTSParameterInvalid", "table [not_exist] does not exist")
9191

9292
def test_parallel_scan_normal(self):
93-
compute_splits_response = self.client_test.compute_splits(self.table_name, self.index_name)
93+
compute_splits_response = self.client_test.compute_splits(self.table_name, self.index_name)
94+
95+
self.assert_equal(1, compute_splits_response.splits_size)
96+
self.assertTrue(len(compute_splits_response.session_id) > 0)
97+
98+
self.assert_equal(compute_splits_response.session_id, compute_splits_response.v1_response()[0])
99+
self.assert_equal(compute_splits_response.splits_size, compute_splits_response.v1_response()[1])
100+
101+
pos = 0
102+
for item in compute_splits_response:
103+
if pos == 0:
104+
self.assert_equal(compute_splits_response.session_id, item)
105+
elif pos == 1:
106+
self.assert_equal(compute_splits_response.splits_size, item)
107+
pos += 1
94108

95109
query = TermQuery('d', 0.1)
96110
scan_query = ScanQuery(query, limit = 70, next_token = None, current_parallel_id = 0,
97111
max_parallel = compute_splits_response.splits_size, alive_time = 30)
98112
parallel_scan_response = self.client_test.parallel_scan(
99113
self.table_name, self.index_name, scan_query, compute_splits_response.session_id,
100-
columns_to_get = ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
114+
columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX))
101115

102116
self.assert_equal(70, len(parallel_scan_response.rows))
103117
self.assertTrue(parallel_scan_response.next_token is not None)
104118

119+
self.assert_equal(70, len(parallel_scan_response.v1_response()[0]))
120+
self.assertTrue(parallel_scan_response.v1_response()[1] is not None)
121+
122+
pos = 0
123+
for item in parallel_scan_response:
124+
if pos == 0:
125+
self.assert_equal(70, len(item))
126+
elif pos == 1:
127+
self.assertTrue(item is not None)
128+
pos += 1
129+
105130
scan_query_2 = ScanQuery(query, limit = 70, next_token = parallel_scan_response.next_token, current_parallel_id = 0,
106-
max_parallel = compute_splits_response.splits_size, alive_time = 30)
131+
max_parallel = compute_splits_response.splits_size, alive_time = 30)
107132
parallel_scan_response2 = self.client_test.parallel_scan(
108133
self.table_name, self.index_name, scan_query_2, compute_splits_response.session_id,
109134
columns_to_get = ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

tests/search_index_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,23 @@ def _check_query_result(self, search_response, rows_count, has_next_token, expec
273273
self.assert_equal(len(search_response.next_token) > 0, has_next_token)
274274
self.assert_equal(search_response.total_count, expect_total_count)
275275

276+
self.assert_equal(len(search_response.v1_response()[0]), rows_count)
277+
self.assert_equal(search_response.v1_response()[3], True)
278+
self.assert_equal(len(search_response.v1_response()[1]) > 0, has_next_token)
279+
self.assert_equal(search_response.v1_response()[2], expect_total_count)
280+
281+
pos = 0
282+
for item in search_response:
283+
if pos == 0:
284+
self.assert_equal(len(item), rows_count)
285+
elif pos == 1:
286+
self.assert_equal(len(item) > 0, has_next_token)
287+
elif pos == 2:
288+
self.assert_equal(item, expect_total_count)
289+
elif pos == 3:
290+
self.assert_equal(item, True)
291+
pos += 1
292+
276293
return search_response.rows
277294

278295
def _test_prefix_query(self, table_name, index_name):

0 commit comments

Comments
 (0)