def test_can_clone_pypher_and_follow_different_paths(self): p = Pypher() p.one.two.three.four c = p.clone() p.xx.yy.zz.node('zzz11122') c.a.b.c.d before = str(p) after = str(c) self.assertTrue(before != after)
def test_can_clone_shallow_pypher(self): p = Pypher() p.a.b.c.d c = p.clone() x = str(p) y = str(c) self.assertEqual(x, y) self.assertEqual(len(p.bound_params), len(c.bound_params)) self.assertTrue(id(p.bound_params) == id(c.bound_params))
def test_can_clone_nested_pypher(self): p = Pypher() d = Pypher() e = Pypher() e.CAND(1, 2, 3, 4, 5, __.test.this.out.CONDITIONAL(9, 9, 8, __.node(6))) d.id(123).raw(e) p.a.b.c.d.node(d == 122) c = p.clone() x = str(p) y = str(c) self.assertEqual(x, y) self.assertEqual(len(p.bound_params), len(c.bound_params)) self.assertTrue(id(p.bound_params) == id(c.bound_params))
def get_by_search_string(self, search_string, ensure_privacy=True, limit=options.pagination, skip=0): """based on a search string of: pyhon #code @mark build a query with the foundation of: MATCH (tag_resource:`Resource`)-[:`HasTag`]->(tag:`Tag`) WHERE tag.tag_normalized = 'code' WITH tag_resource MATCH (user_resource:`Resource`)<-[:`AddedResource`]-(user:`User`) WHERE id(user_resource) = id(tag_resource) WITH user_resource, user MATCH (resource:`Resource`)-[:`HasTag`]->(tag:`Tag`) id(resource) = id(user_resource) RETURN resource, user, collect(tag) """ from datcode.common.model.graph.node import User search = parse_search_string(search_string) user_mapper = self.get_mapper(User) user_mapper.ensure_privacy = ensure_privacy p = Pypher() p.node('resource', labels='Resource') p.rel_in(labels='AddedResource').node('user', labels='User') p2 = Pypher() p2.node('resource').rel_out(labels='HasTag').node('tag', labels='Tag') p2 = Pypher() p2.node('resource').rel_out(labels='HasTag').node('tag', labels='Tag') p3 = Pypher() p3.node('resource').rel_out(labels='HasTag').node('tags', labels='Tag') query = Pypher() query.MATCH(p, p2, p3) wheres = [] search_ors = [] user_ors = [] tag_ors = [] # filter the resource title and descripiton by search string powersets for contains in search['search']['contains']: term = "(?i).*{}.*".format(contains) d = Pypher() t = Pypher() d.resource.__description__.re(term) t.resource.__title__.re(term) search_ors.append(d) search_ors.append(t) if search_ors: ors = Pypher() ors.COR(*search_ors) wheres.append(ors) # filter by users for user in search['users']: u = Pypher() u.user.__username__ == user user_ors.append(u) if user_ors: ors = Pypher() ors.COR(*user_ors) wheres.append(ors) # filter by tags for tag in search['tags']: u = Pypher() u.tag.__tag_normalized__ == normalize(tag) tag_ors.append(u) if tag_ors: ors = Pypher() ors.COR(*tag_ors) wheres.append(ors) if wheres: query.WHERE.CAND(*wheres) # paginate and get a total count total = query.clone() total.RETURN('COUNT(DISTINCT(resource)) AS total') total_res = self.mapper.query(pypher=total) try: total_results = total_res.first()['result'] except: total_results = 0 query.RETURN('DISTINCT(resource)', 'user') query.ORDERBY('resource.date_created').DESC query.SKIP(skip).LIMIT(limit) results = self.mapper.query(pypher=query) result_data = [] all_tags = [] all_tag_ids = [] for res in results: tags = self(res['resource'])['Tags']() username = res['user']['username'] if ensure_privacy: username = '******' result_data.append({ 'resource': self.data(res['resource']), 'user': { 'username': username, }, 'tags': self.data(tags), }) for tag in tags: if tag.id not in all_tag_ids: all_tags.append(tag.data) all_tag_ids.append(tag.id) return { 'total': total_results, 'results': result_data, 'all_tags': all_tags, }