Sessão simultânea no IRIS: SQL, Objects, REST, GraphQL
“E o seu mal-entendido é bastante natural. Como uma pessoa que sempre viaja em um coquetel pode compreender os sentimentos e impressões de viajar por expresso ou voar no ar?
Kazimir Malevich (1916)
, API SQL/REST/GraphQL, /:
;
;
, , ;
, – :
, API , .
, API, . , .
, , , HDD , , - SSD. , HDD/SSD.
, // . HDD — / . SSD — . — , . , / . .
, — HDD/SSD. – , , , , . , , // , .
, . . , InterSystems IRIS, — . , .
, IRIS. — - ObjectScript API. , , SQL ObjectScript. API ObjectScript.
- "SQL Zoo", SQL. API.
API , API, https://github.com/public-apis/public-apis
SQL
SQL. ?
SQL . https://sqlzoo.net. SQL , .
SQLZoo IRIS .
InterSystems IRIS ? — InterSystems IRIS Community Edition — InterSystems IRIS Data Platform
InterSystems IRIS Community Edition .
SQLZoo IRIS. :
( , , http://localhost:52773/csp/sys/UtilHome.csp),
USER - Namespace %SYS Switch USER
> SQL - , SQL .
" " "" - .
, , , SQL IRIS, Visual Studio Code SQLTools "SQLTools Driver for InterSystems IRIS". .
World:
http://sqlzoo.net/w/index.php?title=Createworld.txt&action=raw a script to create the world database
http://sqlzoo.net/w/index.php?title=Tabworld.txt&action=raw the data to go in that table
IRIS " ".
CREATE TABLE world(
name VARCHAR(50) NOT NULL
,continent VARCHAR(60)
,area DECIMAL(10)
,population DECIMAL(11)
,gdp DECIMAL(14)
,capital VARCHAR(60)
,tld VARCHAR(5)
,flag VARCHAR(255)
,PRIMARY KEY (name)
)
" " > . , , — .
" ":
SELECT * FROM world
"SQL Zoo". SQL :
SELECT population
FROM world
WHERE name = 'France'
API SQLZoo IRIS.
— , "" SQL SQL ObjectScript — - , IRIS.
Class User.worldquery
{
ClassMethod WhereName(name As %String)
{
&sql(
SELECT population INTO :population
FROM world
WHERE name = :name
)
IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg QUIT}
ELSEIF SQLCODE=100 {WRITE "Query returns no results" QUIT}
WRITE name, " ", population
}
}
:
do ##class(User.worldquery).WhereName("France")
.
/
REST/GraphQL. API . - , - . : Spring Java/Kotlin, Django Python, Rails Ruby, ASP.NET C# Angular TypeScript. ObjectScript, IRIS.
? , , . , . , API, . . , / , .
, / . ? SQL/REST/GraphQL API . , , – , , .
. – IRIS.
SQL IRIS, :
- () |
(SQL) |
|
|
|
|
|
|
|
|
|
|
|
|
|
, join |
( ) |
( ) |
IRIS.
SQL world , IRIS — User.world.
Class User.world Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = world ]
{
Property name As %Library.String(MAXLEN = 50) [ Required, SqlColumnNumber = 2 ];
Property continent As %Library.String(MAXLEN = 60) [ SqlColumnNumber = 3 ];
Property area As %Library.Numeric(MAXVAL = 9999999999, MINVAL = -9999999999, SCALE = 0) [ SqlColumnNumber = 4 ];
Property population As %Library.Numeric(MAXVAL = 99999999999, MINVAL = -99999999999, SCALE = 0) [ SqlColumnNumber = 5 ];
Property gdp As %Library.Numeric(MAXVAL = 99999999999999, MINVAL = -99999999999999, SCALE = 0) [ SqlColumnNumber = 6 ];
Property capital As %Library.String(MAXLEN = 60) [ SqlColumnNumber = 7 ];
Property tld As %Library.String(MAXLEN = 5) [ SqlColumnNumber = 8 ];
Property flag As %Library.String(MAXLEN = 255) [ SqlColumnNumber = 9 ];
Parameter USEEXTENTSET = 1;
/// Bitmap Extent Index auto-generated by DDL CREATE TABLE statement. Do not edit the SqlName of this index.
Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ];
/// DDL Primary Key Specification
Index WORLDPKey2 On name [ PrimaryKey, Type = index, Unique ];
}
- . ObjectScript, . , , SQL-.
, SQL, User.world WhereName, " " :
ClassMethod WhereName(name As %String) As User.world
{
Set id = 1
While ( ..%ExistsId(id) ) {
Set countryInfo = ..%OpenId(id)
if ( countryInfo.name = name ) { Return countryInfo }
Set id = id + 1
}
Return countryInfo = ""
}
:
set countryInfo = ##class(User.world).WhereName("France")
write countryInfo.name
write countryInfo.population
, , IRIS WORLDPKey2 / :
set countryInfo = ##class(User.world).WORLDPKey2Open("France")
:
write countryInfo.name
write countryInfo.population
, IRIS , Java, Python, , C# (.Net), JavaScript , , Julia [1][2]. .
-API.
REST RESTful -API
. — . , http. IRIS " " http- Apache.
Representational state transfer (REST) — , , -. , , . REST - , http/https. , / - SOAP XML-RPC.
ID REST URL .
- IRIS http://localhost:52773 /world/ /world/France.
-:
http://localhost:52773/world/France
IRIS . , REST API OpenAPI 2.0.
— API . REST-, IRIS:
- URL, %CSP.REST
- - IRIS
1 -
/// Description
Class User.worldrest Extends %CSP.REST
{
Parameter UseSession As Integer = 1;
Parameter CHARSET = "utf-8";
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<Route Url="/:name" Method="GET" Call="countryInfo" />
</Routes>
}
}
- , :
ClassMethod countryInfo(name As %String) As %Status
{
set countryInfo = ##class(User.world).WhereName(name)
write "Country: ", countryInfo.name
write "<br>"
write "Population: ", countryInfo.population
return $$$OK
}
, REST- name - ":name".
2 - IRIS
System Administration > Security > Applications > Web Applications
- URL /world — - worldrest.
- http://localhost:52773/world/France ( , ).
— ( ). https://community.intersystems.com/post/debugging-web
"401 Unauthorized", , - , - %All "Application Roles". , .
GraphQL
, , IRIS API GraphQL . .
GraphQL .
API. , , , REST- -API. GraphQL Linux . .
InterSystems GraphQL IRIS 2018 .
En: GraphQL , ,
GraphQL — IRIS , . , - GraphQL GraphiQL.
, IRIS -. - GraphQL REST- :
GraphiQL — , HTML JavaScript:
http://localhost:52773/graphiql/index.html
, , . , . .
GraphQL :
{
User_world ( name: France ) {
name
population
}
}
:
{
"data": {
"User_world": [
{
"name": "France",
"population": 65906000
}
]
}
}
:
|
|
|
SQL |
50 |
|
|
|
40 , |
|
REST |
20 |
|
GraphQL |
5 |
|
SQL, REST , , GraphQL . IRIS , , .
, API XML (SOAP) JSON IRIS . .
, API — , . , API , , .
,
Este artigo foi preparado não apenas para comparar APIs modernas e, até mesmo, não tanto para uma visão geral dos recursos básicos do IRIS. Os programadores novatos serão capazes de obter mais benefícios com os exemplos acima: veja a facilidade de alternar entre APIs ao acessar um banco de dados, dê os primeiros passos no IRIS e obtenha um resultado rápido para sua tarefa.
E portanto, a sua opinião é muito interessante, essa abordagem ajuda para um "início fácil", quais etapas do processo dificultam para iniciantes dominar as ferramentas de trabalho com a API no IRIS? O que parecia um "obstáculo não óbvio"? Pergunte a quem está dominando o IRIS e escreva para mim nos comentários. Acho que será útil para todos discutir isso.