Esempio n. 1
0
    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)
Esempio n. 2
0
    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
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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
Esempio n. 7
0
    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