Este post fué posteado originalmente en SAP HANA on the OCaml hump.
OCaml es un lenguaje de programación de fuerza industrial que soporta estilos funcional, imperativo y orientado a objetos.
Suena bonito, no? OCaml es el siguiente paso del Lenguaje de programación Caml.
Habiendo aprendido otros lenguajes de programación funcional como Haskell y Erlang, OCaml fué para mi la próxima opción obvia…así que decidí comenzar a aprenderlo…no fué una tarea fácil debo decirlo…pero realmente divertida y iluminadora.
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.
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 podemos pasar a la parte de OCaml…
Para los principiantes, OPAM (El manejador de paquetes de OCaml puede ser complicado y a veces frustrante), así que vamos a hacerles la vida más sencilla siguiendo estos simples pasos…en el terminal escriban esto…
• opam init
• eval `opam config env`
• opam switch 4.01.0
• eval `opam config env`
• opam install core utop core_extended async uri yojson cohttp lwt ezjsonm
Se va a demorar un poco, pero instalándo todos los paquetes requeridos en un solo comando previene que los errores ocurran.
Para programar en OCaml utilizo unos de los editores más asombrosos que he encontrado…Geany. viene pre-configurado para manejar una gran cantidad de lenguajes de programación, pero solo para estar seguros, aquí está como lo configuré para trabajar con OCaml.
Primero, creamos un archivo y lo grabamos como OCaml_HANA.ml
Luego, hacemos click en el botón “Choose more build actions”
La pequeña media flecha que está al lado del botón que parece un ladrillo marrón. Esto abrirá la siguiente pantalla
En "Compile" escriban lo siguiente
corebuild -pkg yojson,cohttp.async,cohttp.lwt,lwt,ezjsonm "%e.native"
Y en "Execute" pongan
“./%e.native”
Con esto, estaremos más que listos para comenzar a programar -:) Copien y peguen el siguiente código…
OCaml_HANA.ml |
---|
open Core.Std open Yojson.Basic.Util open Ezjsonm let get_definition_from_json json = let json = Ezjsonm.from_string(json) in let json = Ezjsonm.(find json ["d";"results"]) in let json = Ezjsonm.to_string(json) in let json = Yojson.Basic.from_string(json) in let json = Yojson.Basic.Util.to_list json in let carrname = Yojson.Basic.Util.filter_member "CARRNAME" json in let carrname = Yojson.Basic.Util.filter_string carrname in let price = Yojson.Basic.Util.filter_member "PRICE" json in let price = Yojson.Basic.Util.filter_string price in printf "Reading SAP HANA from OCaml\n\n"; for i = 0 to List.length(carrname) - 1 do printf "%s: %s\n" (List.nth_exn carrname i) (List.nth_exn price i) done let fetch uri = let cred = Cohttp.Auth.string_of_credential(`Basic("SYSTEM", "YourPassword")) in let headers = Cohttp.Header.init() in let headers = Cohttp.Header.add headers "Authorization" cred in let open Lwt in Cohttp_lwt_unix.Client.get ~headers:headers uri >>= fun (_,body) -> Cohttp_lwt_body.to_string_list body >>= fun strings -> return(get_definition_from_json (String.concat strings)) let () = let hana_uri = Uri.of_string "http://YourServer:8000/Flights/flights.xsodata /FLIGHTS?$format=json" in Lwt_main.run (fetch hana_uri) |
Notarán que se ejecuta bastante rápidamente…
Ahora…algo gracioso acerca de mi código…y debe ser por alguna de estas dos simples razones…
• Aún estoy aprendiendo OCaml
• La documentación para paquetes externos no es un muy extensa o simplemente no existe (En realidad, tuve que navegar por el código fuente en GitHub para poder realizar la mayoría del código)
Así que…la cosa graciosa es que estoy utilizándo dos librerías JSON diferentes para poder leer la información ODATA generada por SAP HANA…utilizándo solamente uno no podría manejar la información que necesitaba…así que utilizándo los dos y extrayendo las piezas de aquí y allá finalmente obtuve lo que quería…no es muy divertido cuando lo estás haciendo por primera vez…pero al final hay una gran recompenza cuando finalmente puedes compilar y obtener el outpur que quieres -;)
Saludos,
Blag.
Development Culture.
No comments:
Post a Comment