source: orange/orange/OrangeWidgets/Prototypes/OWSQLSelect.py @ 6538:a5f65d7f0b2c

Revision 6538:a5f65d7f0b2c, 7.3 KB checked in by Mitar <Mitar@…>, 4 years ago (diff)

Made XPM version of the icon 32x32.

Line 
1"""
2<name>SQL Select</name>
3<description>Reads data from an SQL select statement.</description>
4<icon>icons/SQLSelect.png</icon>
5<contact>Gasper Fele-Zorz (polz(@at@)fri.uni-lj.si)</contact>
6<priority>10</priority>
7"""
8
9#
10# OWSQLSelect.py
11# Based on the file widget
12#
13
14from OWWidget import *
15
16import orngSQL
17import OWGUI, os.path
18
19class OWSubSQLSelect(OWWidget):
20    allSQLSelectWidgets = []
21    settingsList=["recentConnections", "lastQuery"]
22    def __init__(self, parent=None, signalManager = None, name = "SQLSelect"):
23        OWWidget.__init__(self, parent, signalManager, name)
24        OWSubSQLSelect.allSQLSelectWidgets.append(self)
25
26    def destroy(self, destroyWindow, destroySubWindows):
27        OWSubSQLSelect.allSQLSelectWidgets.remove(self)
28        OWWidget.destroy(self, destroyWindow, destroySubWindows)
29
30    def activateLoadedSettings(self):
31        # print "activating", self.recentQueries, ", ",self.recentConnections
32        self.query = self.lastQuery
33        self.setConnectionList()
34
35    def selectConnection(self, n):
36        if n < len(self.recentConnections):
37            name = self.recentConnections[n]
38            self.recentConnections.remove(name)
39            self.recentConnections.insert(0, name)
40        if len(self.recentConnections) > 0:
41            self.setConnectionList()
42            self.connectDB(self.recentConnections[0])
43
44    def setInfo(self, info):
45        for (i, s) in enumerate(info):
46            self.info[i].setText(s)
47
48    def setMeta(self):
49        domain = self.sqlReader.domain
50        s = "Attrs:\n    " + "\n    ".join([str(i) for i in domain.attributes]) + "\n" + "Class:" + str(domain.classVar)
51        self.domainLabel.setText(s)
52        # for i in domain.getmetas():
53            # self.propertyCheckBoxes[i].set()
54
55    # checks whether any file widget knows of any variable from the current domain
56    def attributesOverlap(self, domain):
57        for fw in OWSubFile.allFileWidgets:
58            if fw != self and getattr(fw, "dataDomain", None):
59                for var in domain:
60                    if var in fw.dataDomain:
61                        return True
62        return False
63
64    # Execute a query, create data from it and send it over the data channel
65    def executeQuery(self, query = None, throughReload = 0, DK=None, DC=None):
66        if query is None:
67            query = str(self.queryTextEdit.toPlainText())
68        try:
69            self.sqlReader.execute(query)
70        except Exception, e:
71            self.setInfo(('Query failed:', str(e)))
72        self.send("Examples", self.sqlReader.data())
73        self.setInfo(('Query returned', 'Read ' + str(len(self.sqlReader.data())) + ' examples!'))
74        self.send("Attribute Definitions", self.sqlReader.domain)
75        self.setMeta()
76        self.lastQuery = query
77   
78    def connectDB(self, connectString = None):
79        if connectString is None:
80            connectString = str(self.connectString)
81        if connectString in self.recentConnections: self.recentConnections.remove(connectString)
82        self.recentConnections.insert(0, connectString)
83        print connectString
84        self.sqlReader.connect(connectString)
85
86class OWSQLSelect(OWSubSQLSelect):
87    def __init__(self,parent=None, signalManager = None):
88        OWSubSQLSelect.__init__(self, parent, signalManager, "SQL select")
89        self.sqlReader = orngSQL.SQLReader()
90        self.inputs = []
91        self.outputs = [("Examples", ExampleTable), ("Attribute Definitions", orange.Domain)]
92
93        #set default settings
94        self.domain = None
95        self.recentConnections=["(none)"]
96        self.queryFile = None
97        self.query = ''
98        self.lastQuery = None
99        self.loadSettings()
100        if self.lastQuery is not None:
101            self.query = self.lastQuery
102        self.connectString = self.recentConnections[0]
103        self.connectBox = OWGUI.widgetBox(self.controlArea, "Database")
104
105        self.connectLineEdit = OWGUI.lineEdit(self.connectBox, self, 'connectString', callback = self.connectDB)
106        self.connectCombo = OWGUI.comboBox(self.connectBox, self, 'connectString', items = self.recentConnections, callback = self.selectConnection)
107        button = OWGUI.button(self.connectBox, self, 'connect', callback = self.connectDB, disabled = 0)
108        #query
109        self.splitCanvas = QSplitter(Qt.Vertical, self.mainArea)
110        self.mainArea.layout().addWidget(self.splitCanvas)
111
112        self.textBox = OWGUI.widgetBox(self, 'SQL select')
113        self.splitCanvas.addWidget(self.textBox)
114        self.queryTextEdit = QPlainTextEdit(self.query, self)
115        self.textBox.layout().addWidget(self.queryTextEdit)
116
117        self.selectBox = OWGUI.widgetBox(self.controlArea, "Select statement")
118        # self.selectSubmitBox = QHGroupBox("", self.selectBox)
119        # self.queryTextEdit.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred))
120        # self.queryTextEdit.setMinimumWidth(300)
121        # self.connect(self.queryTextEdit, SIGNAL('returnPressed()'), self.executeQuery)
122        OWGUI.button(self.selectBox, self, "Open...", callback=self.openScript)
123        OWGUI.button(self.selectBox, self, "Save...", callback=self.saveScript)
124        self.selectBox.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding))
125        button = OWGUI.button(self.selectBox, self, 'execute!', callback = self.executeQuery, disabled=0)
126        self.domainBox = OWGUI.widgetBox(self.controlArea, "Domain")
127        self.domainLabel = OWGUI.label(self.domainBox, self, '')
128        # info
129        self.infoBox = OWGUI.widgetBox(self.controlArea, "Info")
130        self.info = []
131        self.info.append(OWGUI.label(self.infoBox, self, 'No data loaded.'))
132        self.info.append(OWGUI.label(self.infoBox, self, ''))
133        self.resize(300,300)
134
135    # set the query combo box
136    def setConnectionList(self):
137        self.connectCombo.clear()
138        if not self.recentConnections:
139            self.connectCombo.insertItem("(none)")
140        else:
141            self.connectLineEdit.setText(self.recentConnections[0])
142        for connection in self.recentConnections:
143            self.connectCombo.insertItem(connection)
144        self.connectCombo.updateGeometry()
145   
146    def openScript(self, filename=None):
147        if self.queryFile is None:
148            self.queryFile = ''
149        if filename == None:
150            self.queryFile = str(QFileDialog.getOpenFileName(self, 'Open SQL file', self.queryFile, 'SQL files (*.sql)\nAll files(*.*)'))   
151        else:
152            self.queryFile = filename
153           
154        if self.queryFile == "": return
155           
156        f = open(self.queryFile, 'r')
157        self.queryTextEdit.setPlainText(f.read())
158        f.close()
159   
160    def saveScript(self):
161        if self.queryFile is None:
162            self.queryFile = ''
163        self.queryFile = QFileDialog.getSaveFileName(self, 'Save SQL file', self.queryFile, 'SQL files (*.sql)\nAll files(*.*)')
164       
165        if self.queryFile:
166            fn = ""
167            head, tail = os.path.splitext(str(self.queryFile))
168            if not tail:
169                fn = head + ".sql"
170            else:
171                fn = str(self.queryFile)
172            f = open(fn, 'w')
173            f.write(self.queryTextEdit.toPlainText())
174            f.close()
175
176if __name__ == "__main__":
177    a=QApplication(sys.argv)
178    ows=OWSQLSelect()
179    ows.activateLoadedSettings()
180    a.setMainWidget(ows)
181    ows.show()
182    a.exec_loop()
183    ows.saveSettings()
Note: See TracBrowser for help on using the repository browser.