diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fea84a3f8f8c1f4ef11753758147c6be2457988..cde38fb0f2efd99856f677fc41e66252d1a43e23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### ### Fixed ### + - Query generation when there are only backrefs or backrefs and a name +- Query generation when there are spaces or `'` in RecordType or Identifiable + names - usage of ID when looking for identified records ### Security ### diff --git a/src/caoscrawler/identifiable_adapters.py b/src/caoscrawler/identifiable_adapters.py index 9122cc4a882b94e3a6bba27921f59bc4bbc9d9a0..245927e7313ca31a78bbe9b54dcb23ddfb837346 100644 --- a/src/caoscrawler/identifiable_adapters.py +++ b/src/caoscrawler/identifiable_adapters.py @@ -104,7 +104,7 @@ identifiabel, identifiable and identified record) for a Record. query_string = "FIND RECORD " if ident.record_type is not None: - query_string += ident.record_type + query_string += f"'{ident.record_type}'" for ref in ident.backrefs: eid = ref if isinstance(ref, db.Entity): @@ -114,7 +114,7 @@ identifiabel, identifiable and identified record) for a Record. query_string += " WITH " if ident.name is not None: - query_string += "name='{}'".format(ident.name) + query_string += "name='{}'".format(convert_value(ident.name)) if len(ident.properties) > 0: query_string += " AND " diff --git a/unittests/test_identifiable_adapters.py b/unittests/test_identifiable_adapters.py index 57f1459de9b6cf4f3fec73b9f3c0af1ae2b87659..5c338f0e37dea0d3d502fc9931ad421b72944699 100644 --- a/unittests/test_identifiable_adapters.py +++ b/unittests/test_identifiable_adapters.py @@ -44,7 +44,7 @@ UNITTESTDIR = Path(__file__).parent def test_create_query_for_identifiable(): query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(record_type="Person", properties={"first_name": "A", "last_name": "B"})) - assert query.lower() == "find record person with 'first_name'='a' and 'last_name'='b' " + assert query.lower() == "find record 'person' with 'first_name'='a' and 'last_name'='b' " query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(name="A", record_type="B", properties={ @@ -56,31 +56,31 @@ def test_create_query_for_identifiable(): "h": db.Record(id=1111), "i": db.File(id=1112), "j": [2222, db.Record(id=3333)]})) - assert (query == "FIND RECORD B WITH name='A' AND 'c'='c' AND 'd'='5' AND 'e'='5.5'" + assert (query == "FIND RECORD 'B' WITH name='A' AND 'c'='c' AND 'd'='5' AND 'e'='5.5'" " AND 'f'='2020-10-10T00:00:00' AND 'g'='TRUE' AND 'h'='1111' AND 'i'='1112' AND " "'j'='2222' AND 'j'='3333' ") # The name can be the only identifiable query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(name="TestRecord", record_type="TestType")) - assert query.lower() == "find record testtype with name='testrecord'" + assert query.lower() == "find record 'testtype' with name='testrecord'" # With referencing entity (backref) query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(record_type="Person", backrefs=[14433], properties={'last_name': "B"})) - assert query.lower() == ("find record person which is referenced by 14433 and with " + assert query.lower() == ("find record 'person' which is referenced by 14433 and with " "'last_name'='b' ") # With two referencing entities (backref) query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(record_type="Person", backrefs=[14433, 333], properties={'last_name': "B"})) - assert query.lower() == ("find record person which is referenced by 14433 and which is " + assert query.lower() == ("find record 'person' which is referenced by 14433 and which is " "referenced by 333 and with 'last_name'='b' ") # With single quote in string query = IdentifiableAdapter.create_query_for_identifiable( Identifiable(record_type="Person", backrefs=[], properties={'last_name': "B'Or"})) - assert query == ("FIND RECORD Person WITH 'last_name'='B\\'Or' ") + assert query == ("FIND RECORD 'Person' WITH 'last_name'='B\\'Or' ") # With only backref query = IdentifiableAdapter.create_query_for_identifiable( @@ -92,6 +92,10 @@ def test_create_query_for_identifiable(): Identifiable(backrefs=[160], name='lo', properties={})) assert query == ("FIND RECORD WHICH IS REFERENCED BY 160 AND WITH name='lo'") + query = IdentifiableAdapter.create_query_for_identifiable( + Identifiable(record_type="record type", name="it's weird")) + assert query == ("FIND RECORD 'record type' WITH name='it\\'s weird'") + def test_load_from_yaml_file(): ident = CaosDBIdentifiableAdapter()