Consultas SQL JSON Simplificadas.
Inspirado pela postagem de @Ashok Kumar T no portal de ideias aqui, bem como pelos meus próprios desejos de uma solução para este problema, criei uma maneira simples de permitir consultas JSON mais completas e consistentes sem ter que especificar cada campo desejado. Desenvolvi uma classe que estende a classe integrada %JSON.Adaptor e torna seus métodos %JSONExportToString e %JSONExportToStream acessíveis através de SQL com apenas alguns métodos SqlProc simples.
Class DH.JSONAdaptor Extends %JSON.Adaptor [ Abstract ]
{
ClassMethod jsonstring(id, map = "") [ SqlProc ]
{
try{
set myobj = ..%OpenId(id)
set sc = myobj.%JSONExportToString(.json,map)
if $$$ISERR(sc) $$$ThrowStatus(sc)
return json
}
catch ex{
throw ex
}
}
ClassMethod jsonstream(id, map = "") [ SqlProc ]
{
try{
set myobj = ..%OpenId(id)
set sc = myobj.%JSONExportToStream(.json,map)
if $$$ISERR(sc) $$$ThrowStatus(sc)
return json
}
catch ex{
throw ex
}
}
}Isso permite ao usuário obter os resultados desses métodos em colunas de uma consulta SQL de forma muito eficiente. Por exemplo, suponha que tenhamos a seguinte classe:
Class User.Name Extends (%Persistent, DH.JSONAdaptor)
{
XData NoMiddle
{
<Mapping xmlns = "http://www.intersystems.com/jsonmapping" >
<Property Name="First" FieldName="First" />
<Property Name="Last" FieldName="Last" />
</Mapping>
}
Property First As %String;
Property Middle As %String;
Property Last As %String;
}Então poderíamos consultar da seguinte forma, fornecendo a coluna id ao SqlProc para obter o mapeamento de objeto JSON padrão:
Ou, como temos um mapeamento JSON adicional definido nesta classe, também podemos fornecer o argumento opcional map para usar esse mapeamento em vez do padrão:
Embora esta não seja uma solução perfeita para a ideia sugerida, já que exige que a classe estenda esta classe específica, acredito que seja um passo na direção certa, e não faria mal que isso fosse incluído no %JSON.Adaptor nativo no futuro.
Este pacote está disponível aqui no Open Exchange, ou você pode instalá-lo no InterSystems Package Manager usando o comando "install sqljsonadaptor".