Skip to content

Commit

Permalink
Initial, adds all described functionality.
Browse files Browse the repository at this point in the history
  • Loading branch information
eduard93 committed Dec 30, 2013
1 parent 21bf7d3 commit 1dcc55d
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sc-list.txt
113 changes: 113 additions & 0 deletions MDX2JSON/REST.cls.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
<Class name="MDX2JSON.REST">
<Description><![CDATA[
Class for REST-like web api for MDX2JSON transformation (and XML/A).<br>
Example: send HTTP POST request to web application with Dispatch class <b>MDX2JSON.REST</b>
with body: { "MDX":"QUERY" }, where QUERY is a correct MDX statement, ex: <br>
{<br>
"MDX": "SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0,NON EMPTY [Outlet].[H1].[Region].Members ON 1 FROM [HoleFoods]"<br>
} <br>
You can send requests to:<br> <ul>
<li>webapplication/test - to get test info, %request, %response<br>
<li>webapplication/MDX - to get result in JSONP format for MDX query<br>
<li>webapplication/MDXDrillthrough - to get resulting listing in JSON format for MDX Drillthrough query<br>
<li>webapplication/MDX2XMLA - to get result in XML/A format for MDX query<br></ul> ]]></Description>
<Super>%CSP.REST</Super>
<TimeCreated>63165,65257.8179</TimeCreated>

<XData name="UrlMap">
<Data><![CDATA[
<Routes>
<!-- Send objects in this format: {"MDX":"QUERY"} HTTP method: POST -->
<Route Url="/MDX" Method="POST" Call="WriteJSONPfromMDX"/>
<Route Url="/MDXDrillthrough" Method="POST" Call="WriteDrillthroughJSON"/>
<Route Url="/MDX2XMLA" Method="POST" Call="WriteXMLAfromMDX"/>
<!-- Valid but illicit, do not use-->
<Route Url="/MDX/:query" Method="GET" Call="WriteJSONPfromMDXURL"/>
<!-- Test method-->
<Route Url="/test" Method="GET" Call="Test"/>
</Routes>
]]></Data>
</XData>

<Method name="Test">
<Description><![CDATA[
Test method, outputs <b>%request</b> and <b>%response</b> objects. ]]></Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
&html<<h1>Status: OK!</h1><br>>
zw %request
&html<<br><br>>
zw %response
quit $$$OK
]]></Implementation>
</Method>

<Method name="WriteDrillthroughJSON">
<Description><![CDATA[
Wrapper for ##class(MDX2JSON.Utils).WriteDrillthroughJSON(pMDX).<br>
Converts incoming request object and calls abovementioned method.]]></Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
set st = $$$OK
set obj = ##class(%ZEN.proxyObject).%New()
set st = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1)
quit:$$$ISERR(st) st
set st = ##class(MDX2JSON.Utils).WriteDrillthroughJSON(obj.MDX)
quit st
]]></Implementation>
</Method>

<Method name="WriteJSONPfromMDXURL">
<Description>
Wrapper for ##class(MDX2JSON.Utils).WriteJSONPfromMDX(pMDX)
Do not use.</Description>
<Internal>1</Internal>
<ClassMethod>1</ClassMethod>
<FormalSpec>MDX:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
set MDX = $ZCONVERT($ZCONVERT(MDX ,"I","URL") ,"I","UTF8")
set st = ##class(MDX2JSON.Utils).WriteJSONPfromMDX(MDX)
quit st
]]></Implementation>
</Method>

<Method name="WriteJSONPfromMDX">
<Description>
Wrapper for ##class(MDX2JSON.Utils).WriteJSONPfromMDX(pMDX)
Converts incoming request object and calls abovementioned method.</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
set st = $$$OK
set obj = ##class(%ZEN.proxyObject).%New()
set st = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1)
quit:$$$ISERR(st) st
set st = ##class(MDX2JSON.Utils).WriteJSONPfromMDX(obj.MDX)
quit st
]]></Implementation>
</Method>

<Method name="WriteXMLAfromMDX">
<Description>
Wrapper for ##class(MDX2JSON.Utils).WriteXMLAfromMDX(pMDX)
Converts incoming request object and calls abovementioned method.</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
set st=$$$OK
set obj = ##class(%ZEN.proxyObject).%New()
set st = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1)
quit:$$$ISERR(st) st
set st = ##class(MDX2JSON.Utils).WriteXMLAfromMDX(obj.MDX)
quit st
]]></Implementation>
</Method>
</Class>
</Export>
79 changes: 79 additions & 0 deletions MDX2JSON/Utils.cls.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
<Class name="MDX2JSON.Utils">
<Description><![CDATA[
Utility class, wrapping processing of MDX queries.<br>
Outputs JSON, JSONP and XML/A.]]></Description>
<Super>%RegisteredObject</Super>
<TimeCreated>63165,65653.547419</TimeCreated>

<Method name="WriteJSONPfromMDX">
<Description><![CDATA[
Automatic processing of MDX query and outputting resulting JSONP.<br>
<b>pMDX</b> - String containing MDX query.<br>
Returns NULL if there is an error in MDX query.]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>pMDX:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
try {
set PageSize = 1000
set CurrPage = 1
set Params = ""
set RS = ##class(%DeepSee.ResultSet).%New()
#dim st As %Status = $$$OK
set RS = ##class(%DeepSee.ResultSet).%ExecuteDirect(pMDX,.Params,st)
do RS.%OutputJSON(PageSize,CurrPage,,PageSize)
} catch ex {
set st = ex.AsStatus()
}
quit st
]]></Implementation>
</Method>

<Method name="WriteDrillthroughJSON">
<Description><![CDATA[
Automatic processing of MDX Drillthrough query and outputting resulting listing as JSON.<br>
<b>pMDX</b> - String containing MDX Drillthrough query.<br>
Returns NULL if there is an error in MDX query.]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>pMDX:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
try {
set Params = ""
set RS = ##class(%DeepSee.ResultSet).%New()
#dim st As %Status = $$$OK
set RS = ##class(%DeepSee.ResultSet).%ExecuteDirect(pMDX,.Params,st)
set SQL = RS.%GetListingSQL()
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,SQL,,$$$MaxCacheInt)
} catch ex {
set st = ex.AsStatus()
}
quit st
]]></Implementation>
</Method>

<Method name="WriteXMLAfromMDX">
<Description><![CDATA[
Automatic processing of MDX query and outputting resulting XML/A.<br>
<b>pMDX</b> - String containing MDX query.<br>
Returns NULL if there is an error in MDX query.]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>pMDX:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
try {
set Params = ""
set RS = ##class(%DeepSee.ResultSet).%New()
#dim st As %Status = $$$OK
set RS = ##class(%DeepSee.ResultSet).%ExecuteDirect(pMDX,.Params,st)
set st = RS.%OutputXMLA()
} catch ex {
set st = ex.AsStatus()
}
quit st
]]></Implementation>
</Method>
</Class>
</Export>

0 comments on commit 1dcc55d

Please sign in to comment.