Beispiel #1
0
def test_query_search(capsys):
    # Error on no query
    q1 = forge.Query(query_search_client)
    assert q1.search() == []
    out, err = capsys.readouterr()
    assert "Error: No query" in out
    assert q1.search(info=True) == ([], {"error": "No query"})

    # Return info if requested
    q2 = forge.Query(query_search_client)
    res2 = q2.search(q="Al", info=False)
    assert isinstance(res2, list)
    assert isinstance(res2[0], dict)
    q3 = forge.Query(query_search_client)
    res3 = q3.search(q="Al", info=True)
    assert isinstance(res3, tuple)
    assert isinstance(res3[0], list)
    assert isinstance(res3[0][0], dict)
    assert isinstance(res3[1], dict)

    # Check limit
    q4 = forge.Query(query_search_client)
    res4 = q4.search("oqmd", limit=3)
    assert len(res4) == 3

    # Check limit correction
    q5 = forge.Query(query_search_client)
    res5 = q5.search("nist_xps_db", limit=20000)
    assert len(res5) == 10000
Beispiel #2
0
def test_query_field():
    q1 = forge.Query(query_search_client)
    # Single field and return value test
    assert isinstance(q1.field("mdf.source_name", "oqmd"), forge.Query)
    assert q1.query == "(mdf.source_name:oqmd"
    # Multi-field and grouping test
    q1.and_join(close_group=True).field("dc.title", "sample")
    assert q1.query == "(mdf.source_name:oqmd) AND (dc.title:sample"
    # Negation test
    q1.negate()
    assert q1.query == "(mdf.source_name:oqmd) AND (dc.title:sample NOT "
    # Explicit operator test
    # Makes invalid query for this case
    q1.operator("NOT")
    assert q1.query == "(mdf.source_name:oqmd) AND (dc.title:sample NOT  NOT "
    # Ensure advanced is set
    assert q1.advanced

    # Test noop on blanks
    q2 = forge.Query(query_search_client)
    assert q2.query == "("
    q2.field(field="", value="value")
    assert q2.query == "("
    q2.field(field="field", value="")
    assert q2.query == "("
    q2.field(field="", value="")
    assert q2.query == "("
    q2.field(field="field", value="value")
    assert q2.query == "(field:value"
Beispiel #3
0
def test_query_chaining():
    q1 = forge.Query(query_search_client)
    q1.field("source_name", "cip")
    q1.and_join()
    q1.field("elements", "Al")
    res1 = q1.search(limit=10000)
    res2 = forge.Query(query_search_client).field("source_name", "cip").and_join().field("elements", "Al").search(limit=10000)
    assert all([r in res2 for r in res1]) and all([r in res1 for r in res2])
Beispiel #4
0
def test_query_init():
    q1 = forge.Query(query_search_client)
    assert q1.query == "("
    assert q1.limit is None
    assert q1.advanced is False
    assert q1.initialized is False

    q2 = forge.Query(query_search_client,
                     q="mdf.source_name:oqmd",
                     limit=5,
                     advanced=True)
    assert q2.query == "mdf.source_name:oqmd"
    assert q2.limit == 5
    assert q2.advanced is True
    assert q2.initialized is True
Beispiel #5
0
def test_query_aggregate(capsys):
    q = forge.Query(query_search_client)
    # Error on no query
    assert q.aggregate() == []
    out, err = capsys.readouterr()
    assert "Error: No query" in out

    # Error on no index
    assert q.aggregate(q="abc") == []
    out, err = capsys.readouterr()
    assert "Error: No index specified" in out

    # Basic aggregation
    res1 = q.aggregate("mdf.source_name:nist_xps_db", index="mdf")
    assert len(res1) > 10000
    assert isinstance(res1[0], dict)

    # Multi-dataset aggregation
    res2 = q.aggregate(
        "(mdf.source_name:nist_xps_db OR mdf.source_name:nist_janaf)",
        index="mdf")
    assert len(res2) > 10000
    assert len(res2) > len(res1)

    # Unnecessary aggregation fallback to .search()
    # Check success in Coveralls
    assert len(q.aggregate("mdf.source_name:hopv")) < 10000
Beispiel #6
0
def test_query_aggregate(capsys):
    q1 = forge.Query(query_search_client)
    # Error on no query
    assert q1.aggregate() == []
    out, err = capsys.readouterr()
    assert "Error: No query" in out

    # Basic aggregation
    res1 = q1.aggregate("mdf.source_name:nist_xps_db")
    assert len(res1) > 10000
    assert isinstance(res1[0], dict)

    # Multi-dataset aggregation
    q2 = forge.Query(query_search_client)
    res2 = q2.aggregate(
        "(mdf.source_name:nist_xps_db OR mdf.source_name:nist_janaf)")
    assert len(res2) > 10000
    assert len(res2) > len(res1)
Beispiel #7
0
def test_query_field():
    q = forge.Query(query_search_client)
    # Single field and return value test
    assert type(q.field("mdf.source_name", "oqmd")) is forge.Query
    assert q.query == "(mdf.source_name:oqmd"
    # Multi-field and grouping test
    q.and_join(close_group=True).field("dc.title", "sample")
    assert q.query == "(mdf.source_name:oqmd) AND (dc.title:sample"
    # Ensure advanced is set
    assert q.advanced
Beispiel #8
0
def test_query_term():
    q = forge.Query(query_search_client)
    # Single match test
    assert type(q.term("term1")) is forge.Query
    assert q.query == "(term1"
    # Multi-match test
    q.and_join().term("term2")
    assert q.query == "(term1 AND term2"
    # Grouping test
    q.or_join(close_group=True).term("term3")
    assert q.query == "(term1 AND term2) OR (term3"
