Thursday, September 17, 2015

Puramente SAP HANA con Haskell

Este post fué posteado originalmente en Purely SAP HANA with Haskell.


Haskell es un lengiaje puramente funcional de propósito general con semánticas no estríctas y tipeado estático fuerte.


Qué significa esto? Nada…solo que Haskell es el lenguaje más puro que circula por esto lares…lo cual significa que no hay y no pueden haber efectos seccundarios…como los Haskellers suelen decir…”Si compila…siempre va a funcionar”…

Hay una caricatura de XKCD que resume de manera elegante lo que es Haskell -;)


Bueno…yo lo ejecutaría -:P Lo que me encanta acerca de Haskell es que realmente te hace olvidar todo lo que habías aprendido antes…una vez asignada, una variable no puede cambiar su valor…la recursividad es practicamente obligatoria…escribir en el terminal es considerado algo impuro, pero hay por supuesto una forma de hacerlo…todo es una función…olvidate de las Clases y los Objetos…pattern matching es tu mejor amigo…y muchas otras cosas realmente interesántes -;)

Así que…ninguna explicación estaría completa si no lo conectara con SAP HANA, no? 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 movernos a la parte de Haskell…

En el terminal escribe esto…

cabal update
cabal install --j --disable-tests wreq
En las nuevas versiones de wreq, lens y aeson ya están incluídos…pero por siacaso…
cabal install lens
cabal install aeson

Para programar en Haskell utilizo uno de los editores más asombrosos que he encontrado…Geany. Viene casi pre-configurado para manejar muchisimos lenguajes de programación, así que estárán listos para programar en Haskell.

Basicamente solo necesitas presionar el botón “Run or view the current file”, la última imágen muestra unos engranajes…lo cual basicamente va a traer el GHCi que es el Glasgow Haskell Compiler Interactive.


Con eso, estaremos más que preparados para comenzar a programar -:) Copia y pega el siguiente código…

Haskell_HANA.hs
{-# LANGUAGE OverloadedStrings #-}
import Network.Wreq
import Control.Lens
import Data.Aeson
import Data.Aeson.Lens
import Data.Aeson.Types
import Data.Text
import Data.Vector
import Prelude as P
import qualified Data.ByteString.Lazy as B

get_info :: B.ByteString -> Text -> Text -> Text -> Text -> Int -> Int -> String
get_info json d results carrname price len ctr
 | ctr < len = unpack(json ^. key d . key results . nth ctr . key carrname . _String) P.++ 
               ": " P.++ unpack(json ^. key d . key results . nth ctr . key price . _String) P.++ "\n" 
               P.++ get_info json d results carrname price len (ctr+1)
 | ctr >= len = []

main :: IO ()
main = do
 let d = pack "d"
 let results = pack "results"
 let carrname = pack "CARRNAME"
 let price = pack "PRICE"
 let opts = defaults & auth ?~ basicAuth "SYSTEM" "YourPassword"
 r <- getWith opts "http://YourHANAServer:8000/Flights/flights.xsodata/FLIGHTS?$format=json"
 let json = r ^. responseBody
 let results_array = json ^. key d . key results . _Array
 let len = Data.Vector.length results_array
 putStr $ get_info json d results carrname price len 0

Guarda tu archivo y presiona el botón “Run or view the current file”.


Debes utilizar el formato “:l name_of_your_file” para cargar el programa en memoria y luego simplemente puedes llamar a la función principal para poder ejecutarlo -;)

Debo decirlo…Haskell no es un lenguaje sencillo…y escribir este post no fué tampoco una tarea sencilla…tuve que hacer mucha investigación…pero afortunadamente los paquetes Wreq y Aeson son simplemente asombrosos!

Saludos,

Blag.
Development Expert.

No comments: