Skip to content

Commit 8028a62

Browse files
committed
ExecuteQuery in public interface
1 parent a6d3e8e commit 8028a62

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

isc/py/Main.cls

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,96 @@ ClassMethod ExcuteCode(code As %Stream.Object, variable As %String = "") As %Sta
8484
quit sc
8585
}
8686

87+
/// Populate variable from sql query
88+
/// variable - python variable to set
89+
/// type - variable type (Currently supported: dataframe (pandas dataframe) and list.
90+
/// query - text of the SQL query
91+
/// set sc = ##class(isc.py.Main).ExecuteQuery("SELECT * FROM isc_py_test.CannibalizationData", "df")
92+
ClassMethod ExecuteQuery(query As %String, variable, type As %String(VALUELIST=",dataframe,list") = "list") As %Status
93+
{
94+
#include %occODBC
95+
#dim sc As %Status = $$$OK
96+
quit:",dataframe,list"'[type $$$ERROR($$$GeneralError, "Invalid type: " _ $g(type) _ ". Expected types: dataframe or list")
97+
98+
if type="dataframe" {
99+
set sc = ..ImportModule("pandas", , .pandas)
100+
quit:$$$ISERR(sc) sc
101+
}
102+
103+
/// Really %sqlcq.<NAMESPACE>.cls<NUMBER>
104+
#dim result As %SQL.ISelectResult
105+
set result = ##class(%SQL.Statement).%ExecDirect(,query)
106+
107+
set start = $zh
108+
#dim metadata As SQL.StatementMetadata
109+
set metadata = result.%GetMetadata()
110+
set columnCount = metadata.columns.Count()
111+
112+
set columnList = ""
113+
for i=1:1:columnCount {
114+
#dim column As %SQL.StatementColumn
115+
set column = metadata.columns.GetAt(i)
116+
117+
set class(i) = $lb(column.colName)
118+
if column.IsNumeric() {
119+
set class(i) = class(i) _ $lb("numeric")
120+
} elseif ((column.ODBCType=$$$ODBCTYPEtimestamp) || (column.ODBCType=$$$ODBCTYPEdate)) {
121+
set class(i) = class(i) _ $lb("date")
122+
} elseif column.ODBCType = $$$ODBCTYPEtime {
123+
set class(i) = class(i) _ $lb("time")
124+
} else {
125+
set class(i) = class(i) _ $lb("string")
126+
}
127+
128+
set columnList = columnList _ $lb("'" _ column.colName _ "'")
129+
}
130+
131+
// zzzcolumns = ['col1', 'col2', 'col3']
132+
if type="dataframe" {
133+
set code = "zzzcolumns=[" _ $lts(columnList, ",") _ "]"
134+
} elseif type="list" {
135+
set code = "zzzcolumns=[(" _ $lts(columnList, ",") _ ")]"
136+
}
137+
set sc = ..SimpleString(code)
138+
quit:$$$ISERR(sc) sc
139+
140+
set data = ##class(%Stream.GlobalCharacter).%New()
141+
do data.Write("[")
142+
143+
set first = $$$YES
144+
while result.%Next() {
145+
// TODO get isLastRow in a sane way
146+
if first {
147+
set first = $$$NO
148+
} else {
149+
do data.Write(",")
150+
}
151+
set rowList = ""
152+
for i=1:1:columnCount {
153+
set value = result.%GetData(i)
154+
set:$lv(value) value = $lts(value)
155+
set rowList = rowList _ $lb("'" _ value _ "'")
156+
}
157+
do data.Write("(" _ $lts(rowList, ",") _ ")")
158+
159+
}
160+
do data.Write("]")
161+
162+
set sc = ..ExcuteCode(data, "zzzdata")
163+
quit:$$$ISERR(sc) sc
164+
165+
if type="dataframe" {
166+
set sc = ..SimpleString(variable _ "=" _ pandas _ ".DataFrame(zzzdata, columns=zzzcolumns)")
167+
} elseif type="list" {
168+
set sc = ..SimpleString(variable _ "= zzzcolumns + zzzdata")
169+
}
170+
do ..SimpleString("del zzzdata, zzzcolumns")
171+
172+
set end = $zh
173+
write "Time: ", end-start,!
174+
quit sc
175+
}
176+
87177
/// variable - variable name
88178
/// useString - if variable length is less than $$$MaxStringLength, return string instead of stream. Ignored if variable length is more than $$$MaxStringLength
89179
/// set sc = ##class(isc.py.Main).GetVariable()

0 commit comments

Comments
 (0)