Skip to content

Instantly share code, notes, and snippets.

@btuso
Last active August 9, 2017 15:00
Show Gist options
  • Save btuso/bfdac4f695f7ebb4b955a6599c5185b7 to your computer and use it in GitHub Desktop.
Save btuso/bfdac4f695f7ebb4b955a6599c5185b7 to your computer and use it in GitHub Desktop.

M.A.R.T.Y

Filtros

Los filtros sirven para acotar los resultados que van a ser devueltos. Funcionan como una query de base de datos, y son combinables.

Cuales hay?

  • Evaluacion: ( "clave" = "valor" )

    Es la operacion base, la que se encarga de hacer filtrar campos particulares. Acepta varios tipos de valores y operadores.

  • Operadores
    = : igual
    ! : distinto
    > : mayor
    >= : mayor o igual
    < : menor
    <= : menor o igual

  • Valores:
    String: "String"
    Numero: -3.14
    Booleano: true
    Fecha: 2016-03-23T04:23
    Listas: [ valor1, valor2 ]

  • And: { operacion1, operacion2, operacion3 }

    Es un and logico, soporta n operaciones dentro.

  • Or: [operacion1, operacion2, operacion3]

    Es un or logico, soporta n operaciones dentro.

  • Not: ! operacion

    Es un not logico, se aplica sobre una operacion.

Por ejemplo !{ !("stage"="PAYMENT"), ![("status"=OK), ("status"="ERROR")]}

Ejemplos

  • Traer un carrito por id:

    ?query=( "id"="AAA-BBB-CCC" )
    
  • Traer los carritos en payment error:

    ?query={ ("stage"="PAYMENT"), ("status"="ERROR") }
    
  • Traer los carritos en Fraud o Payment :

    ?query=[ ("stage"="PAYMENT"),("stage"="FRAUD") ]
    
  • Traer los carritos en Fraud o Payment (otra manera) :

    ?query=("stage"= ["PAYMENT","FRAUD"])
    
  • Traer los carritos que no esten en Payment :

    ?query=("stage" ! "PAYMENT")
    
  • Traer los carritos que no esten en Payment (otra manera):

    ?query=!("stage"="PAYMENT")
    
  • Traer los carritos que no esten en Payment Error :

    ?query=!{ ("stage"="PAYMENT"),("status"="ERROR") }
    
  • Traer los carritos que no esten en Payment o Fraude:

    ?query=("stage" ! ["PAYMENT", "FRAUD"])
    

    (el espacio entre '!' y '[' es importante)

  • Traer los carritos en Payment Manual de la sucursal con id 52, precio mayor a 10000 creados a partir del 15 de agosto de 2016

     ?query={("stage"="PAYMENT"), ("retailer"="52"),
      	    ("price">10000), ("creation date" >= 2016-08-15T00:00)}
    

Proyecciones

Las proyecciones sirven para acotar la informacion que retorna el servicio, para poder recibir solo la informacion que se va a usar.

