def test_nested_delete(): schema = fields.Schema(kind=fields.ID, name=fields.KEYWORD(scorable=True, stored=True)) ix = RamStorage().create_index(schema) with ix.writer() as w: with w.group(): w.add_document(kind=u("class"), name=u("Index")) w.add_document(kind=u("method"), name=u("add document")) w.add_document(kind=u("method"), name=u("add reader")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Accumulator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("get result")) with w.group(): w.add_document(kind=u("class"), name=u("Calculator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("add all")) w.add_document(kind=u("method"), name=u("add some")) w.add_document(kind=u("method"), name=u("multiply")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Deleter")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("delete")) # Delete "Accumulator" class with ix.writer() as w: q = query.NestedParent(query.Term("kind", "class"), query.Term("name", "Accumulator")) w.delete_by_query(q) # Check that Accumulator AND ITS METHODS are deleted with ix.searcher() as s: r = s.search(query.Term("kind", "class")) assert sorted(hit["name"] for hit in r) == ["Calculator", "Deleter", "Index"] names = [fs["name"] for _, fs in s.iter_docs()] assert names == [ "Index", "add document", "add reader", "close", "Calculator", "add", "add all", "add some", "multiply", "close", "Deleter", "add", "delete" ] # Delete any class with a close method with ix.writer() as w: q = query.NestedParent(query.Term("kind", "class"), query.Term("name", "close")) w.delete_by_query(q) # Check the CLASSES AND METHODS are gone with ix.searcher() as s: names = [fs["name"] for _, fs in s.iter_docs()] assert names == ["Deleter", "add", "delete"]
def test_nested_parent(): schema = fields.Schema(name=fields.ID(stored=True), type=fields.ID, part=fields.ID, price=fields.NUMERIC) ix = RamStorage().create_index(schema) with ix.writer() as w: with w.group(): w.add_document(name=u("iPad"), type=u("product")) w.add_document(part=u("screen"), price=100) w.add_document(part=u("battery"), price=50) w.add_document(part=u("case"), price=20) with w.group(): w.add_document(name=u("iPhone"), type=u("product")) w.add_document(part=u("screen"), price=60) w.add_document(part=u("battery"), price=30) w.add_document(part=u("case"), price=10) with w.group(): w.add_document(name=u("Mac mini"), type=u("product")) w.add_document(part=u("hard drive"), price=50) w.add_document(part=u("case"), price=50) with ix.searcher() as s: price = s.schema["price"] pq = query.Term("type", "product") cq = query.Term("price", 50) q = query.NestedParent(pq, cq) r = s.search(q) assert sorted([hit["name"] for hit in r]) == ["Mac mini", "iPad"]
def test_scoring(): schema = fields.Schema(kind=fields.ID, name=fields.KEYWORD(scorable=True, stored=True)) ix = RamStorage().create_index(schema) with ix.writer() as w: with w.group(): w.add_document(kind=u("class"), name=u("Index")) w.add_document(kind=u("method"), name=u("add document")) w.add_document(kind=u("method"), name=u("add reader")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Accumulator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("get result")) with w.group(): w.add_document(kind=u("class"), name=u("Calculator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("add all")) w.add_document(kind=u("method"), name=u("add some")) w.add_document(kind=u("method"), name=u("multiply")) w.add_document(kind=u("method"), name=u("close")) with ix.searcher() as s: q = query.NestedParent(query.Term("kind", "class"), query.Term("name", "add")) r = s.search(q) assert [hit["name"] for hit in r] == ["Calculator", "Index", "Accumulator"]
def test_no_parents(): schema = fields.Schema(id=fields.STORED, kind=fields.ID, name=fields.ID(stored=True)) k = u("alfa") ix = RamStorage().create_index(schema) with ix.writer() as w: w.add_document(id=0, kind=k, name=u("one")) w.add_document(id=1, kind=k, name=u("two")) w.add_document(id=2, kind=k, name=u("three")) w.add_document(id=3, kind=k, name=u("four")) w.add_document(id=4, kind=k, name=u("one")) w.add_document(id=5, kind=k, name=u("two")) w.add_document(id=6, kind=k, name=u("three")) w.add_document(id=7, kind=k, name=u("four")) w.add_document(id=8, kind=k, name=u("one")) w.add_document(id=9, kind=k, name=u("two")) w.add_document(id=10, kind=k, name=u("three")) w.add_document(id=11, kind=k, name=u("four")) with ix.searcher() as s: pq = query.Term("kind", "bravo") cq = query.Or([query.Term("name", "two"), query.Term("name", "four")]) q = query.NestedParent(pq, cq) r = s.search(q) assert r.is_empty()
def test_everything_is_a_parent(): schema = fields.Schema(id=fields.STORED, kind=fields.ID, name=fields.ID(stored=True)) k = u("alfa") ix = RamStorage().create_index(schema) with ix.writer() as w: w.add_document(id=0, kind=k, name=u("one")) w.add_document(id=1, kind=k, name=u("two")) w.add_document(id=2, kind=k, name=u("three")) w.add_document(id=3, kind=k, name=u("four")) w.add_document(id=4, kind=k, name=u("one")) w.add_document(id=5, kind=k, name=u("two")) w.add_document(id=6, kind=k, name=u("three")) w.add_document(id=7, kind=k, name=u("four")) w.add_document(id=8, kind=k, name=u("one")) w.add_document(id=9, kind=k, name=u("two")) w.add_document(id=10, kind=k, name=u("three")) w.add_document(id=11, kind=k, name=u("four")) with ix.searcher() as s: pq = query.Term("kind", k) cq = query.Or([query.Term("name", "two"), query.Term("name", "four")]) q = query.NestedParent(pq, cq) r = s.search(q) assert [hit["id"] for hit in r] == [1, 3, 5, 7, 9, 11]
def test_missing(): schema = fields.Schema(kind=fields.ID, name=fields.KEYWORD(scorable=True, stored=True)) ix = RamStorage().create_index(schema) with ix.writer() as w: with w.group(): w.add_document(kind=u("class"), name=u("Index")) w.add_document(kind=u("method"), name=u("add document")) w.add_document(kind=u("method"), name=u("add reader")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Accumulator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("get result")) with w.group(): w.add_document(kind=u("class"), name=u("Calculator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("add all")) w.add_document(kind=u("method"), name=u("add some")) w.add_document(kind=u("method"), name=u("multiply")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Deleter")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("delete")) with ix.searcher() as s: q = query.NestedParent(query.Term("kind", "class"), query.Term("name", "add")) r = s.search(q) assert_equal([hit["name"] for hit in r], ["Calculator", "Index", "Accumulator", "Deleter"]) with ix.writer() as w: w.delete_by_term("name", "Accumulator") w.delete_by_term("name", "Calculator") with ix.searcher() as s: pq = query.Term("kind", "class") assert_equal(len(list(pq.docs(s))), 2) q = query.NestedParent(pq, query.Term("name", "add")) r = s.search(q) assert_equal([hit["name"] for hit in r], ["Index", "Deleter"])
def test_parent_score_fn(): from whoosh.scoring import Frequency schema = fields.Schema(name=fields.ID(unique=True, stored=True), keys=fields.TEXT, type=fields.ID) with TempIndex(schema) as ix: with ix.writer() as w: w.add_document(name=u"p1", type=u"parent") w.add_document(name=u"c1.1", type=u"child", keys=u"key key") w.add_document(name=u"c1.2", type=u"child", keys=u"key key key") w.add_document(name=u"c1.3", type=u"child", keys=u"key key") w.add_document(name=u"p2", type=u"parent") w.add_document(name=u"c2.1", type=u"child", keys=u"") w.add_document(name=u"c2.2", type=u"child", keys=u"key key key key") w.add_document(name=u"c2.3", type=u"child", keys=u"key") with ix.searcher(weighting=Frequency()) as s: parents = query.Term("type", u"parent") children = query.Term("keys", u"key") q = query.NestedParent(parents, children, score_fn=max) print(list(q.docs(s))) r = s.search(q) assert r.scored_length() == 2 assert r[0]["name"] == u"p2" assert r[0].score == 4 assert r[1]["name"] == u"p1" assert r[1].score == 3 q = query.NestedParent(parents, children, score_fn=min) r = s.search(q) assert r.scored_length() == 2 assert r[0]["name"] == u"p1" assert r[0].score == 2 assert r[1]["name"] == u"p2" assert r[1].score == 1
def test_all_parents_deleted(): schema = fields.Schema(kind=fields.ID, name=fields.KEYWORD(scorable=True, stored=True)) ix = RamStorage().create_index(schema) with ix.writer() as w: with w.group(): w.add_document(kind=u("class"), name=u("Index")) w.add_document(kind=u("method"), name=u("add document")) w.add_document(kind=u("method"), name=u("add reader")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Accumulator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("get result")) with w.group(): w.add_document(kind=u("class"), name=u("Calculator")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("add all")) w.add_document(kind=u("method"), name=u("add some")) w.add_document(kind=u("method"), name=u("multiply")) w.add_document(kind=u("method"), name=u("close")) with w.group(): w.add_document(kind=u("class"), name=u("Deleter")) w.add_document(kind=u("method"), name=u("add")) w.add_document(kind=u("method"), name=u("delete")) with ix.writer() as w: w.delete_by_term("name", "Index") w.delete_by_term("name", "Accumulator") w.delete_by_term("name", "Calculator") w.delete_by_term("name", "Deleter") with ix.searcher() as s: q = query.NestedParent(query.Term("kind", "class"), query.Term("name", "add")) r = s.search(q) assert r.is_empty()