File size: 3,542 Bytes
2b7b752
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from tkinter import *
from tkinter import ttk
from src.apps.dbapp.framebase import CustomFrameBase
from src.database.weavservice import WeaviateService

class QueryFrame(CustomFrameBase):
    def __init__(self, parent, service: WeaviateService) -> None:
        super().__init__(parent, service)

    def init(self) -> ttk.Frame:
        main_frame = ttk.Frame(self._parent)
        main_frame.pack(fill=BOTH, expand=True)

        input_frame = ttk.Frame(main_frame)
        input_frame.pack(fill=X, padx=10, pady=(5, 10))

        self.language_var = StringVar(value="de")

        self.filters_button = ttk.Button(input_frame, text="Filters...", command=self.open_filters)
        self.filters_button.pack(side=LEFT, padx=(0, 10))

        lang_frame = ttk.Frame(input_frame)  
        lang_frame.pack(side=LEFT, padx=(0, 15))

        ttk.Radiobutton(
            lang_frame,
            text="EN",
            variable=self.language_var,
            value="en"
        ).pack(side=LEFT, padx=(0, 8))

        ttk.Radiobutton(
            lang_frame,
            text="DE",
            variable=self.language_var,
            value="de"
        ).pack(side=LEFT)

        self.query_entry = ttk.Entry(input_frame)
        self.query_entry.pack(side=LEFT, fill=X, expand=True, padx=(0, 10))

        self.send_button = ttk.Button(input_frame, text="Send", command=self.send_query)
        self.send_button.pack(side=RIGHT)

        self.query_entry.bind("<Return>", lambda _: self.send_query())

        results_frame = ttk.Frame(main_frame)
        results_frame.pack(fill=BOTH, expand=True, padx=10, pady=(10, 5))

        self.results_text = Text(results_frame, wrap=WORD, font=("TkDefaultFont", 10))
        y_scrollbar = ttk.Scrollbar(results_frame, orient=VERTICAL, command=self.results_text.yview)
        self.results_text.configure(yscrollcommand=y_scrollbar.set)

        self.results_text.pack(side=LEFT, fill=BOTH, expand=True)
        y_scrollbar.pack(side=RIGHT, fill=Y)

        self.results_text.config(state=NORMAL)
        self.results_text.insert(END, "Enter your query below and click Send (or press Enter) to see results.\n")
        self.results_text.config(state=DISABLED)
 
        return main_frame


    def send_query(self):
        query_text = self.query_entry.get().strip()
        if not query_text:
            return

        self.query_entry.delete(0, END)

        try:
            response, _ = self._service.query(
                lang=self.language_var.get(),
                query=query_text,
            )
            result_str = ''.join([f"""
---------------------- Result {idx} ----------------------
SOURCE: {obj.properties['source']}
INSERTION DATE: {obj.properties['date']}
RELEVANT PROGRAMS: {', '.join(obj.properties['programs'])}

CONTENT: 
{obj.properties['body']}

VECTOR:
{obj.vector}
""" for idx, obj in enumerate(response.objects, start=1)])

            result_str = f"Query: {query_text}\n{result_str}"

            self.display_result(result_str)
        except Exception as e:
            self.display_result(f"Error:\n{str(e)}")


    def display_result(self, result_text: str):
        self.results_text.config(state=NORMAL)
        self.results_text.delete(1.0, END)
        self.results_text.insert(END, result_text + "\n")
        self.results_text.config(state=DISABLED)
        self.results_text.see(1.0)


    def open_filters(self):
        dialog = Toplevel(self._parent)
        dialog.title("Query Filters")
        dialog.geometry("400x300")
        dialog.grab_set()