Écrit par

Associate professor at Igor Sikorsky Kyiv Polytechnic Institute
Article Iryna Mykhailova · Mars 4 2m read

Requêtes SQL JSON simplifiées

Inspiré par la publication de @Ashok Kumar T sur le Portail d'idées et par mon propre besoin de résoudre ce problème, j'ai imaginé une méthode simple pour effectuer des requêtes JSON plus complètes et cohérentes sans avoir à spécifier chaque champ souhaité. J'ai créé une classe qui étend la classe intégrée %JSON.Adaptor et rend ses méthodes %JSONExportToString et %JSONExportToStream accessibles via SQL grâce à quelques procédures 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
	}
}
}

Cela permet à l'utilisateur d'intégrer très efficacement les résultats de ces méthodes dans les colonnes d'une requête SQL. Par exemple, supposons que nous ayons la classe suivante :

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;
}

Nous pourrions alors interroger le système comme suit, en fournissant la colonne id à la procédure SQL pour obtenir le mappage d'objet JSON par défaut :

Ou, étant donné que nous avons un mappage JSON supplémentaire défini dans cette classe, nous pouvons également fournir l'argument map optionnel pour utiliser ce mappage à la place :

Bien que cette solution ne soit pas parfaite, car elle nécessite que la classe étende cette classe, je pense qu'elle représente un pas dans la bonne direction. Il serait judicieux de l'intégrer ultérieurement à la classe `%JSON.Adaptor` intégrée.

Ce package est disponible sur Open Exchange ou peut être installé via le Gestionnaire de packages InterSystems avec la commande « install sqljsonadaptor ».