diff --git a/hed/models/basic_search_util.py b/hed/models/basic_search_util.py new file mode 100644 index 00000000..7e3224a5 --- /dev/null +++ b/hed/models/basic_search_util.py @@ -0,0 +1,38 @@ +""" +Utilities to support HED searches based on strings. +""" +from hed.models.hed_string import HedString +from hed.models.hed_tag import HedTag + + +def convert_query(search_query, schema): + """Converts the given basic search query into a hed_string + + Parameters: + search_query(str): The basic search query to convert. + schema(HedSchema): The schema to use to convert tags + + Returns: + long_query(str): The converted search query, in long form. + """ + input_tags = HedString.split_hed_string(search_query) + output_string = "" + skippable_prefix = ("@", "~") + skippable_suffix = ("*", ) + for is_hed_tag, (startpos, endpos) in input_tags: + input_tag = search_query[startpos:endpos] + add_suffix = "" + if is_hed_tag: + if input_tag.startswith(skippable_prefix): + output_string += input_tag[:1] + input_tag = input_tag[1:] + + if input_tag.endswith(skippable_suffix): + add_suffix = input_tag[-1:] + input_tag = input_tag[:-1] + output_string += HedTag(input_tag, schema).long_tag + output_string += add_suffix + else: + output_string += input_tag + + return output_string diff --git a/tests/models/test_basic_search_util.py b/tests/models/test_basic_search_util.py new file mode 100644 index 00000000..9701ca65 --- /dev/null +++ b/tests/models/test_basic_search_util.py @@ -0,0 +1,20 @@ +import unittest +from hed import load_schema_version +from hed.models.basic_search_util import convert_query + + +class TestConvertQueryToForm(unittest.TestCase): + schema = load_schema_version("8.3.0") + + def test_basic_convert(self): + input = "@Event, Head-part*, Time-interval/1" + expected_output = "@Event, Item/Biological-item/Anatomical-item/Body-part/Head-part*, Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" + + actual_output = convert_query(input, self.schema) + self.assertEqual(expected_output, actual_output) + + input = "@Head-part*, Event, Time-interval/1" + expected_output = "@Item/Biological-item/Anatomical-item/Body-part/Head-part*, Event, Property/Data-property/Data-value/Spatiotemporal-value/Temporal-value/Time-interval/1" + + actual_output = convert_query(input, self.schema) + self.assertEqual(expected_output, actual_output) \ No newline at end of file