def getLiftOpsV2(self, prop, valu, cmpr='='): if valu is None: iops = (('pref', b'\x00'),) return ( ('indx', ('byprop', prop.pref, iops)), ) if cmpr == '=': norm, info = self.norm(valu) iops = ( ('eq', b'\x00' + s_common.buid(norm)), ) return ( ('indx', ('byprop', prop.pref, iops)), ) if cmpr == 'contains=': norm, info = self.arraytype.norm(valu) byts = self.arraytype.indx(norm) iops = ( ('eq', b'\x01' + self.arraytype.indx(norm)), ) return ( ('indx', ('byprop', prop.pref, iops)), ) # TODO we *could* retrieve and munge the iops from arraytype... mesg = f'Array type has no lift by: {cmpr}.' raise s_exc.NoSuchCmpr(mesg=mesg)
def getCondEval(self, runt): name = self.kids[0].value() cmpr = self.kids[1].value() ival = runt.snap.model.type('ival') cmprctor = ival.getCmprCtor(cmpr) if cmprctor is None: raise s_exc.NoSuchCmpr(cmpr=cmpr, name=ival.name) if isinstance(self.kids[2], Const): valu = self.kids[2].value() cmpr = cmprctor(valu) async def cond(node, path): return cmpr(node.tags.get(name)) return cond # it's a runtime value... async def cond(node, path): valu = await self.kids[2].compute(path) return cmprctor(valu)(node.tags.get(name)) return cond
def getStorCmprs(self, cmpr, valu): func = self.storlifts.get(cmpr) if func is None: mesg = f'Type ({self.name}) has no cmpr: "{cmpr}".' raise s_exc.NoSuchCmpr(mesg=mesg) return func(cmpr, valu)
def cmpr(self, val1, name, val2): ''' Compare the two values using the given type specific comparator. ''' ctor = self.getCmprCtor(name) if ctor is None: raise s_exc.NoSuchCmpr(cmpr=name, name=self.name) norm1 = self.norm(val1)[0] norm2 = self.norm(val2)[0] return ctor(norm2)(norm1)
def getIndxOps(self, valu, cmpr='='): ''' Return a list of index operation tuples to lift values in a table. Valid index operations include: ('eq', <indx>) ('pref', <indx>) ('range', (<minindx>, <maxindx>)) ''' func = self.indxcmpr.get(cmpr) if func is None: raise s_exc.NoSuchCmpr(name=self.name, cmpr=cmpr) return func(valu)
def getCondEval(self, runt): if len(self.kids) == 3: cmpr = self.kids[1].value() ctor = self.funcs.get(cmpr) if ctor is None: raise s_exc.NoSuchCmpr(cmpr=cmpr, type='subquery') return ctor(runt) subq = self.kids[0] async def cond(node, path): genr = agenrofone((node, path)) async for _ in subq.run(runt, genr): return True return False return cond
def getCondEval(self, runt): name = self.kids[0].value() cmpr = self.kids[1].value() prop = runt.snap.model.props.get(name) if prop is None: raise s_exc.NoSuchProp(name=name) ctor = prop.type.getCmprCtor(cmpr) if ctor is None: raise s_exc.NoSuchCmpr(cmpr=cmpr, name=prop.type.name) if prop.isform: async def cond(node, path): if node.ndef[0] != name: return False val1 = node.ndef[1] val2 = await self.kids[2].compute(path) return ctor(val2)(val1) return cond async def cond(node, path): val1 = node.get(prop.name) if val1 is None: return False val2 = await self.kids[2].compute(path) return ctor(val2)(val1) return cond