JavaScript in SAP HANA Das Schöne und das Biest? Dr. Ralph Guderlei JAX 2014
Agda Serverseitiges Javascript SAP HANA vs. Node.js Fazit 2
Typische Anwdung Web Mobile REST Geschäftslogik Datbank 3
Warum Serverseitiges Javascript? Reduzierung der Anzahl der verwdet Sprach Interessante Features von JavaScript insb. Funktionale Konzepte Effizite Umsetzung von Projekt hohe Geschwindigkeit der Innovation Performance z.b. durch Async/Non-blocking IO 4
Node.js Erstes Release: Mai 2009 Runtime : Google v8 Server für TCP, DNS, HTTP, Single-Threaded Evt Loop Non-blocking IO Viele Module (ca. 70.000) Op Source 5
Node.js ME(A)N Stack Node.js Service-Frameworks REST: Restify/express OData: Jaydata Dathaltung Mongoose MongoDB UI: Angular.js Utilities Q lodash 6
SAP Hana Erstes Release: November 2010 SpaIt-oritierte In-Memory Datbank Repository, Staging-Mechanismus Javascript-Runtime (XS Engine) Engine: Spidermonkey API/Library basiert auf JQuery kommerziell 7
Vergleichsszari Tooling normale REST-Services ODATA Geschäftslogik Abfrag Transformation von Dat Infrastruktur Security 8
Node.js - Tooling Primär Command Line-basiert Etablierte Tools: NPM (Node Package Manager) Grunt (Task runner, vergleichbar mit Ant) Viele gute Testtools (Jasmine, Karma) IDE-Unterstützung IntelliJ Idea Visual Studio Instabilität: Jeder Tag ein neues Buildsystem 9
SAP Hana - Arbeitsweise Integrierte Toolchain auf Eclipse-Basis Editor für Javascript, SQLScript Interaktion mit Repository und Staging 10
HANA Studio
Node.js REST-Services Routdefinition server.post('/items', items.create); // url with path param server.get('/items/:itemid', items.fetchone); // versioned url via AcceptVersion header server.get({path: '/items', version: '1.0.0'}, items.listv1); Callback exports.fetchone = function (req, res, next) { model.items.findbyid(req.params.itemid, function (err, data) { assert.iferror(err); res.sd(data); return next(); }); }; 12
SAP Hana REST-Services mit XSJS Ansicht Kopf-/Fußzeile query = 'SELECT NAME, DATEN FROM "RepairService.data::ZORIGINALDOKUMENT" WHERE QMNUM =?'; preparedstatemt = connection.preparestatemt(query); preparedstatemt.setnstring(1, meldungsnummer); var rs = preparedstatemt.executequery(); var body = '['; while (rs.next()) { if (!first) { body += ','; first = false; } body += '{ "name" : "' + rs.getnstring(1) + '", "data" : "'; body += base64arraybuffer(rs.getblob(2)) + '" }'; } body += ']'; $.response.contttype = 'application/json'; $.response.setbody(body); $.response.status = $.net.http.ok; 13
ODATA Op Data Access Protocol Entwickelt von Microsoft Basiert auf AtomPub Alternativ: Gdata, RDF Versuch einer semantisch Standardisierung von REST-Services SOAP für REST-Services Erleichtert durch die Standardisierung die (automatisierte) Verwdung von REST-Services 14
ODATA Beispiel Metadat <edmx:edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0"> <edmx:dataservices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:dataserviceversion="2.0"> <Schema xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/05/edm" Namespace="reparatur.services"> <EntityType Name="KundType"> <Key> <PropertyRef Name="KUNNR"/> </Key> <Property Name="KUNNR" Type="Edm.String" Nullable="false" MaxLgth="10"/> <Property Name="LAND1" Type="Edm.String" Nullable="false" MaxLgth="3"/> <Property Name="NAME1" Type="Edm.String" Nullable="false" MaxLgth="35"/> <Property Name="ORT01" Type="Edm.String" Nullable="false" MaxLgth="35"/> <Property Name="PSTLZ" Type="Edm.String" Nullable="false" MaxLgth="10"/> <Property Name="STRAS" Type="Edm.String" Nullable="false" MaxLgth="35"/> <Property Name="APART" Type="Edm.String" Nullable="false" MaxLgth="40"/> </EntityType> <EntityContainer Name="kund" m:isdefaultentitycontainer="true"> <EntitySet Name="Kund" EntityType="reparatur.services.KundType"/> </EntityContainer> </Schema> </edmx:dataservices> </edmx:edmx> 15
Odata Beispiel Nutzdat <feed xml:base="http://54.83.207.87:8000/repairservice/services/kund.xsodata/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/atom"> <title type="text">kund</title> <id>http://somehost:8000/repairservice/services/kund.xsodata/kund</id> <author> <name/> </author> <link rel="self" title="kund" href="kund"/> <try> <id>http://somehost:8000/repairservice/services/kund.xsodata/kund('1')</id> <title type="text"></title> <author> <name/> </author> <link rel="edit" title="kund" href="kund('1')"/> <contt type="application/xml"> <m:properties> <d:kunnr m:type="edm.string">1</d:kunnr> <d:land1 m:type="edm.string">de</d:land1> <d:name1 m:type="edm.string">kunde1</d:name1> <d:ort01 m:type="edm.string">ulm</d:ort01> <d:pstlz m:type="edm.string">89073</d:pstlz> <d:stras m:type="edm.string">beim Alt Fritz 1</d:STRAS> <d:apart m:type="edm.string">ansprechpartner 1</d:APART> </m:properties> </contt> </try> </feed>
Node.js OData Server require('odata-server'); $data.entity.extd("todo", { Id: { type: "id", key: true, computed: true }, Task: { type: String, required: true, maxlgth: 200 }, DueDate: { type: Date }, Completed: { type: Boolean } }); $data.entitycontext.extd("tododatabase", { Todos: { type: $data.entityset, elemttype: Todo } }); $data.createodataserver(tododatabase, '/todo', 52999, 'localhost');
SAP HANA ODATA-Service service namespace "reparatur.services" { "JAX_DEMO"."RepairService.data::ZGERAETE" as "Geraete"; } 18
Node.js - Dattransformation Stream API ermöglicht UNIX-artige Pipeline - Konstrukte model.tests.find({_id: {$in: result}}).lean().batchsize(1000).stream().pipe(sometransformation).pipe(anothertransformation).pipe(res); 19
SAP HANA - Dattransformation Sprache: SQL Script Wizzards zum Erstell von Views im Hana Studio l l l CREATE PROCEDURE ProcWithResultView(IN id INT, OUT o1 CUSTOMER) LANGUAGE SQLSCRIPT READS SQL DATA WITH RESULT VIEW ProcView AS BEGIN l o1 = SELECT * FROM CUSTOMER WHERE CUST_ID = :id; END 20
Node.js - Security Authtifizierung / Authorisierung über NPM-Modul z.b. Passport.js Typischerweise HTTP Authtication oder OpID/OAuth 21
SAP HANA - Security Integriertes Rechte/Roll-Konzept Single-Sign-On via Kerberos/SAML Integrierter Auditing Trail bis auf Datbank-Ebe 22
All together now Node Hana Modul: clit.prepare('call * from DUMMY where X =?', function (err, statemt){ if (err) { return console.error('error:', err); } statemt.exec([1], function (err, rows) { if (err) { return console.error('error:', err); } res.sd(json.stringify(rows)); return next(); }); });
Node.js Pros & Cons Großes Op Source Ökosystem Leichtgewichtige Entwicklung Gute Performance Dynamische Entwicklung CPU-intsive Aufgab limitier Performance (node ist single threaded) 24
SAP Hana Pros & Cons Odata-Support Viele Standards Gutes Tooling Integrierte Lösung Lizzkost Hardware-Bundle Widersprüchliche Dokumtation zu SapUI5 im Netz ungewöhnliches Doku-Format (PDF) 25
Danke für Ihre Aufmerksamkeit! Ralph.guderlei@exxcellt.de @rguderlei Demo am Stand von exxcellt Solutions 26