| 38 | transformer = None) |
| 39 | |
| 40 | def get_suggestions(self, query_string): |
| 41 | suggest_type = 'entities' |
| 42 | if query_string == '': |
| 43 | return ENTITY_TYPES, suggest_type |
| 44 | try: |
| 45 | result = self.parser.parse(query_string) |
| 46 | # If the query is correct we try the interactive parser to see next possible tokens of valid query. |
| 47 | interactive = self.parser.parse_interactive(query_string) |
| 48 | interactive.exhaust_lexer() |
| 49 | suggestions = [x for x in interactive.accepts() if x != '$END'] |
| 50 | suggest_type = 'boolean_operator' |
| 51 | return suggestions, suggest_type |
| 52 | except UnexpectedCharacters as chars_exception: |
| 53 | if type(chars_exception) == UnexpectedCharacters: |
| 54 | if chars_exception.char == '.': |
| 55 | last_token = chars_exception.state.value_stack[len(chars_exception.state.value_stack) - 1] |
| 56 | suggestions = [] |
| 57 | num_nested = len(last_token.value.split('.')) |
| 58 | if last_token.type == 'COMPARE_OP': |
| 59 | suggestions.append('$number') |
| 60 | suggestions.append('$text') |
| 61 | suggest_type = 'text' |
| 62 | return suggestions, suggest_type |
| 63 | if num_nested == 1: |
| 64 | if last_token.value in ['label', 'labels']: |
| 65 | # Show available labels in project. |
| 66 | labels = self.project.get_label_list(self.session, |
| 67 | directory = self.project.directory_default) |
| 68 | for label in labels: |
| 69 | suggestions.append(label['label']['name']) |
| 70 | suggest_type = 'labels' |
| 71 | elif last_token.value in ['file', 'files']: |
| 72 | # TODO: add metadata suggestions |
| 73 | keys = File.get_metadata_keys(session = self.session, |
| 74 | project = self.project, |
| 75 | directory = self.directory) |
| 76 | suggestions = keys |
| 77 | suggest_type = 'labels' |
| 78 | elif last_token.value in ['instance', 'instances']: |
| 79 | suggestions = ['type', 'count', 'tag', 'model', 'model_run'] |
| 80 | suggest_type = 'instance_data' |
| 81 | elif last_token.value in ['issues', 'issue']: |
| 82 | suggestions = ['status', 'count'] |
| 83 | suggest_type = 'issues_data' |
| 84 | elif num_nested == 2: |
| 85 | entity = last_token.value.split('.')[0] |
| 86 | if entity in ['label', 'labels']: |
| 87 | suggestions.append('$operator') |
| 88 | suggest_type = 'operator' |
| 89 | return suggestions, suggest_type |
| 90 | else: |
| 91 | print('NOT ENDING IN .') |
| 92 | return [], None |
| 93 | except UnexpectedToken as token_exception: |
| 94 | suggestions = [] |
| 95 | token_type = [t for t in token_exception.accepts] |
| 96 | if 'COMPARE_OP' in token_type: |
| 97 | suggestions.append('$operator') |