Beispiel #9
0
def test_query_term():
    q = forge.Query(query_search_client)
    # Single match test
    assert isinstance(q.term("term1"), forge.Query)
    assert q.query == "(term1"
    assert q.initialized is True
    # Multi-match test
    q.and_join().term("term2")
    assert q.query == "(term1 AND term2"
    # Grouping test
    q.or_join(close_group=True).term("term3")
    assert q.query == "(term1 AND term2) OR (term3"
Beispiel #10
0
def test_query_and_join(capsys):
    q = forge.Query(query_search_client)
    # Test not initialized
    assert q.and_join() == q
    out, err = capsys.readouterr()
    assert ("Error: You must add a term before adding an operator. "
            "The current query has not been changed.") in out
    # Regular join
    q.term("foo").and_join()
    assert q.query == "(foo AND "
    # close_group
    q.term("bar").and_join(close_group=True)
    assert q.query == "(foo AND bar) AND ("
Beispiel #11
0
def test_query_operator(capsys):
    q = forge.Query(query_search_client)
    assert q.query == "("
    # Add bad operator
    assert q.operator("FOO") == q
    out, err = capsys.readouterr()
    assert "Error: 'FOO' is not a valid operator" in out
    assert q.query == "("
    # Test operator cleaning
    q.operator("   and ")
    assert q.query == "( AND "
    # Test close_group
    q.operator("OR", close_group=True)
    assert q.query == "( AND ) OR ("
Beispiel #12
0
def test_query_search(capsys):
    # Error on no query
    q1 = forge.Query(query_search_client)
    assert q1.search() == []
    out, err = capsys.readouterr()
    assert "Error: No query specified" in out

    # Return info if requested
    q2 = forge.Query(query_search_client)
    res2 = q2.search(q="Al", info=False)
    assert type(res2) is list
    assert type(res2[0]) is dict
    q3 = forge.Query(query_search_client)
    res3 = q3.search(q="Al", info=True)
    assert type(res3) is tuple
    assert type(res3[0]) is list
    assert type(res3[0][0]) is dict
    assert type(res3[1]) is dict

    # Check limit
    q4 = forge.Query(query_search_client)
    res4 = q4.search("oqmd", limit=3)
    assert len(res4) == 3
Beispiel #13
0
def test_query_cleaning():
    # Imbalanced/improper parentheses
    q1 = forge.Query(query_search_client, q="() term ")
    assert q1.clean_query() == "term"
    q2 = forge.Query(query_search_client, q="(term)(")
    assert q2.clean_query() == "(term)"
    q3 = forge.Query(query_search_client, q="(term) AND (")
    assert q3.clean_query() == "(term)"
    q4 = forge.Query(query_search_client, q="(term AND term2")
    assert q4.clean_query() == "(term AND term2)"
    q5 = forge.Query(query_search_client, q="term AND term2)")
    assert q5.clean_query() == "(term AND term2)"
    q6 = forge.Query(query_search_client, q="((((term AND term2")
    assert q6.clean_query() == "((((term AND term2))))"
    q7 = forge.Query(query_search_client, q="term AND term2))))")
    assert q7.clean_query() == "((((term AND term2))))"

    # Correct trailing operators
    q8 = forge.Query(query_search_client, q="term AND NOT term2 OR")
    assert q8.clean_query() == "term AND NOT term2"
    q9 = forge.Query(query_search_client, q="term OR NOT term2 AND")
    assert q9.clean_query() == "term OR NOT term2"
    q10 = forge.Query(query_search_client, q="term OR term2 NOT")
    assert q10.clean_query() == "term OR term2"
Beispiel #14
0
def test_query_search(capsys):
    # Error on no query
    q = forge.Query(query_search_client)
    assert q.search(index="mdf") == []
    out, err = capsys.readouterr()
    assert "Error: No query" in out
    assert q.search(info=True) == ([], {"error": "No query"})

    # Error on no index
    assert q.search(q="abc") == []
    out, err = capsys.readouterr()
    assert "Error: No index specified" in out
    assert q.search(q="abc", info=True) == ([], {"error": "No index"})

    # Return info if requested
    res2 = q.search(q="Al", index="mdf", info=False)
    assert isinstance(res2, list)
    assert isinstance(res2[0], dict)
    res3 = q.search(q="Al", index="mdf", 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 = q.search("oqmd", index="mdf", limit=3)
    assert len(res4) == 3

    # Check limit correction
    res5 = q.search("nist_xps_db", index="mdf", limit=20000)
    assert len(res5) == 10000

    # Test index translation
    # mdf = d6cc98c3-ff53-4ee2-b22b-c6f945c0d30c
    res6 = q.search(q="data", index="mdf", limit=1, info=True)
    assert len(res6[0]) == 1
    assert res6[1]["index"] == "mdf"
    assert res6[1]["index_uuid"] == "d6cc98c3-ff53-4ee2-b22b-c6f945c0d30c"
    res7 = q.search(q="data",
                    index="d6cc98c3-ff53-4ee2-b22b-c6f945c0d30c",
                    limit=1,
                    info=True)
    assert len(res7[0]) == 1
    assert res7[1]["index"] == "d6cc98c3-ff53-4ee2-b22b-c6f945c0d30c"
    assert res7[1]["index_uuid"] == "d6cc98c3-ff53-4ee2-b22b-c6f945c0d30c"
    with pytest.raises(SearchAPIError):
        q.search(q="data", index="invalid", limit=1, info=True)
Beispiel #15
0
def test_query_aggregate():
    q = forge.Query(query_search_client)
    r = q.aggregate('mdf.source_name:oqmd AND '
                        '(oqmd.configuration:static OR oqmd.configuration:standard) '
                        'AND oqmd.converged:True AND oqmd.band_gap.value:>2')
    assert isinstance(r[0], dict)