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)]
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)
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
def _check_tags(core, tufo, tags): self.eq(sorted(tags), sorted(s_tufo.tags(tufo)))
def alltags(node): tags = ['#' + t for t in sorted(s_tufo.tags(node, leaf=True))] return ' '.join(tags)
def _check_tags(core, tufo, tags): self.sorteq(tags, s_tufo.tags(tufo))
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