From 52e4fba897b24361112fceebf87b3d7b81c4a18c Mon Sep 17 00:00:00 2001 From: Davis Chase <130488702+dev2049@users.noreply.github.com> Date: Mon, 1 May 2023 10:35:48 -0700 Subject: [PATCH] Fix self query pinecone translation (#3892) Enum to string conversion handled differently between python 3.9 and 3.11, currently breaking in 3.11 (see #3788). Thanks @peter-brady for catching this! --- langchain/retrievers/self_query/pinecone.py | 2 +- .../retrievers/self_query/__init__.py | 0 .../retrievers/self_query/test_pinecone.py | 29 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/unit_tests/retrievers/self_query/__init__.py create mode 100644 tests/unit_tests/retrievers/self_query/test_pinecone.py diff --git a/langchain/retrievers/self_query/pinecone.py b/langchain/retrievers/self_query/pinecone.py index c4e0b844..53083df0 100644 --- a/langchain/retrievers/self_query/pinecone.py +++ b/langchain/retrievers/self_query/pinecone.py @@ -30,7 +30,7 @@ class PineconeTranslator(Visitor): f"Received disallowed comparator {func}. Allowed " f"comparators are {self.allowed_comparators}" ) - return f"${func}" + return f"${func.value}" def visit_operation(self, operation: Operation) -> Dict: args = [arg.accept(self) for arg in operation.arguments] diff --git a/tests/unit_tests/retrievers/self_query/__init__.py b/tests/unit_tests/retrievers/self_query/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit_tests/retrievers/self_query/test_pinecone.py b/tests/unit_tests/retrievers/self_query/test_pinecone.py new file mode 100644 index 00000000..2927fccd --- /dev/null +++ b/tests/unit_tests/retrievers/self_query/test_pinecone.py @@ -0,0 +1,29 @@ +from langchain.chains.query_constructor.ir import ( + Comparator, + Comparison, + Operation, + Operator, +) +from langchain.retrievers.self_query.pinecone import PineconeTranslator + +DEFAULT_TRANSLATOR = PineconeTranslator() + + +def test_visit_comparison() -> None: + comp = Comparison(comparator=Comparator.LT, attribute="foo", value=["1", "2"]) + expected = {"foo": {"$lt": ["1", "2"]}} + actual = DEFAULT_TRANSLATOR.visit_comparison(comp) + assert expected == actual + + +def test_visit_operation() -> None: + op = Operation( + operator=Operator.AND, + arguments=[ + Comparison(comparator=Comparator.LT, attribute="foo", value=2), + Comparison(comparator=Comparator.EQ, attribute="bar", value="baz"), + ], + ) + expected = {"$and": [{"foo": {"$lt": 2}}, {"bar": {"$eq": "baz"}}]} + actual = DEFAULT_TRANSLATOR.visit_operation(op) + assert expected == actual