Skip to content

Commit 0ca4dff

Browse files
authored
Merge pull request #10 from IdanHaim/master
Fix escaping and quoting special characters
2 parents 474938d + 3f2c900 commit 0ca4dff

File tree

4 files changed

+29
-10
lines changed

4 files changed

+29
-10
lines changed

pyravendb/store/session_query.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ def where_not_none(self, field_name):
270270
if len(self.query_builder) > 0:
271271
self.query_builder += ' '
272272
self.query_builder += '('
273-
self.where_equals(field_name, '*').and_also().add_not().where_equals(field_name, None)
273+
self.where_equals(field_name, '*', escape_query_options=EscapeQueryOptions.RawQuery).and_also().add_not().where_equals(field_name, None)
274274
self.query_builder += ')'
275275
return self
276276

@@ -321,8 +321,7 @@ def boost(self, value):
321321
def _execute_query(self):
322322
self.session.increment_requests_count()
323323
conventions = self.session.conventions
324-
start_time = time.time()
325-
end_time = start_time + conventions.timeout
324+
end_time = time.time() + conventions.timeout
326325
while True:
327326
response = self.session.database_commands. \
328327
query(self.index_name, IndexQuery(self.query_builder, default_operator=self.using_default_operator,
@@ -331,7 +330,7 @@ def _execute_query(self):
331330
wait_for_non_stale_results=self.wait_for_non_stale_results),
332331
includes=self.includes)
333332
if response["IsStale"] and self.wait_for_non_stale_results:
334-
if start_time > end_time:
333+
if time.time() > end_time:
335334
raise ErrorResponseException("The index is still stale after reached the timeout")
336335
time.sleep(0.1)
337336
continue

pyravendb/tests/session_tests/test_query.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ def setUpClass(cls):
4747
{"name": "withNesting", "product": {"name": "testing_order", "key": 4, "order": None}},
4848
{"Raven-Entity-Name": "Companies"})
4949
cls.db.put("specials/1", {"url": "https://ravendb.net/"})
50+
cls.db.put("specials/2",
51+
{"url": "http://www.example.com/ebx/LinkResolverServlet?classofcontent=Standard&id=63935",
52+
"date": "2017.03.05T00:00:00.000"})
53+
cls.db.put("specials/3",
54+
{"wild_cards": "%~#+!$,;'*[]?*",
55+
"date": "2017.03.05T00:00:01.000"})
5056
cls.document_store = documentstore(cls.default_url, cls.default_database)
5157
cls.document_store.initialize()
5258

@@ -94,6 +100,21 @@ def test_query_with_special_characters(self):
94100
self.assertTrue(len(query_result) > 0)
95101
self.assertTrue(query_result[0].url == url)
96102

103+
def test_query_with_wild_cards_and_select(self):
104+
with self.document_store.open_session() as session:
105+
url = "http://www.example.com/ebx/LinkResolverServlet?classofcontent=Standard&id=63935"
106+
query_result = list(session.query().where_equals("url", url).select("date"))
107+
self.assertTrue(len(query_result) > 0)
108+
self.assertIsNotNone(query_result[0].date)
109+
self.assertFalse(hasattr(query_result[0], "url"))
110+
111+
def test_query_with_only_wild_cards(self):
112+
with self.document_store.open_session() as session:
113+
wild_cards = "%~#+!$,;'*[]?*"
114+
query_result = list(session.query().where_equals("wild_cards", wild_cards))
115+
self.assertTrue(len(query_result) > 0)
116+
self.assertIsNotNone(query_result[0].wild_cards)
117+
97118
def test_query_success_with_where(self):
98119
with self.document_store.open_session() as session:
99120
query_results = list(session.query().where(name="test101", key=[4, 6, 90]))

pyravendb/tools/utils.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ def empty_etag():
2323

2424
@staticmethod
2525
def quote_key(key):
26-
reserved = '%:=&?~#+!$,;\'*[]'
2726
if key:
2827
# To be able to work on python 2.x and 3.x
2928
if sys.version_info.major > 2:
30-
return urllib.parse.quote(key, safe=reserved)
29+
return urllib.parse.quote(key)
3130
else:
32-
return urllib.quote(key, safe=reserved)
31+
return urllib.quote(key)
3332
else:
3433
return ''
3534

@@ -282,7 +281,7 @@ def timedelta_to_str(timedelta_obj):
282281

283282
@staticmethod
284283
def escape(term, allow_wild_cards, make_phrase):
285-
wild_cards = ['-', '&', '|', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', ':', '\\']
284+
wild_cards = ['-', '&', '|', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', ':', '\\', '?', '*']
286285
if not term:
287286
return "\"\""
288287
start = 0
@@ -301,7 +300,7 @@ def escape(term, allow_wild_cards, make_phrase):
301300

302301
if ch in wild_cards:
303302
if i > start:
304-
builder += term[start:i - start]
303+
builder += term[start:i]
305304

306305
builder += '\\{0}'.format(ch)
307306
start = i + 1

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
setup(
44
name='pyravendb',
55
packages=find_packages(),
6-
version='1.3.1.3',
6+
version='3.5.3.3',
77
description='This is the official python client for RavenDB document database',
88
author='Idan Haim Shalom',
99
author_email='[email protected]',

0 commit comments

Comments
 (0)