Ejemplos

  • Proyeccion default, nivel carrito:

     ?query=("id"="aaa-bbb-ccc")&projection=CART
    
     Devuelve:
     	[{
     	  "id": "aaa-bbb-ccc",
     	  "reservations": [...],
     	  "account_info": { ... },
     	  ...
     	}]
    
  • Proyeccion nivel account info:

     ?query=("id"="aaa-bbb-ccc")&projection=ACCOUNT
    
     Devuelve:
     	[{
     	  "accountId": "627",
     	  "accountEmail": "matias.canessa@almundo.com"
     	  ...
     	}]
    
  • Proyeccion nivel reserva, en un carrito con 2 reservas:

     ?query=("id"="aaa-bbb-ccc")&projection=RESERVATION
    
     Devuelve:
     	[{
     	   "id": "84a31284-f186-4129-b8c3-15c8c3774070",
     	   "product": "FLIGHT",
     	   "items": [ ... ],
     	   ...
     	},
     	{
            "id": "a8a198f3-997e-45bf-a780-5dd67a5a10c9",
     	   "product": "HOTEL",
     	   "items": [ ... ],
     	   ...
     	}]
    

    Importante: Notar que no las agrupa, si se consultan 2 carritos, las reservas no van a estar agrupadas por carrito

  • Proyeccion nivel reserva, en un carrito con 2 reservas, con filtro por producto:

     ?query={("id"="aaa-bbb-ccc"), ("product"="FLIGHT")}&projection=RESERVATION
    
     Devuelve:
     	[{
     	   "id": "84a31284-f186-4129-b8c3-15c8c3774070",
     	   "product": "FLIGHT",
     	   "items": [ ... ],
     	   ...
     	}]
    
  • Proyeccion nivel item, en un carrito con 2 reservas con varios items cada una:

     ?query=("id"="aaa-bbb-ccc")&projection=ITEM
    
     Devuelve:
     	[{
     	   "id": "...",
     	   ...
     	},
     	{
     	   "id": "...",
     	   ...
     	},
     	{
     	   "id": "...",
     	   ...
     	}]
    
  • Proyeccion nivel reserva, en un carrito sin reservas:

     ?query=("id"="ddd-eee-fff")&projection=RESERVATION
    
     Devuelve:
     	[ ]
    

Post Operaciones

A veces la informacion que viene necesita una transformacion simple antes de ser consumida. Las post operaciones se aplican sobre el resultado del filtro y la proyeccion, y tienen como objetivo transformar los datos en algo mas util para el que los va a consumir. Las post operaciones son combinables y cada una tiene su contrato de input-output.

Como se usan?

El uso de las post operaciones es bastante sencillo, consiste en especificarlas por nombre separadas por coma, y con sus respectivos parametros (si los tienen) separados con |

Ejemplos:

	Una post operation: ?...&postOperations=count

	Una con parametro: ?...&postOperations=piechart(STAGE)

	Una con varios parametros: ?...&postOperations=sort(TO|DESC)

	Varias post operations: ?...&postOperations=groupBy(STATUS),count

	Se pueden repetir: ?...&postOperations=groupBy(STATUS),count,count

Importante: Muchas post operaciones no se pueden usar sobre propiedades dentro de listas ya que al estar dentro de una lista, no se puede saber sobre que elemento operar. Ejemplo: Si trato de ordenar carritos segun la fecha de check-in de las reservas, ordeno segun el check-in de la primera reserva o segun el de la segunda? Si cambiamos la proyeccion a nivel reservas, si se puede ordenar por fecha de check-in, ya que las reservas estan aplanadas.

