def _search(self): error = None query = self._input.text() if len(query.split()) == 1 and all(o not in query.strip() for o in '=<>'): objectid = query.strip() try: entries = [self.store.get(objectid)] except KeyError: error = _("objectid '{oid}' not found", oid=objectid) else: try: conditions = parse_expression(query) except tdparser.Error as e: error = e.args[0] else: conditions = self._alter_search_conditions(conditions) entries = self.store.query(conditions, limit=self.MAX_RESULTS) self._result_tree.clear() if error is not None: w = QtWidgets.QTreeWidgetItem([error]) w.setForeground(0, QtGui.QColor(255, 0, 0)) self._result_tree.addTopLevelItem(w) self._result_tree.setFirstItemColumnSpanned(w, True) else: for i, entry in enumerate(entries): file_item = FileItem(entry) f = file_item.font(0) f.setBold(True) file_item.setFont(0, f) self._result_tree.addTopLevelItem(file_item) self._result_tree.setFirstItemColumnSpanned(file_item, True) for k, v in entry.metadata.items(): file_item.addChild(MetadataItem(entry, k, v)) if i + 1 == self.MAX_RESULTS: last_item = QtWidgets.QTreeWidgetItem([ _("... stripped after {nb} results...", nb=self.MAX_RESULTS) ]) f = last_item.font(0) f.setBold(True) f.setItalic(True) last_item.setFont(0, f) self._result_tree.addTopLevelItem(last_item) self._result_tree.setFirstItemColumnSpanned( last_item, True) break if self._result_tree.topLevelItemCount() == 0: w = QtWidgets.QTreeWidgetItem([_("No matches")]) self._result_tree.addTopLevelItem(w) self._result_tree.setFirstItemColumnSpanned(w, True) self._result_tree.expandAll() self._set_needs_refresh(False)
def _search(self): error = None query = self._input.text() if len(query.split()) == 1 and all(o not in query.strip() for o in '=<>'): objectid = query.strip() try: entries = [self.store.get(objectid)] except KeyError: error = _("objectid '{oid}' not found", oid=objectid) else: try: conditions = parse_expression(query) except tdparser.Error as e: error = e.args[0] else: conditions = self._alter_search_conditions(conditions) entries = self.store.query(conditions, limit=self.MAX_RESULTS) self._result_tree.clear() if error is not None: w = QtWidgets.QTreeWidgetItem([error]) w.setForeground(0, QtGui.QColor(255, 0, 0)) self._result_tree.addTopLevelItem(w) self._result_tree.setFirstItemColumnSpanned(w, True) else: for i, entry in enumerate(entries): file_item = FileItem(entry) f = file_item.font(0) f.setBold(True) file_item.setFont(0, f) self._result_tree.addTopLevelItem(file_item) self._result_tree.setFirstItemColumnSpanned(file_item, True) for k, v in entry.metadata.items(): file_item.addChild(MetadataItem(entry, k, v)) if i + 1 == self.MAX_RESULTS: last_item = QtWidgets.QTreeWidgetItem( [_("... stripped after {nb} results...", nb=self.MAX_RESULTS)]) f = last_item.font(0) f.setBold(True) f.setItalic(True) last_item.setFont(0, f) self._result_tree.addTopLevelItem(last_item) self._result_tree.setFirstItemColumnSpanned(last_item, True) break if self._result_tree.topLevelItemCount() == 0: w = QtWidgets.QTreeWidgetItem([_("No matches")]) self._result_tree.addTopLevelItem(w) self._result_tree.setFirstItemColumnSpanned(w, True) self._result_tree.expandAll() self._set_needs_refresh(False)
def test_strings(self): self.assertEqual(parse_expression(r'key1="some string"'), {'key1': {'type': 'str', 'equal': "some string"}}) self.assertEqual(parse_expression(r'key1="some \"string\""'), {'key1': {'type': 'str', 'equal': 'some "string"'}}) with self.assertRaises(tdparser.LexerError): parse_expression(r'key1="some \"string') with self.assertRaises(tdparser.LexerError): parse_expression(r'key1="some \"string\"') with self.assertRaises(tdparser.LexerError): self.assertEqual(parse_expression(r'key1="'), None)
def test_multi(self): self.assertEqual(parse_expression('key1=-12 key2 = "4 2" ' 'key3:int 41< key4'), {'key1': {'type': 'int', 'equal': -12}, 'key2': {'type': 'str', 'equal': '4 2'}, 'key3': {'type': 'int'}, 'key4': {'type': 'int', 'gt': 41}}) self.assertEqual(parse_expression('key1>2 key1<4 '), {'key1': {'type': 'int', 'gt': 2, 'lt': 4}}) with self.assertRaises(tdparser.ParserError): parse_expression('key1="str" key1<2') with self.assertRaises(tdparser.ParserError): parse_expression('key1="str" key1="otherstr"')
def test_single(self): self.assertEqual(parse_expression('key1=-12'), {'key1': {'type': 'int', 'equal': -12}}) self.assertEqual(parse_expression('key2 = "41"'), {'key2': {'type': 'str', 'equal': '41'}}) self.assertEqual(parse_expression('key3:int'), {'key3': {'type': 'int'}}) self.assertEqual(parse_expression('41 < key4'), {'key4': {'type': 'int', 'gt': 41}}) with self.assertRaises(tdparser.MissingTokensError): parse_expression('key4=') self.assertEqual(parse_expression('key5 >0'), {'key5': {'type': 'int', 'gt': 0}}) with self.assertRaises(tdparser.LexerError): parse_expression('key6!"somethg') with self.assertRaises(tdparser.ParserError): parse_expression('"foo" = "bar"') with self.assertRaises(tdparser.ParserError): parse_expression('key7 = key8') with self.assertRaises(tdparser.ParserError): parse_expression('"value"')
def __init__(self, text): self.query = text self.conditions = parse_expression(text)