def test_parses_correct_quoted_query(self): [(field, value)] = parameters.parse_search('title eq "Moby Dick"') self.assertEqual(field, 'title') self.assertEqual(value, 'Moby Dick') [(field, value)] = parameters.parse_search("title eq 'Moby Dick'") self.assertEqual(field, 'title') self.assertEqual(value, 'Moby Dick')
def test_parses_correct_conjunctive_query(self): query = 'title eq Moby Dick and author eq Melville, Herman' [(field1, value1), (field2, value2)] = parameters.parse_search(query) self.assertEqual(field1, 'title') self.assertEqual(value1, 'Moby Dick') self.assertEqual(field2, 'author') self.assertEqual(value2, 'Melville, Herman')
def search(query: str, include: Optional[str] = None) -> List[dict]: fields = parse_include(include) if include else [] conjunction = parse_search(query) parts = iter(get_etexts(field, value) for field, value in conjunction) results = set(next(parts)) [results.intersection_update(part) for part in parts] # type: ignore return [ dict([('text_id', text_id)] + [(field, get_metadata(field, text_id)) for field in fields]) for text_id in results ]
def test_parses_correct_url_encoded_query(self): [(field, value)] = parameters.parse_search('title%20eq%20Moby%20Dick') self.assertEqual(field, 'title') self.assertEqual(value, 'Moby Dick')
def test_no_value_is_invalid(self): with self.assertRaises(InvalidUsage): parameters.parse_search('title eq')
def test_bad_field_is_invalid(self): with self.assertRaises(InvalidUsage): parameters.parse_search('foobar eq value')
def test_bad_operator_is_invalid(self): with self.assertRaises(InvalidUsage): parameters.parse_search('field foobar value')
def test_empty_is_invalid(self): with self.assertRaises(InvalidUsage): parameters.parse_search('')