Skip to content

Commit 8342a6f

Browse files
authored
Merge pull request #14 from IdanHaim/master
master
2 parents d933d47 + 7071f6d commit 8342a6f

File tree

5 files changed

+44
-10
lines changed

5 files changed

+44
-10
lines changed

pyravendb/d_commands/database_commands.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def query(self, index_name, index_query, includes=None, metadata_only=False, ind
263263
raise ValueError("None query is invalid")
264264
if not isinstance(index_query, IndexQuery):
265265
raise ValueError("query must be IndexQuery type")
266-
path = "indexes/{0}?&pageSize={1}".format(Utils.quote_key(index_name), index_query.page_size)
266+
path = "indexes/{0}?".format(Utils.quote_key(index_name))
267267
if index_query.default_operator is QueryOperator.AND:
268268
path += "&operator={0}".format(index_query.default_operator.value)
269269
if index_query.query:
@@ -283,6 +283,10 @@ def query(self, index_name, index_query, includes=None, metadata_only=False, ind
283283
path += "&debug=entries"
284284
if includes and len(includes) > 0:
285285
path += "".join("&include=" + item for item in includes)
286+
if index_query.start:
287+
path += "&start={0}".format(index_query.start)
288+
289+
path += "&pageSize={0}".format(index_query.page_size)
286290
response = self._requests_handler.http_request_handler(path, "GET",
287291
force_read_from_master=force_read_from_master).json()
288292
if "Error" in response:

pyravendb/data/indexes.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def to_json(self):
109109

110110

111111
class IndexQuery(object):
112-
def __init__(self, query="", total_size=0, skipped_results=0, default_operator=None, **kwargs):
112+
def __init__(self, query="", total_size=0, skipped_results=0, default_operator=None, start=None, **kwargs):
113113
"""
114114
@param query: Actual query that will be performed (Lucene syntax).
115115
:type str
@@ -125,13 +125,16 @@ def __init__(self, query="", total_size=0, skipped_results=0, default_operator=N
125125
self.query = query
126126
self.total_size = total_size
127127
self.skipped_results = skipped_results
128-
self._page_size = 128
129128
self.__page_size_set = False
129+
self._page_size = 128
130+
if "page_size" in kwargs:
131+
self.page_size = kwargs["page_size"]
130132
self.default_operator = default_operator
131133
self.sort_hints = kwargs.get("sort_hints", {})
132134
self.sort_fields = kwargs.get("sort_fields", {})
133135
self.fetch = kwargs.get("fetch", [])
134136
self.wait_for_non_stale_results = kwargs.get("wait_for_non_stale_results", False)
137+
self.start = start
135138

136139
@property
137140
def page_size(self):

pyravendb/store/session_query.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def __init__(self, session):
2323
self._sort_hints = set()
2424
self._sort_fields = set()
2525
self.fetch = None
26+
self._page_size = None
27+
self._start = None
2628

2729
def __call__(self, object_type=None, index_name=None, using_default_operator=None,
2830
wait_for_non_stale_results=False, includes=None, with_statistics=False, nested_object_types=None):
@@ -254,6 +256,16 @@ def where_between_or_equal(self, field_name, start, end):
254256
self.query_builder += "{0}:{1}".format(field_name, lucene_text)
255257
return self
256258

259+
def take(self, count):
260+
# This method control on the number of the server return results
261+
self._page_size = count
262+
return self
263+
264+
def skip(self, count):
265+
# This method tell the server to return the results from count and on
266+
self._start = count
267+
return self
268+
257269
def where_greater_than(self, field_name, value):
258270
return self.where_between(field_name, value, None)
259271

@@ -270,7 +282,9 @@ def where_not_none(self, field_name):
270282
if len(self.query_builder) > 0:
271283
self.query_builder += ' '
272284
self.query_builder += '('
273-
self.where_equals(field_name, '*', escape_query_options=EscapeQueryOptions.RawQuery).and_also().add_not().where_equals(field_name, None)
285+
self.where_equals(field_name, '*',
286+
escape_query_options=EscapeQueryOptions.RawQuery).and_also().add_not().where_equals(
287+
field_name, None)
274288
self.query_builder += ')'
275289
return self
276290

@@ -323,12 +337,14 @@ def _execute_query(self):
323337
conventions = self.session.conventions
324338
end_time = time.time() + conventions.timeout
325339
while True:
326-
response = self.session.database_commands. \
327-
query(self.index_name, IndexQuery(self.query_builder, default_operator=self.using_default_operator,
328-
sort_hints=self._sort_hints, sort_fields=self._sort_fields,
329-
fetch=self.fetch,
330-
wait_for_non_stale_results=self.wait_for_non_stale_results),
331-
includes=self.includes)
340+
index_query = IndexQuery(self.query_builder, default_operator=self.using_default_operator,
341+
sort_hints=self._sort_hints, sort_fields=self._sort_fields,
342+
fetch=self.fetch,
343+
wait_for_non_stale_results=self.wait_for_non_stale_results,
344+
start=self._start)
345+
if self._page_size is not None:
346+
index_query.page_size = self._page_size
347+
response = self.session.database_commands.query(self.index_name, index_query, includes=self.includes)
332348
if response["IsStale"] and self.wait_for_non_stale_results:
333349
if time.time() > end_time:
334350
raise ErrorResponseException("The index is still stale after reached the timeout")

pyravendb/tests/database_commands_tests/test_query.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class TestQuery(TestBase):
88
def setUpClass(cls):
99
super(TestQuery, cls).setUpClass()
1010
cls.db.put("products/10", {"Name": "test"}, {"Raven-Entity-Name": "Products", "Raven-Python-Type": "object"})
11+
cls.db.put("products/11", {"Name": "test2"}, {"Raven-Entity-Name": "Products", "Raven-Python-Type": "object"})
12+
cls.db.put("products/12", {"Name": "test3"}, {"Raven-Entity-Name": "Products", "Raven-Python-Type": "object"})
1113

1214
def test_only_query(self):
1315
self.db.put_index("Testing", self.index, True)
@@ -31,3 +33,8 @@ def test_fail(self):
3133
def test_fail_none_response(self):
3234
with self.assertRaises(exceptions.ErrorResponseException):
3335
self.db.query("IndexIsNotExists", IndexQuery("Tag:Products"))
36+
37+
def test_only_query_change_page_size_and_add_start(self):
38+
self.db.put_index("Testing", self.index, True)
39+
response = self.db.query("Testing", IndexQuery("Tag:Products", page_size=1, start=1))
40+
self.assertEqual(response["Results"][0]["Name"], "test2")

pyravendb/tests/session_tests/test_query.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ def test_query_with_fetch_terms(self):
188188

189189
self.assertTrue(found_in_all)
190190

191+
def test_where_starts_with_skip_take(self):
192+
with self.document_store.open_session() as session:
193+
query_result = list(session.query().where_starts_with("name", "test").take(4).skip("2"))
194+
self.assertEqual(len(query_result), 4)
191195

192196
if __name__ == "__main__":
193197
unittest.main()

0 commit comments

Comments
 (0)