diff options
Diffstat (limited to 'examples/elementtree/adjacency_list.py')
-rw-r--r-- | examples/elementtree/adjacency_list.py | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/examples/elementtree/adjacency_list.py b/examples/elementtree/adjacency_list.py index 0a5a922d0..cee73bffd 100644 --- a/examples/elementtree/adjacency_list.py +++ b/examples/elementtree/adjacency_list.py @@ -33,6 +33,7 @@ from sqlalchemy import MetaData from sqlalchemy import String from sqlalchemy import Table from sqlalchemy import Unicode +from sqlalchemy.orm import aliased from sqlalchemy.orm import lazyload from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship @@ -215,14 +216,20 @@ ElementTree.dump(document.element) # PART VI - Searching for Paths # manually search for a document which contains "/somefile/header/field1:hi" +root = aliased(_Node) +child_node = aliased(_Node) +grandchild_node = aliased(_Node) + d = ( session.query(Document) - .join("_root", aliased=True) - .filter(_Node.tag == "somefile") - .join("children", aliased=True, from_joinpoint=True) - .filter(_Node.tag == "header") - .join("children", aliased=True, from_joinpoint=True) - .filter(and_(_Node.tag == "field1", _Node.text == "hi")) + .join(Document._root.of_type(root)) + .filter(root.tag == "somefile") + .join(root.children.of_type(child_node)) + .filter(child_node.tag == "header") + .join(child_node.children.of_type(grandchild_node)) + .filter( + and_(grandchild_node.tag == "field1", grandchild_node.text == "hi") + ) .one() ) ElementTree.dump(d.element) @@ -232,31 +239,39 @@ ElementTree.dump(d.element) def find_document(path, compareto): query = session.query(Document) - attribute = "_root" + attribute = Document._root for i, match in enumerate( re.finditer(r"/([\w_]+)(?:\[@([\w_]+)(?:=(.*))?\])?", path) ): (token, attrname, attrvalue) = match.group(1, 2, 3) - query = query.join( - attribute, aliased=True, from_joinpoint=True - ).filter(_Node.tag == token) - attribute = "children" + target_node = aliased(_Node) + + query = query.join(attribute.of_type(target_node)).filter( + target_node.tag == token + ) + + attribute = target_node.children + if attrname: + attribute_entity = aliased(_Attribute) + if attrvalue: query = query.join( - "attributes", aliased=True, from_joinpoint=True + target_node.attributes.of_type(attribute_entity) ).filter( and_( - _Attribute.name == attrname, - _Attribute.value == attrvalue, + attribute_entity.name == attrname, + attribute_entity.value == attrvalue, ) ) else: query = query.join( - "attributes", aliased=True, from_joinpoint=True - ).filter(_Attribute.name == attrname) + target_node.attributes.of_type(attribute_entity) + ).filter(attribute_entity.name == attrname) return ( - query.options(lazyload("_root")).filter(_Node.text == compareto).all() + query.options(lazyload(Document._root)) + .filter(target_node.text == compareto) + .all() ) |