Responsible for creating a DiffgramQuery based on the defined syntax.
| 16 | |
| 17 | |
| 18 | class QueryCreator: |
| 19 | """ |
| 20 | Responsible for creating a DiffgramQuery based on the defined syntax. |
| 21 | """ |
| 22 | |
| 23 | def __init__(self, session, project, member, directory = None): |
| 24 | self.project = project |
| 25 | self.session = session |
| 26 | self.member = member |
| 27 | self.directory = directory |
| 28 | # Additional security check just for sanity |
| 29 | Project_permissions.by_project_core( |
| 30 | project_string_id = self.project.project_string_id, |
| 31 | Roles = ["admin", "Editor", "Viewer", "allow_if_project_is_public"], |
| 32 | apis_project_list = [], |
| 33 | apis_user_list = ['security_email_verified'] |
| 34 | ) |
| 35 | self.log = regular_log.default() |
| 36 | self.parser = Lark(grammar_definition, |
| 37 | parser = 'lalr', |
| 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) |
no outgoing calls