From 67e2e7ded8eac57ad849303fb47b6e7beb8a2375 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20B=C4=B0LG=C4=B0N?= Date: Wed, 16 Aug 2023 10:59:02 +0000 Subject: [PATCH 1/3] Use json dumps to add escape quotes --- test/gql/test_get.py | 1 + weaviate/gql/get.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/gql/test_get.py b/test/gql/test_get.py index d9ad622a6..83d964a24 100644 --- a/test/gql/test_get.py +++ b/test/gql/test_get.py @@ -67,6 +67,7 @@ def test_getbuilder_with_additional_props(additional_props: AdditionalProperties ), ("other query", [], 'bm25:{query: "other query"}'), ("other query", None, 'bm25:{query: "other query"}'), + ('what is an "airport"', None, 'bm25:{query: "what is an \\"airport\\""}'), ], ) def test_bm25(query: str, properties: List[str], expected: str): diff --git a/weaviate/gql/get.py b/weaviate/gql/get.py index 9d825dcd2..fead108b9 100644 --- a/weaviate/gql/get.py +++ b/weaviate/gql/get.py @@ -38,7 +38,7 @@ class BM25: properties: Optional[List[str]] def __str__(self) -> str: - ret = f'query: "{util.strip_newlines(self.query)}"' + ret = f"query: {dumps(util.strip_newlines(self.query))}" if self.properties is not None and len(self.properties) > 0: props = '","'.join(self.properties) ret += f', properties: ["{props}"]' From 6d7e726207f9fdd5bbe4a60e04062feb8043f749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20B=C4=B0LG=C4=B0N?= Date: Wed, 16 Aug 2023 18:02:07 +0000 Subject: [PATCH 2/3] Add a test case with a single quote --- test/gql/test_get.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/gql/test_get.py b/test/gql/test_get.py index 83d964a24..4b718e97e 100644 --- a/test/gql/test_get.py +++ b/test/gql/test_get.py @@ -68,6 +68,7 @@ def test_getbuilder_with_additional_props(additional_props: AdditionalProperties ("other query", [], 'bm25:{query: "other query"}'), ("other query", None, 'bm25:{query: "other query"}'), ('what is an "airport"', None, 'bm25:{query: "what is an \\"airport\\""}'), + ("what is an 'airport'", None, """bm25:{query: "what is an 'airport'"}"""), ], ) def test_bm25(query: str, properties: List[str], expected: str): From d7b20b75c4aeea68248ecd4f5d366158ec1a48c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20B=C4=B0LG=C4=B0N?= Date: Thu, 17 Aug 2023 08:24:11 +0000 Subject: [PATCH 3/3] Use dumps in with_hybrid and with_generate --- test/gql/test_get.py | 26 ++++++++++++++++++++++++++ weaviate/gql/get.py | 8 +++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/test/gql/test_get.py b/test/gql/test_get.py index 4b718e97e..22b104380 100644 --- a/test/gql/test_get.py +++ b/test/gql/test_get.py @@ -110,6 +110,8 @@ def test_get_references(property_name: str, in_class: str, properties: List[str] 'hybrid:{query: "query", vector: [1, 2, 3], alpha: 0.5}', ), ("query", None, None, None, None, 'hybrid:{query: "query"}'), + ('query "query2"', None, None, None, None, 'hybrid:{query: "query \\"query2\\""}'), + ("query 'query2'", None, None, None, None, """hybrid:{query: "query 'query2'"}"""), ("query", None, None, ["prop1"], None, 'hybrid:{query: "query", properties: ["prop1"]}'), ( "query", @@ -166,12 +168,36 @@ def test_hybrid( None, """generate(singleResult:{prompt:"What is the meaning of life?"}){error singleResult} """, ), + ( + 'What is the meaning of "life"?', + None, + None, + """generate(singleResult:{prompt:"What is the meaning of \\"life\\"?"}){error singleResult} """, + ), + ( + "What is the meaning of 'life'?", + None, + None, + """generate(singleResult:{prompt:"What is the meaning of 'life'?"}){error singleResult} """, + ), ( None, "Explain why these magazines or newspapers are about finance", None, """generate(groupedResult:{task:"Explain why these magazines or newspapers are about finance"}){error groupedResult} """, ), + ( + None, + 'Explain why these magazines or newspapers are about "finance"', + None, + """generate(groupedResult:{task:"Explain why these magazines or newspapers are about \\"finance\\""}){error groupedResult} """, + ), + ( + None, + "Explain why these magazines or newspapers are about 'finance'", + None, + """generate(groupedResult:{task:"Explain why these magazines or newspapers are about 'finance'"}){error groupedResult} """, + ), ( "What is the meaning of life?", "Explain why these magazines or newspapers are about finance", diff --git a/weaviate/gql/get.py b/weaviate/gql/get.py index fead108b9..0b9c47afe 100644 --- a/weaviate/gql/get.py +++ b/weaviate/gql/get.py @@ -59,7 +59,7 @@ class Hybrid: fusion_type: Optional[HybridFusion] def __str__(self) -> str: - ret = f'query: "{util.strip_newlines(self.query)}"' + ret = f"query: {dumps(util.strip_newlines(self.query))}" if self.vector is not None: ret += f", vector: {self.vector}" if self.alpha is not None: @@ -1130,14 +1130,16 @@ def with_generate( task_and_prompt = "" if single_prompt is not None: results.append("singleResult") - task_and_prompt += f'singleResult:{{prompt:"{util.strip_newlines(single_prompt)}"}}' + task_and_prompt += ( + f"singleResult:{{prompt:{dumps(util.strip_newlines(single_prompt))}}}" + ) if grouped_task is not None or ( grouped_properties is not None and len(grouped_properties) > 0 ): results.append("groupedResult") args = [] if grouped_task is not None: - args.append(f'task:"{util.strip_newlines(grouped_task)}"') + args.append(f"task:{dumps(util.strip_newlines(grouped_task))}") if grouped_properties is not None and len(grouped_properties) > 0: props = '","'.join(grouped_properties) args.append(f'properties:["{props}"]')