Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

ES | EN

En algunas ocasiones, para poder crear un gadget template que satisfaga nuestras tus necesidades, necesitamos necesitas poder acceder a más de un datasource. Para esto se han implementado varias funciones:

vm.getDataFromDataSource(datasource,callbackFunction,filters,group,project,sort,limit,offset,param,debug) 

Los 3 tres primeros parámetros están disponibles en versiones antiguas, y el resto son soportados a partir de la versión "Empire". Todas estas operaciones se aplican en servidor transformando la query del datasource.

  • datasource: identificador del datasource al que

...

  • quieres acceder.

...

  • Ten en cuenta que

...

  • sólo devolverán datos a los que el usuario tenga acceso. En el caso de que

...

  • quieras mostrar un dashboard público, las ontologías de las cuales se forman los datasources también deben estar marcadas como públicas.
  • callbackFunction: función que

...

  • retornará los datos tras la consulta. Al definirla, tan sólo necesita un parámetro, que será el que nos devuelva los datos.
  • filters:

...

  • puedes pasar un array de filtros para los datos. Un ejemplo de filtros sería éste, donde

...

  • se pasan dos: [{field: f.field1,op: "=",exp: f.value1},{field: f.field2,op: "=",exp: f.value2}], en el que field es el path del parametro del datasource, por ejemplo 'Helsinki.year', op es el operador que puede ser =,>,<, in ..., y exp es el valor.
    • Ejemplo filtro

...

    • tipo IN:

...

    •  Si

...

    • tienes un array de strings con los elementos por los que

...

    • quieres filtrar,

...

    • puedes crear un array que contenga todos los filtros por si

...

    • usas más de uno, y

...

    • después pasar esta variable a la consulta, por ejemplo: 
