---
title: "Soporte de Queries en el Rules Engine"
canonical: "https://onesaitplatform-es.refined.site/space/DOC/2216824700/Soporte%20de%20Queries%20en%20el%20Rules%20Engine"
format: markdown
---
> Macro (toc)

> ℹ️ Disponible a partir de la versión 3.0.0

Desde hace ya tiempo es posible crear reglas de negocio en la plataforma gracias al módulo Rules Engine

En este Q1 hemos metido varias mejoras significativas en este módulo, cómo el **[soporte de Tablas de Decisión](https://onesaitplatform.atlassian.net/wiki/spaces/DOC/pages/2216824615)**, un **nuevo wrapper para poder ejecutar queries** sobre ontologías de manera muy sencilla dentro de la regla y la posibilidad de **[cargar un JSON desde un fichero en la parte de testeo](https://onesaitplatform.atlassian.net/wiki/spaces/DOC/pages/2216824751)** de las reglas.

# Soporte de Queries

Para la ejecución de queries sobre Ontologías en la regla, se utiliza una clase Wrapper (**QueryWrapper**), este Wrapper tiene que ser importado en la regla para poder ser usado.

Para poder operar con esta nueva clase hay que tener en cuenta que la conexión se realizará a través de un **Digital Client**, por lo que solo las ontologías asociados al Digital Client utilizado podrán ser consultadas. Para crear un objeto **QueryWrapper** necesitamos indicar:

- **Ontología** que queremos consultar
- **Query** a ejecutar
- **Digital Client** en el que tenemos la Ontología asociada
- **Token** del Digital Client
- **URL de conexión** para especificar el entorno en el que se está trabajando

```java
QueryWrapper queryWrapper = new QueryWrapper(<ontologyName>, <query>, <digitalClientName>, <token>, <URL_conection>);
```

> ℹ️ En el caso de que el Digital Client no tenga permisos sobre la Ontología consultada o que la Query de error, la regla no se ejecutará

Una vez creado el objeto **queryWrapper** procedemos a ejecutar la query, para ello basta con llamar al método **run()**

```java
queryWrapper.run();
```

Una vez ejecutada la query, en el parámetro **queryResult** del objeto queryWrapper tendremos el resultado de la Query, que será una lista de **OntologyJsonWrapper**. 

```java
List<OntologyJsonWrapper> result = queryWrapper.getQueryResult();
```

## Ejemplo regla definida en DRL

Vamos a analizar el siguiente ejemplo:

```java
package com.minsait.onesait.platform.rulesengine;
import com.minsait.onesait.platform.rulesengine.model.OntologyJsonWrapper;
import com.minsait.onesait.platform.rulesengine.model.QueryWrapper;
global com.minsait.onesait.platform.rulesengine.model.OntologyJsonWrapper output;

dialect  "mvel"

function Boolean existEmployee(Object id){
   QueryWrapper queryWrapper = new QueryWrapper("employee", "select * from employee as c where c.employee.id = " + Integer.parseInt(id.toString()), "client", "917069adcdf94d96832e711acc9c6631", "http://localhost:19000");
   queryWrapper.run();
   return !queryWrapper.getQueryResult().isEmpty();
}

rule "Create new employee"

    when
        input: OntologyJsonWrapper()
        eval( !existEmployee(input.getProperty("id")))
    then
    	
        output.setRootNode("employee")
        output.setProperty("id", input.getProperty("id"));
        output.setProperty("rol", "Consultant");
end

```

- *Línea 2 y 3*: se importan los Wrappers
- *Línea 4*: se define la variable global **output**
- *Línea 8:* se define la función **existEmployee**, donde se lanza una query sobre la ontología **employee** para consultar si existe un empleado con un determinado identificador
- *Línea 18*: se evalúa el resultado de la función **existEmployee** para el parámetro **id** de la variable **input. **En el caso de que no exista el empleado seleccionado, se ejecuta la regla y se crea el empleado en la ontología destino.

## Ejemplo regla definida en DDT

También se puede utilizar este nuevo Wrapper en las Tablas de Decisión. A continuación, vemos el mismo ejemplo anterior pero esta vez definido con una Tabla de Decisión:

![image](media://8f21b0c8-cfa1-434d-a27b-9bb63409b8a3)