diff --git a/goblin/session.py b/goblin/session.py index dd2e54a0dffffead97fcb777689000b234c79c80..0cb286ecdf3713a9e414429ed7c8208978f92590 100644 --- a/goblin/session.py +++ b/goblin/session.py @@ -189,13 +189,11 @@ class Session: hashable_id = self._get_hashable_id(obj.id) current = self.current.get(hashable_id, None) if isinstance(obj, Vertex): - props = await self._g.V(obj.id).valueMap(True).next() + # why doesn't this come in on the vertex? + label = await self._g.V(obj.id).label().next() if not current: - current = self.app.vertices.get( - props.get('label'), GenericVertex)() - props = await self._get_vertex_properties(current, props) - else: - props = await self._get_vertex_properties(current, props) + current = self.app.vertices.get(label, GenericVertex)() + props = await self._get_vertex_properties(obj.id, label) if isinstance(obj, Edge): props = await self._g.E(obj.id).valueMap(True).next() if not current: @@ -218,21 +216,26 @@ class Session: else: return result - async def _get_vertex_properties(self, element, props): - new_props = {} - for key, val in props.items(): - if key in element.__mapping__.db_properties: - key, _ = element.__mapping__.db_properties[key] - if isinstance(element.__properties__.get(key), VertexProperty): - trav = self._g.V( - props['id']).properties(key).valueMap(True) - vert_prop = await trav.toList() - new_props[key] = vert_prop - else: - new_props[key] = val - print("id", props['id']) - # new_props = await self._g.V(props['id']).properties().project('id', 'key', 'value', 'meta').by(__.id()).by(__.key()).by(__.value()).by(__.valueMap()).toList() - print(new_props) + async def _get_vertex_properties(self, vid, label): + projection = self._g.V(vid).properties() \ + .project('id', 'key', 'value', 'meta') \ + .by(__.id()).by(__.key()).by(__.value()) \ + .by(__.valueMap()) + props = await projection.toList() + new_props = {'label': label, 'id': vid} + for prop in props: + key = prop['key'] + val = prop['value'] + # print('val_type', type(val)) + meta = prop['meta'] + new_props.setdefault(key, []) + if meta: + meta['key'] = key + meta['value'] = val + meta['id'] = prop['id'] + val = meta + + new_props[key].append(val) return new_props # Creation API @@ -396,12 +399,14 @@ class Session: return await self._update_edge_properties(edge, traversal, props) # *metodos especiales privados for creation API + async def _simple_traversal(self, traversal, element): elem = await traversal.next() if elem: if element.__type__ == 'vertex': - props = await self._g.V(elem.id).valueMap(True).next() - props = await self._get_vertex_properties(element, props) + # Look into this + label = await self._g.V(elem.id).label().next() + props = await self._get_vertex_properties(elem.id, label) elif element.__type__ == 'edge': props = await self._g.E(elem.id).valueMap(True).next() elem = element.__mapping__.mapper_func( @@ -488,17 +493,17 @@ class Session: # Make sure to get vp ids here. for key, val in metaprops.items(): if val: - # prop_name = vertex.__mapping__.db_properties[db_name][0] - # vp = vertex.__properties__[prop_name] - # # Select and add by id here if possible - # if vp.cardinality == Cardinality.single: - # traversal = self._g.V(Binding('vid', result.id)).properties( - # db_name).property(key, val) - # else: - # traversal = self._g.V(Binding('vid', result.id)).properties( - # db_name).hasValue(value).property(key, val) - # await traversal.iterate() - pass + prop_name = vertex.__mapping__.db_properties[db_name][0] + vp = vertex.__properties__[prop_name] + # Select and add by id here if possible + if vp.cardinality == Cardinality.single: + traversal = self._g.V(Binding('vid', result.id)).properties( + db_name).property(key, val) + else: + traversal = self._g.V(Binding('vid', result.id)).properties( + db_name).hasValue(value).property(key, val) + await traversal.iterate() + # pass else: potential_removals.append((db_name, key, value)) return potential_removals diff --git a/tests/test_vertex_properties_functional.py b/tests/test_vertex_properties_functional.py index 6f09ea261dd1b454aef3f38d7c7aee54372d8a9f..d78060c9264a6fdf1188002296820582be46108b 100644 --- a/tests/test_vertex_properties_functional.py +++ b/tests/test_vertex_properties_functional.py @@ -86,30 +86,35 @@ async def test_add_update_set_card_property(app, place): @pytest.mark.asyncio async def test_metas(app, place, remote_connection): g = Graph().traversal().withRemote(remote_connection) - # Property API - v = await g.addV('person').property('name', 'dave').next() - props = await g.V(v.id).properties().toList() - meta = await g.V(v.id).properties('name').property('nickname', 'davebshow').next() - nickname = await g.V(v.id).properties('name').valueMap(True).next() - # List card - v2 = await g.addV('person').property(Cardinality.list_, 'name', 'dave').property(Cardinality.list_, 'name', 'dave brown').next() - props2 = await g.V(v2.id).properties().toList() - meta2 = await g.V(v2.id).properties('name').hasValue('dave').property('nickname', 'davebshow').next() - nickname2 = await g.V(v2.id).properties('name').valueMap(True).next() - session = await app.session() place.zipcode = 98402 place.historical_name = ['Detroit'] place.historical_name('Detroit').notes = 'rock city' place.historical_name('Detroit').year = 1900 + place.historical_name.append('Other') + place.historical_name[-1].notes = 'unknown' + place.historical_name[-1].year = 1700 detroit = await session.save(place) + dprops = await g.V(detroit.id).properties().toList() + assert len(dprops) == 3 trav = g.V(detroit.id).properties('historical_name').valueMap(True) - dmetas = await trav.next() - + dmetas = await trav.toList() + assert dmetas[0]['value'] == 'Detroit' + assert dmetas[0]['notes'] == 'rock city' + assert dmetas[0]['year'] == 1900 + assert dmetas[1]['value'] == 'Other' + assert dmetas[1]['notes'] == 'unknown' + assert dmetas[1]['year'] == 1700 new_session = await app.session() new_detroit = await new_session.g.V(detroit.id).next() - + assert new_detroit.zipcode == detroit.zipcode + assert new_detroit.historical_name[-1].value == detroit.historical_name[-1].value + assert new_detroit.historical_name[-1].notes == detroit.historical_name[-1].notes + assert new_detroit.historical_name[-1].year == detroit.historical_name[-1].year + assert new_detroit.historical_name[0].value == detroit.historical_name[0].value + assert new_detroit.historical_name[0].notes == detroit.historical_name[0].notes + assert new_detroit.historical_name[0].year == detroit.historical_name[0].year await remote_connection.close() await app.close()