Monday, October 26, 2015

(Defn SAP HANA [OData Clojure])

Este post fué posteado originalmente en (Defn SAP HANA [OData Clojure]).


Clojure es un lenguaje de programación dinámico que apunta a la Maquina Virtual de Java. Está diseñado para ser un lenguaje de propósito general, combinándo facilidad la y desarrollo interactivo de un lenguaje script con una estructura eficiente y robusta para programación de multi hilos.


Además…Clojure es un dialecto de Lisp, y comparte con Lisp la filosofía de código como datos y un poderoso sistemas de macros.
Así que, antes de continuar…quiero compartir un cómic de XKCD que realmente me gusta sobre Lisp -:) Y se darán cuenta de el por qué después de ver mi código fuente -;)


Así que…ninguna demostración estaría completa si la enlazaramos con SAP HANA, so? Así que…vamos a hacerlo -;)

Primero, debemos crear un objeto Join y asociar la tabla por MANDT y CARRID. De ahí, seleccionar los siguientes campos como output MANDT, CARRID, CARRNAME, PRICE y CURRENCY.

Luego crear un objeto Aggregation seleccionándo los campos CARRNAME, PRICE (Como columnas agregadas) y CURRENCY. Debemos filtrar el campo CURRENCY por ‘USD’.

Luego, debemos crear un objeto Projection y seleccionar solo PRICE y CARRNAME.

En el objeto Semantics asegúrense de marcar  “CROSS CLIENT” como cliente por defecto.


Ahora, cambiemos a la vista SAP HANA Development y creemos un nuevo repositorio. Lo llamaremos“Flights”.

Creamos un proyecto “XS Engine” y también lo llamamos “Flights”. Lo enlazamos con el repositorio “Flights”.

Creamos un archivo vacio llamado “.xsapp”.

Creamos un archivo llamado “.xsaccess” con el siguente código.

.xsaccess
{
          "exposed" : true,
          "authentication" : [ { "method" : "Basic" } ]
}

Finalmente creamos un archivo llamado “flights.xsodata” con el siguiente código

flights.xsodata
service {
          "Blag/FLIGHTS_BY_CARRIER.calculationview" as "FLIGHTS" keys 
                                                        generate local "Id";
}

Activamos el proyecto y lanzamos nuestro browser...deberíamos ver algo como esto…


La parte de SAP HANA está lista…así que ahora podemos pasar a la parte de Clojure…

La mejor forma y la más sencilla de usar Clojure es instalar Leiningen, pueden encontrar el proceso de instalación aquí.

Una vez instalado, simplemente creamos un proyecto así…

Crear Projecto
Create Project
lein new clojure_hana
cd clojure_hana
nano project.clj

Y lo modificámos para que se vea así…

project.clj
(defproject clojure_hana "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
[clj-http "1.1.0"]
[cheshire "5.4.0"]]
:main clojure-hana.core)

Esto descargará e instalará las librerías clj-http (para trabajar con páginas web) and chesire (para trabajar con JSon) en tu proyecto.

Para programar en Clojure, pueden utilizar cualquier editor que les guste…

Dentro del folder clojure_hana, debemos hacer lo siguiente…

Crear código fuente
cd src
cd clojure_hana
nano core.clj

Copiamos y pegamos el siguiente código fuente…

core.clj
(ns clojure-hana.core
                (:require [clj-http.client :as client])
                (:require [cheshire.core :refer :all]))
 
(defn show_info [results len ctr]
                (cond
                                (or (= ctr len) (< ctr len))
                                                                (concat ((results ctr) :CARRNAME) " : " 
                                                                ((results ctr) :PRICE) "\n"
                                                                (show_info results len (inc ctr)))
                                (> ctr len)
                                                (concat "" "\n")))
 
(defn -main
  "Reads information from SAP HANA OData"
  [& args]
                (let [json (:body (client/get "http://YourHANAServer:8000/Flights/flights.xsodata/FLIGHTS?$format=json" 
                                  {:basic-auth ["YourUser" "YourPassword"]}))
                                  parsed_json (parse-string json true)
                                  results ((parsed_json :d) :results)]
                   (do(print(apply str(show_info results (dec (count results)) 0)) (symbol "")))))

Ahora lo pueden ver…Clojure es todo acerca de los paréntesis, tal como el buen viejo Lisp -:) En fín…para ejecutar el proyecto simplemente vamos hacia atrás, a la carpeta principal del proyecto clojure_hana folder y escribimos

lein run


He estado haciendo interfaces de SAP HANA OData con múltiples lenguajes…y hasta ahora…Racket había sido una de mi implementaciones más veloces…pero debo decirlo…Clojure fué aún más rápido de implementar y el código más corto -:P…aunque es un poco dificil acostumbrarse a todos esos extraños paréntesis…es un lenguaje muy bueno y poderoso…y las cosas se pueden hacer mucho más rápido de lo que uno podría imaginarse…

Saludos,

Blag.
Development Culture.

No comments: