async def setTagProp(self, tag, name, valu): ''' Set the value of the given tag property. ''' if not self.hasTag(tag): await self.addTag(tag) prop = self.snap.core.model.getTagProp(name) if prop is None: raise s_exc.NoSuchTagProp( mesg='Tag prop does not exist in this Cortex.', name=name) try: norm, info = prop.type.norm(valu) except Exception as e: mesg = f'Bad property value: #{tag}:{prop.name}={valu!r}' return await self.snap._raiseOnStrict(s_exc.BadTypeValu, mesg, name=prop.name, valu=valu, emesg=str(e)) edits = ((s_layer.EDIT_TAGPROP_SET, (tag, name, norm, None, prop.type.stortype), ()), ) await self.snap.applyNodeEdit((self.buid, self.form.name, edits)) props = self.tagprops.get(tag) if props is None: props = self.tagprops[tag] = {} props[name] = norm
async def nodesByTagProp(self, form, tag, name): prop = self.core.model.getTagProp(name) if prop is None: mesg = f'No tag property named {name}' raise s_exc.NoSuchTagProp(name=name, mesg=mesg) for layr in self.layers: genr = layr.liftByTagProp(form, tag, name) async for node in self._joinStorGenr(layr, genr): yield node
async def nodesByTagProp(self, form, tag, name): prop = self.core.model.getTagProp(name) if prop is None: mesg = f'No tag property named {name}' raise s_exc.NoSuchTagProp(name=name, mesg=mesg) async for (buid, sodes) in self.core._liftByTagProp(form, tag, name, self.layers): node = await self._joinSodes(buid, sodes) if node is not None: yield node
async def delTagProp(self, tag, name): prop = self.snap.core.model.getTagProp(name) if prop is None: raise s_exc.NoSuchTagProp(name=name) curv = self.tagprops.get((tag, name), s_common.novalu) if curv is s_common.novalu: return False edits = ((s_layer.EDIT_TAGPROP_DEL, (tag, name, None, prop.type.stortype), ()), ) await self.snap.applyNodeEdit((self.buid, self.form.name, edits))
async def nodesByTagPropValu(self, form, tag, name, cmpr, valu): prop = self.core.model.getTagProp(name) if prop is None: mesg = f'No tag property named {name}' raise s_exc.NoSuchTagProp(name=name, mesg=mesg) cmprvals = prop.type.getStorCmprs(cmpr, valu) # an empty return probably means ?= with invalid value if not cmprvals: return async for (buid, sodes) in self.core._liftByTagPropValu( form, tag, name, cmprvals, self.layers): node = await self._joinSodes(buid, sodes) if node is not None: yield node
async def nodesByTagPropValu(self, form, tag, name, cmpr, valu): prop = self.core.model.getTagProp(name) if prop is None: mesg = f'No tag property named {name}' raise s_exc.NoSuchTagProp(name=name, mesg=mesg) cmprvals = prop.type.getStorCmprs(cmpr, valu) # an empty return probably means ?= with invalid value if not cmprvals: return for layr in self.layers: genr = layr.liftByTagPropValu(form, tag, name, cmprvals) async for node in self._joinStorGenr(layr, genr): if node.bylayer['tagprops'].get((tag, prop.name)) != layr: continue yield node
async def _getNodesByTagProp(self, name, tag=None, form=None, valu=None, cmpr='='): prop = self.model.getTagProp(name) if prop is None: mesg = f'No tag property named {name}' raise s_exc.NoSuchTagProp(name=name, mesg=mesg) cmpf = prop.type.getLiftHintCmpr(valu, cmpr=cmpr) full = f'#{tag}:{name}' lops = (('tag:prop', {'form': form, 'tag': tag, 'prop': name}), ) if valu is not None: lops[0][1]['iops'] = prop.type.getIndxOps(valu, cmpr) async for row, node in self.getLiftNodes(lops, full, cmpf=cmpf): yield node
async def setTagProp(self, tag, name, valu): ''' Set the value of the given tag property. ''' if not self.hasTag(tag): await self.addTag(tag) prop = self.snap.model.getTagProp(name) if prop is None: raise s_exc.NoSuchTagProp(name=name) try: norm, info = prop.type.norm(valu) except Exception as e: mesg = f'Bad property value: #{tag}:{prop.name}={valu!r}' return await self.snap._raiseOnStrict(s_exc.BadPropValu, mesg, name=prop.name, valu=valu, emesg=str(e)) indx = prop.type.indx(norm) tagkey = (tag, name) curv = self.tagprops.get(tagkey) sops = (('tag:prop:set', (self.buid, self.form.name, tag, prop.name, norm, indx, {})), ) splices = (self.snap.splice('tag:prop:set', ndef=self.ndef, tag=tag, prop=prop.name, valu=norm, curv=curv), ) await self.snap.stor(sops, splices) self.tagprops[tagkey] = norm