Skip to content

Commit b383736

Browse files
committed
Async mode for /MDX.
Added Timeout parameter to MDX, if query is not complete before the timeout only basic information is returned to a client. This information includes: cubeKey, queryKey, percentDone. If /MDX is called with CubeKey and QueryKey parameters instead of MDX, then existing query would be returned (or the new percentDone would). Timeout can be passed to this query too. Default Timeout is 0 which means indefinite wait.
1 parent d186cff commit b383736

4 files changed

Lines changed: 101 additions & 20 deletions

File tree

MDX2JSON/REST.cls.xml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Example: send HTTP GET request to web application with Dispatch class <b>MDX2JSO
4747
<Routes>
4848
<!-- Send objects in this format: {"MDX":"QUERY"} HTTP method: POST -->
4949
50-
<Route Url="/MDX" Method="POST" Call="WriteJSONfromMDX" Body="MDX"/>
50+
<Route Url="/MDX" Method="POST" Call="WriteJSONfromMDX"/>
5151
<Route Url="/MDX2JSONP" Method="POST" Call="WriteJSONPfromMDX" Body="MDX"/>
5252
<Route Url="/MDXDrillthrough" Method="POST" Call="WriteDrillthroughJSON" Body="MDX"/>
5353
<Route Url="/MDX2XMLA" Method="POST" Call="WriteXMLAfromMDX" Body="MDX"/>
@@ -271,12 +271,22 @@ Converts incoming request object and calls abovementioned method.]]></Descriptio
271271
<ReturnType>%Status</ReturnType>
272272
<Implementation><![CDATA[
273273
try {
274-
if $$$R("Engine")="DeepSeeREST" {
274+
set mdx = $$$R("MDX")
275+
set timeout = $$$R("Timeout")
276+
set engine = $$$R("Engine")
277+
set cubeKey = $$$R("CubeKey")
278+
set queryKey = $$$R("QueryKey")
279+
280+
if engine = "DeepSeeREST" {
275281
// DeepSeeREST engine for MDX->JSON transformation. Only in 15.3+
276-
set st = ##class(MDX2JSON.Utils).WriteJSONfromMDXNew($$$R("MDX"))
282+
set st = ##class(MDX2JSON.Utils).WriteJSONfromMDXNew(mdx)
277283
} else {
278284
// Default MDX2JSON engine. 14.1+
279-
set st = ##class(MDX2JSON.Utils).WriteJSONfromMDX($$$R("MDX"))
285+
if mdx'="" {
286+
set st = ##class(MDX2JSON.Utils).WriteJSONfromMDX(mdx, timeout)
287+
} else {
288+
set st = ##class(MDX2JSON.Utils).WriteJSONfromQuery(cubeKey, queryKey, timeout)
289+
}
280290
}
281291
} catch ex {
282292
set st=ex.AsStatus()

MDX2JSON/ResultSet.cls.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Converts ResultSet to %ZEN.proxyObject.<br>
2727
2828
set tQueryKey = ..%QueryKey
2929
30-
set st = ..%GetQueryStatus(..%Cube,tQueryKey)
30+
/*set st = ..%GetQueryStatus(..%Cube,tQueryKey)
3131
if (st < 100) {
3232
hang 1
3333
set st = ..%GetQueryStatus(..%Cube,tQueryKey)
@@ -36,10 +36,12 @@ Converts ResultSet to %ZEN.proxyObject.<br>
3636
if (st < 100) {
3737
set pStatus = st
3838
return ""
39-
}
39+
}*/
4040
4141
try {
4242
set obj.Info = ..InfoToProxyObject() // basic info about cube and query
43+
quit:obj.Info.percentDone<100
44+
4345
set obj.Cols = ..AxesToListOfObjects() // all axes
4446
set obj.Data = ..DataToListOfDataTypes() // array of all cells, left-to-right, up-to-down
4547
} catch ex {
@@ -74,13 +76,14 @@ Returns meta-information about ResultSet.</Description>
7476
set info.colCount = $G(tAxisSize(2))
7577
set info.colKey = $G(tAxisKeys(1))
7678
set info.rowKey = $G(tAxisKeys(2))
77-
79+
set info.percentDone = ..%GetStatus()
7880
7981
// find name of cube in original case
8082
set tCubeClass = $G($$$DeepSeeMetaGLVN("cubes",tCubeName))
8183
set tCubeName = $G($$$DeepSeeMetaGLVN("classes",tCubeClass))
8284
set info.cubeName = tCubeName
8385
set info.cubeClass = tCubeClass
86+
set info.cubeKey = tCubeIndex
8487
8588
set info.numericGroupSeparator = ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator")
8689
set info.numericGroupSize = ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")

MDX2JSON/Tests.cls.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ Classes with support methods for testing MDX2JSON</Description>
88

99
<Parameter name="LastCommit">
1010
<Type>%String</Type>
11-
<Default>ece429006a0a3be90ce3b11f90b2add9896d2d15</Default>
11+
<Default>d186cff8f8a178c176bd919aefba2d1cc3de8e70</Default>
1212
</Parameter>
1313

1414
<Parameter name="LastCommitTS">
1515
<Type>%TimeStamp</Type>
16-
<Default>2018-02-05 16:29:46.938</Default>
16+
<Default>2018-02-06 11:07:50.433</Default>
1717
</Parameter>
1818

1919
<Method name="ProjectLength">

MDX2JSON/Utils.cls.xml

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,100 @@ Also has functionality for getting information about cubes, dashboards and widge
1111
<Method name="GetResultSet">
1212
<Description><![CDATA[
1313
Transforms MDX query into executed <b>MDX2JSON.ResultSet</b>.<br>
14-
<b>pMDX</b> - String containing MDX query.<br>
15-
<b>pStatus</b> - Status of query execution.<br>]]></Description>
14+
<b>MDX</b> - String containing MDX query.<br>
15+
<b>Status</b> - Status of query execution.<br>]]></Description>
1616
<ClassMethod>1</ClassMethod>
17-
<FormalSpec>pMDX:%String,*pStatus</FormalSpec>
17+
<FormalSpec>MDX:%String,*Status</FormalSpec>
1818
<ReturnType>MDX2JSON.ResultSet</ReturnType>
1919
<Implementation><![CDATA[
20-
set Params = ""
21-
set pStatus = $$$OK
20+
set Status = $$$OK
21+
set RS = ##class(MDX2JSON.ResultSet).%New()
22+
set Status = RS.%PrepareMDX(MDX)
23+
return RS
24+
]]></Implementation>
25+
</Method>
26+
27+
<Method name="GetResultSetFromQuery">
28+
<Description><![CDATA[
29+
Transforms MDX query into executed <b>MDX2JSON.ResultSet</b>.<br>
30+
<b>MDX</b> - String containing MDX query.<br>
31+
<b>Status</b> - Status of query execution.<br>]]></Description>
32+
<ClassMethod>1</ClassMethod>
33+
<FormalSpec>CubeKey:%String,QueryKey:%String,*Status</FormalSpec>
34+
<ReturnType>MDX2JSON.ResultSet</ReturnType>
35+
<Implementation><![CDATA[
36+
set Status = $$$OK
2237
set RS = ##class(MDX2JSON.ResultSet).%New()
23-
set pStatus = RS.%PrepareMDX(pMDX)
24-
return:$$$ISERR(pStatus) RS
25-
set pStatus = RS.%ExecuteAsynch(,.Params,1)
38+
set Status = RS.%PrepareKey(CubeKey, QueryKey)
39+
return:$$$ISERR(Status) RS
40+
41+
do:$$$ISOK(Status) RS.%GetQueryText()
2642
return RS
2743
]]></Implementation>
2844
</Method>
2945

46+
<Method name="ExecuteResultSet">
47+
<ClassMethod>1</ClassMethod>
48+
<FormalSpec>RS:MDX2JSON.ResultSet,QueryKey:%String="",Timeout:%Integer=0</FormalSpec>
49+
<ReturnType>%Status</ReturnType>
50+
<Implementation><![CDATA[
51+
set Params = ""
52+
set Status = $$$OK
53+
54+
if Timeout = 0 {
55+
set Status = RS.%ExecuteAsynch(QueryKey ,.Params, $$$YES)
56+
} else {
57+
set Status = RS.%ExecuteAsynch(QueryKey ,.Params, $$$NO)
58+
set TimeElapsed = 0
59+
set QueryStatus = 0
60+
while (TimeElapsed < Timeout)&&(QueryStatus<100)&&($$$ISOK(Status)) {
61+
hang .01
62+
set TimeElapsed = TimeElapsed + .01
63+
// Check query status again
64+
set QueryStatus = RS.%GetStatus(,.Status)
65+
}
66+
}
67+
68+
quit Status
69+
]]></Implementation>
70+
</Method>
71+
3072
<Method name="WriteJSONfromMDX">
3173
<Description><![CDATA[
3274
Automatic processing of MDX query and outputting resulting JSON.<br>
33-
<b>pMDX</b> - String containing MDX query.<br>]]></Description>
75+
<b>MDX</b> - String containing MDX query.<br>]]></Description>
3476
<ClassMethod>1</ClassMethod>
35-
<FormalSpec>pMDX:%String</FormalSpec>
77+
<FormalSpec>MDX:%String,Timeout:%Integer=0</FormalSpec>
3678
<ReturnType>%Status</ReturnType>
3779
<Implementation><![CDATA[
3880
#dim RS As MDX2JSON.ResultSet
39-
set RS = ..GetResultSet(pMDX,.st)
81+
set RS = ..GetResultSet(MDX, .st)
82+
return:$$$ISERR(st) st
83+
84+
set st = ..ExecuteResultSet(RS, , Timeout)
85+
return:$$$ISERR(st) st
86+
87+
set obj = RS.ToProxyObject(.st)
88+
return:$$$ISERR(st) st
89+
$$$DynObjToJSON(obj)
90+
91+
return $$$OK
92+
]]></Implementation>
93+
</Method>
94+
95+
<Method name="WriteJSONfromQuery">
96+
<Description><![CDATA[
97+
Automatic processing of MDX query and outputting resulting JSON.<br>
98+
<b>MDX</b> - String containing MDX query.<br>]]></Description>
99+
<ClassMethod>1</ClassMethod>
100+
<FormalSpec>CubeKey:%String,QueryKey:%String,Timeout:%Integer=0</FormalSpec>
101+
<ReturnType>%Status</ReturnType>
102+
<Implementation><![CDATA[
103+
#dim RS As MDX2JSON.ResultSet
104+
set RS = ..GetResultSetFromQuery(CubeKey, QueryKey, .st)
105+
return:$$$ISERR(st) st
106+
107+
set st = ..ExecuteResultSet(RS, , Timeout)
40108
return:$$$ISERR(st) st
41109
42110
set obj = RS.ToProxyObject(.st)

0 commit comments

Comments
 (0)