Exemple #1
0
    def _stormOperToTags(self, query, oper):
        opts = dict(oper[1].get('kwlist'))
        nodes = query.take()
        core = self.getStormCore()

        leaf = opts.get('leaf', True)
        limt = self.getLiftLimitHelp(opts.get('limit'))
        limtv = limt.get()

        if limtv and limtv < 0:
            raise s_common.BadOperArg(oper='totags', name='limit', mesg='limit must be >= 0')

        tags = list({tag for node in nodes for tag in s_tufo.tags(node, leaf=leaf)})

        [query.add(tufo) for tufo in core.getTufosBy('in', 'syn:tag', tags, limit=limtv)]
Exemple #2
0
        def _updateTagDarks(existing_tagforms, old, new):

            # create a set of all of the tags on all of the nodes of a given form
            tags = set()
            for tufo in self.core.getTufosByProp(old):
                tags.update(s_tufo.tags(tufo))

            # for each tag, update the dark tag row and form a tagform if it is missing
            for tag in tags:

                if tag not in existing_tagforms:
                    self.core.formTufoByProp('syn:tagform', (tag, new))
                    existing_tagforms.add(tag)

                olddark = '_:*%s#%s' % (old, tag)
                newdark = '_:*%s#%s' % (new, tag)
                self.core.store.updateProperty(olddark, newdark)
Exemple #3
0
    def _stormOperJoinTags(self, query, oper):

        args = oper[1].get('args', ())
        opts = dict(oper[1].get('kwlist'))
        core = self.getStormCore()

        forms = set(args)
        keep_nodes = opts.get('keep_nodes', False)

        limt = self.getLiftLimitHelp(opts.get('limit'))

        nodes = query.data()
        if not keep_nodes:
            query.clear()

        tags = {tag for node in nodes for tag in s_tufo.tags(node, leaf=True)}

        if not forms:

            for tag in tags:

                nodes = core.getTufosByTag(tag, limit=limt.get())

                limt.dec(len(nodes))
                [query.add(n) for n in nodes]

                if limt.reached():
                    break

            return

        for form in forms:

            if limt.reached():
                break

            for tag in tags:

                nodes = core.getTufosByTag(tag, form=form, limit=limt.get())

                limt.dec(len(nodes))
                [query.add(n) for n in nodes]

                if limt.reached():
                    break
Exemple #4
0
 def _check_tags(core, tufo, tags):
     self.eq(sorted(tags), sorted(s_tufo.tags(tufo)))
Exemple #5
0
 def alltags(node):
     tags = ['#' + t for t in sorted(s_tufo.tags(node, leaf=True))]
     return ' '.join(tags)
Exemple #6
0
 def _check_tags(core, tufo, tags):
     self.sorteq(tags, s_tufo.tags(tufo))
Exemple #7
0
    def runCmdOpts(self, opts):

        ques = opts.get('query')
        if ques is None:
            self.printf(self.__doc__)
            return

        if opts.get('props') and opts.get('raw'):
            self.printf('Cannot specify --raw and --props together.')
            return

        core = self.getCmdItem()
        resp = core.ask(ques)

        oplog = resp.get('oplog')

        # check for an error condition
        if oplog and oplog[-1].get('excinfo'):
            opts['debug'] = 1

        if opts.get('debug'):

            self.printf('oplog:')
            for opfo in resp.get('oplog'):
                mnem = opfo.get('mnem')
                took = opfo.get('took')
                self.printf('    %s (took:%d) %r' % (mnem, took, opfo))

            self.printf('')

            self.printf('options:')
            for name, valu in sorted(resp.get('options').items()):
                self.printf('    %s = %s' % (name, valu))

            self.printf('')

            self.printf('limits:')
            for name, valu in sorted(resp.get('limits').items()):
                self.printf('    %s = %s' % (name, valu))

            self.printf('')

        def nodevalu(t):
            return repr(t[1].get(t[1].get('tufo:form')))

        nodes = list(sorted(resp.get('data'), key=nodevalu))

        if len(nodes) == 0:
            self.printf('(0 results)')
            return

        forms = set([node[1].get('tufo:form') for node in nodes])

        fsize = max([len(f) for f in forms])

        # Short circuit any fancy formatting and dump the raw node content as json
        if opts.get('raw'):
            self.printf(json.dumps(nodes, sort_keys=True, indent=2))
            self.printf('(%d results)' % (len(nodes), ))
            return resp

        show = resp.get('show', {})
        cols = show.get('columns')

        if cols is not None:

            shlp = s_storm.ShowHelp(core, show)
            rows = shlp.rows(nodes)
            pads = shlp.pad(rows)

            for pad in pads:
                self.printf(' '.join(pad))

        else:

            for node in nodes:

                form = node[1].get('tufo:form')
                valu = node[1].get(form)

                leafs = set(s_tufo.tags(node, leaf=True))

                taglines = []
                for tag in sorted(s_tufo.tags(node)):

                    prop = '#' + tag
                    asof = node[1].get(prop)

                    ival = s_tufo.ival(node, prop)
                    if ival is None and tag not in leafs:
                        continue

                    mesg = '%s (added %s)' % (prop,
                                              core.getTypeRepr('time', asof))
                    if ival is not None:
                        mins = core.getTypeRepr('time', ival[0])
                        maxs = core.getTypeRepr('time', ival[1])
                        mesg += ' %s  -  %s' % (mins, maxs)

                    taglines.append(mesg)

                # FIXME local typelib and datamodel
                disp = core.getPropRepr(form, valu)

                self.printf('%s = %s' % (form.ljust(fsize), disp))
                for line in taglines:
                    self.printf('    %s' % (line, ))

                if opts.get('props'):
                    pref = form + ':'
                    flen = len(form)
                    for prop in sorted(
                        [k for k in node[1].keys() if k.startswith(pref)]):
                        valu = node[1].get(prop)
                        disp = core.getPropRepr(prop, valu)
                        self.printf('    %s = %s' % (prop[flen:], disp))

        self.printf('(%d results)' % (len(nodes), ))

        return resp