Cuales hay?

  • count

    Toma como entrada varios tipos de datos y retorna el resultado de contar lo que contiene.

  • Contrato:

    Entrada Salida
    List Integer
    Map Integer
    Map<?, List> Map<?, Integer>
  • Comportamiento: * List: Devuelve la cantidad de elementos que contiene * Map: Devuelve la cantidad de elementos que contiene * Map<?, List>: Devuelve un mapa con las mismas claves que como valor tienen la cantidad de elementos que contenia cada lista

  • Ejemplos:

    • Lista:
      Input:
       [{
         "id" : "asd123",
         "product" : "FLIGHT",
         ...
       },
       {
         "id" : "def456",
         "product" : "FLIGHT",
         ...
       }]
    
     Output:
     	2
    
    • Mapa:
     Input:
       {
         "OK" : { .. },
         "ERROR" : { .. },
         "MANUAL" : { .. }
       }
    
     Output:
     	3
    
    • Mapa de listas:
     Input:
       {
         "OK" : [ {..}, {..} ],
         "ERROR" : [ {..} ],
         "MANUAL" : [ ]
       }
    
     Output:
       {
         "OK" : 2,
         "ERROR" : 1,
         "MANUAL" : 0
       }
    
  • sort

    Toma como entrada una lista o un mapa de listas y las retorna ordenadas.

  • Contrato: Los datos internos no son modificados.

    Entrada Salida
    List List
    Map<?, List> Map<?, List>
  • Parametros:

    • * - Propiedad a comparar - obligatorio
    • DESC - Invierte el orden - opcional
  • Comportamiento: * List: Devuelve la lista ordenada, segun el criterio de orden natural del tipo de datos sobre el que ordena. * Map<?, List>: Devuelve el mapa con las listas ordenadas

  • Ejemplos:

    • Lista:
     Argumentos: sort(TO)
    
     Input:
       [
         {"to" : "2016-02-17T09:23:00"},
         {"to" : null},
         {"to" : "2016-01-27T15:05:00"}
       ]
    
     Output:
       [
         {"to" : "2016-01-27T15:05:00"},
         {"to" : "2016-02-17T09:23:00"},
         {"to" : null}
       ]
    
    • Mapa de listas:
     Argumentos: sort(STATUS)
    
     Input:
       {
         "BOOKING" : [{"status" : "PENDING"}, {"status" : "ERROR"}],
         "PAYMENT" : [{"status" : "PENDING"}, {"status" : "OK"}]
       }
    
    
     Output:
         {
         "BOOKING" : [{"status" : "ERROR"}, {"status" : "PENDING"}],
         "PAYMENT" : [{"status" : "OK"}, {"status" : "PENDING"}]
       }
    
    • Lista con orden descendiente:
     Argumentos: sort(PRICE|DESC)
    
     Input:
       [
         {"price" : "400"},
         {"price" : "600"}
       ]
    
     Output:
       [
         {"price" : "600"},
         {"price" : "400"}
       ]
    
  • groupBy

    Toma como entrada una lista, devuelve un mapa cuyas claves se corresponden con cada valor del campo sobre el que se agrupa.

  • Contrato: Los datos internos no son modificados.

    Entrada Salida
    List Map<?, List>
  • Parametros:

    • * - Propiedad a sobre la cual se agrupa - obligatorio
  • Comportamiento: * List: Devuelve un mapa de listas, la clave es el valor del campo sobre el que se agrupa, las listas contienen los elementos que contienen cada valor.

  • Ejemplos:

    • Lista:
     Argumentos: groupBy(STAGE)
    
     Input:
       [
         {
           "status" : "OK",
           "stage" : "PAYMENT"
         },
         {
           "status" : "ERROR",
           "stage" : "PAYMENT"
         },
         {
           "status" : "OK",
           "stage" : "BOOKING"
         }
       ]
    
     Output:
       {
         "BOOKING": [
     	    {
     	      "status" : "OK",
     	      "stage" : "BOOKING"
     	    }
         ],
         "PAYMENT": [
     	    {
     	      "status" : "OK",
     	      "stage" : "PAYMENT"
     	    },
     	    {
     	      "status" : "ERROR",
     	      "stage" : "PAYMENT"
     	    }
         ]
       }
    
  • pieChart

    Toma como entrada una lista, una lista correspondiente a los porcenates por clave para poder armar un grafico de torta.

  • Contrato:

    Entrada Salida
    List List<PieChartItem>
PieChartItem:
	key: clave sobre la que se genera el grafico
	count: cantidad de items en la porcion
	percentage: porcentaje de la porcion
  • Parametros:

    • * - Propiedad a sobre la cual se agrupa - obligatorio
  • Ejemplos:

    • Lista:
     Argumentos: groupBy(STAGE)
    
     Input:
       [
         {
           "stage" : "PAYMENT"
         },
         {
           "stage" : "PAYMENT"
         },
         {
           "stage" : "BOOKING"
         }
       ]
    
     Output:
       [
         {
           "key" : "BOOKING",
           "count" : 1,
           "percentage" : 33.3
         },
         {
           "key" : "PAYMENT",
           "count" : 2,
           "percentage" : 66.6
         }
       ]
    

Que mas hay?

  • Limites -> ....&limit=20

  • Offset -> ....&offset=10

  • Paging -> proximamente


B2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment