def test_ex_search(): # Error on no query q = SearchHelper(INDEX, search_client=SEARCH_CLIENT) with pytest.raises(ValueError): q._ex_search() # Return info if requested res2 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="Al")._ex_search(info=False) assert isinstance(res2, list) assert isinstance(res2[0], dict) res3 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="Al")._ex_search(info=True) assert isinstance(res3, tuple) assert isinstance(res3[0], list) assert isinstance(res3[0][0], dict) assert isinstance(res3[1], dict) # Check limit res4 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="Al")._ex_search(info=False, limit=3) assert len(res4) == 3 # Check default limits res5 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="Al")._ex_search() assert len(res5) == 10 res6 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="mdf.source_name:nist_xps_db", advanced=True)._ex_search() assert len(res6) == 10000 # Check limit correction (should throw a warning) with pytest.warns(RuntimeWarning): res7 = SearchHelper( INDEX, search_client=SEARCH_CLIENT, advanced=True, q="mdf.source_name:nist_xps_db")._ex_search(limit=20000) assert len(res7) == 10000 # Test index translation # mdf = 1a57bbe5-5272-477f-9d31-343b8258b7a5 res8 = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="data")._ex_search(info=True, limit=1) assert len(res8[0]) == 1 assert res8[1]["index_uuid"] == "1a57bbe5-5272-477f-9d31-343b8258b7a5" with pytest.raises(SearchAPIError): SearchHelper("notexists", search_client=SEARCH_CLIENT, q="data")._ex_search(info=True, limit=1)
def test_add_sort_internal(): # Sort ascending by atomic number q = SearchHelper(INDEX, search_client=SEARCH_CLIENT, q="mdf.source_name:oqmd", advanced=True) q._add_sort('crystal_structure.number_of_atoms', True) res = q._ex_search(limit=1) assert res[0]['crystal_structure']['number_of_atoms'] == 1 # Sort descending by composition q._add_sort('material.composition', False) res = q._ex_search(limit=1) assert res[0]['crystal_structure']['number_of_atoms'] == 1 assert res[0]['material']['composition'].startswith('Zr')
def test_chaining(): # Internal q = SearchHelper(INDEX, search_client=SEARCH_CLIENT) q._field("source_name", "cip") q._and_join() q._field("elements", "Al") res1 = q._ex_search(limit=10000) res2 = (SearchHelper(INDEX, search_client=SEARCH_CLIENT)._field( "source_name", "cip")._and_join()._field("elements", "Al")._ex_search(limit=10000)) assert all([r in res2 for r in res1]) and all([r in res1 for r in res2]) # External f = SearchHelper(INDEX, search_client=SEARCH_CLIENT) f.match_field("source_name", "cip") f.match_field("material.elements", "Al") res1 = f.search() res2 = f.match_field("source_name", "cip").match_field("material.elements", "Al").search() assert all([r in res2 for r in res1]) and all([r in res1 for r in res2])