Code Block
languagejs
var elementosSeleccionados = ['elemento1',elemento2','elemento4'];

var filtros = [];

filtros.push({field: 'campoDeLaEntidadPorElQueFiltrar',op: "IN",exp: "('" + elementosSeleccionados.join("', '") + "')"});

En el caso de que fueran valores numéricos no pondríamos las comillas simples.

vm.from(datasource).filters(filtros).exec...
  • group: array de

...

  • strings para los campos de agrupación del datasource

...

  • . Para que sea coherente, estos campos deben estar también en la etapa project. Si no se necesita (pero

...

  • hay parámetros posteriores), se puede pasar el valor en vacío, []
  • project: indica la proyección aplicada al datasource y se compone de un array de

...

  • JSON de dos campos {"field":"field/projectop","alias":"alias"} definiendo cada proyección con su alias (no requerido), por ejemplo [{"field":"Restaurant.cuisine"}] ó [{"field":"Restaurant.cuisine","alias":"cui"}]. Si se tienen campos tipo group, deberán ir

...

  • como proyección. Si no se necesita (pero si hay parámetros posteriores), se puede pasar el valor en vacío []
  • sort: indica la ordenación que se aplica al datasource y se compone de un array

...

  • de JSON dos campos {"field":"fieldtosort","asc":true/false}

...

  • . Por ejemplo, una ordenación descendiente valida es

...

  • ésta; [{"field":"Restaurant.cuisine","asc":false}]. Si no se necesita (pero si hay parámetros posteriores) se puede pasar el valor en vacío []
  • offset: indica el offset aplicado al datasource

...

  • . Es un valor entero. Si no se necesita (pero si hay parámetros posteriores), se puede pasar el valor -1
  • limit: indica el límite aplicado al datasource

...

  • . Es un valor entero. Si no se necesita (pero si hay parámetros posteriores), se puede pasar el valor -1
  • param: se pueden incluir parámetros en el datasource para, por ejemplo, sustituir dentro de una subquery un valor o

...

  • la parte que se requiera. Hay que tener en cuenta que este parámetro habilita un

...

  • inyección SQL, por lo que hay que usarlo de forma controlada. El parámetro en el datasource vendrá definido con la notación {$param}, por ejemplo:
Code Block
languagesql
SELECT t1.pt as pt
FROM 
(select * from translations) as t1,
(select * from translations) as t2
where t1.{$cdest}=t2.id

Se compone de un array de

...

JSON con dos campos {"field":"paramtoverwrite","value":"value"}, por ejemplo: [{"field":"cdest","value":"United States"}]

  • debug: sólo habilitado para el modo desarrollo (para visualización habrá que quitarlo)

...

  • . Por defecto a false. Si se habilita la respuesta del motor, devuelve la query generada para su depuración.


Realizaremos a continuación un ejemplo de uso:

Crearemos Crea inicialmente dos datasources, uno con la ontología HelsinkiPopulation y otro con la ontología Restaurants:

En un dashboard crearemos , crea un gadget template.

Accedemos Accede a la edición del gadget:

y escribimos escribe en la caja de texto de HTML:

Code Block
<!-- Write your HTML <div></div> and CSS <style></style> here -->

<!--Focus here and F11 to full screen editor--> 

<h2>HELSINKIDATA </h2>
{{vm.helsinkiData}} 

<br><h2>RESTAURANTSDATA </h2>
{{vm.restaurantsData}} 


y en la caja de texto JAVASCRIPT:

Code Block
//Write your controller (JS code) code here

//Focus here and F11 to full screen editor


//This function will be call once to init components
vm.initLiveComponent = function(){   
   vm.getDataFromDataSource('helsinki',vm.callbackFunctionHelsinki,[{field:'Helsinki.year',op:'=',exp:'2000'}]);
   vm.getDataFromDataSource('restaurants',vm.callbackFunctionRestaurants);
}; 


vm.callbackFunctionHelsinki = function (data){ 
  vm.helsinkiData = data;
  console.log(vm.helsinkiData);
}

vm.callbackFunctionRestaurants = function (data){ 
  vm.restaurantsData = data;
  console.log(vm.restaurantsData);
}

//This function will be call when data change. On first execution oldData will be null
vm.drawLiveComponent = function(newData, oldData){
};

//This function will be call on element resize
vm.resizeEvent = function(){

}

//This function will be call when element is destroyed
vm.destroyLiveComponent = function(){

};



En el caso de que desees pasar una cadena en el filtro se desee pasar una cadena la pasaríamos , pásala escapando las comillas de esta forma: exp:'\'TEXTO\'' 

Para hacer un filtro sobre fechas podemos , puedes usar este formato: [{field: 'FECHA', op: '<=' , exp: "TIMESTAMP('2011-01-02T00:00:00.000Z')"}]


Datasource

...

API Chaining y operaciones con promise (

...

a partir de la versión Empire):

A partir de esta versiónla versión 1.6.0-Empire, se dispone la posibilidad de usar un API más ágil, basada en promesas. Desde cualquier template se tienen , tienes las siguientes operaciones:

  • vm.get('datasource',params): sólo se tiene requerido el id del datasource. Params será una estructura

...

  • JSON con todas las operaciones embebidas, por ejemplo:

{"limit":3,"offset":4}

Se devuelve una promesa por lo que se puede operar con la misma por ejemplo:


Code Block
vm.get("DsRawRestaurants").then(
	data => console.log(data)
)


o (si se necesita retrocompatibilidad con navegadores antiguos)

Code Block
vm.get("DsRawRestaurants").then(
	function(data){
		console.log(data)
	}
)
  • vm.getOne('datasource'): caso especial del anterior (vm.get(datasourcename,{"limit":1})) en el que sólo

...

  • se quiere un

...

  • valor .
  • vm.from('datasource')...: con esta función

...

  • , accederás al Api Chaining de los datasource que también devuelve una promesa

...

  • . Tiene esta estructura:

vm.from(datasource).(chaining operations).exec();

...

Code Block
vm.from("restaurants")
	.project([{"field":"Restaurant.cuisine","alias":"cui"},{"field":"Restaurant.cuisine","alias":"coun","op":"count"}])
	.group("Restaurant.cuisine") //o se puede poner varios como ["Restaurant.cuisine","Restaurant.borough"] 
    .exec()
    .then(
		function(data){
			vm.data = data;
		});

y en el html podemos poner pongo puedes poner el {{vm.data}} para ver el resultado de la consulta.

...