Guía Avanzada de VQL - Denodo Platform Help

Anuncio
VIRTUAL DATAPORT 4.0 GUÍA AVANZADA DE VQL
NOTA
Este documento es confidencial y propiedad de denodo technologies (en
adelante denodo).
Ninguna de las partes del documento puede ser copiada, fotografiada,
fotocopiada, transmitida electrónicamente, almacenada en un sistema de
gestión documental o reproducida mediante cualquier otro mecanismo sin la
autorización previa o por escrito de denodo.
copyright © 2007
Queda prohibida la reproducción total o parcial de este documento sin la autorización por escrito de denodo technologies
Virtual DataPort 4.0
Guía Avanzada de VQL
ÍNDICE
PREFACIO...........................................................................................................................................................................I
ALCANCE .....................................................................................................................................................................I
QUIÉN DEBERÍA USAR ESTE DOCUMENTO..........................................................................................................I
RESUMEN DE CONTENIDOS....................................................................................................................................I
1
INTRODUCCIÓN ..................................................................................................................................... 2
2
2.2
VIRTUAL DATAPORT A VISTA DE PÁJARO....................................................................................... 3
CREACIÓN O DEFINICIÓN DE DATOS ................................................................................................ 3
Definición de relaciones base................................................................................................................... 3
Definición de datasources y wrappers ..................................................................................................... 5
Definición de las vistas del esquema global ............................................................................................ 6
EJECUCIÓN DE SENTENCIAS.............................................................................................................. 7
3.1
3.2
3.3
3.4
CARACTERÍSTICAS................................................................................................................................ 9
TIPOS DE DATOS ................................................................................................................................... 9
INTERNACIONALIZACIÓN.................................................................................................................. 10
CAPACIDADES DE CONSULTA.......................................................................................................... 11
REGLAS DE REESCRITURA................................................................................................................. 11
2.1
2.1.1
2.1.2
2.1.3
3
4
4.1
4.2
4.3
4.4
4.5
4.6
4.6.1
4.6.2
4.6.3
4.6.4
4.6.5
4.6.6
4.7
4.8
4.8.1
5
5.1
5.2
5.2.1
5.2.2
5.2.3
5.3
5.3.1
5.3.2
LENGUAJE DE DEFINICIÓN Y MANEJO DE DATOS: VQL ............................................................. 12
SENTENCIAS ........................................................................................................................................ 12
SENTENCIA SELECT: CLÁUSULAS.................................................................................................... 13
INSERT / UPDATE /DELETE: CLÁUSULAS........................................................................................ 13
OPERADORES LÓGICOS...................................................................................................................... 14
OPERADORES DE COMPARACIÓN ................................................................................................... 15
FUNCIONES DE ATRIBUTO DERIVADO Y CONDICIONES............................................................. 18
Funciones Aritméticas............................................................................................................................. 18
Funciones de Manejo de Texto............................................................................................................... 19
Funciones de Manejo de Fechas............................................................................................................. 21
Funciones de Conversión de Tipos.......................................................................................................... 22
Funciones de manejo de XML................................................................................................................. 23
Otras funciones ....................................................................................................................................... 24
FUNCIONES DE AGREGACIÓN .......................................................................................................... 25
CONVENCIONES DE SINTAXIS ......................................................................................................... 26
Sintaxis de funciones y valores de condiciones ..................................................................................... 28
CREACIÓN DE UNA RELACIÓN BASE (O VISTA BASE)................................................................. 30
MODIFICACIÓN DE UNA RELACIÓN BASE ..................................................................................... 30
CAPACIDADES DE CONSULTA: MÉTODOS DE BÚSQUEDA Y WRAPPERS............................... 32
Restricciones de Consulta....................................................................................................................... 32
Asignación de Wrappers a Métodos de Búsqueda ................................................................................ 33
Ejemplo de Creación de un Método de Búsqueda.................................................................................. 33
REGLAS DE REESCRITURA................................................................................................................. 34
Reglas de Reescritura de Entrada........................................................................................................... 34
Reglas de Reescritura de Salida............................................................................................................. 37
Virtual DataPort 4.0
6
6.1
6.1.1
6.1.2
6.2
6.2.1
6.3
6.3.1
6.4
6.4.1
6.5
6.6
6.6.1
6.7
6.8
6.9
7
7.1
7.1.1
8
8.1
8.2
8.3
8.4
9
Guía Avanzada de VQL
CONSULTAS: SENTENCIA SELECT ................................................................................................... 39
CLÁUSULA FROM................................................................................................................................. 41
Operaciones de join ................................................................................................................................ 41
FLATTEN VIEW (Aplanando estructuras de datos) ................................................................................. 42
CLÁUSULA SELECT.............................................................................................................................. 43
Atributos Derivados ................................................................................................................................ 44
CLÁUSULA WHERE.............................................................................................................................. 44
Condiciones con valores compuestos..................................................................................................... 45
CLÁUSULA GROUP BY ........................................................................................................................ 45
Uso de Funciones de Agregación............................................................................................................ 46
CLÁUSULA HAVING............................................................................................................................. 46
CLÁUSULA UNION............................................................................................................................... 47
Especificación de proyecciones en consultas UNION ............................................................................ 47
CLÁUSULA ORDER BY......................................................................................................................... 47
CLÁUSULA CONTEXT .......................................................................................................................... 48
CLÁUSULA TRACE ............................................................................................................................... 49
DEFINICIÓN DE UNA VISTA DERIVADA .......................................................................................... 52
MODIFICACIÓN DE UNA VISTA DERIVADA.................................................................................... 53
Reglas de Reescritura Sobre Vistas Derivadas ...................................................................................... 54
INSERCIONES, ACTUALIZACIONES Y BORRADOS SOBRE VISTAS ........................................... 56
SENTENCIA INSERT ............................................................................................................................ 56
SENTENCIA UPDATE........................................................................................................................... 57
SENTENCIA DELETE ............................................................................................................................ 58
USO DE WITH CHECK OPTION .......................................................................................................... 58
TRANSACCIONES EN DATAPORT .................................................................................................... 60
10
10.1
10.2
10.3
10.4
PROCEDIMIENTOS ALMACENADOS................................................................................................ 61
IMPORTACIÓN DE UN PROCEDIMIENTO ALMACENADO............................................................ 61
USO DE PROCEDIMIENTOS ALMACENADOS................................................................................. 61
CREACIÓN DE NUEVOS PROCEDIMIENTOS ALMACENADOS .................................................... 62
PROCEDIMIENTOS PREDEFINIDOS.................................................................................................. 64
11.1
11.2
DEFINICIÓN DE OTROS ELEMENTOS DEL CATÁLOGO ................................................................. 65
DEFINICIÓN DE UN TIPO DE DATO................................................................................................... 65
DEFINICIÓN DE UN MAPA ................................................................................................................. 66
12.1
12.2
12.2.1
12.2.2
12.3
12.3.1
12.3.2
12.3.3
12.3.4
CREACIÓN DE BASES DE DATOS, USUARIOS Y PERMISOS ....................................................... 68
BASES DE DATOS EN VIRTUAL DATAPORT ................................................................................... 68
ESTRUCTURA DE USUARIOS Y PERMISOS EN VIRTUAL DATAPORT........................................ 68
Tipos de usuarios .................................................................................................................................... 68
Tipos de permisos ................................................................................................................................... 68
SENTENCIAS VQL DE BASES DE DATOS, USUARIOS Y PERMISOS .......................................... 70
Creación de Bases de Datos ................................................................................................................... 70
Modificación y Borrado de Bases de Datos............................................................................................ 70
Creación de usuarios............................................................................................................................... 71
Modificación y Borrado de usuarios ....................................................................................................... 72
11
12
Virtual DataPort 4.0
Guía Avanzada de VQL
12.3.5 Cambio de Base de Datos Activa............................................................................................................ 72
12.3.6 Modificación de los privilegios de un usuario........................................................................................ 73
13
13.1
DESCRIPCIÓN DE ELEMENTOS DEL CATÁLOGO ........................................................................... 76
EXPORTACIÓN DE METADATOS....................................................................................................... 77
14
LISTADO DE ELEMENTOS DEL CATÁLOGO..................................................................................... 78
15
ELIMINACIÓN DE ELEMENTOS DEL CATÁLOGO ........................................................................... 80
16
16.1
16.2
OTROS COMANDOS ............................................................................................................................ 82
BORRADO DE ENTRADAS DE LA CACHÉ DEL DICCIONARIO DE DATOS .................................. 82
COMANDO DE AYUDA........................................................................................................................ 82
17
GENERACIÓN DE WRAPPERS Y DATASOURCES .......................................................................... 84
17.1
CONVERSIONES VÁLIDAS ENTRE TIPOS EN LOS WRAPPERS Y VDP....................................... 85
17.1.1 Conversiones de tipo nativo de un wrapper a tipos Java ...................................................................... 85
17.2
ESPECIFICACIÓN DE RUTAS EN VIRTUAL DATAPORT................................................................. 88
17.3
CREACIÓN DE DATASOURCES.......................................................................................................... 90
17.3.1 DataSources JDBC.................................................................................................................................. 90
17.3.2 DataSources ODBC ................................................................................................................................. 93
17.3.3 DataSources para Servicios Web ........................................................................................................... 95
17.3.4 DataSources XML ................................................................................................................................... 96
17.3.5 DataSources DF....................................................................................................................................... 96
17.3.6 DataSources Denodo Aracne.................................................................................................................. 98
17.3.7 DataSources Google Mini....................................................................................................................... 98
17.3.8 DataSources LDAP .................................................................................................................................. 99
17.3.9 DataSources Custom............................................................................................................................... 99
17.3.10 Propiedades de Configuración de Fuentes de Datos............................................................................ 100
17.4
CREACIÓN DE WRAPPERS............................................................................................................... 105
17.4.1 Contexto de Ejecución y Cadenas de Interpolación.............................................................................. 105
17.4.2 Metainformacion de un wrapper .......................................................................................................... 105
17.4.3 Wrapper JDBC ...................................................................................................................................... 106
17.4.4 Wrapper ODBC...................................................................................................................................... 108
17.4.5 Wrapper ITPilot ..................................................................................................................................... 109
17.4.6 Wrapper de Servicios Web................................................................................................................... 112
17.4.7 Wrapper XML........................................................................................................................................ 114
17.4.8 Wrapper DF ........................................................................................................................................... 116
17.4.9 Wrapper Denodo Aracne ...................................................................................................................... 117
17.4.10 Wrapper Google Mini ........................................................................................................................... 120
17.4.11 Wrapper CUSTOM ................................................................................................................................ 123
17.4.12 Propiedades de Configuración de Wrappers ........................................................................................ 126
17.5
SENTENCIAS DE CONSULTA DE WRAPPERS .............................................................................. 128
18
CARACTERÍSTICAS AVANZADAS................................................................................................... 130
GESTIÓN DE VALORES DE TIPOS COMPUESTOS........................................................................ 130
Manejo de Tipos Compuestos: Ejemplo ............................................................................................... 131
OPTIMIZACIÓN DE CONSULTAS .................................................................................................... 135
Optimización de Operaciones de join ................................................................................................... 135
Uso de la Cache .................................................................................................................................... 139
Configuración de Políticas de “Swapping”........................................................................................... 140
18.1
18.1.1
18.2
18.2.1
18.2.2
18.2.3
Virtual DataPort 4.0
Guía Avanzada de VQL
18.3
CREACIÓN DE CONFIGURACIONES DE INTERNACIONALIZACIÓN.......................................... 141
18.3.1 Acceso y Mantenimiento de la Información de Cambio de Divisas..................................................... 144
18.4
CONTEXTO DE EJECUCIÓN DE UNA CONSULTA Y CADENAS DE INTERPOLACIÓN ............ 144
19
19.1
19.1.1
19.1.2
19.1.3
19.1.4
19.1.5
19.2
19.2.1
19.2.2
APÉNDICES......................................................................................................................................... 146
SINTAXIS DE EXPRESIONES DE BÚSQUEDA DEL OPERADOR CONTAINS ............................ 146
Términos y Frases exactas.................................................................................................................... 146
Modificadores de términos................................................................................................................... 146
Operadores Booleanos.......................................................................................................................... 148
Agrupaciones ........................................................................................................................................ 148
Escapar caracteres especiales.............................................................................................................. 148
SOPORTE PARA EL OPERADOR CONTAINS DE CADA TIPO DE FUENTE................................. 148
Aracne ................................................................................................................................................... 148
Google Mini........................................................................................................................................... 149
BIBLIOGRAFÍA ............................................................................................................................................................. 150
Virtual DataPort 4.0
Guía Avanzada de VQL
ÍNDICE DE FIGURAS
Figura 1
Figura 2
Figura 3
Figura 4
Figura 5
Figura 6
Figura 7
Figura 8
Figura 9
Figura 10
Figura 11
Figura 12
Figura 13
Figura 14
Figura 15
Figura 16
Figura 17
Figura 18
Figura 19
Figura 20
Figura 21
Figura 22
Figura 23
Figura 24
Figura 25
Figura 26
Figura 27
Figura 28
Figura 29
Figura 30
Figura 31
Figura 32
Figura 33
Figura 34
Figura 35
Figura 36
Figura 37
Figura 38
Figura 39
Figura 40
Figura 41
Figura 42
Figura 43
Figura 44
Figura 45
Figura 46
Figura 47
Figura 48
Figura 49
Figura 50
Figura 51
Figura 52
Formulario de búsqueda para una tienda de libros .................................................................................. 5
Método de búsqueda para una tienda de libros....................................................................................... 5
Primitivas básicas para la especificación de sentencias VQL................................................................ 28
Reglas para la formación de funciones .................................................................................................. 29
Sintaxis de la sentencia CREATE TABLE ........................................................................................ 30
Ejemplo de creación de una vista base .................................................................................................. 30
Sintaxis de la sentencia ALTER TABLE ........................................................................................... 32
Ejemplo de creación de un método de búsqueda con ALTER TABLE ............................................. 33
Adición de una regla de reescritura de entrada REGEXP() .............................................................. 36
Adición de una regla de reescritura sobre condiciones MAP()........................................................... 36
Adición de una regla de reescritura de entrada CHANGEOPERATOR()......................................... 37
Adición de una regla de reescritura de salida con la función MAP().................................................. 38
Sintaxis de la sentencia SELECT......................................................................................................... 40
Sintaxis de una FLATTEN view ............................................................................................................... 43
Sintaxis para una condición.................................................................................................................... 44
Sintaxis para una proyección sobre el resultado de una unión.............................................................. 47
Sintaxis de la cláusula CONTEXT ........................................................................................................ 49
Traza de ejecución .................................................................................................................................. 51
Sintaxis de la sentencia CREATE VIEW ........................................................................................... 52
Ejemplo de definición de una vista en función de otras......................................................................... 53
Sintaxis de la sentencia ALTER VIEW.............................................................................................. 54
Adición de una regla de reescritura de entrada sobre vista derivada ................................................... 55
Borrado de una regla de reescritura de salida de una vista no base..................................................... 55
Adición de una reescritura sobre resultados en una vista derivada ...................................................... 55
Sintaxis de la sentencia INSERT......................................................................................................... 56
Sintaxis de la sentencia UPDATE......................................................................................................... 57
Sintaxis de la sentencia DELETE......................................................................................................... 58
Sintaxis de CREATE PROCEDURE .................................................................................................. 61
Sintaxis de ALTER PROCEDURE ..................................................................................................... 61
Sintaxis de la sentencia CALL .............................................................................................................. 61
Sintaxis de la sentencia CREATE TYPE ........................................................................................... 65
Creación de un tipo de dato enumerated ............................................................................................... 65
Creación de un tipo de dato register ...................................................................................................... 66
Creación de un tipo de dato array y del tipo register que contiene ...................................................... 66
Sintaxis de la sentencia CREATE MAP.............................................................................................. 66
Creación de un mapa de tipo inputrewrite ............................................................................................. 67
Sintaxis de la sentencia CREATE DATABASE ................................................................................ 70
Sintaxis de la sentencia ALTER DATABASE ................................................................................... 71
Sintaxis de la sentencia CREATE USER ........................................................................................... 72
Sintaxis de la sentencia ALTER USER.............................................................................................. 72
Sintaxis de las sentencias CONNECT y CLOSE ................................................................................. 73
Sintaxis de las cláusulas GRANT/REVOKE para Bases de Datos...................................................... 73
Sintaxis de las cláusulas GRANT/REVOKE para Bases de Datos...................................................... 74
Sintaxis de las cláusulas GRANT/REVOKE para vistas...................................................................... 75
Ejemplo de asignación de privilegios a usuarios.................................................................................... 75
Sintaxis de la sentencia DESC .............................................................................................................. 76
Sintaxis de la sentencia LIST .............................................................................................................. 78
Sintaxis de la sentencia DROP .............................................................................................................. 80
Sintaxis de la sentencia CLEAR CACHE ........................................................................................... 82
Sintaxis de la sentencia HELP .............................................................................................................. 83
Sentencia que solicita ayuda sobre el comando ALTER TABLE ..................................................... 83
Sintaxis de la sentencia de creación de un datasource JDBC ............................................................... 92
Virtual DataPort 4.0
Figura 53
Figura 54
Figura 55
Figura 56
Figura 57
Figura 58
Figura 59
Figura 60
Figura 61
Figura 62
Figura 63
Figura 64
Figura 65
Figura 66
Figura 67
Figura 68
Figura 69
Figura 70
Figura 71
Figura 72
Figura 73
Figura 74
Figura 75
Figura 76
Figura 77
Figura 78
Figura 79
Figura 80
Figura 81
Figura 82
Figura 83
Figura 84
Figura 85
Figura 86
Figura 87
Figura 88
Figura 89
Figura 90
Figura 91
Figura 92
Figura 93
Figura 94
Figura 95
Figura 96
Figura 97
Figura 98
Figura 99
Figura 100
Figura 101
Figura 102
Figura 103
Figura 104
Figura 105
Guía Avanzada de VQL
Sintaxis de la sentencia de modificación de un datasource JDBC ........................................................ 93
Sintaxis de la sentencia de creación de un datasource ODBC............................................................... 95
Sintaxis de la sentencia de modificación de un datasource ODBC........................................................ 95
Sintaxis de la sentencia de creación de un datasource WS. ................................................................. 95
Sintaxis de la sentencia de modificación de un datasource WS. .......................................................... 95
Sintaxis de la sentencia de creación de un datasource XML................................................................. 96
Sintaxis de la sentencia de modificación de un datasource XML.......................................................... 96
Sintaxis de la sentencia de creación de un datasource DF.................................................................... 97
Sintaxis de la sentencia de modificación de un datasource DF............................................................. 98
Sintaxis de la sentencia de creación de un datasource Aracne............................................................. 98
Sintaxis de la sentencia de modificación de un datasource Aracne...................................................... 98
Sintaxis de la sentencia de creación de un datasource Google Mini .................................................... 98
Sintaxis de la sentencia de modificación de un datasource Google Mini ............................................. 99
Sintaxis de la sentencia de creación de un datasource LDAP ............................................................... 99
Sintaxis de la sentencia de modificación de un datasource LDAP ........................................................ 99
Sintaxis de la sentencia de creación de un datasource Custom.......................................................... 100
Sintaxis de la sentencia de modificación de un datasource Custom................................................... 100
Ejemplo de modificación de configuración de un datasource. ............................................................. 103
Sintaxis de creación de un wrapper JDBC ........................................................................................... 106
Sintaxis de modificación de un wrapper JDBC .................................................................................... 107
Sintaxis de creación de un wrapper ODBC........................................................................................... 108
Sintaxis de modificación de un wrapper ODBC.................................................................................... 109
Sintaxis de creación de un wrapper de tipo ITPilot.............................................................................. 110
Sintaxis de modificación de un wrapper de tipo ITPilot....................................................................... 110
Ejemplo de wrapper ITPIlot 4.0............................................................................................................. 111
Ejemplo de creación de un wrapper ITPilot ......................................................................................... 112
Sintaxis de creación de un wrapper de servicios Web ........................................................................ 113
Sintaxis de modificación de un wrapper de servicios Web ................................................................. 113
Sintaxis de creación de un wrapper XML............................................................................................ 115
Sintaxis de modificación de un wrapper XML..................................................................................... 115
Sintaxis de creación de un wrapper DF ............................................................................................... 116
Sintaxis de modificación de un wrapper DF ........................................................................................ 117
Sintaxis de creación de un wrapper Denodo Aracne .......................................................................... 118
Ejemplo de creación de un wrapper Denodo Aracne ........................................................................... 119
Sintaxis de modificación de un wrapper Denodo Aracne ................................................................... 120
Sintaxis de creación de un wrapper Google Mini ............................................................................... 122
Ejemplo de creación de un wrapper Google Mini ................................................................................ 122
Sintaxis de modificación de un wrapper Google Mini ........................................................................ 123
Sintaxis de creación de un wrapper tipo CUSTOM .............................................................................. 126
Ejemplo de creación de un wrapper CUSTOM ..................................................................................... 126
Sintaxis de modificación de un wrapper tipo CUSTOM ....................................................................... 126
Ejemplo de configuración de un Wrapper CUSTOM ............................................................................ 128
Sintaxis de las sentencias de consulta de wrappers ........................................................................... 128
Sintaxis de la sentencias de consulta de wrappers ITPilot.................................................................. 129
Árboles de tipos compuestos................................................................................................................ 132
Tupla con elementos compuestos ........................................................................................................ 133
Árbol de valores de tipos compuestos.................................................................................................. 133
Creación de una relación base con tipos compuestos ......................................................................... 133
Creando un método de búsqueda con tipos compuestos..................................................................... 134
Adición de un método de búsqueda con tipos compuestos ................................................................. 134
Sintaxis de QUERYPLAN ................................................................................................................... 137
Árbol de definición de la vista V5........................................................................................................ 138
Internacionalización es_euro................................................................................................................ 144
Virtual DataPort 4.0
Guía Avanzada de VQL
ÍNDICE DE TABLAS
Tabla 1
Tabla 2
Tabla 3
Tabla 4
Tabla 5
Tabla 6
Tabla 7
Tabla 8
Conversiones de tipos permitidas con la función CAST ....................................................................... 23
Conversiones automáticas entre tipos JAVA y tipos Virtual DataPort .................................................. 85
Otras conversiones válidas entre tipos JAVA y tipos Virtual DataPort.................................................. 85
Conversiones de tipos JDBC................................................................................................................... 86
Conversiones de tipos ITPilot.................................................................................................................. 87
Conversiones de tipos de Web Services ................................................................................................ 87
Conversiones de tipos XML .................................................................................................................... 88
Caracteres reservados para el formato de una fecha .......................................................................... 143
Virtual DataPort 4.0
Guía Avanzada de VQL
PREFACIO
ALCANCE
Este documento proporciona una visión de Virtual DataPort desde el punto de vista del administrador avanzado.
QUIÉN DEBERÍA USAR ESTE DOCUMENTO
Este documento está dirigido a administradores y desarrolladores que quieran conocer con detalle cómo se realizan
todas las actividades de administración de una solución de integración basada en Virtual DataPort utilizando
directamente el lenguaje VQL. Se incluye la descripción de actividades tales como la definición de wrappers, la
elaboración de vistas unificadas a partir de las relaciones base o la especificación de mapas sobre los campos
integrados. La información detallada necesaria para instalar el sistema, administrarlo a través de herramientas
gráficas y/o desarrollar aplicaciones utilizando las APIs se proporciona en otros manuales que serán referenciados a
medida que sea necesario.
RESUMEN DE CONTENIDOS
Más concretamente, en este documento:
•
Se describen algunas características importantes de Virtual DataPort que es necesario conocer
previamente para comprender el resto del documento.
•
Se proporciona una visión general del lenguaje VQL.
•
Se muestra en detalle cómo se realizan las diferentes tareas de operación sobre el servidor Virtual
DataPort, es decir, cómo se definen y modifican los elementos del catálogo y cómo se realizan consultas
y/o modificaciones sobre el servidor.
Prefacio
i
Virtual DataPort 4.0
1
Guía Avanzada de VQL
INTRODUCCIÓN
Denodo Virtual DataPort es una solución global para la integración de fuentes de información heterogéneas y
dispersas en tiempo real.
Virtual DataPort utiliza el lenguaje VQL (Virtual Query Language) como lenguaje de consulta, actualización y
definición de datos. VQL permite crear, actualizar y manipular los elementos que constituyen el diccionario de datos
del sistema, así como la realización de consultas y actualizaciones sobre las vistas integradas de información. VQL es
un lenguaje muy similar a SQL pero que incluye además construcciones específicas para tratar con las peculiaridades
de un sistema de integración de información virtual en tiempo real.
En este documento se describe VQL y la forma de utilizarlo para realizar las labores de administración de Virtual
DataPort. Es importante resaltar que en general no es necesario utilizar VQL directamente. En la Guía del
Administrador [3] se describe el uso de las herramientas gráficas de Virtual DataPort, que permiten realizar la
mayoría de las labores de administración de forma gráfica.
Introducción
2
Virtual DataPort 4.0
2
Guía Avanzada de VQL
VIRTUAL DATAPORT A VISTA DE PÁJARO
En esta sección se proporciona una breve introducción a las etapas involucradas en la creación de aplicaciones de
integración de información utilizando Virtual DataPort.
Se asume que la creación de dichas aplicaciones se realizará en este caso utilizando directamente el lenguaje VQL.
Véase la Guía del Administrador [3] para una descripción de cómo realizar estas tareas de forma gráfica a través de
las herramientas de administración de Virtual DataPort. El modo gráfico es el recomendado para realizar las tareas
de administración.
En la operación de Virtual DataPort se pueden distinguir dos fases: una primera de creación o definición de datos y
una segunda de ejecución de las consultas y/o actualizaciones que especifica el usuario. En la primera fase se define
el modelo de datos unificado del sistema, es decir, se importan las fuentes a utilizar y se definen vistas que
combinan dicha información de la forma deseada. La segunda fase, la ejecución de consultas y/o actualizaciones,
constituye la operación normal del sistema, en la cual acepta sentencias expresadas en VQL sobre las vistas y las
resuelve extrayendo y combinando información de las fuentes y/o modificando información de éstas.
Los siguientes subapartados se ocupan, respectivamente, de cada una de estas fases.
2.1
CREACIÓN O DEFINICIÓN DE DATOS
Esta fase tiene como objetivo definir la estructura de las vistas o relaciones de las que constará el esquema global
de Virtual DataPort. Todas las tareas involucradas en la creación y administración de esquemas dentro del servidor
se describen detalladamente en secciones posteriores de este documento. En esta sección se proporciona tan solo
una visión general del proceso.
Para la definición de datos será necesario –en primer lugar- definir las relaciones base (también llamadas vistas
base) que representarán a las fuentes externas suministradoras de la información. Para ello es necesario especificar
un wrapper para la relación base, cuya misión será extraer información de la fuente e interpretar los resultados
devueltos por ella. Dependiendo del tipo de fuente utilizada, puede ser necesario como paso previo a la creación de
wrappers, la creación de un datasource. Los datasources encapsulan información de acceso a una fuente
determinada de forma que ésta puede ser reutilizada por los diferentes wrappers que actuen sobre la misma.
Una vez que las relaciones base ya puedan acceder a los datos de las fuentes, se definirán las vistas que componen
el esquema global mediante la composición y combinación de las relaciones base.
A continuación se describen brevemente estas operaciones.
2.1.1
Definición de relaciones base
Cada fuente en el sistema se modelará como un conjunto de relaciones base exportadas por la misma. Cada relación
base estará compuesta de un conjunto de atributos, de manera similar a una tabla en una Base de Datos relacional
convencional.
Cada atributo de una relación pertenecerá a un tipo de dato. El tipo de un determinado atributo delimita qué
operadores de consulta pueden aplicarse sobre él, así como ciertas restricciones que los elementos de ese tipo
deben cumplir. Algunos tipos de datos usuales soportados por Virtual DataPort son: cadenas de caracteres, enteros,
divisas, fechas, etc. Están soportados también los tipos de dato array (para representar datos multi-valuados) y
register (para representar datos de tipo registro). Combinando estos dos tipos de dato, pueden también representarse
fácilmente en el modelo unificado estructuras de datos jerárquicas.
Virtual Dataport a Vista de Pájaro
3
Virtual DataPort 4.0
Guía Avanzada de VQL
Además, cada relación base describirá explícitamente sus capacidades de consulta mediante los denominados
métodos de búsqueda. Esto es necesario porque algunas fuentes de datos (e.g. fuentes web o servicios web) no
permiten realizar cualquier consulta sobre sus datos, sino que presentan interfaces limitadas para esos efectos (e.g.
formularios HTML o las operaciones definidas a través de un Servicio Web). Si una relación no tiene ningún método
de búsqueda, entonces no podrá realizarse ninguna consulta sobre ella.
Cada método de búsqueda estará compuesto por una serie de 5-uplas. Cada 5-upla representa una restricción que
una consulta determinada debe cumplir para que pueda ser ejecutada sobre la fuente utilizando ese método de
búsqueda.
El formato de una 5-upla es (atributo, operadores, obligatoriedad, multiplicidad, valores_posibles) donde:
•
atributo es un atributo de la relación.
•
operadores es el conjunto de operadores que puede ser utilizado en las consultas sobre esa fuente y con
ese método de búsqueda. ‘ANY’ representa a cualquier operador admitido por el tipo de dato del atributo.
•
obligatoriedad puede tomar tres valores: ‘OBL’ indica que el atributo debe obligatoriamente aparecer en
cualquier consulta sobre la fuente. ‘OPT’ indica que el atributo puede aparecer o no en la consulta (es
opcional) y ‘NOS’ indica que las consultas por ese atributo no están permitidas en la fuente.
•
multiplicidad indica por cuántos valores puede consultarse a la vez la fuente para el atributo y el
operador dados. Si no es posible realizar consultas por ese atributo (valor “NOS” en el campo
obligatoriedad) el valor es forzosamente 0. ‘ANY’ indica un número de valores mayor que 0 pero sin límite
superior.
•
valores_posibles es la lista de valores por los que puede consultarse el atributo. Si contiene el valor
‘ANY’ significa que el rango de búsqueda no está acotado (dentro del rango asociado al tipo de dato del
atributo) y puede consultarse el atributo por cualquier valor. Si el campo obligatoriedad está fijado en la 5upla al valor ‘NOS’, entonces forzosamente toma el valor de un conjunto vacío.
En fuentes tales como bases de datos relacionales habitualmente será permitida cualquier consulta. En ese caso las
relaciones base creadas a partir de dichas fuentes tendrán típicamente un único método de búsqueda con una 5-upla
por cada atributo de la relación. Cada 5-upla indicará que el atributo puede aparecer o no en las consultas (valor
‘OPT’ en obligatoriedad) y con cualquier multiplicidad (valor ‘ANY’ en multiplicidad).
En otras fuentes la situación puede ser diferente. Considérese el siguiente ejemplo.
Ejemplo: Consideremos el ejemplo de una tienda virtual de libros en Internet cuyo formulario de búsqueda es como
el mostrado en la Figura 1.
Virtual Dataport a Vista de Pájaro
4
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 1 Formulario de búsqueda para una tienda de libros
El formulario obliga al usuario a especificar un valor para el atributo TITLE y opcionalmente le permite fijar un
valor para el atributo AUTHOR y para el atributo FORMAT (restringido a un conjunto de valores). Las búsquedas por
título y autor son búsquedas por palabra clave (operador like). Una búsqueda por frase exacta (operador ‘=’) se
indica marcando la casilla adjunta a la caja de búsqueda del campo. Para cada atributo se permite la búsqueda
simultánea por un solo valor. Además de los campos TITLE, AUTHOR y FORMAT, supondremos que la tienda
devuelve en su salida un atributo PRECIO, por el que no se pueden realizar consultas directamente en el
formulario.
Modelaremos esta fuente como una relación R={TITLE,AUTHOR,FORMAT,PRICE} con un método de
búsqueda conteniendo las 5-uplas que se muestran en la Figura 2.
(TITLE,{like,=}, OBL, 1, Any)
(AUTHOR, {like,=}, OPT, 1, Any)
(FORMAT, {=}, OPT, 1,
{'All formats','Hardcover', 'eBooks', 'Paperbacks'})
(PRICE, {}, NOS, 0, {})
Figura 2 Método de búsqueda para una tienda de libros
Nótese que la primera 5-upla tenga el valor {like, =} en el campo operadores y OBL en el campo
obligatoriedad, no significa que sea obligatorio consultar el atributo TITLE con ambos operadores, sino
que es obligatorio consultarlo al menos con alguno de ellos. Si se quisiese representar que el atributo TITLE debe
aparecer obligatoriamente en la consulta con ambos operadores (no es posible en este formulario de ejemplo),
debería hacerse con dos 5-uplas diferentes para el atributo TITLE, una con cada operador:
{(TITLE, {like}, OBL, 1, ANY) (TITLE, {=}, OBL, 1, ANY)}.
Por tanto, como se ve, cuando se quiere diferenciar el tratamiento de un determinado atributo en función del
operador con el que se utiliza, puede haber más de una 5-upla por atributo.
2.1.2
Definición de datasources y wrappers
Para que una relación base pueda obtener datos de una fuente determinada es necesario crear y asignarle un
wrapper. Cada wrapper debe proporcionar acceso a los datos que componen una relación base en una fuente de
Virtual Dataport a Vista de Pájaro
5
Virtual DataPort 4.0
Guía Avanzada de VQL
manera que, de cara al servidor DataPort, se estructuren de manera similar a una tabla de una Base de Datos
Relacional. Más concretamente, cada wrapper debe proporcionar una visión de la fuente acorde al modelo de
relación base expuesto en el apartado anterior.
El proceso de generación de wrappers para fuentes tales como Bases de Datos JDBC/ODBC, Servicios web,
documentos XML, ficheros de texto delimitados o índices de información no estructurada, puede realizarse de
manera rápida y sencilla con la ayuda de la herramienta de administración de Denodo Virtual DataPort (ver [3]).
Normalmente es necesario crear previamente un datasource para la fuente, que encapsulará información de acceso a
la misma reutilizable por los diferentes wrappers que actúen sobre ella.
La creación de wrappers para fuentes web semi-estructuradas puede realizarse de forma totalmente gráfica con
Denodo ITPilot (ver [6]). Es posible también crear wrappers para aplicaciones específicas utilizando el tipo de wrapper
Custom.
Si se desea crear los datasources y wrappers directamente mediante VQL, sin ayuda de la herramienta de
administración, en la sección 17 de este documento se describe cómo hacerlo. En general, el uso de la herramienta
de administración es fuertemente recomendado para estas tareas ya que el proceso es más sencillo y automático.
Una vez creado el wrapper para una fuente, basta asociarlo al método de búsqueda o métodos de búsqueda
deseados de la relación base que representa a dicha fuente en el sistema (véase sección 5). En ese momento ya
podremos realizar consultas sobre la relación base.
2.1.3
Definición de las vistas del esquema global
Una vez definidas las relaciones base y construidos sus wrappers, cada relación del esquema global se define
mediante una consulta sobre las relaciones base, de forma similar a la definición de vistas en una Base de Datos
convencional.
Es importante destacar que en la definición de una vista, además de las relaciones base, pueden utilizarse también
vistas intermedias que se hayan definido previamente.
Ejemplo: Supónganse tres relaciones base
A = {TITLE, AUTHOR, FORMAT, PRICE},
B = {TITLE, AUTHOR, FORMAT, PRICE} y
C = {TITLE, AUTHOR, AVERAGE _RELEVANCE}.
A y B representan a dos tiendas electrónicas de libros en Internet. C representa a una fuente en la que sus usuarios
valoran libros y el sistema permite buscar la valoración media de un libro determinado. Supóngase que deseamos
obtener una relación del esquema global
R = {TITLE,AUTHOR,PRICE,AVERAGE_RELEVANCE),
que contenga todos los libros de A y B, junto con su valoración media según C y el valor mínimo encontrado para el
atributo PRICE, de entre las ocurrencias del libro encontradas en ambas fuentes. La definición de R podría hacerse
en los dos siguientes pasos:
1.
Creación de la vista bookview como la unión de A y B.
CREATE VIEW bookview AS
• SELECT * FROM A
• UNION
• SELECT * FROM B;
2.
Creación de la vista R como el join de bookview y C, aplicando una operación groupby para
seleccionar el precio mínimo para cada libro.
CREATE VIEW R AS
Virtual Dataport a Vista de Pájaro
6
Virtual DataPort 4.0
•
•
•
Guía Avanzada de VQL
SELECT TITLE, AUTHOR, AVERAGE_RELEVANCE,MIN(PRICE) AS MINIMUM
FROM bookview JOIN C ON ( bookview.TITLE = C.TITLE
AND bookview.AUTHOR = C.AUTHOR )
GROUP BY TITLE, AUTHOR;
Tal y como ya se ha comentado, las relaciones base pueden presentar limitaciones en sus capacidades de consulta,
que se expresan mediante métodos de búsqueda. Al crear vistas, Virtual DataPort es capaz de calcular
automáticamente sus métodos de búsqueda partiendo de los de las relaciones base y de la expresión utilizada para
definir la vista. Esto permite al sistema saber a priori si una determinada consulta va a poder ser contestada y
también hace posible que un servidor Virtual DataPort pueda ser utilizado como fuente para otro servidor Virtual
DataPort, facilitando así abordar proyectos de gran tamaño mediante un enfoque incremental.
2.1.3.1
Post-procesados
A la hora de considerar las capacidades de consulta de una fuente, es también preciso tener en cuenta que el
servidor Virtual DataPort puede realizar operaciones de post-procesado sobre los resultados obtenidos. A partir de
las restricciones de consulta de una fuente, aplicando post-procesados es posible obtener su lista de capacidades
como un superconjunto de ésta. Esta tarea la realiza de forma automática el servidor.
2.2
EJECUCIÓN DE SENTENCIAS
Una vez terminada la fase de creación, el sistema está preparado para aceptar consultas y/o actualizaciones; las
actualizaciones sólo pueden realizarse sobre vistas actualizables conforme al estándar SQL 92, las cuales son vistas
definidas sobre wrappers JDBC/ODBC o wrappers Custom. Los detalles sobre la manera en que las aplicaciones
externas pueden enviar y ejecutar sentencias sobre la Base de Datos Virtual se muestran en la Guía del Desarrollador
[5]. En esta sección, se proporciona tan solo una visión general del proceso de ejecución de consultas desde un punto
de vista interno.
Cuando se recibe una consulta VQL, el intérprete de consultas de Virtual DataPort comienza comprobando si la
consulta puede ser contestada en función de las capacidades de las vistas involucradas. Si la consulta no puede ser
contestada, el usuario es informado de ello. Si puede serlo, el proceso continúa.
Seguidamente el Generador de Planes del sistema crea todos los posibles planes de ejecución para la consulta. Los
planes diferirán normalmente entre sí en aspectos como el algoritmo utilizado para ejecutar los joins o los métodos
de búsqueda concretos seleccionados sobre las fuentes.
Es responsabilidad del módulo optimizador obtener el coste de cada uno de los planes, en función de diferentes
parámetros, de manera que pueda seleccionarse el mejor. Este proceso se ocupa, entre otras tareas, de distribuir de
forma óptima el procesamiento entre el servidor DataPort y las fuentes, delegando a las mismas, cuando sea posible,
operaciones tales como condiciones de selección, joins, uniones o agrupaciones. De esta forma puede minimizarse la
transferencia de datos por la red. Esta etapa también se ocupa de tareas tales cómo escoger el método más
adecuado para implementar operadores de join, de fijar la estrategia de swapping a disco de resultados muy grandes
o de gestionar el uso del módulo de cache. Véase la sección 18.2 para más detalle.
Una vez seleccionado el plan óptimo, el Motor de Ejecución se encarga de ponerlo en marcha. La ejecución de un
plan supondrá la ejecución de una serie de sub-consultas expresadas únicamente en términos de las relaciones base.
Estas subconsultas serán ejecutadas por el wrapper de la fuente correspondiente. Es remarcable la capacidad que
tiene Virtual DataPort de explotar al máximo las posibilidades de paralelismo, por lo que normalmente la ejecución
de las subconsultas se efectúa en paralelo.
Finalmente, el motor de ejecución combina los resultados devueltos por las fuentes de acuerdo a lo especificado por
el plan, obteniendo así la respuesta final a la consulta.
Virtual Dataport a Vista de Pájaro
7
Virtual DataPort 4.0
Guía Avanzada de VQL
Es importante destacar que el sistema funciona de manera asíncrona. Esto quiere decir que a medida que están
disponibles resultados de las fuentes, el sistema empieza a procesarlos, aunque las fuentes todavía no hayan
emitido una respuesta completa. Esto puede acelerar mucho los tiempos de obtención de las primeras tuplas del
resultado final (tiempos de respuesta). Otro aspecto importante, es que el sistema es capaz de tratar resultados
parciales, esto es: es capaz de procesar la consulta incluso si alguna de las fuentes está temporalmente inaccesible,
proporcionando los resultados que puedan obtenerse con el resto de fuentes.
Opcionalmente, pueden pre-cargarse o mantenerse todos o parte de los datos de las fuentes en la caché del sistema.
En ese caso, el sistema comprobará si la subconsulta recibida puede ser resuelta con los datos contenidos en la
caché. Si es así, obtiene la respuesta directamente de la misma en lugar de consultar a la fuente.
Virtual DataPort también soporta la ejecución de sentencias de actualización (INSERT / UPDATE /DELETE) sobre las
vistas, siempre que éstas sean actualizables de acuerdo a la definición estándar en SQL-92. Véase la sección 8 para
más detalle.
Virtual Dataport a Vista de Pájaro
8
Virtual DataPort 4.0
3
Guía Avanzada de VQL
CARACTERÍSTICAS
Virtual DataPort permite de manera rápida y sencilla, extraer y combinar en tiempo real información procedente de
múltiples fuentes heterogéneas estructuradas, semi-estructuradas y no estructuradas.
Virtual DataPort proporciona un lenguaje de definición y manejo de datos llamado Denodo VQL (Virtual Query
Language), cuya sintaxis es similar a SQL (Structured Query Language) con algunas extensiones necesarias para un
entorno de integración virtual de fuentes de información heterogéneas y distribuidas. Por ejemplo, VQL incluye
diversas construcciones que facilitan la consulta de información no estructurada y su combinación con información
estructurada.
En este apartado se describen algunas características importantes de Virtual DataPort que es necesario conocer
previamente para comprender el resto del documento.
•
En primer lugar, se describen cuáles son los tipos de datos existentes.
•
A continuación, se describen los mecanismos de internacionalización de los diferentes tipos de datos del
sistema.
•
Posteriormente, se introducen los mecanismos de representación de las capacidades de consulta de una
relación.
•
Por último, se introduce el sistema de reglas de reescritura, que permite solventar dificultades derivadas de
las heterogeneidades semánticas de las fuentes.
3.1
TIPOS DE DATOS
Virtual DataPort incluye en su catálogo un conjunto de tipos de datos predefinidos. Estos tipos se pueden dividir en
dos grupos: los tipos básicos y los tipos compuestos.
Los tipos de datos básicos soportados son:
•
int. Representa un número entero en el rango -2147483648 a 2147483647.
•
long: Representa un número entero en el rango -9223372036854775808 a 9223372036854775807.
•
float: Representa un número real en el rango 1.4E-45 a 3.4028235E38.
•
double. Representa un número real en el rango 4.9E-324 a 1.7976931348623157E308.
•
boolean: Representa un valor lógico, verdadero o falso (true | false).
•
text. Representa una cadena de caracteres.
Características
9
Virtual DataPort 4.0
•
date. Encapsula una fecha.
•
time. Representa un intervalo de tiempo o duración.
•
money. Representa una cantidad monetaria.
•
blob. Representa un elemento de datos binario.
•
xml. Representa un documento XML (o un fragmento de un documento XML).
Guía Avanzada de VQL
Los tipos de datos compuestos, que permiten la creación de nuevos tipos de datos, son los siguientes:
•
enumerated. Los atributos de este tipo pueden tomar como valor una cadena de caracteres de entre un
conjunto predefinido por el tipo de datos.
•
register. Tipo de dato que sirve para representar información que posee una estructura interna y
heterogénea, es decir, los campos en los que se subdivide el dato no son todos del mismo tipo.
•
array. Representa una lista –por tanto, importa el orden– de elementos de un mismo tipo register.
Como se verá mas adelante (ver secciones 11.1 y 18.1), Virtual DataPort permite la definición de tipos de datos
compuestos específicos que permiten modelar de forma natural elementos de datos jerárquicos como los utilizados
habitualmente en fuentes de datos tales como los Servicios Web o los documentos XML.
3.2
INTERNACIONALIZACIÓN
Virtual DataPort incorpora soporte para la integración de fuentes de datos procedentes de distintos países o ámbitos
geográficos expresando además los datos de salida en los formatos esperados por el país deseado.
Por ejemplo, Virtual DataPort incorpora soporte para comparar cantidades monetarias expresadas en monedas
diferentes mediante conversiones automáticas. De forma similar DataPort ofrece soporte para mostrar los resultados
de una consulta en una determinada zona horaria independientemente de la zona utilizada por las fuentes de datos
(e.g. en España, aunque se extraigan datos de fuentes inglesas, los resultados podrán mostrar las monedas, horas y
fechas correspondientes a España).
Para cada uno de los paises/localizaciones de los que pueden proceder los datos que maneja el servidor existe una
configuración de internacionalización, que se representa por medio de un mapa de tipo i18n (ver construcción de
mapas en el Apartado 11.2). Virtual DataPort incluye mapas ya creados para las configuraciones más habituales de
muchos paises. El nombre de dichas configuraciones utiliza el prefijo estándar definido en la norma ISO-3166 [2] (e.g.
España (es_euro), Reino Unido (gb), Francia (fr), Estados Unidos (us), etc.).
También es muy sencillo crear nuevas configuraciones de internacionalización. Véase la sección 18.3 para una
descripción detallada del proceso.
Por último, es importante tener en cuenta que el formato por defecto a utilizar para escribir constantes de tipo date,
money y double en las consultas sobre una vista viene fijado por la configuración de internacionalización que se esté
utilizando sobre la misma. Véase la sección 18.3 para más información sobre los distintos parámetros de una
configuración de internacionalización y la sección 13 para saber cómo consultar los parámetros asignados a una
configuración concreta. Por otro lado, la sección 4.6.3 describe diversas funciones para manejar fechas que pueden
ser útiles para expresar las fechas en el formato deseado.
Características
10
Virtual DataPort 4.0
3.3
Guía Avanzada de VQL
CAPACIDADES DE CONSULTA
En el contexto en el que funciona Virtual DataPort, puede ocurrir que las fuentes de información presenten
capacidades de consulta limitadas. Por ejemplo, la mayor parte de fuentes web sólo permiten la realización de
consultas que cumplan las restricciones impuestas por un determinado formulario HTML de consulta.
Por ello, el administrador debe especificar directamente las capacidades de consulta de las relaciones que
representan las fuentes del sistema (estas relaciones se llaman relaciones base). La descripción de las capacidades
de consulta en Virtual DataPort se realiza mediante los llamados métodos de búsqueda. Para cada relación base, el
administrador definirá uno o más métodos de búsqueda.
Los métodos de búsqueda de las vistas derivadas serán obtenidos automáticamente por el sistema partiendo de los
métodos de búsqueda de las relaciones base que intervienen en la vista y de la expresión utilizada para construirla,
por lo que el administrador no tiene que ocuparse de su definición en este caso.
3.4
REGLAS DE REESCRITURA
En ocasiones, fuentes diferentes pueden utilizar distintos formatos para representar el mismo tipo de contenidos
semánticos. Virtual DataPort incluye un sistema propio para el tratamiento de las representaciones heterogéneas de
información procedente de varias fuentes. Concretamente, se proporciona un mecanismo que permite reescribir las
consultas realizadas y los resultados obtenidos desde una fuente para adaptarlos al formato deseado.
Por ejemplo, supóngase que una determinada fuente A tiene un atributo que almacena el nombre del autor de un
libro utilizando un atributo con el formato de representación ‘Apellido, Nombre’ (e.g. ‘Smith, John’ o ‘de Cervantes,
Miguel’), mientras que otra fuente B utiliza un formato ‘Nombre Apellido’ (e.g. ‘John Smith’ o ‘Miguel de Cervantes’).
Además, cuando se realizan consultas por el atributo autor, ambas fuentes esperan que el nombre aparezca en la
consulta en su formato particular. Supóngase ahora que se desea usar Virtual DataPort para definir una vista unión
sobre A y B, a la que llamaremos C. Cuando el servidor reciba la consulta select * from C where
author = ’John Smith’, deberá emitir subconsultas a A y B para extraer de ambas fuentes los libros del
autor deseado y devolver el resultado. Sin embargo, para que la consulta pueda ser contestada correctamente por la
fuente A, será necesario incluir una regla de reescritura de consulta que transforme la cadena de caracteres ‘John
Smith’ en ‘Smith, John’.
De la misma forma que puede ser necesario reescribir consultas para tratar las heterogeneidades de representación
en las fuentes, puede ser necesario transformar los resultados recibidos desde ellas para que su representación se
adecue al formato deseado para las vistas del esquema global. La reescritura de resultados se realiza en Virtual
DataPort a través de las reglas de reescritura sobre resultados o de salida.
Continuando con el ejemplo anterior, la fuente A devolverá sus resultados con el atributo autor codificado en el
formato ‘Apellido, Nombre’, mientras que en la vista C se desea que todos los resultados estén en el formato
‘Nombre Apellido’. Por tanto, es necesaria una regla de reescritura de salida que realice la transformación en los
datos extraídos de A.
Las reglas de reescritura se aplican sobre métodos de búsqueda. El tipo de reglas de reescritura que pueden
aplicarse varía según el método de búsqueda pertenezca a una relación base o a una vista derivada. Véanse las
secciones 5.3 y 7.1.1 para más detalle.
Características
11
Virtual DataPort 4.0
4
Guía Avanzada de VQL
LENGUAJE DE DEFINICIÓN Y MANEJO DE DATOS: VQL
El lenguaje estructurado SQL (Structured Query Language), es un lenguaje de base de datos normalizado soportado
por la mayoría de los gestores de Base de Datos relacionales implantados en el mercado.
Virtual DataPort proporciona un lenguaje llamado Denodo VQL (Denodo Virtual Query Language) que extiende SQL
para dotarle de las capacidades necesarias para un entorno de integración distribuida utilizando el enfoque EII.
VQL, al igual que SQL, está compuesto por comandos, cláusulas, operadores y funciones. Estos elementos se
combinan en las instrucciones para crear, actualizar y manipular las bases de datos. Este apartado describe la
sintaxis de VQL.
4.1
SENTENCIAS
Existen dos tipos de sentencias:
•
•
Sentencias DDL (Data Definition Language), que permiten crear y definir nuevas relaciones, wrappers, etc.
Los comandos DDL son:
o
CREATE: Crea o reemplaza nuevas tablas (relaciones base), vistas, procedimientos
almacenados, wrappers, datasources, mapas, tipos, bases de datos y usuarios.
o
DROP: Elimina elementos como tablas (relaciones base), vistas, procedimientos almacenados,
wrappers, datasources, mapas, tipos, bases de datos y usuarios.
o
ALTER: Modifica propiedades específicas de una tabla (o relación base) como su configuración
de internacionalización, de caché, de “swapping”, reglas de reescritura, etc. También permite
realizar modificaciones sobre las descripciones de bases de datos y usuarios, la asignación de
permisos de acceso y creación a usuarios y la redefinición de procedimientos almacenados,
wrappers y datasources.
o
DESC: Muestra la descripción de tipos de datos, vistas, procedimientos almacenados mapas,
operadores, wrappers, datasources, bases de datos y usuarios definidos en el servidor. También
permite obtener una visión jerárquica de las dependencias de una vista (vistas sobre las que se
define junto con los operadores relacionales implicados), y las sentencias VQL requeridas para
reconstruir un elemento del catálogo.
o
LIST: Enumera los distintos elementos del catálogo (tipos de datos, vistas, etc.)
o
GRANT and REVOKE: Permiten establecer o revocar permisos para usuarios sobre bases de
datos, vistas y/o procedimientos almacenados.
Sentencias DML (Data Manipulation Language), que permiten consultar y actualizar datos. Virtual DataPort
dispone de las siguientes sentencias DML:
o
SELECT, para realizar consultas sobre el servidor.
Lenguaje de Definición y Manejo de Datos: VQL
12
Virtual DataPort 4.0
4.2
Guía Avanzada de VQL
o
INSERT, UPDATE y DELETE, para, respectivamente, realizar inserciones, actualizaciones y
borrados.
o
BEGIN, COMMIT, ROLLBACK, para, respectivamente, comenzar, confirmar y deshacer
una transacción.
o
CALL, para invocar procedimientos almacenados.
SENTENCIA SELECT: CLÁUSULAS
La sentencia SELECT es utilizada para ejecutar consultas y para definir nuevas vistas. Está compuesta por un
conjunto de cláusulas. Las cláusulas son condiciones impuestas sobre una sentencia que colaboran en la definición
de los datos que se desea definir, seleccionar o manipular. Las cláusulas que soporta el lenguaje son:
4.3
•
FROM: Permite especificar la relación o relaciones de la cuál se van a seleccionar los datos. Es posible
especificar subconsultas.También es posible especificar la invocación a un procedimiento almacenado.
•
WHERE: Especifica las condiciones que deben cumplir los datos que se desea seleccionar.
•
UNION: Permite realizar la unión de dos sentencias SELECT.
•
GROUP BY: Utilizada para agrupar los resultados obtenidos como respuesta a una consulta en función de
determinados campos denominados de agregación.
•
HAVING: La cláusula HAVING se utiliza para filtrar los registros devueltos por una consulta que utilice la
cláusula GROUP BY.
•
ORDER BY: Utilizada para ordenar los datos seleccionados, en base al atributo indicado.
•
CONTEXT: Utilizada para modificar determinadas opciones de configuración para la ejecución de una
consulta determinada.
•
TRACE: Permite obtener el plan de ejecución de una sentencia.
INSERT / UPDATE /DELETE: CLÁUSULAS
Las sentencias INSERT / UPDATE /DELETE permiten, respectivamente, insertar, modificar y borrar tuplas
de una vista, actualizando directamente la fuente de datos. Estas sentencias pueden ejecutarse sólo sobre vistas
creadas a partir de fuentes de tipo base de datos o de tipo CUSTOM. Además, las vistas deben ser actualizables de
acuerdo a la definición del estándar SQL-92 (ver sección 8).
La sentencia INSERT permite insertar una nueva tupla de datos en una vista, actualizando directamente la fuente
de datos. Soporta las siguientes cláusulas:
Lenguaje de Definición y Manejo de Datos: VQL
13
Virtual DataPort 4.0
Guía Avanzada de VQL
•
INTO: indica la vista sobre la que se realizará la inserción de datos y los atributos de la misma.
•
VALUES: indica el valor para cada atributo de la vista de la nueva tupla insertada.
•
SET: sintaxis alternativa al uso de la cláusula VALUES para especificar el valor de cada atributo de la
nueva tupla.
La sentencia UPDATE permite modificar una o varias tuplas de datos de una vista, actualizando directamente la
fuente de datos. Soporta las siguientes cláusulas:
•
UPDATE: permite indicar la vista a actualizar.
•
SET: permite indicar qué atributos de la vista serán modificados por la operación, así como el nuevo valor
que tomará cada uno de ellos.
•
WHERE: especifica la condición que deben cumplir las tuplas a actualizar.
La sentencia DELETE permite eliminar una o varias tuplas de una vista, actualizando directamente la fuente de
datos. Soporta las siguientes cláusulas:
•
FROM: permite indicar la vista a actualizar.
•
WHERE: especifica la condición que deben cumplir las tuplas a eliminar.
Todas las sentencias mencionadas soportan además las siguientes cláusulas:
•
CONTEXT: utilizada para modificar determinadas opciones de configuración para la ejecución de una
sentencia.
•
TRACE: permite obtener el plan de ejecución de una sentencia.
4.4
OPERADORES LÓGICOS
Los operadores lógicos se utilizan para combinar expresiones booleanas (que se evalúan a true o false), utilizadas
típicamente en una cláusula WHERE. Los operadores lógicos soportados son:
•
AND: Es el "y" lógico. Evalúa dos condiciones y devuelve un valor verdadero sólo si ambas son ciertas.
•
OR: Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdadero si alguna de las dos es cierta.
•
NOT: Es la negación lógica. Se aplica sobre una condición y niega su valor.
Lenguaje de Definición y Manejo de Datos: VQL
14
Virtual DataPort 4.0
4.5
Guía Avanzada de VQL
OPERADORES DE COMPARACIÓN
Un operador de este tipo devuelve el valor lógico true o false en función del resultado de evaluación sobre dos o más
operandos. Dependiendo de la naturaleza del operador, los operandos pueden tener que pertenecer a un tipo de
datos determinado. Cuando el operando derecho de un operador pueda tomar varios valores, estos deben
introducirse separados por comas (ver sección 4.8).
Los operadores soportados actualmente son:
•
‘<’: Recibe dos operandos que pueden ser de los tipos: int, long, float, double, date, time,
money. Se evalúa a true si el primer operando es menor que el segundo.
•
‘<=’: Se aplica sobre dos operandos de los mismos tipos que en el operador ‘<’ y se evalúa a true si el
primer operando es menor o igual que el segundo.
•
’>’: Recibe dos operandos que pueden ser de los tipos: int, long, float, double, date, time,
money. Comprueba si el primer operando es mayor que el segundo.
•
‘>=’: Se aplica sobre dos operandos de los mismos tipos que el operador ‘>’ y se evalúa a true si el
primer operando es mayor o igual que el segundo.
•
‘=’: Recibe dos operandos que pueden ser de los tipos: int, long, float, double, boolean,
text, enumerated, date, time, money, link. Evalúa la igualdad entre sus dos operandos.
•
‘<>’: Se aplica sobre los mismos tipos que el operador ‘=’ y se evalúa a true si el primer operando es
diferente del segundo.
•
‘like’: Admite como operandos 1 elemento de tipo text y una o más expresiones regulares.
Comprueba si la cadena de caracteres es conforme a todas las expresiones regulares recibidas. Cada
expresión regular debe seguir el formato estándar en SQL para las expresiones utilizadas con el operador
SQL like. Más concretamente, el carácter ‘%’ representa a un segmento de cualquier longitud dentro
una cadena de caracteres y el carácter ‘_’ representa a un segmento de longitud 1. Por ejemplo, la
expresión ‘%comercio_’ concuerda con cualquier cadena de caracteres que termine con la subcadena
‘comercio’seguida de un carácter cualquiera. Si se desea incluir los carácteres ‘%’ o ‘_’ como
parte de una subcadena constante, deben escaparse prefijándolos con el carácter ‘$’. Si se desea incluir el
carácter de escape debe escribirse ‘$$’.
Ejemplos: La primera consulta mostrada devuelve aquellas tuplas de la vista internet_inc cuyo
atributo summary contenga el texto ‘adsl’. La segunda exige que además contengan el texto ‘error’:
SELECT * FROM internet_inc WHERE summary like '%adsl%'
SELECT * FROM internet_inc WHERE summary like '%adsl%','%error%'
•
‘contains’: Admite como operandos 2 elementos de tipo text. El primer operando será un
atributo de tipo text procedente de un índice de información no estructurada externo (e.g. datasources
tipo Aracne y/o Google Mini). El segundo operando será una expresión de búsqueda booleana escrita en el
lenguaje de búsqueda sobre información no estructurada de DataPort.
Lenguaje de Definición y Manejo de Datos: VQL
15
Virtual DataPort 4.0
Guía Avanzada de VQL
La sintaxis del lenguaje de búsqueda sobre información no estructurada se describe en la sección 19.1. Sin
embargo, es necesario tener presente que las opciones de búsqueda disponible dependen de las
capacidades proporcionadas nativamente por la fuente de datos. Por ejemplo, Google Mini no soporta
diversas características del lenguaje de búsqueda como, por ejemplo, las búsquedas por proximidad. Por lo
tanto, cuando se utilice el operador contains con atributos procedentes de fuentes Google Mini, dichas
capacidades no estarán disponibles. La sección 19.2 detalla con exactitud las capacidades de búsqueda
soportadas para fuentes Google Mini y para fuentes Aracne. Los wrappers de tipo Custom que permitan el
acceso a otras fuentes de datos pueden especificar qué capacidades del lenguaje de búsqueda para
contains soportan a través de las Propiedades de Configuración (ver sección 17.3.10.1).
En el caso de vistas derivadas, las capacidades de búsqueda soportadas para un atributo son calculadas
por DataPort en función de las capacidades de los atributos de sus vistas base. Es posible ver las
capacidades de cada atributo haciendo uso de la sentencia DESC VIEW para consultar el valor de sus
Propiedades de Configuración (ver secciones 17.3.6 y 17.3.10.1).
Ejemplos: La siguiente consulta devuelve aquellas tuplas de la vista aracneview cuyo atributo
searchablecontent contenga las palabras ‘acme’ e ‘incorporated’:
SELECT * FROM aracneview WHERE searchablecontent contains 'acme
AND incorporated’
La siguiente consulta devuelve aquellas tuplas de la vista aracneview cuyo atributo
searchablecontent contenga la frase exacta “acme incorporated” y alguna palabra que
comience por ‘product’:
SELECT * from aracneview WHERE searchablecontent contains
'"acme incorporated "AND product*'
•
’containsor’: Admite como operandos 2 ó más elementos de tipo text. Comprueba si la primera
cadena contiene al menos una de las restantes cadenas que recibe.
•
‘isContained’: Admite como operandos 2 o más elementos de tipo text. Comprueba si la primera
cadena está contenida en todas las restantes cadenas que recibe.
•
‘is not NULL’: Se aplica sobre un único operando, que puede pertenecer a los siguientes tipos de
dato: int, long, float, double, boolean, text, enumerated, date, time, money
y link. Comprueba si el valor no es nulo, es decir, si tiene algún valor.
•
‘is NULL’: Recibe un operando que puede ser de uno de los siguientes tipos de dato: int, long,
float, double, boolean, text, enumerated, date, time, money y link. Evalúa si
su valor es nulo, es decir, si no tiene valor.
•
‘is TRUE’: Se aplica sobre un único operando de tipo boolean. Devuelve el valor lógico del
operando (es decir, true sí y sólo sí su valor es true; false en caso contrario).
•
‘is FALSE’: Recibe un operando de tipo boolean. Devuelve la negación del valor lógico del
operando (es decir, true sí el operando se evalúa a false; false en caso contrario).
Lenguaje de Definición y Manejo de Datos: VQL
16
Virtual DataPort 4.0
•
Guía Avanzada de VQL
‘in’: Recibe una lista de operandos que puede ser de uno de los siguientes tipos de dato: int,
long, float, double, text, enumerated, date, time, money y link.
Devuelve true si el operando de la parte izquierda está incluido en la lista de operandos de la parte
derecha. La lista de operandos puede ir o no entre paréntesis.
Ejemplo: Las dos siguientes sentencias producen el mismo resultado: seleccionan aquellas tuplas de la
vista internet_inc tales que su valor para el atributo taxid es igual o bien al valor
'B78596011' o al valor 'B78596012':
SELECT
*
FROM
internet_inc
('B78596011','B78596012')
WHERE
taxid
in
SELECT * FROM internet_inc WHERE taxid in 'B78596011','B78596012'
•
‘between’: Se aplica sobre tres operandos que pueden ser de alguno de los siguientes tipos de datos:
int, long, float, double, date, time y money. Devuelve true si el operando de la
parte izquierda se encuentra dentro del rango especificado por los otros dos operandos, incluyendo los
valores límite. Como sintaxis alternativa, los operandos que delimitan el rango pueden separarse con la
palabra AND.
Ejemplo: Las dos siguientes sentencias producen el mismo resultado: seleccionan aquellas tuplas de la
vista internet_inc tales que su valor para el atributo iinc_d está en el rango entre 2 y 4
(inclusives):
SELECT * FROM internet_inc WHERE iinc_id between 2 AND 4
SELECT * FROM internet_inc WHERE iinc_id between 2,4
•
‘~’. La evaluación de este operador devuelve un valor entre 0 y 1 que estima la similitud entre dos
operandos de tipo text, utilizando una variedad de algoritmos de similitud. Además de los operandos a
comparar, el operador de similitud recibe como parámetros el algoritmo de similitud a utilizar y un umbral
mínimo de similitud. Si la similitud entre las cadenas de caracteres alcanza o supera el umbral, la condición
se evalua como verdadera. En caso contrario, se evalua como falsa. El operando izquierdo (de tipo text)
es una de las cadenas de caracteres a comparar. El operando derecho es una lista de elementos de tipo
text. El primer elemento de dicha lista es la segunda cadena de caracteres a comparar. El segundo
especifica el umbral mínimo de similitud (un valor entre 0 y 1) y el tercero (opcional) especifica el algoritmo
de similitud que se desea utilizar. Los algoritmos disponibles son los mismos que para la función
similarity (ver sección 4.6.2).
Ejemplo: La siguiente consulta devuelve aquellas tuplas cuyo campo customername tenga una
similitud superior a 0.7 con la cadena ‘General Motors Inc’, utilizando el algoritmo de distancia de edición
entre cadenas de Jaro Winkler:
SELECT * FROM internet_inc_cname WHERE customer_name ~ 'General
Motors Inc','0.7','JaroWinkler'
NOTA: Los valores de tipo de dato blob no pueden participar en condiciones de consulta.
Lenguaje de Definición y Manejo de Datos: VQL
17
Virtual DataPort 4.0
4.6
Guía Avanzada de VQL
FUNCIONES DE ATRIBUTO DERIVADO Y CONDICIONES
Las funciones de atributo derivado se utilizan para generar nuevos atributos en el esquema de una vista, aplicando
algún procesamiento sobre los valores de los otros atributos de la vista, sobre constantes y/o sobre el resultado de
evaluar otras funciones. Estas funciones pueden utilizarse también como operandos en las condiciones.
Una función se define como un identificador y una lista de argumentos, que pueden ser a su vez constantes, campos
o nuevas funciones. En algunos casos (un subconjunto de las funciones aritméticas y de las de manejo de texto), los
parámetros recibidos por una función, así como el valor que será devuelto por ellas, deben normalmente pertenecer
todos al mismo tipo de datos. Por ejemplo, la función SUM puede realizar la suma de dos o más valores enteros, de
dos o más valores en punto flotante o de dos o más valores de tipo double pero no realizará, la suma de un valor
entero y de un valor en punto flotante. Además, algunas funciones, sólo operarán con elementos pertenecientes a un
tipo de dato concreto.
Virtual DataPort proporciona una serie de funciones predefinidas, que pueden agruparse en diferentes tipos, en base
al tipo de datos sobre las que se aplican:
Funciones aritméticas
Funciones para el manejo de texto
Funciones para el manejo de fechas
Funciones de conversión de tipos.
Funciones para el manejo de elementos de tipo XML.
Otras funciones.
En los siguientes apartados se describen las funciones soportadas por el sistema.
NOTA: La notación de funciones es, en general, prefija, es decir, se indica un identificador seguido de una lista de
parámetros entre paréntesis y separados por comas. Para algunas funciones existe también notación infija (por
ejemplo, para algunas funciones aritméticas).
4.6.1
Funciones Aritméticas
Las funciones aritméticas se aplican sobre atributos y literales de tipo numérico, int, long, float,
double, time y money, con la restricción de que todos los parámetros deben de poseer el mismo tipo.
Permiten realizar cálculos matemáticos sobre atributos y literales.
Las funciones aritméticas soportadas son:
•
SUM: La función suma recibe un número variable de argumentos (mayor o igual a dos) y devuelve como
resultado un nuevo elemento del mismo tipo conteniendo la suma de los anteriores. La versión infija de
esta función recibe dos argumentos y se representa con el símbolo ‘+’.
•
SUBTRACT: La función resta recibe dos argumentos y devuelve un nuevo elemento del mismo tipo con el
resultado de restar del primer argumento el valor del segundo. La versión infija de esta función recibe dos
argumentos y se representa con el símbolo ‘-‘.
•
MULT: La función producto recibe un número variable de argumentos (mayor o igual a dos) y devuelve un
nuevo elemento del mismo tipo con el resultado del producto entre los diferentes argumentos. La versión
infija de esta función recibe dos argumentos y se representa por el símbolo ‘*’.
•
DIV: La función división recibe dos argumentos de tipo numérico y devuelve un nuevo elemento del mismo
tipo con el resultado de dividir el primer argumento por el segundo. Si los argumentos son enteros, el
resultado de la división será también entero. La versión infija de esta función recibe dos argumentos y se
representa con el símbolo ‘/’.
Lenguaje de Definición y Manejo de Datos: VQL
18
Virtual DataPort 4.0
Guía Avanzada de VQL
•
MIN: La función mínimo recibe un número variable de argumentos (mayor o igual a dos) y devuelve como
resultado el valor del menor argumento de la lista.
•
MAX: La función máximo recibe un número variable de argumentos (mayor o igual a dos) y devuelve como
resultado el valor del mayor argumento de la lista.
•
ABS: La función valor absoluto recibe un único argumento de tipo numérico y devuelve como resultado su
valor absoluto.
•
MOD: La función módulo recibe dos argumentos de tipo numérico o money devuelve el resultado de la
operación módulo entre el primer argumento y el segundo (el resto de la división entera entre el primer
argumento y el segundo). La versión infija de esta función recibe dos argumentos y se representa con el
símbolo ‘%’.
•
CEIL: Esta función recibe un argumento numérico y devuelve el menor entero, mayor o igual que el
argumento, más próximo al argumento. Si el argumento es de tipo int, devuelve un valor de tipo int.
Si el argumento es de tipo long, float o double, el valor devuelto es de tipo long. Si el
argumento es de tipo time o money, el valor devuelto es del mismo tipo.
•
FLOOR: Esta función recibe un argumento numérico y devuelve el mayor entero, menor o igual que el
argumento, más próximo al argumento. Si el argumento es de tipo int, devuelve un valor de tipo int.
Si el argumento es de tipo long, float o double, el valor devuelto es de tipo long. Si el
argumento es de tipo time o money, el valor devuelto es del mismo tipo.
•
ROUND: Esta función recibe un argumento numérico y devuelve como resultado el número entero más
próximo al argumento. Si el argumento es de tipo int, devuelve un valor de tipo int. Si el argumento
es de tipo long, float o double, el valor devuelto es de tipo long. Si el argumento es de tipo
time o money, el valor devuelto es del mismo tipo.
•
POWER: Esta función recibe dos argumentos numéricos, el segundo de los cuáles debe ser entero.
Devuelve como resultado un valor de tipo double obtenido mediante la exponenciación del primer
argumento con el segundo como exponente.
•
SQRT: Esta función recibe un argumento numérico y devuelve un valor de tipo double con el resultado
de obtener la raíz cuadrada del argumento.
•
LOG: Esta función recibe un valor numérico y devuelve un valor de tipo double con el resultado de
obtener el logaritmo en base 10 del argumento.
4.6.2
Funciones de Manejo de Texto
Las funciones de manejo de texto tienen como objetivo realizar alguna transformación o cálculo sobre un atributo o
literal de tipo texto.
•
TEXTCONSTANT: Esta función permite crear un elemento de tipo texto a partir del literal que se pasa
como parámetro (sólo necesario en la cláusula SELECT).
Lenguaje de Definición y Manejo de Datos: VQL
19
Virtual DataPort 4.0
Guía Avanzada de VQL
•
CONCAT: La función concatenación recibe un número variable de argumentos, y permite obtener un
elemento de tipo texto como resultado de concatenar sus parámetros. La versión infija de esta función
recibe 2 argumentos y se representa con el símbolo ‘||’.
•
LEN: La función len recibe como parámetro un argumento de tipo texto, y devuelve el número de
caracteres que lo forman.
•
REPLACE: Esta función recibe 3 argumentos de tipo texto y devuelve el resultado de reemplazar en el
primero las ocurrencias del segundo, por el tercero.
•
REPLACEMAP: Esta función recibe como entradas un texto y un mapa de transformaciones
especificando una serie de textos (a los que llamaremos claves) que deben ser reemplazados por otros (a
los que llamaremos valores de reemplazo) en el texto original. En el. Tiene dos posibles firmas:
o
REPLACEMAP (originalText: text, mapName: text). Las claves y los
valores de reemplazo se especifican mediante un mapa clave-valor definido por el administrador
(en la sección 11.2 se describe la forma de crear mapas). La función recibe dos argumentos: el
primero indica el texto sobre el que realizar las transofrmaciones y el segundo el nombre del
mapa.
o
REPLACEMAP (key: text, viewName: text, keyField:text,
valueField:text). Las claves y los valores de reemplazo se especifican mediante una
vista DataPort. Recibe cuatro parámetros: el texto sobre el que realizar las transofrmaciones, el
nombre de la vista conteniendo el mapa de transformaciones, el nombre del atributo de la vista
que contiene las claves y el nombre del atributo de la vista que contiene los valores de
reemplazo.
Ambas firmas devuelven un elemento de tipo text conteniendo el texto original una vez que todas las
transformaciones especificadas se han realizado (si la clave no existiese, se devuelve null). La clave es
insensible a mayúsculas/minúsculas.
Ejemplo: Supóngase que el mapa test contiene las correspondencias:
ADSL -> DSL
Error -> Warning
La siguiente consulta devuelve tuplas con un atributo llamado new_summary cuyos valores son
obtenidos tomando el valor del atributo summary de la vista internet_inc y sustituyendo las
ocurrencias de la palabra “ADSL” por “DSL” y de la palabra “Error” por la palabra “Warning”.
SELECT
REPLACEMAP
internet_inc
(summary,'test')
AS
new_summary
FROM
•
LOWER: Esta función recibe un argumento de tipo texto y lo devuelve a la salida con todos los caracteres
que lo forman convertidos a minúsculas.
•
UPPER: Esta función recibe un argumento de tipo texto y lo devuelve a la salida con todos los caracteres
que lo forman convertidos a mayúsculas.
Lenguaje de Definición y Manejo de Datos: VQL
20
Virtual DataPort 4.0
Guía Avanzada de VQL
•
SUBSTRING: La función substring recibe como parámetros un argumento de tipo texto y dos números
enteros. Devuelve a la salida la parte del substring del primer argumento que se corresponde a las
posiciones indicadas por el segundo (inicio) y tercer (fin) argumentos.
•
REGEXP: Esta función permite realizar transformaciones sobre cadenas de caracteres basadas en
expresiones regulares. Recibe tres argumentos: un elemento de tipo texto, una expresión regular “de
entrada” y una expresión regular “de salida”. Las expresiones regulares deben expresarse utilizando la
sintaxis de expresiones regulares del lenguaje JAVA [11]. La función se comporta de la forma siguiente: la
expresión regular de entrada se evalúa contra el texto del primer argumento y la expresión regular de
salida puede incluir los “grupos” definidos en la expresión regular de entrada. Las porciones de texto que
hayan encajado con los mismos se sustituirán en la expresión de salida. Por ejemplo, el resultado de
evaluar:
REGEXP(‘Shakespeare,William’,‘(\w+),(\w+)’,‘$2 $1’)
será el valor de tipo texto ‘William Shakespeare’.
•
TRIM: Esta función recibe un argumento de tipo texto y devuelve el mismo argumento, una vez le ha
eliminado espacios y retornos de carro iniciales y finales.
•
REMOVEACCENTS: Esta función recibe un argumento de tipo texto y devuelve el mismo argumento,
una vez le ha eliminado los acentos.
•
SIMILARITY(value1: text, value2: text, algorithm:text): Esta función
recibe dos cadenas de caracteres y devuelve un valor entre 0 y 1, que es una medida de la similitud
estimada entre las cadenas. El tercer parámetro (opcional) especifica el algoritmo a utilizar para calcular la
medida de similitud. DataPort incluye los siguientes algoritmos (si no se especifica ningún algoritmo,
DataPort escogera cuál aplicar):
o
Basados en la distancia de edición entre las cadenas de los textos: ScaledLevenshtein,
JaroWinkler, Jaro, Level2Jaro, MongeElkan, Level2MongeElkan.
o
Basados en la aparición de términos comunes en los textos: TFIDF, Jaccard,
UnsmoothedJS.
o
Combinaciones de ambos: JaroWinklerTFIDF.
Ejemplo: La siguiente consulta devuelve aquellas tuplas cuyo campo customername tenga una
similitud superior a 0.7 con la cadena ‘General Motors Inc’, utilizando el algoritmo de distancia de edición
entre cadenas de Jaro-Winkler:
SELECT * FROM internet_inc_cname WHERE
similarity(customer_name,'General Motors
Inc','JaroWinkler') > 0.7
4.6.3
Funciones de Manejo de Fechas
Las funciones de manejo de fechas permiten obtener fechas y elementos concretos de una fecha.
•
NOW: Esta función no recibe ningún argumento y crea un objeto de tipo date conteniendo la fecha actual.
Lenguaje de Definición y Manejo de Datos: VQL
21
Virtual DataPort 4.0
Guía Avanzada de VQL
•
GETDAY: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa el día de la
fecha recibida.
•
GETHOUR: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa la hora
de la fecha recibida.
•
GETMINUTE: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa el
minuto de la fecha recibida.
•
GETSECOND: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa el
segundo de la fecha recibida.
•
GETTIMEINMILLIS: Recibe un argumento de tipo date y devuelve un objeto de tipo long que
representa el número de milisegundos transcurridos desde el 1 de Enero de 1970 a las 00:00:00 GMT hasta
la fecha recibida como parámetro. el segundo de la fecha recibida.
•
GETMONTH: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa el mes
de la fecha recibida.
•
GETYEAR: Recibe un argumento de tipo date y devuelve un objeto de tipo long que representa el año de
la fecha recibida.
•
TO_DATE: Permite convertir cadenas de texto que representan fechas en elementos de tipo date.
Recibe tres argumentos de tipo texto. El primero de ellos representa un patrón para expresar fechas
(siguiendo la sintaxis estándar en el lenguaje JAVA especificada en [12]) mientras el segundo será una
fecha expresada de acuerdo al mencionado patrón. El tercero, opcional, es un parámetro de tipo texto que
indica la configuración de internacionalización que representa el “locale” de la fecha a procesar. Como
resultado se devuelve un elemento de tipo date equivalente a la fecha especificada.
4.6.4
Funciones de Conversión de Tipos
Estas funciones permiten realizar diversas transformaciones entre datos de tipos diferentes.
•
CAST: Esta función recibe dos argumentos. El primero especifica el nombre de un tipo de datos y el
segundo especifica un valor que se desea convertir a dicho tipo de datos. La siguiente tabla muestra las
conversiones de tipo posibles:
Tipo Destino
array
blob
boolean
date
double
enumerated
float
int
link
long
Lenguaje de Definición y Manejo de Datos: VQL
Tipos Origen
array
text, blob
text, int, long, float, double, boolean
text, date, long
text, int, long, float, double, time, money
text, enumerated
text, int, long, float, double, time, money
text, int, long, float, double, time, money
text, link
text, int, long, float, double, time, money, date
22
Virtual DataPort 4.0
money
register
text
Guía Avanzada de VQL
text, int, long, float, double, money
xml, register
text, int, long, float, double, boolean, date, time, xml,
money, link, blob, enumerated, register, array
text, long, int, time
text, xml
Time
Xml
Tabla 1
Conversiones de tipos permitidas con la función CAST
•
TO_DATE: Permite convertir cadenas de texto que representan fechas en elementos de tipo date. Ver
sección 4.6.3.
•
CREATETYPEFROMXML: Esta función crea un tipo compuesto register (ver sección 18.1)
partiendo de un elemento de tipo XML. Recibe dos argumentos: el primero es de tipo texto y debe contener
el nombre del nuevo tipo mientras el segundo es el elemento XML. Véase la sección 4.6.5 para más detalle.
4.6.5
Funciones de manejo de XML
Estas funciones permiten crear y manejar elementos de tipo XML.
•
XPATH: Esta función aplica una expresión Xpath [13] sobre un elemento de tipo XML. Recibe dos
argumentos obligatorios: un elemento de tipo XML y un texto conteniendo la expresión Xpath. Devuelve un
elemento XML con el resultado de la aplicación de la expresión. Opcionalmente puede recibir un tercer
parámetro de tipo boolean; cuando este tercer parámetro tome el valor true, se añadirá al resultado
la cabecera XML (“<?xml version="1.0" encoding="UTF-8"?>). Nótese que el
resultado de aplicar una expresión Xpath puede ser un valor individual (entero, texto, etc.). En ese caso es
posible utilizar la función CAST para convertirlo al tipo correspondiente de Virtual DataPort.
•
CREATETYPEFROMXML: Esta función crea un tipo compuesto register (ver sección 18.1) que
reproduce el esquema de un elemento XML de ejemplo. Recibe dos argumentos: el primero es de tipo texto
y debe contener el nombre del nuevo tipo mientras que el segundo es una cadena de caracteres
conteniendo un ejemplo del elemento XML (de tipo text). El esquema del tipo compuesto será inferido
por DataPort analizando la estructura del elemento XML. Devuelve el nombre del nuevo tipo creado. Véase
la siguiente sub-sección para un ejemplo.
4.6.5.1
Convirtiendo datos XML en tipos compuestos de Virtual DataPort
Combinando las funciones CAST y CREATETYPEFROMXML es posible crear en una vista nuevos atributos
compuestos de tipo register (ver sección 18.1) partiendo de datos XML. Considérese el siguiente ejemplo:
supongamos una vista V con un atributo llamado PERSONAL_DATA_XML de tipo XML. Supondremos también
que cada valor del atributo PERSONAL_DATA_XML contiene código XML de la forma:
<person>
<name> John Smith </name>
<age> 25 </age>
</person>
Considérese ahora la siguiente expresión:
CREATE VIEW PERSON AS
Lenguaje de Definición y Manejo de Datos: VQL
23
Virtual DataPort 4.0
Guía Avanzada de VQL
SELECT CAST(CREATETYPEFROMXML('personaldata_type', '<person><name> John
Smith </name><age> 25 </age></person>'),PERSONAL_DATA_XML) PERSONALDATA
FROM V
El atributo derivado PERSONALDATA de la vista PERSON sería de tipo personaldata_type, que sería un
tipo register compuesto por los campos name (de tipo text) y age (de tipo long). Nótese que el segundo
parámetro de la función CREATETYPEFROMXML debe ser un ejemplo de los valores contenidos en el campo
PERSONAL_DATA_XML de la vista V.
Convertir datos de tipo XML en datos de tipos compuestos de DataPort permite combinar los datos contenidos en el
código XML con los datos provenientes de otras relaciones. Por ejemplo, supongamos que tenemos una vista
RISK_LEVEL que tiene dos atributos llamados age (de tipo long) y risk (de tipo double) que recoge algún
tipo de índice de riesgo calculado en función de la edad de un individuo. Sería posible hacer una operación de join
entre la vista PERSON y la vista RISK_LEVEL utilizando para ello el atributo age de RISK_LEVEL y el
campo age del atributo PERSONALDATA de la vista PERSON.
4.6.6
Otras funciones
En esta sección se agrupan funciones misceláneas:
•
HASH: Esta función recibe un único argumento de tipo text y devuelve un HASH MD5 del mismo.
•
MAP: Esta función permite obtener el valor asociado a una determinada clave en un mapa de conversión
de valores. Tiene dos posibles firmas:
o
MAP (key: text, mapName: text, i18nConf:text). Permite obtener el
valor asociado a una determinada clave en un mapa clave-valor definido por el administrador (en
la sección 11.2 se describe la forma de crear mapas). La función recibe tres argumentos: el
primero indica la clave deseada y el segundo el nombre del mapa. El tercero (opcional y de tipo
text) especifica el nombre de la configuración de internacionalización que debe aplicarse al
nuevo valor creado.
o
MAP
(key:
text,
viewName:
text,
keyField:text,
valueField:text). Permite obtener el valor asociado a una determinada clave en base a
los valores contenidos en una vista DataPort. Recibe cuatro parámetros: la clave deseada, el
nombre de la vista conteniendo el mapa de conversiones, el nombre del atributo de la vista que
contiene las claves y el nombre del atributo de la vista que contiene los valores.
Ambas firmas devuelven un elemento de tipo text con el valor asociado para la clave especificada (si la
clave no existiese, se devuelve null). La clave es insensible a mayúsculas/minúsculas.
•
COALESCE: Esta función recibe un número variable de argumentos (mayor o igual a dos) de un mismo
tipo y devuelve como resultado el primer argumento no nulo.
•
CONTEXTUALSUMMARY: Esta función obtiene un resumen contextual de un texto en base a una
búsqueda por palabra clave. Se obtendrán una serie de fragmentos del texto que contengan la palabra o
frase especificada. Presenta la siguiente firma:
Lenguaje de Definición y Manejo de Datos: VQL
24
Virtual DataPort 4.0
4.7
Guía Avanzada de VQL
•
CONTEXTUALSUMMARY(content:text, keyword:text,
[beginDelim:text, endDelim:text, fragmentSeparator:text,
fragmentLength:int [,maxFragmentsNumber:int]]), donde:
o
content: El texto a analizar y del que se desea extraer los fragmentos más relevantes.
(obligatorio)
o
keyword: La palabra clave utilizada para extraer los fragmentos del texto. (obligatorio). El
contenido de este argumento puede ser una única palabra o una frase.
o
beginDelim: Texto a añadir como prefijo de la palabra clave cuando ésta aparezca en el
texto. (opcional, valor por defecto "")
o
endDelim: Texto a añadir como sufijo de la palabra clave cuando ésta aparezca en el texto.
(opcional, valor por defecto "")
o
fragmentSeparator: Texto a utilizar como separador de los diferentes fragmentos de
texto obtenidos como resultado. (opcional, el valor por defecto es " ...")
o
fragmentLength: Número aproximado de palabras que aparecerán antes y después de las
ocurrencias de la palabra clave dentro del texto (opcional, el valor por defecto es 5).
o
maxFragmentNumber: Número máximo de fragmentos a obtener.
FUNCIONES DE AGREGACIÓN
Las funciones de agregación se usan dentro de un comando SELECT para devolver un único valor por cada grupo de
tuplas resultado de una operación de agrupamiento.
Las funciones de agregación reciben como parámetro una expresión indicando el nombre del atributo sobre el que se
aplica. Opcionalmente, este parámetro puede estar precedido por uno de dos modificadores: ALL ó DISTINCT.
Estos modificadores afectan a la semántica de algunas funciones de agregación, aplicándolas sobre todas las tuplas
de un grupo o sólo sobre las que presenten distinto valor para el atributo considerado.
A continuación se enumeran las diferentes funciones de agregación:
•
AVG: Utilizada para calcular el promedio de los valores de un atributo determinado. Aplicable sobre
atributos de tipo int, long, float, double, time y money. Devuelve un valor de tipo
double.
•
COUNT: Utilizada para devolver el número total de tuplas resultado de una operación de selección (si se
especifica como atributo el carácter especial ‘*’) o el número de tuplas que tienen valor no nulo para un
atributo concreto. Aplicable sobre cualquier tipo de atributo. Se puede utilizar esta función de agregación
sin especificar una clausula de GROUP BY, pero en ese caso, sólo puede aplicarse sobre el atributo de
carácter especial ‘*’ para contabilizar el número total de tuplas devueltas.
•
SUM: Utilizada para devolver la suma de todos los valores de un atributo determinado que no sean nulos.
Aplicable sobre atributos de tipo int, long, float, double, time y money.
•
MAX: Utilizada para devolver el valor más alto de un atributo especificado. Aplicable sobre atributos de
tipo int, long, float, double, time y money. La implementación de esta función
ignora el modificador ALL/DISTINCT.
Lenguaje de Definición y Manejo de Datos: VQL
25
Virtual DataPort 4.0
Guía Avanzada de VQL
•
MIN: Utilizada para devolver el valor más bajo de un atributo especificado. Aplicable sobre atributos de
tipo int, long, float, double, time y money. La implementación de esta función
ignora el modificador ALL/DISTINCT.
•
FIRST: Utilizada para devolver el valor de un atributo de la primera tupla de cada grupo de valores.
Aplicable sobre cualquier tipo de atributo. La implementación de esta función ignora el modificador
ALL/DISTINCT.
•
LAST: Utilizada para devolver el valor de un atributo de la última tupla de cada grupo de valores.
Aplicable sobre cualquier tipo de atributo. La implementación de esta función ignora el modificador
ALL/DISTINCT.
•
LIST: Función de agregación que devuelve una lista con todos los valores de un atributo especificado,
para cada grupo. Aplicable sobre cualquier tipo de atributo.
4.8
CONVENCIONES DE SINTAXIS
Los siguientes apartados de este documento describen las diferentes operaciones que se pueden realizar sobre
Virtual DataPort, en base a las instrucciones que forman parte del lenguaje VQL. A continuación se listan las
convenciones de notación y sintaxis utilizadas para esta descripción.
•
El lenguaje no es sensible a mayúsculas y minúsculas.
•
El texto en minúsculas y especificado entre los símbolos ‘<’ y ’>’ (<name>) indica un elemento cuya sintaxis
concreta será especificada posteriormente. Si aparece el separador ‘:’ (e.g. <name:element-definition>),
entonces indica un nombre de elemento representativo y a continuación el nombre del elemento que lo
define.
•
Los símbolos ‘::=’ declaran la definición de un elemento.
•
Los corchetes ([]) indican elementos opcionales. También se utiliza para acceder a elementos de un array
o para definir un parámetro multivaluado de una función. En estos casos se especifica entrecomillada para
indicar explícitamente que deben aparecer, y que no indican elementos opcionales.
•
El asterisco (*) indica que un elemento se puede especificar cero o más veces. Ejemplo:
[<search_method_clause>]* indica que el elemento [<search_method_clause>]
se puede repetir tantas veces como sea necesario. Posee un significado especial cuando se utiliza en la
sentencia SELECT o con la función de agregación COUNT.
•
El signo suma (+) indica que un elemento se puede especificar una o más veces. Ejemplo:
[<field>]+ indica que el elemento [<field>] debe aparecer al menos una vez y se puede repetir
tantas veces como sea necesario.
•
Elementos separados por el carácter "|", y agrupados entre llaves ({}), indican elementos alternativos. Por
ejemplo: {elemento1 | elemento2} indica que en esa posición habrá que escribir el
elemento1 o el elemento2.
Lenguaje de Definición y Manejo de Datos: VQL
26
Virtual DataPort 4.0
Guía Avanzada de VQL
•
Las comas (,) se utilizan en construcciones sintácticas para separar elementos de una lista.
•
Los paréntesis (()) sirven normalmente para agrupar expresiones y reforzar la precedencia. En algunos casos
se exigen como parte de la sintaxis particular de una sentencia.
•
El punto (.) se utiliza en las constantes numéricas y para separar nombres de tablas, columnas y campos.
•
El carácter de espacio en blanco puede ser un espacio, un tabulador, un retorno de carro o un salto de
línea.
•
Identificadores (<identifier>). Los identificadores permiten asociar nombres a los diferentes elementos del
catálogo y son en general alfanuméricos a los que se exige que no puedan comenzar por un número.
Existen una serie de palabras reservadas que no pueden ser utilizadas como identificadores (ver Figura 3).
•
Números (<number>). Un número es una combinación de dígitos, que pueden estar precedidos por un signo
‘-‘ y pueden incluir un punto como carácter separador decimal y opcionalmente un exponente (si se trata de
números reales).
•
Valores lógicos (<boolean>). Representación de los valores lógicos “true” y “false”.
•
Literales (<literal>). Permiten definir cualquier cadena de caracteres entrecomillándola (comillas simple o
dobles). Los caracteres comilla simple o doble (dependiendo del caso) deben ser escapados (carácter de
escape \’ y \” respectivamente).
•
Operadores (<operator>). Permiten definir los operadores del sistema, que pueden estar representados por
identificadores, por una combinación de los símbolos definidos para <opsymbol> o las expresiones “is
null”, “is not null”, “is true” “is false”.
Lenguaje de Definición y Manejo de Datos: VQL
27
Virtual DataPort 4.0
Guía Avanzada de VQL
<identifier> ::= [A-Za-z\200-\377_][A-Za-z\200-\377_0-9\$]*
<integer> ::= [-][0-9]+
<number> ::= <integer> |
(([0-9]*\.[0-9]+)|([0-9]+\.[0-9]*))
((([0-9]*\.[0-9]+)|([0-9]+\.[0-9]*)|([0-9]+))([Ee][-+][0-9]+))
<boolean> ::= true | false
<literal> ::= '[^\']*' | "[^\"]*"
<operator> ::= <unary operator> | <binary operator>
<opsymbol> ::= [\~\!\@\#\^\&\|\'\?\<\>\=]+
<unary operator> ::=
is null
| is not null
| is true
| is false
<binary operator> ::=
=
| <identifier>
| <opsymbol>
<reserved VQL word> ::=
ADD, ALL, ALTER, AND, ANY, ARN, AS, ASC, BASE, CALL, CLEAR, CONNECT,CONTEXT,
CREATE, CROSS, CUSTOM, DATABASE, DEFAULT, DESC, DF, DISTINCT, DROP, EXCEL,
EXISTS, FALSE, FIELD, FILTER, FROM, FULL, GRANT, GROUP BY, GS, HASH, HAVING,
HTML, IF, INNER, IS, JDBC, JOIN, LDAP, LEFT, MERGE, MY, NATURAL,NESTED, NOS,
NOT, NULL, OBL, ODBC, OF, OFF, ON, ONE, OPT, OR, ORDER BY, ORDERED,
PRIVILEGES, RAW, RAWPATTERNS, READ, REVERSEORDER, REVOKE, RIGHT, ROW, SELECT,
SWAP, TABLE, TO, TRACE, TRUE, UNION, USER, USING, VDB, VIEW, WHERE, WITH,
WRITE, WS, ZERO
Figura 3 Primitivas básicas para la especificación de sentencias VQL
4.8.1
Sintaxis de funciones y valores de condiciones
Tal y como se ha ido comentando a lo largo de este manual, en Virtual DataPort existen diferentes tipos de funciones
que se pueden utilizar para diversos propósitos.
Un primer tipo de funciones son las que calculan un valor a partir de una tupla. Las funciones de este tipo se
referencian en condiciones de consulta o se utilizan para obtener un atributo derivado.
Otro tipo de funciones, son las funciones de agregación, que calculan un valor a partir de un conjunto de tuplas.
También existen las funciones de transformación que actúan en las reglas de reescritura.
Virtual DataPort utiliza una sintaxis de funciones genérica común para la representación de todas las funciones
existentes en el sistema. Dicha sintaxis se muestra en la Figura 4.
<field name> ::= <identifier>[.<identifier>]
| <identifier>[.<identifier>]'['<integer>']'
[<compound field name>]*
| (<identifier>[.<identifier>])[<compound field name>]*
<compound field name> ::= .<identifier> | '['<integer>']'
<funcsymbol> ::= [\+\-\*\/\%]+
<value> ::=
<field name>
| <number>
| <boolean>
| <literal>
| <function>
Lenguaje de Definición y Manejo de Datos: VQL
28
Virtual DataPort 4.0
Guía Avanzada de VQL
| <value> <funcsymbol> <value>
| ( <value> )
| <rowvalue>
| { <rowvalue> [, <rowvalue>]* }
<rowvalue> ::= ROW( <value> [, <value>]* )
<function> ::=
<identifier> ( [ [<function modifier>] <function parameter>
[, <function parameter>]* ] )
<function parameter> ::=
*
| <value>
| '[' [ <value>, [ <value> ]* ] ']'
<function modifier> ::=
ALL
| DISTINCT
Figura 4 Reglas para la formación de funciones
Para definir la sintaxis de una función, es necesario definir previamente los siguientes elementos:
•
El elemento <field name> define la sintaxis para especificar un atributo de una relación, en el que
puede aparecer el nombre de la relación y la referencia a campos de elementos de tipos compuestos (ver
sección 18.1 para una descripción detallada del soporte de tipos compuestos).
•
El elemento <value> define la sintaxis para cualquier parámetro de una función, que puede ser un
nombre de un atributo, una constante numérica, booleana o literal. También es posible crear un valor
compuesto utilizando el constructor ROW (ver sección 6.3.1). Como se puede observar, el parámetro de una
función puede ser a su vez una nueva función. Además, un <value> permite especificar notaciones
infijas para una función (véase la regla <value> <funcsymbol> <value>).
Una vez descritos los elementos básicos de una función, podemos definir una función como un identificador seguido
por una lista de parámetros, entre paréntesis y separados por comas. Los parámetros de una función pueden ser “*”,
univaluados (elementos <value>) o multivaluados (elementos <value>, entre corchetes y separados por
comas).
La sintaxis que se ha explicado con anterioridad es común para todos los tipos de funciones existentes en Virtual
DataPort. Sin embargo, pueden existir algunas particularidades para algún tipo de función. Estas particularidades,
cuando existen, se comentan en la sección del manual correspondiente a cada tipo de función.
Por último, es importante recordar que el formato a utilizar para escribir constantes de tipo date, money y double en
las consultas sobre una vista viene fijado por la configuración de internacionalización que se esté utilizando sobre la
misma. Véase la sección 18.3 para más información sobre los distintos parámetros de una configuración de
internacionalización y la sección 13 para saber cómo consultar los parámetros asignados al mapa de
internacionalización asignado a una configuración concreta.
Lenguaje de Definición y Manejo de Datos: VQL
29
Virtual DataPort 4.0
5
Guía Avanzada de VQL
CREACIÓN DE UNA RELACIÓN BASE (O VISTA BASE)
La sentencia CREATE TABLE permite la creación de una relación base (también llamada vista base) en Virtual
DataPort. Una relación base representa en el sistema EII información que proviene directamente de una fuente
externa (web, relacional, etc.).
La sintaxis de la sentencia CREATE TABLE se muestra en la Figura 5. Cada relación o vista base se compone de
un conjunto de atributos. Cada atributo de una relación pertenecerá a un tipo de dato. El tipo de un determinado
atributo determina qué operadores pueden aplicarse sobre él. El esquema de la vista se corresponde con los
atributos que componen cada tupla que pertenece a la relación base y los tipos de dato a los que pertenece cada
atributo.
En la creación de la relación base se especifica su nombre, su configuración de internacionalización y su esquema.
CREATE [ OR REPLACE ] TABLE <name:identifier> I18N <name:identifier>
( <field> [, <field> ]* )
<field> ::=
<name:identifier>:<type:identifier> [ ( <property list> ) ]
<property list> ::=
<name:identifier> [= <value:identifier>]
[, <name_i:identifier> [= <value_i:identifier>] ]*
Figura 5 Sintaxis de la sentencia CREATE TABLE
El uso del modificador OR REPLACE permite especificar que, si ya existe una vista base con el nombre indicado,
ésta debe ser reemplazada por la nueva vista. En caso de que debido al cambio de definición de la vista, las
capacidades de consulta (ver sección 5.2) de alguna de las vistas derivadas se hayan alterado (p.e. debido a la
adición de algún campo adicional, o a alguna restricción de consulta no existente anteriormente), DataPort
actualizará automáticamente el esquema y las capacidades de consulta de las vistas derivadas siempre que sea
posible.
En la Figura 6 se muestra la creación de una vista base a través de la sentencia CREATE TABLE. Se crea una
vista base de nombre ‘book’, con internacionalización española (es_euro) y con dos atributos TITLE y AUTHOR
de tipo texto.
CREATE TABLE book I18N es_euro (
title:TEXT,
author:TEXT
);
Figura 6 Ejemplo de creación de una vista base
5.1
MODIFICACIÓN DE UNA RELACIÓN BASE
Utilizando la sentencia ALTER TABLE es posible configurar las siguientes propiedades específicas de una
relación base: su configuración de internacionalización, su configuración de caché, su configuración de “swapping”,
Creación de una Relación Base (o Vista Base)
30
Virtual DataPort 4.0
Guía Avanzada de VQL
añadir, eliminar o modificar un método de búsqueda y añadir, eliminar o modificar una regla de reescritura. En la
Figura 7 se muestra la sintaxis de ALTER TABLE.
Una vez creada y definida la estructura de una relación base, es necesario especificar sus métodos de búsqueda para
que el servidor pueda saber qué consultas se pueden ejecutar sobre la información de la fuente que representa. Los
métodos de búsqueda se componen de reglas que representan las restricciones que una consulta determinada debe
cumplir para que pueda ser ejecutada utilizando ese método de búsqueda. Además, cada método de búsqueda tendrá
asociado un wrapper que poseerá la información necesaria para traducir la consulta del usuario a la fuente e
interpretar su respuesta. La sección 5.2 proporciona más detalle sobre este aspecto.
También es posible aplicar a los métodos de búsqueda de una relación base reglas de reescritura sobre consultas
(que reescriben consultas antes de enviarlas a la fuente, para adaptarlas a los formatos que la fuente precisa), o
sobre los resultados (que reescriben los resultados obtenidos de la fuente para adaptarlos a otro formato deseado),
para el tratamiento de las representaciones heterogéneas de información procedente de varias fuentes. La sección
5.3 se ocupa con detalle de las reglas de reescritura.
El comando ALTER TABLE también permite indicar si la relación base debe ser cacheada (CACHE ON), es
decir, si deben materializarse o no en la cache local las tuplas que se vayan extrayendo de la fuente como resultado
de la ejecución de consultas. La sección18.2.2 se ocupa de este aspecto con más detalle.
Finalmente, es posible configurar la política de “swapping” a disco utilizada por DataPort al ejecutar consultas sobre
la relación base que involucren gran número de tuplas. Véase la sección 18.2.3 para una descripción detallada.
ALTER TABLE <name:identifier>
[ I18N <name:identifier> ]
[ CACHE { ON | POST | OFF | INVALIDATE} ]
[ TIMETOLIVEINCACHE <seconds:integer> ]
[ SWAP { ON | OFF } ]
[ SWAPSIZE <megabytes:integer> ]
[ <table search method clause> ]*
<table search method clause> ::=
ADD SEARCHMETHOD <name:identifier> (
[ I18N <name:identifier> ]
[ CONSTRAINTS ( [ <constraint clause> ]+ ) ]
[ OUTPUTLIST ( <output clause> ) ]
[ <wrapper clause> ]
[ PATTERNS ( [ <pattern clause> ]+ ) ]
[ RAWPATTERNS ( [ <pattern clause> ]+ ) ]
)
| ALTER SEARCHMETHOD <name:identifier> (
[ I18N { <name:identifier> | DEFAULT } ]
[ CONSTRAINTS ( [ <constraint clause> ]+ ) ]
[ OUTPUTLIST ( <output clause> ) ]
[ <wrapper clause> ]
[ PATTERNS ( [ <pattern clause> ]+ ) ]
[ RAWPATTERNS ( [ <pattern clause> ]+ ) ]
)
| DROP SEARCHMETHOD <name:identifier>
<constraint clause> ::=
ADD <field> ( [ <operator> [, <operator> ]* ] )
{
<obligatoriness> <multiplicity>
Creación de una Relación Base (o Vista Base)
31
Virtual DataPort 4.0
Guía Avanzada de VQL
[ ( <value_1:value> [ , <value_i:value> ]* ) ]
|
NOS { ZERO | 0 } ()
}
| DROP <integer>
<output clause> ::= <field> [ ,<field> ]*
<wrapper clause>=
WRAPPER ( <wrapper type> <name:identifier> )
| DROP WRAPPER
<wrapper type> ::= { ARN | CUSTOM | DF | GS | ITP | JDBC | ODBC | WS | XML }
<pattern clause>=
ADD INPUT [FIELD <field> <operator> [, <operator> ]* ]+
<input_function:function> <integer>
| ADD OUTPUT { () | <condition_clause> } <i18n:identifier>
<output_function:function> <integer>
| DROP INPUT <integer>
| DROP OUTPUT <integer>
<field> ::= <identifier>[.<identifier>]*
<obligatoriness> ::= { OPT | OBL }
<multiplicity> ::= { ZERO | ONE | ANY | <integer> }
<condition clause> ::= (see section 6.3)
<operator> includes “any” to represent any operator.
Figura 7 Sintaxis de la sentencia ALTER TABLE
5.2
CAPACIDADES DE CONSULTA: MÉTODOS DE BÚSQUEDA Y WRAPPERS
En la creación de un método de búsqueda, se deben especificar los siguientes elementos: la lista de restricciones de
consulta, la lista de atributos de salida y el wrapper, previamente creado por medio de la sentencia CREATE
WRAPPER, encargado de extraer los datos de la fuente.
5.2.1
Restricciones de Consulta
Para la especificación de los métodos de búsqueda, es necesario especificar una serie de 5-tuplas, a las que
llamaremos ‘restricciones de consulta’. Para cada restricción de consulta, se deben indicar los siguientes elementos:
•
Atributo – es un atributo de la relación.
•
Operadores – es el conjunto de operadores que puede ser utilizado en las consultas sobre esa fuente y con
ese método de búsqueda. ‘ANY’ representa a cualquier operador admitido por el tipo de dato del atributo.
Si el campo de obligatoriedad (explicado más adelante) es ‘NOS’, no se especifica su valor.
•
Obligatoriedad – puede tomar cuatro valores: ‘OBL’ indica que el atributo debe obligatoriamente
aparecer en cualquier consulta sobre la fuente. ‘OPT’ indica que el atributo puede aparecer o no en la
consulta (es opcional). ‘NOS’ indica que las consultas por ese atributo no están permitidas en la fuente.
Creación de una Relación Base (o Vista Base)
32
Virtual DataPort 4.0
Guía Avanzada de VQL
•
Multiplicidad – indica por cuántos valores puede consultarse a la vez la fuente para el atributo y el
operador dados. Puede tomar los valores ‘ZERO’ (que equivale a ‘0’), ‘ONE’ (que equivale a ‘1’),
‘ANY’ y cualquier número entero. Si no es posible realizar consultas por ese atributo (valor ‘NOS’ en el
campo obligatoriedad) este parámetro es opcional. ‘ANY’ indica un número de valores mayor que ‘0’ pero
sin límite superior.
•
Valores Posibles – es la lista de valores por los que puede consultarse el atributo. Si contiene el valor
‘ANY’ significa que el rango de búsqueda no está acotado (dentro del rango asociado al tipo de dato del
atributo) y puede consultarse el atributo por cualquier valor. Si el campo obligatoriedad está fijado en la 5upla al valor ‘NOS’, este parámetro es opcional.
Después de especificar las restricciones de consulta, se indican los atributos que aparecen a la salida de las
consultas realizadas a través del método de búsqueda. Los atributos de salida de un método de búsqueda, se
especifican enumerando los atributos separados por comas.
5.2.2
Asignación de Wrappers a Métodos de Búsqueda
Como se puede observar en la sintaxis de la Figura 7, para asignar un wrapper a un método de búsqueda, es
necesario indicar dos elementos: el tipo del wrapper, y el nombre del mismo.
El tipo de wrapper indica la naturaleza de la fuente externa de la que extrae información. La creación de un wrapper
se explica con detalle en la sección 17.
5.2.3
Ejemplo de Creación de un Método de Búsqueda
En la Figura 8 se muestra un ejemplo en el que se añade un método de búsqueda a una relación.
ALTER TABLE bookview
ADD SEARCHMETHOD bookview_sm1 (
CONSTRAINTS (
ADD TITLE
(any) OBL ANY
ADD AUTHOR
(like) OPT ANY
ADD FORMAT
NOS ZERO ()
ADD PRICE
NOS ZERO ()
)
OUTPUTLIST (TITLE, AUTOR, FORMAT, PRICE)
WRAPPER (ITP booktest)
);
Figura 8 Ejemplo de creación de un método de búsqueda con ALTER TABLE
En el ejemplo de la Figura 8, se añade a la relación base denominada bookview, un método de búsqueda de
nombre bookview_sm1, con cuatro restricciones de consulta. Las restricciones del método de búsqueda, indican
que para realizar una consulta sobre la fuente, es obligatorio buscar por el atributo TITLE (especificando cualquier
número de valores), opcionalmente se puede buscar por el atributo AUTHOR (especificando cualquier número de
valores), y que no se permite la consulta directa por el resto de los atributos (FORMAT, PRICE). Además, en la
definición del método de búsqueda se indica que todos los atributos aparecen a la salida. Por último se le asocia al
método de búsqueda el wrapper denominado booktest de tipo ITPilot, como el encargado de extraer los
resultados cuando se realiza una consulta utilizando este método de búsqueda.
Es importante resaltar que aunque la fuente no pueda hacer consultas por sí misma por determinados atributos (en el
ejemplo anterior, esto ocurre con FORMAT y PRICE), Virtual DataPort sí será capaz de realizar algunas consultas
sobre dichos atributos por medio de post-procesados sobre los resultados obtenidos de las fuentes. Por ejemplo, si
el servidor recibiese la consulta: SELECT * FROM BOOKVIEW WHERE TITLE like ‘java’ AND
Creación de una Relación Base (o Vista Base)
33
Virtual DataPort 4.0
Guía Avanzada de VQL
FORMAT = ‘eBook’, Virtual DataPort sería capaz de contestarla extrayendo de la fuente los libros que
contienen la palabra ‘java’ en el título (ya que la fuente sí permite esa consulta) y, posteriormente, aplicaría un
post-procesado para filtrar los resultados y quedarse sólo con aquellos que además tengan la cadena ‘eBook’ en su
atributo FORMAT.
5.3
REGLAS DE REESCRITURA
Tal y como ya se ha comentado, el sistema de reglas de reescritura sirve para tratar con heterogeneidades
semánticas y de formatos de representación en las fuentes.
Existen dos tipos de reglas de reescritura:
•
Reglas de Reescritura de Entrada. Sirven para adaptar las consultas que se envíen a una relación a los
formatos de representación esperados por ésta.
•
Reglas de Reescritura de Salida. Adaptan los resultados obtenidos de una relación al formato esperado por
las vistas de orden superior.
Las reglas de reescritura se aplican sobre métodos de búsqueda. El tipo de reglas de reescritura que pueden
aplicarse varía según el método de búsqueda pertenezca a una relación base o a una vista derivada.
Más concretamente, un método de búsqueda de una relación base tiene asociadas cuatro listas de reglas de
reescritura diferentes: dos listas de tipo raw (una sobre resultados y otra sobre consultas); y otras dos de tipo no raw
(una de entrada –consultas- y otra de salida –resultados-). Sin embargo, un método de búsqueda de una vista
derivada sólo tiene asociadas las dos listas de tipo no raw.
Una regla de tipo raw tiene como característica diferencial que puede tratar con los valores de los atributos de una
relación base sin estar sujeta a las restricciones asociadas a los tipos de datos de dichos atributos. Esto es posible
porque estas reglas operan o bien sobre consultas que se van a enviar a un wrapper (reglas de entrada), o bien sobre
los datos devueltos por un wrapper (reglas de salida), y los datos enviados o devueltos por un wrapper no están
tipados por el servidor. El uso de reglas de tipo raw es especialmente importante cuando se trata con atributos de
tipo enumerado. Véanse los apartados 5.3.2.3 y 5.3.1.3 para ver algunos ejemplos de reglas de tipo raw.
En cambio, una vista derivada, por cada subvista inmediatamente inferior en la jerarquía de vistas, tiene asociadas
dos listas de reglas de reescrituras: una lista de reglas de reescritura sobre consultas y otra lista de reglas que
reescriben los resultados, sin que sea posible utilizar reglas de tipo raw.
Los siguientes apartados describen, respectivamente, el uso de las reglas de reescritura de entrada y de salida.
5.3.1
Reglas de Reescritura de Entrada
Las reglas de reescritura de entrada de una relación base, es decir, las que actúan sobre condiciones de consulta
(independiente de si son tipo raw o no), se aplican sobre un método de búsqueda y se componen de los siguientes
elementos:
•
Las expresiones-patrón o patrones asociados a la regla de reescritura. Sirven para indicar la estructura que
deben seguir las condiciones de consulta que serán reescritas mediante esta regla de reescritura. Una
expresión-patrón se compone de varias condiciones-patrón. Cada condición-patrón consta de dos
elementos: un atributo de la relación y un conjunto de operadores. Una condición de consulta encaja o
verifica una condición patrón, si tiene como parte izquierda el atributo de la condición-patrón y tiene como
operador alguno de los operadores que contiene la condición-patrón. Las expresiones-patrón deben
construirse de modo que ninguna condición encaje con varias condiciones-patrón. Una expresión-patrón se
verifica para una condición de consulta si: 1) para cada condición patrón existe una condición simple que la
Creación de una Relación Base (o Vista Base)
34
Virtual DataPort 4.0
Guía Avanzada de VQL
satisface, y 2) si las condiciones simples que cumplen cada una de las condiciones patrón no están
contenidas en ninguna condición OR y NOT.
•
La función de transformación. Es la función que reescribe las condiciones que han encajado con las
expresiones-patrón, produciendo a la salida un nuevo conjunto de condiciones de consulta que tomarán el
lugar de las encajadas en la consulta original. Una función de transformación es una función predefinida
(cuya sintaxis se explica en el Apartado 4.8) parametrizada por valores individuales o listas de valores
individuales.
•
La posición que toma la regla de reescritura en la lista de reglas de reescritura asociadas al método de
búsqueda sobre el que actúa.
El resultado de una reescritura de condiciones es el subconjunto de condiciones que no ha encajado con ninguna
expresión-patrón, más el resultado de aplicar la función de transformación sobre el subconjunto de condiciones que
sí han sido encajadas.
Como podemos ver en el Apartado 4.8, una función de transformación de una regla de reescritura de entrada se
compone de un nombre y una serie de parámetros. Los parámetros son opcionales, van separados por comas y
pueden ser elementos simples (literal, número o nombre de atributo, con la sintaxis general definida en el apartado
4.8) o listas. Las listas se delimitan por los caracteres ’[’ y ’]’, sus elementos se separan con el carácter ‘,’ y pueden
ser cualquier elemento simple.
Las funciones de transformación de entrada que Virtual DataPort incluye ya implementadas son:
REMOVEACCENTS(), REGEXP(), MAP() y CHANGEOPERATOR(). Los siguientes subapartados se
ocupan, respectivamente, de cada una de ellas.
5.3.1.1
REMOVEACCENTS
La función de transformación REMOVEACCENTS()elimina los acentos de los literales de búsqueda. Esta función
no recibe ningún parámetro.
5.3.1.2
REGEXP
La función REGEXP() realiza transformaciones sobre los valores resultado de evaluar la parte derecha de las
condiciones, desde un formato de entrada a un formato de salida, parametrizados ambos formatos por variables. Esta
función recibe dos parámetros: una expresión regular de entrada y otra de salida.
Las expresiones regulares deben expresarse utilizando la sintaxis de expresiones regulares del lenguaje JAVA[11].
En la Figura 9 se muestra un ejemplo de una regla de reescritura de entrada que utiliza la función de transformación
REGEXP(). Dicha regla de reescritura, sobrescribe las condiciones de la forma (AUTHOR like <value>),
dónde <value> es una cadena que representa el nombre y los apellidos del autor separados por una coma,
intercambiando el orden del nombre y apellidos y eliminando la coma. Por ejemplo, dicha regla de reescritura
sustituiría la condición (AUTHOR like ‘Smith, John ') por (AUTHOR like ’John Smith’).
ALTER TABLE bookview
ALTER SEARCHMETHOD bookview_sm1 (
PATTERNS (
ADD INPUT
FIELD AUTHOR like
REGEXP('(\w+),(\w+)','$2 $1') 1
)
Creación de una Relación Base (o Vista Base)
35
Virtual DataPort 4.0
Guía Avanzada de VQL
);
Figura 9 Adición de una regla de reescritura de entrada REGEXP()
5.3.1.3
MAP
La función de transformación de entrada MAP() modifica los operandos de una lista de condiciones de consulta
basándose en la aplicación de mapas de correspondencia directa sobre determinadas condiciones. Es decir,
transforma unas condiciones en otras en base a un mapa (ver la creación de mapas en el Apartado 11.2).
Esta función, recibe dos parámetros: el nombre de la configuración de internacionalización de las condiciones del
mapa y el nombre del mapa que contiene las correspondencias de transformación de las condiciones.
En la Figura 10 se muestra un fragmento de código que añade, a un método de búsqueda específico, una regla de
reescritura de entrada de tipo raw que utiliza la función MAP(), en la segunda posición dentro de la lista de reglas
de reescritura que posee el método de búsqueda.
ALTER TABLE otherview
ALTER SEARCHMETHOD otherview_sm1 (
RAWPATTERNS (
ADD INPUT
FIELD TIMETABLE =
Map(‘es_euro’, ‘daysOfWeek’) 2
)
);
Figura 10 Adición de una regla de reescritura sobre condiciones MAP()
La función MAP() utiliza el mapa “daysOfWeek” (creado en la Figura 36) que contiene condiciones expresadas
según la configuración de internacionalización denominada “es_euro”. Nótese que, en este caso, es preciso utilizar
una reescritura del tipo raw ya que el campo TIMETABLE tiene un tipo de dato enumerado que admite sólo unos
determinados valores (más concretamente, los mostrados en la columna de la izquierda de la Figura 36) y el resultado
de la reescritura es un valor no compatible con ese tipo de datos (más concretamente, el resultado será uno de los
valores mostrados en la columna de la derecha de la Figura 36, que no son valores permitidos por el tipo de dato del
atributo TIMETABLE).
5.3.1.4
CHANGEOPERATOR
La función de transformación de entrada CHANGEOPERATOR(), cambia el operador de la lista de condiciones
que encajan con la regla de reescritura. Recibe como parámetro el nombre del operador que tendrán las condiciones
después de aplicar sobre ellas la función de transformación. Por ejemplo, en la Figura 11 se define una regla de
reescritura que al aplicarse sobre una condición de la forma (TITLE = ’value'), se sustituye por la
condición (TITLE like ’value’).
NOTA: Esta función de transformación está obsoleta y no se recomienda su uso en nuevas aplicaciones.
Creación de una Relación Base (o Vista Base)
36
Virtual DataPort 4.0
Guía Avanzada de VQL
ALTER TABLE bookview
ALTER SEARCHMETHOD bookview_sm1 (
PATTERNS (
ADD INPUT
FIELD TITLE =
ChangeOperator('like') 1
)
);
Figura 11 Adición de una regla de reescritura de entrada CHANGEOPERATOR()
5.3.2
Reglas de Reescritura de Salida
Las reglas de reescritura de salida de una relación base, es decir, las que actúan sobre tuplas de resultados, se
aplican sobre un método de búsqueda y se componen de los siguientes elementos:
•
La condición asociada a la regla de reescritura. Sirve para indicar sobre qué tuplas debe aplicarse esta
regla de reescritura. Si no se especifica ninguna condición, significa que la regla de reescritura reescribe
todas las tuplas de la vista. Estas condiciones se construyen de la misma manera que las utilizadas con la
cláusula WHERE de la sentencia SELECT (ver sección 6.3).
•
Internacionalización de la condición. Indica la configuración de internacionalización de los literales que
contiene la condición.
•
Función de transformación de salida. La función que realiza la reescritura sobre una tupla resultado. Dicha
función de transformación recibe las tuplas que verifican una expresión-patrón y las reescribe, obteniendo
un nuevo conjunto de tuplas que sustituye a las que encajaron inicialmente.
•
Posición de la regla, dentro de la lista de reglas de escritura asociadas al método de búsqueda al que está
asociado.
Una función de trasformación de salida tiene la misma sintaxis que una función de transformación de entrada (sigue
la sintaxis genérica de las funciones predefinidas de Virtual DataPort, descrita en el Apartado 4.8).
Las funciones de transformación sobre resultados que se incluyen son: REMOVEACCENTS(),REGEXP() y
MAP(). Los siguientes subapartados se ocuparán, respectivamente, de cada una de ellas.
5.3.2.1
REMOVEACCENTS
La función de transformación de salida REMOVEACCENTS(), elimina los acentos de los valores de un conjunto
de atributos. El parámetro que recibe es la lista de atributos de tipo texto sobre los que debe actuar, eliminando los
acentos de las cadenas que tienen como valores dentro de la tupla. La lista de atributos se especifica entre
corchetes, separados por comas (p.e. [field1, field2] ).
5.3.2.2
REGEXP
La función de transformación de salida REGEXP(), reescribe los valores para un conjunto de atributos de una
tupla, que concuerdan con una expresión regular de entrada, a un formato de salida, parametrizados ambos formatos
por variables. Las expresiones regulares de entrada y salida siguen la misma sintaxis que los utilizados por la función
de transformación de entrada del mismo nombre (descrita en el Apartado 5.3.1.2). Esta función recibe tres
parámetros: la lista de atributos de la tupla que reescribe (entre corchetes y separados por comas), los patrones de
Creación de una Relación Base (o Vista Base)
37
Virtual DataPort 4.0
Guía Avanzada de VQL
entrada y los patrones de salida. Los dos últimos indican el formato de los valores de entrada y salida para dichos
atributos, respectivamente.
5.3.2.3
MAP
La función MAP() reescribe una tupla aplicando mapas de correspondencia directa sobre determinados campos de
la misma. Recibe como parámetros la opción de internacionalización a aplicar, la lista de nombres de los atributos
sobre los que se aplican los mapas (entre corchetes y separados por comas) y la lista de mapas a aplicar a cada uno
de los atributos especificados en el atributo anterior.
Como ejemplo, supóngase que tenemos una tienda electrónica de libros que, para la información de formato, puede
devolver uno de los siguientes valores: ‘eBook’, ’Hardcover’ o ‘Paperback’, mientras que la relación base
que representa a dicha fuente tiene un atributo FORMAT, que pertenece a un tipo de dato enumerado que admite
los siguientes valores: ’EB’, ’HC’ o ‘PB’. Podríamos definir un mapa que realizase la conversión entre unos y otros
valores y, posteriormente, utilizar una función de reescritura MAP para reescribir adecuadamente los resultados
obtenidos de la fuente.
En la Figura 12 se muestra cómo se añadiría una regla de reescritura tipo raw sobre resultados que reescribe el valor
del campo FORMAT aplicando el mapa “testBookFormat” (expresado según la configuración de
internacionalización “es_euro”) sobre todas las tuplas resultado de ejecutar el método de búsqueda
bookview_sm1.
ALTER TABLE bookview
ALTER SEARCHMETHOD bookview_sm1 (
RAWPATTERNS (
ADD OUTPUT () es Map('es_euro',[FORMAT],[ 'testBookFormat']) 1
)
);
Figura 12 Adición de una regla de reescritura de salida con la función MAP()
Nótese que en este ejemplo, la regla de reescritura se ha hecho de tipo raw porque los valores utilizados por la
fuente para los datos del atributo FORMAT, no son válidos para el tipo de datos enumerado definido para este
atributo (será, de hecho, la regla de reescritura la que convierta el valor recibido de la fuente en uno de los valores
aceptados por el tipo de dato del atributo).
Creación de una Relación Base (o Vista Base)
38
Virtual DataPort 4.0
6
Guía Avanzada de VQL
CONSULTAS: SENTENCIA SELECT
Virtual DataPort permite realizar consultas sobre las relaciones previamente creadas utilizando la sentencia
SELECT. Su sintaxis se muestra en la Figura 13. La sintaxis de esta y todas las sentencias VQL puede consultarse
también haciendo uso del comando HELP (ver sección 16.2).
Los siguientes subapartados describen el uso de cada una de las cláusulas de la sentencia SELECT.
{ <select> | <union select> }
[
FILTER <function> [; <function> ]*
| ORDER BY <order by field> [, <order by field>]* [ ASC | DESC ]
]
[ CONTEXT ( <context information> [, <context information>]* ) ]
[ TRACE ]
<select> ::=
SELECT [DISTINCT] <select fields>
FROM <view> [ , <view> ]*
WHERE <condition>
GROUP BY <group by field> [ , <group by field> ]*
HAVING <condition>
<union select> ::= <select> [ UNION <select> ]+
<projected union select> ::= SELECT <select fields> FROM ( <union select> )
<select fields> ::=
<select field> [ [ AS ] <alias:identifier>]
[, <select field> [ [ AS ] <alias:identifier>] ]*
<select field> ::= * | <value>
<view> ::=
<simple view>
| <join view>
| ( <select> )
<simple view> ::=
<view:identifier> [ [ AS ] <alias:identifier> ]
| <procedure:identifier> ( [<procedureParameter> [,<procedureParameter>]*]
)
[ [ AS ] <alias:identifier> ]
| <flatten view>
<join view> ::=
<inner view1:view> [<method type>] [<order type>] [<join type>]
JOIN <inner view2:view> ON ( <join condition> )
| <inner view1:view> NESTED PARALLEL [<order type>] [<join type>]
JOIN [nestedParallelNumber:integer] <inner view2:view> ON ( <join
condition> )
| <inner view1:view> [<method type>] [<order type>]
NATURAL [<join type>] JOIN <inner view2:view>
| <inner view1:view> NESTED PARALLEL [<order type>]
NATURAL [<join type>] JOIN [nestedParallelNumber:integer] <inner
view2:view>
| <inner view1:view> [<method type>] [<order type>] [<join type>]
JOIN <inner view2:view> USING ( <field> [, <field>]* )
| <inner view1:view> NESTED PARALLEL [<order type>] [<join type>]
JOIN [nestedParallelNumber:integer]<inner view2:view>
USING ( <field> [, <field>]* )
Consultas: Sentencia SELECT
39
Virtual DataPort 4.0
Guía Avanzada de VQL
| <inner view1:view> CROSS JOIN <inner view2:view>
<inner view> ::=
<simple view>
| ( <view> )
<join type> ::= LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] | INNER
<method type> ::= HASH | NESTED | MERGE
<order type> ::= ORDERED | REVERSEORDER
<flatten view> ::=
FLATTEN ( <view identifier>[.<register field>]*.<array field> )
| FLATTEN ( <view identifier> AS <alias>
[, <alias>[.<register field>]*.<array field> AS <alias> ]*,
<alias>[.<register field>]*.<array field> )
<value> ::= (see Figura 4)
<condition> ::=
<condition> AND <condition>
| <condition> OR <condition>
| NOT <condition>
| ( <condition> )
| <value> <binary operator> <value> [ , <value> ]*
| <value> <binary operator> ( <value> [ , <value> ]* )
| <value> BETWEEN <value> AND <value>
| <value> <unary operator>
<view identifier> ::=
<view name:identifier>
| <view name:literal>
<value> ::= (see Figura 4)
<join condition> ::=
<simple join condition> [ AND <simple join condition> ]*
| ( <join condition> )
<simple join condition> ::=
<field1:field name> <binary operator> <field2:field name>
| <field2:field name> <binary operator> <field1:field name>
<group by field> ::= { <field name> | <field position:integer> }
<order by field> ::= { <field name> | <field position:integer> }
<binary operator> ::= (see Figura 3)
<field name> ::= (see Figura 4)
<context information> ::=
<literal> = <context value>
| QUERYPLAN = <query plan>
<query plan> ::= { } | [<view name:identifier> : <view plans>]+
<view plans> ::= <view plan> | [ ( [<view plan>] ) ]+
<view plan> ::=
<any method type> <any order type>
| NESTED PARALLEL [nestedParallelNumber:integer] <any order type>
<any method type> ::= <method type> | ANY
<any order type> ::= <order type> | ANY
<context value> ::= <number> | <boolean> | <literal>
Figura 13 Sintaxis de la sentencia SELECT
Consultas: Sentencia SELECT
40
Virtual DataPort 4.0
6.1
Guía Avanzada de VQL
CLÁUSULA FROM
La especificación de la tabla origen se realiza a través de la cláusula FROM. En dicha cláusula, se indica el nombre
de la relación -o relaciones- de las que se extrae la información. Es posible indicar alias para las relaciones en la
cláusula FROM, que podrán ser utilizados en el resto de cláusulas de la sentencia SELECT, y facilitarán la creación
de condiciones de Join. Si se indica un alias para una relación en la cláusula FROM, en el resto de la sentencia
SELECT no se podrá utilizar el nombre de la relación para prefijar campos de la misma; deberá utilizarse siempre el
alias.
Es posible utilizar subconsultas en la cláusula FROM. La subconsulta debe incluirse entre paréntesis.
Ejemplo: La siguiente sentencia utiliza una subconsulta que realiza una operación de UNION entre las vistas
internet_inc y phone_inc:
SELECT * FROM (SELECT * FROM internet_inc UNION SELECT * FROM phone_inc)
WHERE taxid="B78596011"
Si se listan varias relaciones en la cláusula FROM sin separarlas por la cláusula JOIN, entonces se realizará el
producto cartesiano de las mismas. El siguiente subapartado se ocupa de las diferentes operaciones de join
disponibles.
La cláusula FROM también puede contener invocaciones a procedimientos almacenados. Los resultados devueltos
por la invocación del procedimiento serán tratados en este caso como las tuplas de una vista. Véase la sección 10
para más detalle.
6.1.1
Operaciones de join
La cláusula FROM también permite definir las condiciones de Join entre las vistas involucradas en una consulta.
Para ello debe utilizarse la construcción:
FROM view1 JOIN view2 ON (joinCondition)
donde view1 y view2 son las vistas involucradas y joinCondition especifica la condición de join deseada.
Pueden utilizarse los siguientes modificadores sobre la cláusula JOIN:
•
INNER: La operación de join realizada será de tipo inner. Los ‘inner join’ incluyen en el resultado sólo
aquellas tuplas construidas a partir de las tuplas de ambas relaciones que quedan asociadas en función de
las condiciones de join. Es el tipo más habitual de join y el utilizado por defecto. Ejemplos:
FROM view1 JOIN view2 ON (joinCondition)
FROM view1 INNER JOIN view2 ON (joinCondition)
•
OUTER: La operación de join realizada será de tipo outer. Hay tres opciones para los join ‘outer’ (debe
utilizarse siempre una de ellas): FULL, LEFT y RIGHT. Si se utiliza la opción FULL se incluyen en el
resultado las tuplas de ambas relaciones aunque no tengan una tupla asociada en la otra relación (los
atributos de la otra relación se rellenarán con NULL en la tupla resultante). Si se utiliza la opción LEFT,
sólo se incluyen las tuplas de la primera relación que no tengan tuplas asociadas en la segunda. Si se
especifica la opción RIGHT, sólo se añaden las tuplas de la segunda que no tengan tuplas asociadas en
la primera. Ejemplos:
FROM view1 FULL OUTER JOIN view2 ON (joinCondition)
FROM view1 LEFT OUTER JOIN view2 ON (joinCondition)
FROM view1 RIGHT OUTER JOIN view2 ON (joinCondition)
Consultas: Sentencia SELECT
41
Virtual DataPort 4.0
•
Guía Avanzada de VQL
NATURAL: Se realizará la operación de join natural. En este tipo de join no se indicarán condiciones ya
que se realizará asociando aquellos atributos con el mismo nombre y el mismo tipo en ambas relaciones de
entrada utilizando el operador ‘=’. Puede utilizarse tanto con joins ‘inner’ como ‘outer’. Ejemplos:
FROM view1 NATURAL JOIN view2
FROM view1 NATURAL LEFT OUTER JOIN view2
•
CROSS: Se realizará el producto cartesiano de las vistas especificadas. Es equivalente a listar las
relaciones en la cláusula FROM sin utilizar JOIN. Ejemplo:
FROM view1 CROSS JOIN view2
En lugar de especificar una condición de join es posible también utilizar la claúsula USING para especificar una lista
de atributos con el mismo nombre y mismo tipo en ambas relaciones. Si alguno de los atributos especificados no
existe en alguna rama del join, o los tipos no coinciden en ambas ramas, se producirá un error. Este caso es
equivalente a utilizar una condición de join que exija la igualdad de los valores de los atributos especificados en
ambas relaciones.
Ejemplo:
FROM view1 JOIN view2 USING (attribute1,…,attributeN)
Por último, es posible también fijar una estrategia de ejecución para una operación de join determinada. Véase la
sección 18.2.1 para más información a este respecto.
6.1.2
FLATTEN VIEW (Aplanando estructuras de datos)
Denodo Virtual DataPort soporta el modelado de tipos de dato con estructura en árbol mediante el uso de los tipos
register y array (ver sección 18.1).
En Virtual DataPort un elemento de tipo array debe ser visto como una subrelación; en realidad un array
DataPort siempre tendrá asociado internamente un tipo register. Cada subelemento contenido en el array
pertenecerá a dicho tipo de datos register. De esta forma, los campos de este registro pueden verse como el
esquema de la subrelación que está modelando.
En ocasiones puede ser deseable “aplanar” un campo compuesto que contenga un array de registros. Esto es
especialmente frecuente al tratar fuentes de tipo XML y Web services. Esta sección describe como hacerlo.
Supóngase que tenemos un Servicio Web con una operación getAverageMonthlySales. Esta operación no
recibe ningún parámetro y devuelve información sobre las ventas mensuales de todos los clientes de una empresa
mediante un array de objetos dónde cada objeto tendrá dos propiedades: taxId y revenue.
La relación base creada sobre esta nueva operación tendrá típicamente un único atributo de tipo array
conteniendo elementos de un tipo register y una única tupla dónde se encontrará toda la información devuelta
por el servicio web. De cara a la combinación de la información con otras fuentes puede ser mucho más útil una
vista que tenga dos atributos (taxId y revenue) y una tupla por cada cliente. Esto puede realizarse mediante
una operación de “aplanamiento” sobre la vista original. A continuación se describe dicho proceso.
En la cláusula FROM se puede utilizar un constructor especial (FLATTEN) para la definición de consultas sobre
visiones “aplanadas” de vistas con tipos de datos compuestos (ver sección18.1). El constructor FLATTEN permite
generar tuplas a partir de los subcampos compuestos de tipo array de las tuplas originales de una vista determinada.
Su sintaxis (ver Figura 14) permite las siguientes alternativas:
Consultas: Sentencia SELECT
42
Virtual DataPort 4.0
-
-
Guía Avanzada de VQL
Especificando el nombre de un atributo de una vista de tipo array, genera una vista que tiene como
esquema el del registro contenido en el array indicado. El nombre del subelemento array especificado
puede encontrarse contenido dentro de una o varias estructuras de registros (pero no puede atravesar
ningún otro array).
Especificando el nombre de una vista y un alias, es posible obtener la representación aplanada de un array
que podría estar a su vez contenido en otros arrays. Además en este caso se conservan el resto de campos
de la vista.
La sintaxis se especifica indicando inicialmente un alias para la vista original, y a continuación el elemento
array sobre el que aplicar la operación FLATTEN. Si se desea aplicar sobre un array que está
contenido en otro, será necesario añadir un alias al último array indicado y sobre éste especificar el
elemento array que interese (si se desea atravesar más elementos array, se procede de forma similar).
El esquema resultante contendrá los campos de la vista original (excepto sobre el que se realice la
operación de FLATTEN) y todos los elementos de todos los registros involucrados en el aplanamiento.
<flatten view> ::=
FLATTEN ( <view name:identifier>[.<register field>]*.<array field> )
| FLATTEN ( <view name:identifier> AS <alias>,
[ <alias>[.<register field>]*.<array field> AS <alias> ]*,
<alias>[.<register field>]*.<array field> )
Figura 14 Sintaxis de una FLATTEN view
Ejemplo: Supóngase que tenemos la relación base AVERAGE_REVENUE_ARRAY cuyo esquema está
compuesto por un campo de tipo array de registros llamado RETURN. Cada registro tiene dos campos: TAXID y
REVENUE. La siguiente sentencia devuelve los contenidos “aplanados” de AVERAGE_REVENUE_ARRAY:
SELECT TAXID, REVENUE FROM FLATTEN (AVERAGE_REVENUE_ARRAY AS V,
V.RETURN)
6.2
CLÁUSULA SELECT
A través de la cláusula SELECT se indican los atributos (separados por comas) que se desea obtener de las
relaciones que se especifican en la cláusula FROM. Las consultas que un usuario realiza pueden involucrar tanto
relaciones base como vistas complejas derivadas previamente definidas.
Si se especifica el carácter “*” en la cláusula SELECT, significa que se seleccionan todos los atributos de las
vistas sobre las que se realiza la consulta.
Como resultado de una consulta sobre Virtual DataPort, se obtiene una relación o vista cuyo esquema viene dado por
los nombres y tipos de los atributos especificados en la cláusula SELECT. También es posible definir alias para las
columnas obtenidas, permitiendo de esta forma modificar el nombre de algún atributo.
En el caso de atributos derivados, no es obligatorio definir un alias para indicar el nombre del nuevo campo de la
relación (véase el apartado 6.2.1). Si no se especifica, entonces el sistema asociará como alias el nombre de la
función generadora del atributo derivado, en el caso de las funciones, y el nombre del último subcampo referenciado
en el caso de un subelemento de un campo compuesto.
En una consulta, si un campo no tiene alias y es una referencia a un campo de una vista inferior, su nombre es el
nombre de la vista de la que proviene seguida del nombre del campo (separados por el caracter '.'). En cambio, en
una vista, el nombre de sus campos nunca encapsulan el nombre de una vista inferior; por tanto, en una vista el
nombre de un campo sin alias que es una referencia a un campo de una vista inferior, será simplemente el nombre
del campo en la vista inferior sin ningún nombre de vista.
Consultas: Sentencia SELECT
43
Virtual DataPort 4.0
Guía Avanzada de VQL
En las consultas y en las vistas, no se permite que haya dos campos con el mismo nombre, siendo necesario
renombrar (mediante alias) alguno de ellos de forma diferente.
Finalmente, puede incluirse el modificador DISTINCT. En ese caso se eliminarán del resultado aquellas tuplas
duplicadas.
6.2.1
Atributos Derivados
En la cláusula SELECT, además de columnas que procedan directamente de atributos de relaciones incluidas en la
cláusula FROM, pueden incluirse columnas cuyos valores se deriven de un cálculo a partir de los valores de otras
columnas. Este tipo de atributos suelen denominarse atributos derivados.
Los valores de un atributo derivado se obtienen por medio de una función predefinida (ver la sección 4.6), que puede
recibir como parámetros los valores de otras columnas, así como valores constantes o, incluso, el resultado de
aplicar otras funciones del mismo tipo.
En la sección 4.6 se puede encontrar la descripción de las funciones soportadas por Virtual DataPort.
A continuación se muestran algunos ejemplos de utilización de funciones de atributo derivado. La siguiente consulta
obtiene el sueldo de los empleados (vista emp) con un incremento de 1000 euros en una columna denominada
newSalary.
SELECT SUM(1000, salary) newSalary
FROM emp;
Y el siguiente ejemplo muestra el uso como parámetro de una función anidada:
SELECT NAME, SUM(SALARY, DIV(SALARY,1000)) salaries
FROM emp;
6.3
CLÁUSULA WHERE
En la cláusula WHERE se especifican las condiciones que deben cumplir los resultados de la consulta efectuada. La
sintaxis para la especificación de una condición se muestra en la Figura 15.
<condition> ::=
<condition> AND <condition>
| <condition> OR <condition>
| NOT <condition>
| ( <condition> )
| <value> <binary operator> <value> [ , <value> ]*
| <value> <binary operator> ( <value> [ , <value> ]* )
| <value> BETWEEN <value> AND <value>
| <value> <unary operator>
Figura 15 Sintaxis para una condición
Una condición es una secuencia de elementos condición separados por los operadores lógicos AND, OR o NOT. Cada
condición, representa una operación de comparación, que al evaluarse obtiene como resultado un valor positivo
(verdadero) o negativo (falso). Las condiciones pueden agruparse entre los símbolos ‘(’ y ‘)’ para variar su
precedencia.
Consultas: Sentencia SELECT
44
Virtual DataPort 4.0
Guía Avanzada de VQL
Una condición se compone de un argumento, que es el elemento sobre el cuál se aplica la condición y que se
corresponderá con el primer operando, seguido de un operador de comparación. Este operador, a su vez, y siempre
que no sea unario (IS NULL, IS NOT NULL, IS TRUE o IS FALSE), va seguido de uno o varios
argumentos dependiendo de la naturaleza del mismo. Los operadores de comparación que soporta Virtual DataPort
se especifican en el apartado 4.5, e incluyen operadores de igualdad, de comparación mayor/menor, de contención
de cadenas, etc.
Se puede decir que una condición se compone de tres elementos: una parte izquierda (que será el operando sobre el
que se aplica la operación de comparación), un operador y una parte derecha (que es opcional y que contiene el resto
de los operandos que se compararán con el de la parte izquierda).
Un operando de una condición puede ser el nombre de un atributo, un literal, un número, un valor lógico, una
expresión a evaluar o un valor compuesto (ver sección 6.3.1). Una expresión como operando de una condición es una
función predefinida y parametrizada como la que se utiliza para la especificación de un atributo derivado dentro de la
cláusula SELECT, pero con una particularidad añadida: en la mayoría de los casos es obligatorio que uno de los
operandos sobre el que se aplica la condición (es decir, en el operando de la parte izquierda o en alguno de los de la
derecha), esté parametrizado por al menos el nombre de un atributo (no es así, por ejemplo con la función
TEXTCONSTANT("texto"), porque TEXTCONSTANT devuelve siempre como resultado un elemento de
tipo "text").
Como ya se ha adelantado, algunos operadores pueden admitir operandos de varios tipos de dato, pero en una
misma condición, todos sus operandos deben pertenecer al mismo tipo. Por ejemplo, el operador ‘=’, sirve para
comparar elementos de cualquier tipo de dato (tipo texto, entero, real, etc), pero dentro de una condición específica,
es necesario que todos los operandos sean del mismo tipo (no se pueden comparar, por ejemplo, un valor tipo entero
con un valor tipo texto, aunque es posible utilizar la función CAST para realizar las conversiones de tipo precisas
antes de la comparación).
6.3.1
Condiciones con valores compuestos
El constructor ROW permite crear valores compuestos de tipo register (ver sección 18.1). Por ejemplo:
ROW (value1,…,valueN)
crearía un valor de tipo register con N campos. Cada value especificado puede ser un atributo, un literal, un
número, un valor lógico, una expresión a evaluar o un nuevo elemento ROW. Cada campo del registro creado será del
tipo de datos del value correspondiente.
Utilizando ROW combinado con los contructores ‘{‘ y ‘}’ es posible también crear tipos array DataPort. Por
ejemplo:
{ ROW (value1,…,valueN), ROW (valueN+1,…,value2N)}
crearía un valor de tipo array conteniendo dos valores register.
NOTA: Véase la Figura 4 para una descripción formal de la sintaxis de creación de valores compuestos.
Las condiciones con valores compuestos pueden utilizarse solamente con los operadores de igualdad ‘=’ y
desigualdad ‘<>’. Para que la comparación sea posible ambos operandos deben tener tipos compatibles.
6.4
CLÁUSULA GROUP BY
Otra cláusula perteneciente al comando SELECT es GROUP BY. Esta cláusula permite agrupar los resultados
obtenidos de una consulta en función de los valores de un conjunto de atributos, obteniendo por cada uno de esos
grupos una única tupla en los resultados. En la cláusula GROUP BY se especifican los atributos por los que se
Consultas: Sentencia SELECT
45
Virtual DataPort 4.0
Guía Avanzada de VQL
desea realizar la operación de agrupamiento. Si no se especificasen atributos de agrupamiento (sin cláusula GROUP
BY o con cláusula GROUP BY vacía) pero en la cláusula SELECT se indicasen funciones de agregación, entonces todos
los resultados obtenidos por la sentencia SELECT formarían un grupo.
Cuando en una consulta se especifica la cláusula GROUP BY, el contenido de la cláusula SELECT está
restringido. Sólo se podrán especificar en ella los atributos de agrupamiento (es decir, los que se especifican en el
GROUP BY). El resto de los atributos deberán aparecer como parámetros de funciones de agregación, que
calcularán el valor “agregado” de cada atributo en las tuplas resultado. Cuando se especifica una función de
agregación en la cláusula SELECT, es necesario indicar un alias para el nuevo atributo en la vista resultado. De no
hacerlo, se generará un alias de forma automática, que será el nombre de la función aplicada.
En una vista de agrupación, en la cláusula SELECT también pueden aparecer funciones de atributo derivado, aunque
sólo aplicadas sobre campos o funciones de agregación.
6.4.1
Uso de Funciones de Agregación
Una función de agregación o de agregado, se aplica sobre las tuplas pertenecientes a un grupo resultado de una
operación GROUP BY, y calcula un valor a partir de las mismas. En el Apartado 4.7 se enumeran las funciones de
agregación existentes en Virtual DataPort.
Las funciones de agregación, siguen la sintaxis general de las funciones predefinidas (ver Apartado 4.8), pero sólo
admiten como parámetro el nombre del atributo sobre el que actúan (tampoco admiten funciones anidadas).
Adicionalmente, también permiten especificar el modificador ALL/DISTINCT.
Una excepción la constituye la función de agregación COUNT(), que puede recibir como parámetro el carácter
especial “*”, para indicar que cuente el número de tuplas que pertenecen a cada grupo.
Por ejemplo, dada una relación emp representando a los empleados de una empresa, que contenga un atributo
departament que indique a qué departamento pertenece cada empleado, para obtener los diferentes
departamentos, junto con el número de empleados que pertenecen a cada uno de ellos, se realizaría la siguiente
consulta:
SELECT count(*) AS numOfWorkers, department
FROM emp
GROUP BY department;
6.5
CLÁUSULA HAVING
La cláusula HAVING permite especificar condiciones de filtrado sobre los resultados devueltos por una consulta que
utilice la cláusula GROUP BY.
Por ejemplo, continuando con el ejemplo de la sección anterior, para obtener solamente los datos correspondientes a
departamentos con más de 10 empleados, podríamos efectuar la siguiente consulta:
SELECT count(*) AS numOfWorkers, department
FROM emp
GROUP BY department
HAVING COUNT(*)>10
Consultas: Sentencia SELECT
46
Virtual DataPort 4.0
6.6
Guía Avanzada de VQL
CLÁUSULA UNION
La sentencia SELECT también permite obtener una nueva vista que contenga las tuplas contenidas en otras dos
vistas o consultas. Esto es posible mediante la cláusula UNION. Esto se corresponde, salvando algunas diferencias
leves, con la operación unión de álgebra relacional.
Cada relación que interviene en la operación de unión se corresponde con una consulta específica. Para especificar
una unión de varias consultas, éstas se separan por la palabra UNION.
En principio, para realizar su unión en álgebra relacional, se precisa que todas las relaciones tengan el mismo
esquema, es decir, los mismos atributos. Sin embargo, en Virtual DataPort, si alguna de las vistas tiene algún
atributo que la otra no tiene, éste se añade a la vista resultante (unión ampliada).
Además, en este caso, la unión incluye filas repetidas, es decir, si alguna fila está en dos tablas, la tupla aparecerá
dos veces en la vista resultado. Puede utilizarse el modificador DISTINCT para evitar esta situación.
6.6.1
Especificación de proyecciones en consultas UNION
Como característica adicional, es posible indicar en las sentencias SELECT de Virtual DataPort los campos a
proyectar de una vista unión; es decir, se permite indicar una proyección (SELECT <field list>) sobre el resultado de
una <union view>. Su sintaxis se muestra en la Figura 16.
<union select> ::= <select> [ UNION <select> ]+
<projected union select> ::= SELECT <select fields> FROM ( <union
select> )
Figura 16 Sintaxis para una proyección sobre el resultado de una unión
6.7
CLÁUSULA ORDER BY
En el comando SELECT, se puede utilizar la cláusula ORDER BY para indicar que se desea obtener el resultado
ordenado por una lista de atributos.
La cláusula ORDER BY va seguida del atributo o atributos de la vista final por los que se desean ordenar las tuplas
y el orden, ascendente o descendente que se desea utilizar. Por defecto, los resultados se muestran en orden
ascendente. Por ejemplo, la siguiente consulta obtiene los empleados ordenados por el atributo pay en orden
descendente.
SELECT * FROM emp ORDER BY pay DESC;
También es posible especificar los atributos de ordenación por su número de orden en la cláusula SELECT. Por
ejemplo:
SELECT name,pay FROM emp ORDER BY 2 DESC;
En general, los resultados de una consulta sobre Virtual DataPort se tratarán de forma asíncrona, es decir que los
resultados se obtendrán a medida que son extraídos de las fuentes, sin que sea preciso esperar a tener disponibles
todos los resultados para procesar los que ya han llegado. En cambio, si una consulta tiene especificada una cláusula
ORDER BY, el resultado de la consulta se obtendrá de forma síncrona (es decir, no se podrá acceder a ningún
resultado hasta que se hayan obtenido todos).
Consultas: Sentencia SELECT
47
Virtual DataPort 4.0
6.8
Guía Avanzada de VQL
CLÁUSULA CONTEXT
Una consulta tiene un contexto de ejecución, es decir, un conjunto de características de ejecución específicas que
poseen unos valores por defecto. Por ejemplo, los resultados de una consulta, mientras no se indique lo contrario, se
mostrarán según una configuración de internacionalización concreta; es decir, en una moneda, lenguaje, etc.
específicos. La sentencia SELECT, mediante la cláusula CONTEXT, permite modificar el contexto de ejecución
para la consulta actual.
En general, la cláusula CONTEXT recibe pares clave-valor (separados por comas), dónde la clave es el nombre de la
característica de ejecución a modificar y el valor indica el nuevo valor para dicha característica. El nombre de la clave
no es sensible a mayúsculas /minúsculas, mientras que, en el caso del valor, depende de la característica que
represente (ver Figura 17 para una descripción formal de la sintaxis). Las características de ejecución configurables a
través de CONTEXT son:
•
i18n: La internacionalización para los resultados de una consulta. Dicha propiedad, toma como valor el
nombre de una configuración de internacionalización (por ejemplo: es_euro). Una internacionalización
es válida, si existe un mapa de tipo i18n en el catálogo del servidor (en el Apartado 11.2 se explican en
detalle los tipos de mapas pertenecientes al catálogo).
•
Cache: La utilización de caché de resultados, es decir, si debe aprovechar resultados de consultas
anteriores para la resolución de la consulta. Esta propiedad, puede tomar como valores “ON” (para utilizar
la caché de las vistas involucradas en la consulta de acuerdo a su configuración actual) y “OFF” (para
desactivar la caché para la consulta). Por defecto, está a “ON”. Véase la sección 18.2.2 para más detalles
sobre la configuración de la cache en vistas.
•
QueryPlan: Permite especificar en tiempo de ejecución diversas características del plan de ejecución de la
consulta. Véase la sección 18.2.1 para más detalle.
•
DelegateUnnamedViews. Puede tomar los valores ‘YES’ o ‘NO’. Si no se indica, se asume el valor ‘YES’. La
utilidad de esta opción se explica a continuación. Al crear vistas utilizando la herramienta de
administración gráfica de Virtual DataPort, es posible que el sistema cree vistas intermedias adicionales.
Estas vistas reciben un nombre interno creado por DataPort y, por ello, se denominan “vistas sin nombre”.
Además, cuando se ejecuta una consulta que realiza una proyección o una agregación sobre una vista
existente, DataPort también crea internamente una vista sin nombre que dura tan sólo mientras se ejecuta
la consulta. Por otro lado, DataPort intenta delegar siempre la mayor cantidad de procesamiento que sea
posible a las fuentes de datos origen. En ciertos casos, la delegación a la fuente de las operaciones
realizadas por las vistas sin nombre puede llevar a que, en ciertas consultas, no se utilice la cache de una
vista, incluso aunque la cache haya sido activada. En estos casos, el usuario puede decidir fijar el valor de
esta propiedad a ‘NO’. Véase la sección 18.2.2.1 para más detalle.
•
Swap: Indica si está activado o no el “swapping” para la consulta. Esta propiedad debe tomar el valor
“ON” para indicar que está permitido realizar swapping de resultados intermedios durante la ejecución de
la consulta. El valor “OFF” indica lo contrario. Véase la sección 18.2.3 para más detalle.
•
SwapSize: Esta propiedad indica el tamaño máximo que puede alcanzar un resultado intermedio obtenido
mediante la ejecución de esta consulta sin que el sistema realice “swapping” del mismo. Recibe como
parámetro el tamaño máximo (en megabytes). Sólo tiene efecto en caso de que se haya especificado la
opción SWAP ON. Véase la sección 18.2.3 para más detalle.
<context information> ::=
Consultas: Sentencia SELECT
48
Virtual DataPort 4.0
|
Guía Avanzada de VQL
<literal> = <context value>
QUERYPLAN = <query plan>
<query plan> ::= (see section 18.2.1.1)
<context value> ::= <number> | <boolean> | <literal>
Figura 17 Sintaxis de la cláusula CONTEXT
6.9
CLÁUSULA TRACE
Mediante la cláusula TRACE del comando SELECT, se solicita al servidor un nivel detallado de traza en la
ejecución de una consulta.
La traza de una sentencia permite un examen detallado de su plan de ejecución. Dicho plan puede modelarse como
un árbol donde cada nodo representa una vista intermedia involucrada en la ejecución de la consulta o un acceso a
una fuente a través de un wrapper.
Para cada nodo en el árbol de ejecución de la consulta, la cláusula TRACE muestra sus parámetros más relevantes.
La herramienta de administración de DataPort (ver Guía del Administrador [3]) permite visualizar la traza de ejecución
en forma gráfica, lo que permite un análisis más sencillo de esta información.
Entre los parámetros mostrados por la cláusula TRACE se encuentran:
•
Tipo de nodo. Si el nodo es una vista, indica el tipo de vista de que se trata (vista base, unión, join,
proyección,…). Si se trata de un acceso a una fuente (wrapper), se indica el tipo de fuente (JDBC, Web
Service, Web…).
•
Tiempo de ejecución. Tiempo invertido en la ejecución completa del nodo y de todos sus hijos.
•
Momento de inicio. Momento exacto en el que se inicia el procesamiento del nodo en el plan de ejecución.
•
Momento de fin de la consulta. Momento exacto en el que se finaliza el procesamiento del nodo (y de
todos sus hijos) en el plan de ejecución.
•
Tiempo hasta que se obtuvo la primera tupla de resultados. Tiempo transcurrido hasta que el nodo recibió
la primera tupla a procesar.
•
Número de tuplas procesadas. Número de tuplas procesadas por el nodo.
•
Estado. Indica si el nodo se ejecutó correctamente o se produjo algún error.
•
Parámetros avanzados. Proporcionan más detalle sobre cada tipo de nodo. Por ejemplo:
o
En el caso de nodos de tipo wrapper, se indican las subconsultas exactas ejecutadas sobre cada
fuente de datos, así como los datos de conexión utilizados para acceder a cada una de ellas.
Consultas: Sentencia SELECT
49
Virtual DataPort 4.0
o
•
Guía Avanzada de VQL
Para cada nodo de tipo vista, se indica si se ha utilizado o no la cache, si ha sido necesario
realizar swapping, si existen reglas de reescritura asociadas a la misma, etc.
Condiciones de error. La traza indica también los posibles errores producidos durante la ejecución del nodo.
A modo de ejemplo, la Figura 18 muestra la traza de la ejecución de la consulta siguiente:
SELECT * FROM INTERNET_INC TRACE
INTERNET_INC es una vista base creada sobre una tabla del mismo nombre accesible a través de una fuente de
datos JDBC.
BASE PLAN (
name = INTERNET_INC
startTime = Wed Jan 10 17:50:01 850 GMT+01:00 2007
endTime = Wed Jan 10 17:50:04 063 GMT+01:00 2007
responseTime = Wed Jan 10 17:50:04 053 GMT+01:00 2007
numRows = 4
state = OK
completed = true
fields
=
[IINC_ID,
SUMMARY,
TTIME,
TAXID,
SPECIFIC_FIELD2]
search conditions = []
filter conditions = []
numOfFilteredTuples = 0
numOfDuplicatedTuples = 0
numOfSwappedTuples = 0
swapping = false
inputRewriteFunctions = false
outputRewriteFunctions = false
inputRawRewriteFunctions = false
outputRawRewriteFunctions = false
SPECIFIC_FIELD1,
JDBC WRAPPER (
name = internet_inc
startTime = Wed Jan 10 17:50:02 070 GMT+01:00 2007
endTime = Wed Jan 10 17:50:04 063 GMT+01:00 2007
responseTime = Wed Jan 10 17:50:04 063 GMT+01:00 2007
numRows = 4
state = OK
completed = true
searchConditions = []
orderByFields = []
projectedFields
=
[IINC_ID,
SUMMARY,
TTIME,
TAXID,
SPECIFIC_FIELD1, SPECIFIC_FIELD2]
JDBC ROUTE (
name = internet_inc#0
startTime = Wed Jan 10 17:50:03 782 GMT+01:00 2007
endTime = Wed Jan 10 17:50:04 063 GMT+01:00 2007
responseTime = Wed Jan 10 17:50:04 063 GMT+01:00 2007
numRows = 4
state = OK
completed = true
SQLSentence = SELECT t0.iinc_id, t0.summary, t0.ttime,
t0.taxId, t0.specific_field1, t0.specific_field2 FROM test_vdb.internet_inc t0
parameters = []
DBUri = jdbc:mysql://localhost/test_vdb
userName = vdb
connectionTime = 0
cachedStatus = false
)
Consultas: Sentencia SELECT
50
Virtual DataPort 4.0
Guía Avanzada de VQL
)
)
Figura 18 Traza de ejecución
Para analizar la traza de ejecución de consultas, se recomienda el uso de la herramienta de administración de
DataPort (ver Guía del Administrador [3]), que permite visualizar la traza de ejecución en forma gráfica.
Consultas: Sentencia SELECT
51
Virtual DataPort 4.0
7
Guía Avanzada de VQL
DEFINICIÓN DE UNA VISTA DERIVADA
Partiendo de las relaciones base del sistema, el administrador puede definir otras nuevas en función de éstas,
ampliando las funcionalidades del servidor. Estas nuevas relaciones se llaman: vistas derivadas o vistas del esquema
global.
Virtual DataPort permite definir esquemas de mediación para cada aplicación de agregación concreta, mediante la
definición de vistas sobre las relaciones base. El sistema se encargará de calcular automáticamente los métodos de
búsqueda de las nuevas relaciones partiendo de los métodos de búsqueda de las relaciones base involucradas en la
vista y de la expresión utilizada para crearla.
La sentencia CREATE VIEW permite crear vistas derivadas en el esquema mediado del servidor. Su sintaxis se
muestra en la Figura 19.
CREATE [ OR REPLACE ] VIEW <name:identifier> AS <select>
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ] [ CONTEXT ( <context
information> [, <context information>]* ) ]
<select> ::= (see Figura 13)
<context information> ::= (see Figura 13)
Figura 19 Sintaxis de la sentencia CREATE VIEW
Como se puede observar, en la definición de una vista se especifica un nombre y la consulta que la define. La
consulta que se especifica, se define utilizando la sintaxis de la sentencia SELECT, que ha sido explicada en
detalle en el Apartado 6.
Por lo tanto, el administrador puede crear nuevas vistas derivadas utilizando diferentes tipos de relaciones entre
elementos preexistentes en el sistema. Por ejemplo, puede generar una nueva relación que sea la unión de varias, el
join, el producto cartesiano, la selección, la proyección o el group-by.
Además, en la creación de una nueva relación pueden combinarse varios de estos tipos de operadores con el nivel de
complejidad que se desee. También pueden definirse vistas que tomen como base otras vistas previamente
definidas, con lo que se pueden construir árboles de vistas de tantos niveles como sea necesario.
Por ejemplo, considerando las vistas A, B y R como relaciones base (que acceden directamente a las fuentes para
obtener sus datos), el administrador podría definir una vista G como el join del resultado de aplicar la unión (A, B),
con R; como se puede observar en la Figura 20.
Definición de una Vista Derivada
52
Virtual DataPort 4.0
Guía Avanzada de VQL
G
I∪
A
R
B
Figura 20 Ejemplo de definición de una vista en función de otras
La creación de una vista también admite la cláusula estándar SQL WITH CHECK OPTION, cuyo uso está
relacionado con la actualización de los contenidos de la vista mediante las sentencias INSERT /UPDATE /
DELETE. En la sección 8.4 se explica con detalle la función de este modificador.
El uso del modificador OR REPLACE permite especificar que, si ya existe una vista con el nombre indicado, ésta
debe ser reemplazada por la nueva vista. En caso de que debido al cambio de definición de la vista, las capacidades
de consulta (ver sección 5.2) de alguna de las vistas derivadas se hayan alterado (p.e. debido a la adición de algún
campo adicional, o a alguna restricción de consulta no existente anteriormente), DataPort actualizará el esquema y
las capacidades de consulta de las vistas derivadas de nivel superior, siempre que sea posible
7.1
MODIFICACIÓN DE UNA VISTA DERIVADA
Una vez creada una vista derivada a partir de otras vistas existentes, es posible modificar algunas de sus
propiedades:
•
La configuración de la caché mediante las opciones CACHE y TIMETOLIVEINCACHE (ver sección
18.2.2),
•
La configuración de las políticas de “swapping” de DataPort mediante las opciones SWAP y SWAPSIZE
(ver sección 18.2.3)
•
La configuración de las estrategias de ejecución de los joins involucrados en la definición de la vista
mediante la opción QUERYPLAN (ver sección 18.2.1).
•
La configuración de reglas de reescritura de condiciones o resultados para el tratamiento de las
representaciones heterogéneas de información procedente de varias fuentes (ver sección 7.1.1).
La sentencia ALTER VIEW permite al administrador de Virtual DataPort realizar todas estas operaciones. Su
sintaxis se muestra en la Figura 21.
ALTER
[
[
[
[
[
[
VIEW <name:identifier>
CACHE { ON | POST | OFF | INVALIDATE } ]
TIMETOLIVEINCACHE <seconds:integer> ]
SWAP { ON | OFF } ]
SWAPSIZE <megabytes:integer> ]
QUERYPLAN = <query plan> ]
<view search method clause> ]*
<view search method clause> ::=
Definición de una Vista Derivada
53
Virtual DataPort 4.0
Guía Avanzada de VQL
ALTER <name:identifier> (
[ PATTERNS ( [ <pattern clause> ]+ ) ]
)
<pattern clause>=
ADD INPUT [FIELD <field> <operator> [, <operator> ]* ]+
<input_function:function> <integer>
| ADD OUTPUT { () | <condition_clause> }
<i18n:identifier> <output_function:function> <integer>
| DROP INPUT <integer>
| DROP OUTPUT <integer>
<operators> includes “any” to represent any operator.
<query plan> ::= (see section 18.2.1.1)
Figura 21 Sintaxis de la sentencia ALTER VIEW
7.1.1
Reglas de Reescritura Sobre Vistas Derivadas
La sentencia ALTER VIEW permite añadir o eliminar reglas de reescritura. Las reglas de reescritura de entrada
indican cómo deben de ser “traducidas” las consultas que se realizan sobre la vista superior para poder delegarlas a
las vistas inmediatamente inferiores. Y las reglas de reescritura de salida indican cómo deben ser transformadas las
tuplas obtenidas de las vistas inferiores para incluirlas como resultado de la vista inmediatamente superior de forma
homogénea.
En el Apartado 5.3, se describe la estructura de la reglas de reescritura de entrada y salida sobre un método de
búsqueda de una relación base. Las reglas de reescritura asociadas a una vista derivada, son iguales que las que se
aplican sobre las relaciones base, con la diferencia de que las reglas de reescritura sobre las vistas base se indican a
nivel de los métodos de búsqueda de una fuente, mientras que las reglas de reescritura sobre las vistas derivadas se
especifican a nivel de las vistas que se encuentran por debajo en la jerarquía de vistas.
Una vista derivada tiene asociada dos listas de reglas de reescritura de tipo no raw por cada vista inmediatamente
inferior: una lista de reglas de reescritura sobre resultados y otra sobre consultas. Nótese que a este nivel no es
posible utilizar reglas tipo raw (que sí pueden utilizarse sobre relaciones base, tal y como se mostró en la sección
5.3), debido a que es necesario asegurar la consistencia entre los tipos de datos de los atributos de una vista
derivada y los de las relaciones que la componen.
Tal y como ya se comentó en el apartado 5.3.1, una regla de reescritura sobre condiciones o de entrada se compone
de tres partes diferenciadas:
•
las expresiones-patrón o patrones que indican la estructura que deben seguir las condiciones de consulta
que deben de ser reescritas mediante esta regla de reescritura,
•
la función de transformación que reescribe las condiciones que han encajado con las expresiones-patrón y
•
la posición que ocupa dentro de la lista de reglas de reescritura de entrada asociadas al contenedor
especificado.
Por otro lado, una regla de reescritura sobre resultados o de salida se estructura en los siguientes elementos:
•
la condición que debe verificar la tupla para que se aplique sobre ella la regla de reescritura,
Definición de una Vista Derivada
54
Virtual DataPort 4.0
•
la internacionalización de dicha condición,
•
la función de transformación de salida que reescribe los resultados y,
•
la posición que ocupa en la lista de reglas de reescritura de salida.
Guía Avanzada de VQL
En el ejemplo de la Figura 22 se añade a la vista bookview, una regla de reescritura de entrada en la primera
posición. La regla de reescritura cambia el formato de los valores de las condiciones de consulta que utilizan el
operador like sobre el atributo AUTHOR, al delegarlas a la subvista base bookshop.
ALTER VIEW bookview
ALTER bookshop (
PATTERNS (
ADD INPUT
FIELD AUTHOR like
REGEXP('(\w+),(\w+)', '$2 $1') 1
)
);
Figura 22 Adición de una regla de reescritura de entrada sobre vista derivada
Para eliminar la primera regla de reescritura de entrada que se aplica sobre la vista bookshop, desde
bookview, se debe ejecutar la sentencia de la Figura 23.
ALTER VIEW bookview
ALTER bookshop (
PATTERNS (
DROP INPUT 1
)
);
Figura 23 Borrado de una regla de reescritura de salida de una vista no base
Y por último, la Figura 24 muestra como se añade a la vista bookview, una regla de reescritura sobre resultados
en la primera posición. La regla de reescritura de salida modifica el formato de los valores del atributo AUTHOR en
todas las tuplas (ya que carece de condición) que provienen de la subvista bookshop.
ALTER VIEW bookview
ALTER bookshop (
PATTERNS (
ADD OUTPUT () es REGEXP([AUTHOR], '(\w+),(\w+)', '$2 $1') 1
)
);
Figura 24 Adición de una reescritura sobre resultados en una vista derivada
Definición de una Vista Derivada
55
Virtual DataPort 4.0
8
Guía Avanzada de VQL
INSERCIONES, ACTUALIZACIONES Y BORRADOS SOBRE VISTAS
Las sentencias INSERT / UPDATE / DELETE permiten, respectivamente, insertar, modificar y borrar tuplas
de una vista, actualizando directamente la fuente de datos.
Estas sentencias pueden ejecutarse sólo sobre vistas creadas a partir de fuentes de tipo base de datos (fuentes
JDBC/ODBC. Ver secciones 17.3.1 y 17.3.2) y de tipo CUSTOM (ver sección 17.4.9). Además, las vistas deben ser
actualizables de acuerdo a la definición del estándar SQL-92.
En resumen, una vista actualizable debe verificar las siguientes restricciones:
8.1
•
La sentencia SELECT utilizada en la definición de la vista no puede incluir DISTINCT, GROUP BY o
HAVING.
•
La cláusula FROM de la sentencia se refiere a exactamente una vista. Esa vista debe ser o bien una vista
base o bien una vista actualizable. En el caso de ser una vista base, debe o bien pertenecer a una base de
datos (DataSources JDBC/ODBC. Ver secciones 17.3.1 y 17.3.2) o bien utilizar un wrapper de tipo MY que
proporcione soporte para actualizaciones (ver sección 17.4.9).
•
Los atributos derivados no son actualizables.
•
Una vista que utilice una función de agregación (aunque no haya cláusula GROUP BY) no es actualizable.
SENTENCIA INSERT
La sentencia INSERT permite insertar una nueva tupla en una vista, actualizando directamente la fuente de datos.
La Figura 25 muestra su sintaxis.
INSERT INTO <name:identifier> (<field name>[, <field name>]*)
VALUES (<value>[, <value>]*)
[ CONTEXT ( <context information> [, <context information>]* ) ]
[ TRACE ]
INSERT INTO <name:identifier>
SET <field name> = <value> [, <field name> = <value> ]*
[ CONTEXT ( <context information> [, <context information> ]* ) ]
[ TRACE ]
<field name> ::= <identifier>[.<identifier>]
<value> ::=
NULL
| <number>
| <boolean>
| <literal>
Figura 25 Sintaxis de la sentencia INSERT
Por ejemplo, la siguiente sentencia añade una nueva tupla en la vista internet_inc:
Inserciones, Actualizaciones Y Borrados sobre Vistas
56
Virtual DataPort 4.0
INSERT
INTO
internet_inc
(iinc_id,
summary,
specific_field1, specific_field2)
VALUES (6,"Error in ADSL Router", "31-mar-2005
"B78596015", "5", "6")
Guía Avanzada de VQL
ttime,
22h
35m
taxid,
24s",
Como efecto de la ejecución de esta sentencia, se añadirá una nueva tupla en la base de datos fuente a la tabla
representada por la vista internet_inc.
También es posible utilizar la sintaxis alternativa:
INSERT INTO internet_inc
SET iinc_id=6, summary="Error in ADSL router", ttime="31-mar-2005
22h
35m
24s",
taxid="B78596015",
specific_field1="5",
specific_field2="6"
8.2
SENTENCIA UPDATE
La sentencia UPDATE permite modificar el valor de determinados atributos para todas las tuplas de una vista que
verifiquen una determinada condición, actualizando directamente la fuente de datos. La Figura 26 muestra su
sintaxis:
UPDATE <name:identifier>
SET (<field name>[, <field name>]*) = (<value>[, <value>]*)
[ WHERE <condition> ]
[ CONTEXT ( <context information> [, <context information>]* ) ]
[ TRACE ]
UPDATE <name:identifier>
SET <field name> = <value> [, <field name> = <value>]*
[ WHERE <condition> ]
[ CONTEXT ( <context information> [, <context information>]* ) ]
[ TRACE ]
<field name> ::= <identifier>[.<identifier>]
<value> ::=
NULL
| <number>
| <boolean>
| <literal>
| <field name>
<condition> ::=
<condition> AND <condition>
| <condition> OR <condition>
| NOT <condition>
| ( <condition> )
| <value> <binary operator> <value> [ , <value> ]*
| <value> <unary operator>
Figura 26 Sintaxis de la sentencia UPDATE
Por ejemplo, la siguiente sentencia modifica las tuplas de la vista internet_inc cuyo valor para el atributo
iinc_id sea 6, haciendo que su valor para los atributos specific_field1 y specific_field2
pase a ser 10:
UPDATE internet_inc
Inserciones, Actualizaciones Y Borrados sobre Vistas
57
Virtual DataPort 4.0
Guía Avanzada de VQL
SET (specific_field1, specific_field2) = ("10","10")
WHERE iinc_id=6
Como efecto de la ejecución de esta sentencia, se modificarán las tuplas correspondientes en la base de datos
fuente, en la tabla representada por la vista internet_inc.
También es posible utilizar la sintaxis alternativa:
UPDATE internet_inc
SET specific_field1="10", specific_field2="10"
WHERE iinc_id=6
8.3
SENTENCIA DELETE
La sentencia DELETE permite eliminar las tuplas de una vista que verifiquen una determinada condición, actualizando
directamente la fuente de datos. La Figura 27 muestra su sintaxis:
DELETE FROM <name:identifier> [ WHERE <condition> ]
[ CONTEXT ( <context information> [, <context information>]* ) ]
[ TRACE ]
<condition> ::=
<condition> AND <condition>
| <condition> OR <condition>
| NOT <condition>
| ( <condition> )
| <value> <binary operator> <value> [ , <value> ]*
| <value> <unary operator>
Figura 27 Sintaxis de la sentencia DELETE
Por ejemplo, la siguiente sentencia borra las tuplas de la vista internet_inc cuyo valor para el atributo
iinc_id sea mayor que 4:
DELETE FROM internet_inc WHERE iinc_id>4
Como efecto de la ejecución de esta sentencia, se borrarán las tuplas correspondientes en la base de datos fuente,
en la tabla representada por la vista internet_inc.
8.4
USO DE WITH CHECK OPTION
Al crear una vista, DataPort también soporta el uso de la cláusula estándar SQL WITH CHECK OPTION
[CASCADED]. Si una vista ha sido creada con esta opción, las actualizaciones de datos que sean inconsistentes
con la definición de la vista serán rechazadas y DataPort devolverá un mensaje de error. Por ejemplo, si definimos la
vista incidences_acme utilizando la sentencia siguiente:
CREATE VIEW incidences_acme AS
SELECT * FROM Internet_inc WHERE taxid="B78596011"
WITH CHECK OPTION
Entonces, al ejecutar la siguiente sentencia de inserción, obtendremos un mensaje de error, ya que el valor indicado
para el atributo taxid es inconsistente con la condición de selección utilizada para definir
incidences_acme.
Inserciones, Actualizaciones Y Borrados sobre Vistas
58
Virtual DataPort 4.0
Guía Avanzada de VQL
INSERT INTO incidences_acme (iinc_id, summary, ttime, taxid,
specific_field1, specific_field2)
VALUES (6,"Error in ADSL Router", "31-mar-2005 22h 35m 24s",
"B78596015", "5", "6")
El modificador CASCADED se utiliza para que esta comprobación se aplique también a las condiciones de las vistas
de nivel inferior (ver Figura 19). Si no se indica, la comprobación se realizará sólo con las condiciones definidas en
esta vista.
Inserciones, Actualizaciones Y Borrados sobre Vistas
59
Virtual DataPort 4.0
9
Guía Avanzada de VQL
TRANSACCIONES EN DATAPORT
DataPort permite definir transacciones haciendo uso de las siguientes cláusulas:
•
BEGIN. Permite iniciar una transacción.
•
COMMIT. Confirma la transacción activa.
•
ROLLBACK. Deshace los cambios realizados en la transacción activa.
Las transacciones en DataPort son distribuidas por naturaleza. Por lo tanto, sólo pueden participar en ellas fuentes de
datos que implementen el protocolo Two-Phase-Commit.
La mayor parte de gestores de bases de datos comerciales implementan dicho protocolo. Por lo tanto, el tipo
principal de fuentes DataPort cuyas vistas pueden participar en transacciones son las fuentes de datos de tipo
JDBC/ODBC (ver secciones 17.3.1 y 17.3.2 ).
Adicionalmente, los wrappers de tipo CUSTOM y los procedimientos almacenados también pueden participar en
transacciones siempre que implementen las operaciones necesarias para ello (ver secciones 17.4.9 y 10.3).
Es posible especificar si una fuente de datos soporta o no transacciones distribuidas mediante el uso de la propiedad
supportsDistributedTransactions de la configuración de las fuentes (ver secciones 17.3.6 y
17.4.12).
Transacciones en DataPort
60
Virtual DataPort 4.0
10
Guía Avanzada de VQL
PROCEDIMIENTOS ALMACENADOS
DataPort soporta la creación de procedimientos almacenados escritos en el lenguaje JAVA. Esta sección describe
cómo crearlos y cómo importarlos en DataPort utilizando el lenguaje VQL. La distribución de DataPort contiene
diversos ejemplos de procedimientos almacenados (incluyendo su código fuente) en la ruta
DENODO_HOME/samples/vdp/storedProcedures. El fichero README en dicha ruta contiene
instrucciones para compilar e instalar dichos procedimientos.
10.1
IMPORTACIÓN DE UN PROCEDIMIENTO ALMACENADO
La sentencia CREATE PROCEDURE permite añadir un nuevo procedimiento almacenado al servidor DataPort. La
Figura 28 muestra su sintaxis.
CREATE [OR REPLACE] PROCEDURE <name:identifier>
CLASSNAME <className:literal>
[CLASSPATH <classPath:literal>]
Figura 28 Sintaxis de CREATE PROCEDURE
La cláusula CLASSNAME indica el nombre de la clase JAVA que implementa el procedimiento almacenado. Esta
clase debe estar presente en el CLASSPATH del servidor DataPort (ver sección Tareas de Post-Instalación de la
Guía del Administrador [3]).
Opcionalmente, puede utilizarse la cláusula CLASSPATH para indicar librerías adicionales utilizadas por el
procedimiento almacenado y que no se encuentren ya en el CLASSPATH del servidor.
El uso del modificador OR REPLACE permite especificar que si ya existe un procedimiento con el nombre
indicado, éste debe ser reemplazado por el nuevo procedimiento. Esto provocará el recálculo de esquemas y
capacidades de las vistas derivadas que utilicen dicho procedimiento.
Una vez creado, un procedimiento almacenado puede modificarse utilizando la sentencia ALTER PROCEDURE,
cuya sintaxis se muestra en la Figura 29.
ALTER PROCEDURE <name:identifier>
[CLASSNAME <className:literal>]
[CLASSPATH <classPath:literal>]
Figura 29 Sintaxis de ALTER PROCEDURE
La interpretación de las cláusulas CLASSNAME y CLASSPATH es la misma que para la sentencia CREATE
PROCEDURE.
10.2
USO DE PROCEDIMIENTOS ALMACENADOS
La invocación de un procedimiento almacenado se realiza mediante la sentencia CALL. Su sintaxis se muestra en la
Figura 30.
CALL <procedureName:identifier> ( [<paramValue:literal>
[ ,<paramValue:literal> ]* ] )
[ CONTEXT ( "i18n" = <literal> ) ] [ TRACE ]
Figura 30 Sintaxis de la sentencia CALL
Procedimientos Almacenados
61
Virtual DataPort 4.0
Guía Avanzada de VQL
Por ejemplo, la siguiente sentencia invoca el procedimiento almacenado DropIncidence pasándole un único
parámetro de tipo numérico:
CALL DropIncidence(5)
Los procedimientos almacenados pueden ser utilizados en la cláusula FROM de una sentencia SELECT. Los
valores devueltos por el procedimiento se tratan en este caso de forma análoga a las tuplas de una vista. Por
ejemplo:
SELECT avgrevenue FROM
CalculateAvgRevenue({ROW("B78596011"),ROW("B78596012")})
En este caso, utilizamos como ejemplo el procedimiento almacenado CalculateAvgRevenue, que recibe
como entrada un parámetro de tipo array de registros. Cada registro contiene un único campo, que se corresponde
con el CIF de un cliente. Este procedimiento devuelve una única tupla de resultado con un atributo llamado
avgrevenue que contiene la media de la facturación de los clientes indicados.
10.3
CREACIÓN DE NUEVOS PROCEDIMIENTOS ALMACENADOS
Las clases e interfaces necesarias para la creación de nuevos procedimientos almacenados se encuentran en el
paquete com.denodo.vdb.engine.storedprocedure. En esta sección, se describe brevemente el
uso de sus principales clases. Véase la documentación Javadoc [4] para más detalle sobre clases y operaciones.
Cualquier procedimiento almacenado debe extender la clase AbstractStoredProcedure, que implementa
las interfaces StoredProcedure y StoredProcedureExecutor. Es posible reescribir los
siguientes métodos:
•
public void initialize(DatabaseEnvironment environment). Método
invocado en el momento de inicializar el procedimiento almacenado (cuya implementación es obligatoria).
Recibe como parámetro un objeto de tipo DatabaseEnvironment, que proporciona métodos de
utilidad para comunicarse con el servidor DataPort. Estos métodos permiten realizar las siguientes acciones
(ver documentación Javadoc [4] para más detalle):
o
Ejecutar sentencias
executeUpdate),
o
Obtener referencias a otros procedimientos
lookupProcedure), para poder ejecutarlos.
o
Obtener referencias a una función del servidor (método lookupFunction), para poder
ejecutarlas,
o
Crear transacciones (método createTransaction),
o
Unir un procedimiento almacenado a la transacción actual (método joinTransaction),
o
Escribir en el log del servidor (método log),
Procedimientos Almacenados
sobre
el
servidor
DataPort
(métodos
almacenados
del
executeQuery,
servidor
(método
62
Virtual DataPort 4.0
o
Guía Avanzada de VQL
Obtener el valor de una propiedad del servidor (método getDatabaseProperty). Las
propiedades accesibles actualmente mediante este método son CURRENT_USER y
CURRENT_DATABASE que indican el nombre del usuario y de la base de datos actuales
respectivamente.
•
public String getDescription(). Debe devolver la descripción del procedimiento
almacenado (obligatorio).
•
public String getName(). Debe devolver el nombre del procedimiento almacenado (cuya
implementación es obligatoria).
•
void prepare(). Opcionalmente, el procedimiento almacenado puede reescribir este método para
preparar la transacción actual.
•
void commit(). Opcionalmente, el procedimiento almacenado puede reescribir este método para
confirmar la transacción actual.
•
void rollback().Opcionalmente, el procedimiento almacenado puede reescribir este método para
deshacer la transacción actual.
•
public StoredProcedureParameter[] getParameters(). Método que debe
especificar los parámetros de entrada y salida del procedimiento almacenado (obligatorio). Estos
parámetros se devuelven como un array de objetos StoredProcedureParameter. Cada objeto
StoredProcedureParameter especifica el nombre, tipo y dirección (entrada o salida) de un
parámetro. En caso de que el parámetro sea de tipo compuesto, se debe especificar también un array de
objetos StoredProcedureParameter para describir sus campos. Ver documentación Javadoc [4]
para más detalle.
•
public
void
doCall(Object[]
inputValues)
throws
StoredProcedureException. Método invocado al ejecutar el procedimiento almacenado
(obligatorio).
•
public int getNumOfAffectedRows(). Devuelve el número de entidades de datos
afectadas por la ejecución del procedimiento (obligatorio).
La clase AbstractStoredProcedure también proporciona los siguientes métodos:
•
public StoredProcedureResultSet getProcedureResultSet(). Método
utilizado para obtener el objeto StoredProcedureResultSet asociado del procedimiento
almacenado. Este objeto es el que contiene los resultados que devolverá el procedimiento almacenado, por
lo que normalmente la implementación del método doCall precisará llamar a
getProcedureResultSet()para obtenerlo y añadirle los resultados deseados.
•
protected static java.sql.Array createArray(Collection values,
int type). Método para crear un objeto de tipo SQL array. Necesario cuando el procedimiento
almacenado devuelva valores de tipo compuesto.
Procedimientos Almacenados
63
Virtual DataPort 4.0
•
Guía Avanzada de VQL
protected static java.sql.Struct createStruct(Collection values,
int type).Método para crear un objeto de tipo SQL struct. Necesario cuando el procedimiento
almacenado devuelva valores de tipo compuesto.
La distribución de DataPort contiene diversos ejemplos de procedimientos almacenados (incluyendo su código fuente)
en la ruta DENODO_HOME/samples/vdp/storedProcedures. El fichero README en dicha ruta
contiene instrucciones para compilar e instalar dichos procedimientos.
10.4
PROCEDIMIENTOS PREDEFINIDOS
DataPort incluye los siguientes procedimientos almacenados predefinidos:
•
WriteLogInfo (String text). Escribe un mensaje en el log del servidor DataPort en el nivel
info.
•
WriteLogError (String text). Escribe un mensaje en el log del servidor DataPort en el nivel
error.
•
Wait (long timeInMillis). Espera el tiempo especificado (en milisegundos).
•
LogController (String logCategory, String logLevel). Permite modificar el
nivel de log para una categoría de log determinada. Su cambio no persiste entre diferentes ejecuciones del
servidor.
Procedimientos Almacenados
64
Virtual DataPort 4.0
11
11.1
Guía Avanzada de VQL
DEFINICIÓN DE OTROS ELEMENTOS DEL CATÁLOGO
DEFINICIÓN DE UN TIPO DE DATO
Virtual DataPort incluye en su catálogo un conjunto de tipos de datos predefinidos (ver Apartado 3.1). Como ya se ha
adelantado, los tipos de datos que incluye se pueden dividir en dos grupos: los tipos básicos y los tipos compuestos.
Virtual DataPort permite la definición de nuevos tipos de datos compuestos a través de la sentencia CREATE
TYPE. Es decir, se permite la creación de tipos de datos de tipo array, enumerated, y register. Véase la sección 18.1
para una explicación detallada de cómo manejar los tipos compuestos array y register.
La Figura 31 muestra la sintaxis de la sentencia CREATE TYPE.
CREATE TYPE <name:identifier> AS { <array>|<enumerated>|<register> }
<array> ::=
ARRAY OF <register>
<enumerated> ::=
ENUMERATED OF ( <literal> [ , <literal> ]* )
<register> ::=
REGISTER OF ( <name:identifier>:<type:identifier>
[ , <name:identifier>:<type:identifier>]* )
Figura 31 Sintaxis de la sentencia CREATE TYPE
En la creación de un tipo de dato, es necesario asignarle un nombre único que lo identifique y diferencie del resto de
los tipos existentes.
Los tipos de dato enumerated (ver sección 3.1) se crean enumerando la lista de valores que admiten, separados por
comas. En la Figura 32 se crea un tipo de dato enumerated que representa los días de la semana en inglés.
CREATE TYPE daysOfWeek AS ENUMERATED OF (
'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY',
'FRIDAY', 'SATURDAY', 'SUNDAY'
);
Figura 32 Creación de un tipo de dato enumerated
Para crear un nuevo tipo register es necesario indicar el tipo de los elementos que contiene y asignarles un nombre.
En la Figura 33 se crea un tipo de dato registro que contiene los datos personales referentes a una persona: el
nombre (atributo NAME de tipo text), los apellidos (atributo SURNAME de tipo text), teléfono (atributo PHONE de
tipo arrayphone), sueldo (atributo PAY de tipo money) y su fecha de cumpleaños (atributo BIRTH de tipo date).
CREATE TYPE registerPersonalData AS REGISTER OF (
NAME:text,
SURNAME:text,
PHONE:arrayphone,
PAY:money,
BIRTH:date
);
Definición de Otros Elementos del Catálogo
65
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 33 Creación de un tipo de dato register
Para la definición de un tipo de dato array, es necesario indicar el nombre del tipo register de los elementos que
contiene. En la Figura 34 se crea el tipo de dato array denominado array_phone que encapsula una lista de
teléfonos, donde cada teléfono se representa a través de un entero. Cada elemento del array array_phone es
de tipo registro register_phone. Como se puede observar, el tipo register_phone encapsula a un
elemento de tipo int denominado number.
CREATE TYPE registerPhone AS REGISTER OF (
NUMBER:int
);
CREATE TYPE arrayPhone AS ARRAY OF registerPhone;
Figura 34 Creación de un tipo de dato array y del tipo register que contiene
11.2
DEFINICIÓN DE UN MAPA
Un mapa representa una lista de pares clave-valor. Existen los siguientes tipos de mapas:
•
simple. Se utilizan con la función MAP (ver sección 4.6).
•
i18n. Representan la configuración de internacionalización referente a una localización específica. Algunos
ejemplos de parámetros configurados a través de estos ficheros son: moneda, símbolos utilizados como
separadores decimales y de miles para la moneda, formato de fecha, etc. Véase el apartado 3.2 para más
detalle.
•
inputrewrite. Se utilizan para la traducción de valores de condiciones al formato de la fuente para delegar
una consulta sobre ella. Son utilizados por la función de transformación sobre condiciones (que forman
parte de una regla de reescritura de entrada) denominada MAP().
•
outputrewrite. Estos mapas se utilizan para la conversión de enumeraciones, para adaptarlas al formato de
integración, a partir del formato de una fuente específica. Este tipo de mapas se utilizan en la función de
transformación de salida –que compone una regla de reescritura sobre resultados- denominada MAP().
Virtual DataPort permite la creación de mapas a través de la sentencia CREATE MAP. Su sintaxis se muestra en la
Figura 35. Esta sentencia permite la creación de los diferentes tipos de mapas. Para ello se debe indicar el tipo del
mapa: i18n, inputrewrite o outputrewrite o simple, el nombre del mapa que lo identifica, y la lista de pares clavevalor que forman parte del mismo.
CREATE MAP { I18N|SIMPLE|INPUTREWRITE|OUTPUTREWRITE } <name:identifier>
( [<name:literal> = <value:literal>]+ ) )
Figura 35 Sintaxis de la sentencia CREATE MAP
La Figura 36 muestra un ejemplo de creación de un mapa de tipo inputrewrite.
CREATE MAP INPUTREWRITE daysOfWeek (
'lunes' = ”TIMETABLE = 'Monday'”
'martes' = ”TIMETABLE = 'Tuesday'”
'miercoles' = ”TIMETABLE = 'Wednesday'”
'jueves' = ”TIMETABLE = 'Thursday'”
Definición de Otros Elementos del Catálogo
66
Virtual DataPort 4.0
Guía Avanzada de VQL
'viernes' = ”TIMETABLE = 'Friday'”
'sabado' = ”TIMETABLE = 'Saturday'”
'domingo' = ”TIMETABLE = 'Sunday'”
);
Figura 36 Creación de un mapa de tipo inputrewrite
Definición de Otros Elementos del Catálogo
67
Virtual DataPort 4.0
12
Guía Avanzada de VQL
CREACIÓN DE BASES DE DATOS, USUARIOS Y PERMISOS
En esta sección se describen diversos conceptos clave dentro de la arquitectura de Virtual DataPort.
La sección 12.1 describe el concepto de base de datos tal y como se entiende en el contexto de un servidor Virtual
DataPort. La sección 12.2 describe los conceptos generales sobre la gestión de usuarios y permisos en DataPort. Por
último, en la sección 12.3 se describen los comandos VQL que permiten gestionar esta estructura.
12.1
BASES DE DATOS EN VIRTUAL DATAPORT
Un servidor de Virtual DataPort puede contener varias bases de datos diferentes (no confundir con las posibles bases
de datos externas que puedan actuar como fuentes del sistema). Una base de datos de Virtual DataPort representa
un esquema virtual compuesto por una serie de DataSources, Wrappers, vistas y relaciones base.
Cada base de datos es independiente del resto de base de datos del servidor y, tal y como se detalla en la siguiente
sección, los diferentes usuarios pueden tener privilegios diferentes sobre cada base de datos.
Al instalar un servidor Virtual DataPort se crea una base de datos admin, que no puede ser eliminada.
12.2
ESTRUCTURA DE USUARIOS Y PERMISOS EN VIRTUAL DATAPORT
12.2.1
Tipos de usuarios
Denodo Virtual DataPort distingue dos tipos de usuarios:
•
Administradores. Pueden crear, modificar y borrar bases de datos dentro de un servidor DataPort sin
limitación alguna. De la misma forma también pueden crear, modificar y borrar usuarios. Al instalar el
servidor se crea un usuario de administración por defecto cuyo nombre de usuario es admin y su
contraseña es también admin. Este usuario nunca puede ser borrado.
•
Usuarios normales. No pueden crear, modificar ni borrar usuarios. No pueden crear ni borrar bases de
datos, aunque sí pueden tener privilegios de conexión, lectura, creación o escritura sobre una o varias
bases de datos o sobre vistas particulares contenidas en las mismas.
12.2.2
Tipos de permisos
Los permisos de Virtual DataPort se aplican a un usuario determinado para delimitar las acciones que le está
permitido realizar sobre las bases de datos, vistas y procedimientos almacenados de un determinado servidor.
Los permisos para un usuario pueden aplicarse de manera global sobre una base de datos o de manera particular
sobre una vista o un procedimiento almacenado dentro de una base de datos particular. Los permisos sobre vistas y
procedimientos almacenados particulares se aplican solo si el usuario no tiene el permiso correspondiente a nivel
global.
Denodo Virtual DataPort soporta los siguientes tipos de permisos globales sobre una base de datos:
•
Permisos de lectura: Si un usuario dispone de este permiso sobre una base de datos a nivel global, puede
realizar las siguientes tareas sobre la misma:
o Ver la lista de relaciones base, vistas y/o procedimientos almacenados de la base de datos (se
corresponde con el comando VQL LIST). Si un usuario no tiene permisos de lectura sobre una
base de datos pero sí sobre alguna de sus vistas y/o procedimientos almacenados, el comando
Creación de Bases de Datos, Usuarios y Permisos
68
Virtual DataPort 4.0
o
o
Guía Avanzada de VQL
LIST podrá ejecutase pero sólo mostrará el conjunto de vistas y procedimientos sobre las que
el usuario tiene permisos de lectura.
Ver la información relativa a una relación base, vista o procedimiento almacenado de la base de
datos. Por ejemplo, ver el esquema, métodos de búsqueda, configuración de caché y “swapping”,
etc., de una vista base (se corresponde con el comando VQL DESC).
Ejecutar consultas sobre cualquier vista y/o procedimiento almacenado de la base de datos (se
corresponde con el comando VQL SELECT).
•
Permisos de creación: Si un usuario dispone de este permiso sobre una base de datos a nivel global, puede
realizar las siguientes tareas sobre la misma:
o Creación de DataSources, vistas, relaciones base y procedimientos almacenados en la base de
datos (se corresponde con el comando VQL CREATE).
•
Permisos de escritura. Disponer del permiso de escritura implica disponer también automáticamente del
permiso de lectura. Si un usuario dispone de este permiso sobre una base de datos puede realizar sobre
ella las siguientes tareas adicionales:
o Borrado de cualquier vista, relación base y/o procedimiento almacenado de la base de datos.
También podrá borrar cualquier DataSource de la base de datos que haya sido creado por él pero
no podrá borrar DataSources creados por otros usuarios (se corresponde con el comando VQL
DROP).
o Modificación de cualquier vista, relación base y/o procedimiento almacenado de la base de
datos. También podrá modificar cualquier DataSource de la base de datos que haya sido creado
por él pero no podrá modificar DataSources creados por otros usuarios (se corresponde con el
comando VQL ALTER).
•
Permisos de conexión. Si un usuario dispone de este permiso sobre una base de datos entonces puede
conectarse a la misma, no pudiendo conectarse en caso contrario. Este tipo de permiso es útil si, por
ejemplo, se desea revocar temporalmente el acceso de un usuario a una base de datos sin por ello tener
que modificar el resto de sus privilegios habituales de forma manual.
Denodo Virtual DataPort también soporta la particularización de los privilegios a vistas y procedimientos
almacenados concretos. Los tipos de permisos que pueden aplicarse a una vista y/o a un procedimiento almacenado
de una base de datos son:
•
Permisos de lectura: Si un usuario dispone de este permiso sobre una vista o procedimiento almacenado,
puede realizar las siguientes tareas sobre dichos componentes:
o Ver la información relativa a una relación base, vista o procedimiento almacenado. Por ejemplo,
ver el esquema, métodos de búsqueda, configuración de caché, “swapping”, ... de una vista (se
corresponde con el comando VQL DESC).
o Ejecutar consultas sobre la vista o procedimiento almacenado (se corresponde con los comandos
VQL SELECT o CALL).
o Crear nuevas vistas que lo utilicen, siempre que disponga de permisos de creación dentro de la
base de datos a la que pertenece. Se corresponde con el comando VQL CREATE VIEW.
o Si un usuario no tiene permisos de lectura sobre una base de datos pero sí sobre alguna de sus
vistas y/o procedimientos, el comando LIST podrá ejecutase pero sólo mostrará dichos
componentes.
•
Permisos de escritura. Disponer del permiso de escritura implica disponer también automáticamente del
permiso de lectura. Si un usuario dispone de este permiso sobre una vista y/o procedimiento almacenado
puede realizar sobre ella las siguientes tareas adicionales:
o Borrado del componente (se corresponde con el comando VQL DROP).
o Modificación del componente (se corresponde con el comando VQL ALTER).
Creación de Bases de Datos, Usuarios y Permisos
69
Virtual DataPort 4.0
Guía Avanzada de VQL
•
Permisos de Inserción. Permite insertar tuplas en la vista a través de sentencias INSERT. No aplicables a
procedimientos almacenados.
•
Permisos de Actualización. Permite actualizar tuplas de la vista a través de sentencias UPDATE. No
aplicables a procedimientos almacenados.
•
Permisos de Borrado. Permite borrar tuplas de la vista a través de sentencias DELETE. No aplicables a
procedimientos almacenados.
12.3
SENTENCIAS VQL DE BASES DE DATOS, USUARIOS Y PERMISOS
Para gestionar las bases de datos, usuarios y permisos de un servidor Virtual DataPort es necesario acceder con un
usuario de tipo administrador y no es necesario especificar una base de datos en la uri de conexión al servidor.
Al instalar el servidor se crea un usuario de administración por defecto cuyo nombre de usuario es
contraseña es también admin.
admin
y su
Las siguientes secciones describen, respectivamente, cómo crear nuevas bases de datos, cómo modificarlas o
borrarlas, cómo crear nuevos usuarios y, finalmente, cómo modificar o borrar los usuarios existentes.
12.3.1
Creación de Bases de Datos
La sentencia VQL CREATE DATABASE permite a un usuario administrador crear una nueva base de datos en el
servidor, indicando un nombre para la nueva base de datos y, opcionalmente, una descripción de la misma. En la
Figura 37 se muestra la sintaxis de la sentencia CREATE DATABASE. El uso de las opciones de asignación de
privilegios a usuarios se describe en la sección 12.3.6.
CREATE DATABASE <name:identifier> [<description:literal>]
[ <grant> ]*
<grant> ::= (see section 12.3.6.1)
Figura 37 Sintaxis de la sentencia CREATE DATABASE
12.3.2
Modificación y Borrado de Bases de Datos
Para ver la lista de bases de datos actuales en el servidor, debe utilizarse el comando LIST (ver apartado 14). Cada
usuario verá las bases de datos para las que tiene permiso de conexión. Un usuario administrador tendrá acceso a
todas las bases de datos del servidor.
Una vez creada una base de datos, un usuario administrador puede modificar su descripción utilizando la sentencia
ALTER DATABASE (ver Figura 38).
ALTER DATABASE <name:identifier> [ <description:literal> ]
[ I18N {DEFAULT | <name:identifier>} ]
[ CACHE
{ DEFAULT |
[ON | OFF ] (
[MAINTAINERPERIOD <seconds:integer>]
[TIMETOLIVE <seconds:integer>]
[DATASOURCE {DEFAULT | CUSTOM}]
)
}
]
[ SWAP
Creación de Bases de Datos, Usuarios y Permisos
70
Virtual DataPort 4.0
Guía Avanzada de VQL
{ DEFAULT |
[ON | OFF] (
[SWAPSIZE <megabytes:integer>]
[BLOCKSIZE <megabytes:integer>]
)
}
]
[ <grant> ]*
<grant> ::= (see section 12.3.6.1)
Figura 38 Sintaxis de la sentencia ALTER DATABASE
A través de esta sentencia es posible modificar los privilegios de acceso de los usuarios para la base de datos (ver
sección 12.3.6), y las preferencias por defecto en la base de datos para la configuración de la cache (ver sección
18.2.2) y el swapping a disco de consultas de gran tamaño (ver sección 18.2.3).
El comando DESC (ver apartado 13) permite obtener información relativa a una base de datos, mostrando los
permisos del usuario para esta base de datos. Si el usuario es un administrador, entonces mostrará los permisos de
todos los usuarios sobre la base de datos indicada.
Un usuario administrador también puede borrar una base de datos del servidor, utilizando el comando DROP (ver
apartado 15). Nótese que al borrar una base de datos se eliminarán todos sus componentes: DataSources, vistas,
relaciones base, etc.
12.3.3
Creación de usuarios
La sentencia CREATE USER (Figura 39) permite crear un nuevo usuario en el servidor. Como ya se ha comentado
previamente, existen dos tipos de usuarios. Un usuario administrador puede crear usuarios de cualquiera de los dos
tipos.
Para crear un nuevo usuario es necesario indicar su nombre, su password y opcionalmente una descripción. En la
sentencia de creación se especifica también si se trata de un nuevo usuario administrador (modificador ADMIN) o de
un usuario normal. El modificador ENCRYPTED permite especificar que la contraseña ya se proporciona cifrada y,
por lo tanto, no debe cifrarse nuevamente.
La autenticación del usuario podrá realizarse contra DataPort o contra un data source de tipo LDAP dado de alta en
DataPort (ver sección 17.3.8). El segundo caso se especifica utilizando el modificador LDAP. En ese caso, es
necesario proporcionar dos datos adicionales:
•
•
Servidor LDAP a utilizar (DATASOURCE). El formato es <databaseName>.<dataSourceName>
donde <databaseName> especifica la base de datos dónde se ha dado de alta el data source LDAP y
<dataSourceName> es el nombre del data source.
Usuario LDAP (USERNAME). Especifica el nombre del usuario contra el que se realizará la autenticación
en el servidor LDAP. Por ejemplo, el valor 'cn=test,ou=People,dc=denodo,dc=com’
identifica al usuario test en la unidad organizativa People del dominio denodo.com.
NOTA: Si se elimina en cascada (ver sección 15) un datasource LDAP, los usuarios que dependen del mismo serán
también eliminados (esta operación sólo pùede ser realizada por un usuario de tipo administrador).
Cómo asignar privilegios a los usuarios se describe en la sección 12.3.6.
CREATE USER [ADMIN] <name:identifier>
<authentication>
[<description:literal>]
Creación de Bases de Datos, Usuarios y Permisos
71
Virtual DataPort 4.0
Guía Avanzada de VQL
[ <grant> ]*
<authentication> ::=
<password:literal> [ENCRYPTED]
| LDAP (
DATASOURCE <databaseName:identifier>.<dataSourceName:identifier>
USERNAME <name:literal>
)
<grant> ::= (see section 12.3.6.2)
Figura 39 Sintaxis de la sentencia CREATE USER
12.3.4
Modificación y Borrado de usuarios
La sentencia LIST (ver apartado 14) permite obtener un listado de los usuarios del servidor. Es posible obtener la
información relativa a un usuario, y a los permisos que posee sobre las diferentes bases de datos y vistas de las
mismas mediante el comando DESC (ver apartado 13). Un usuario administrador puede acceder a toda la
información de cualquier usuario. El resto de usuarios sólo pueden obtener su propia información.
Un usuario administrador puede eliminar usuarios del servidor utilizando la sentencia DROP (ver apartado 15). No es
posible borrar el administrador predefinido “admin”.
12.3.4.1
Modificar los datos de un usuario
Cualquier usuario puede modificar su clave de acceso y su descripción utilizando la sentencia ALTER USER (ver
Figura 40). En caso de tratarse de un usuario que se autentica contra un servidor LDAP es también posible modificar
los datos del servidor (ver sección 12.3.3). También es posible modificar los privilegios de un usuario (ver sección
12.3.6).
ALTER USER <name:identifier>
[ <authentication> ]
[ <description:literal> ]
[ <grant> ]*
<authentication> ::=
PASSWORD <password:literal>
| LDAP (
[DATASOURCE
<databaseName:identifier>.<dataSourceName:identifier> ]
[ USERNAME <name:literal> ]
)
<grant> ::= (see section 12.3.6.2)
Figura 40 Sintaxis de la sentencia ALTER USER
12.3.5
Cambio de Base de Datos Activa
En el transcurso de una sesión contra el servidor Virtual DataPort, un usuario puede requerir la conexión a una base
de datos del servidor o la utilización de un usuario diferente para realizar determinadas tareas que requieran otros
permisos. Para permitir esta funcionalidad pueden utilizarse los comandos CONNECT y CLOSE (Figura 41).
CONNECT [USER <name:identifier> PASSWORD <password:literal>] [DATABASE <name>]
CLOSE
Creación de Bases de Datos, Usuarios y Permisos
72
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 41 Sintaxis de las sentencias CONNECT y CLOSE
El comando CONNECT permite indicar un nombre de usuario y su clave para iniciar una nueva sesión en el servidor
con un nuevo perfil. Es posible también iniciar una sesión con una nueva base de datos (con el usuario actual u otro
usuario).
El comando CLOSE permite restablecer la sesión anterior, después de haber establecido una nueva sesión con el
comando CONNECT.
12.3.6
Modificación de los privilegios de un usuario
Para los usuarios que no sean de tipo administrador, es posible modificar sus privilegios sobre las diferentes bases
de datos, vistas y procedimientos almacenados del sistema. Esta tarea sólo la pueden realizar usuarios
administradores.
La modificación de privilegios de un usuario puede realizarse a nivel de base de datos para un conjunto de usuarios,
o de forma individual por usuario.
12.3.6.1
Especificación de privilegios por base de datos
Utilizando las sentencias CREATE DATABASE (Figura 37) o ALTER DATABASE (Figura 38) es posible especificar
los privilegios de acceso de los diferentes usuarios del servidor a nivel de base de datos, haciendo uso de las
cláusulas GRANT y REVOKE.
En la Figura 42 se muestra la sintaxis de estas cláusulas para la asignación de permisos de usuarios a nivel global de
base de datos. A nivel de base de datos es posible conceder o revocar todos los permisos (ALL PRIVILEGES), o una
lista de los siguientes permisos:
CONNECT: Permite que el usuario indicado se conecte a la base de datos. Si un usuario no posee este
permiso sobre una base de datos, el resto de privilegios no se consideran.
CREATE: Permite que un usuario pueda crear nuevos elementos en el catálogo del servidor.
READ: Permite que un usuario acceda a todas las vistas y procedimientos almacenados de la base de
datos indicada.
WRITE: Permite que el usuario especificado modifique o borre cualquier vista y/o procedimiento
almacenado de la base de datos indicada. El permiso de escritura implica al permiso de lectura.
<grant> ::=
GRANT <database privileges> TO <user:identifier>
REVOKE <database privileges> TO <user:identifier>
<database privileges> ::=
ALL PRIVILEGES
| <database privilege list>
<database privilege list> ::= <database privilege> [, <database privilege>]*
<database privilege> ::=
CONNECT
| CREATE
| READ
| WRITE
Figura 42 Sintaxis de las cláusulas GRANT/REVOKE para Bases de Datos
12.3.6.2
Especificación de privilegios por usuario
Los privilegios de un usuario pueden asignarse también cuando se crea el usuario o una vez creado con las
sentencias CREATE USER (Figura 39) o ALTER USER (Figura 40) respectivamente.
Creación de Bases de Datos, Usuarios y Permisos
73
Virtual DataPort 4.0
Guía Avanzada de VQL
La gestión de privilegios de un usuario se realiza mediante la utilización de las cláusulas GRANT (asignar privilegios)
y REVOKE (revocar privilegios). Pueden distinguirse dos casos:
asignación de permisos de usuarios a bases de datos
asignación de permisos de usuarios a vistas o procedimientos almacenados de bases de datos.
En la Figura 43 se muestra la sintaxis de estas cláusulas para la asignación de permisos de usuarios a nivel global de
base de datos. A nivel de base de datos es posible conceder o revocar todos los permisos (ALL PRIVILEGES), o una
lista de los siguientes permisos:
CONNECT: Permite que el usuario se conecte a la base de datos indicada. Si un usuario no posee este
permiso sobre una base de datos, el resto de privilegios no se consideran.
CREATE: Permite que el usuario pueda crear nuevos elementos en el catálogo del servidor.
READ: Permite que el usuario acceda a todas las vistas y/o procedimientos almacenados de la base de
datos indicada.
WRITE: Permite que el usuario modifique o borre cualquier vista y/o procedimiento almacenado de la
base de datos indicada. El permiso de escritura implica al permiso de lectura.
<grant> ::=
GRANT <database privileges> ON <database:identifier>
| REVOKE <database privileges> ON <database:identifier>
<database privileges> ::=
ALL PRIVILEGES
| <database privilege list>
<database privilege list> ::= <database privilege> [, <database privilege>]*
<database privilege> ::=
CONNECT
| CREATE
| READ
| WRITE
Figura 43 Sintaxis de las cláusulas GRANT/REVOKE para Bases de Datos
En la Figura 44 se muestra la sintaxis de estas cláusulas para la asignación de permisos de usuarios a nivel de vistas
y/o procedimientos almacenados. Estas asignaciones se hacen efectivas cuando un usuario no tiene acceso de
lectura o escritura global sobre todos los elementos de la base de datos.
En el caso de asociación de privilegios de usuarios sobre vistas de una base de datos, son aplicables los permisos
READ, WRITE, INSERT, UPDATE y DELETE.
<grant> ::=
GRANT <view privileges> ON <database::identifier>.<view::identifier>]
| GRANT <procedure privileges> ON PROCEDURE
<database:identifier>.<procedure:identifier>
| REVOKE <view privileges> ON <database::identifier>.<view::identifier>]
| REVOKE <procedure privileges> ON PROCEDURE
<database:identifier>.<procedure:identifier>
<view privileges> ::=
ALL PRIVILEGES
| <view privilege list>
<view privilege list> ::= <view privilege> [, <view privilege>]*
<view privilege> ::=
READ
| WRITE
| INSERT
| UPDATE
| DELETE
Creación de Bases de Datos, Usuarios y Permisos
74
Virtual DataPort 4.0
Guía Avanzada de VQL
<procedure privileges> ::=
ALL PRIVILEGES
| <procedure privilege list>
<procedure privilege list> ::= <procedure privilege> [, <procedure
privilege>]*
<procedure privilege> ::=
READ
| WRITE
| INSERT
| UPDATE
| DELETE
Figura 44 Sintaxis de las cláusulas GRANT/REVOKE para vistas
En la Figura 45 se muestra un ejemplo en el que se crean dos bases de datos, “database1” y “database2”, y un
usuario “user1” al que se le asignan los siguientes privilegios sobre las bases de datos “database1” y “database2”:
posee todos los privilegios sobre “database1”
tiene permiso de conexión a “database2” y permisos de creación, pero sólo posee permisos de
lectura/escritura para la vista “view1”.
CREATE DATABASE database1 ‘Database1 Description’;
CREATE DATABASE database2 ‘Database2 Description’;
CREATE USER user1 ‘user1password’ ‘User1 Description’
GRANT ALL PRIVILEGES ON database1
GRANT CONNECT, CREATE ON database2
GRANT READ,WRITE ON database2.view1;
Figura 45 Ejemplo de asignación de privilegios a usuarios
Creación de Bases de Datos, Usuarios y Permisos
75
Virtual DataPort 4.0
13
Guía Avanzada de VQL
DESCRIPCIÓN DE ELEMENTOS DEL CATÁLOGO
En los apartados anteriores, se han explicado las sentencias que permiten la creación y modificación de algunos de
los elementos que componen el catálogo o diccionario de datos de Virtual DataPort: relaciones base, vistas
derivadas, wrappers, datasources, tipos de dato, mapas, bases de datos y usuarios.
Virtual DataPort permite visualizar el estado actual de algunos de los elementos que pertenecen al catálogo, a través
de la sentencia DESC.
DESC { DATABASE | USER | TYPE | PROCEDURE |VIEW [TREE] } <name:identifier>
DESC DATASOURCE { ARN | CUSTOM | DF | GS | JDBC | LDAP | ODBC | WS | XML }
<name:identifier>
DESC MAP { I18N | INPUTREWRITE | OUTPUTREWRITE | SIMPLE } <name:identifier>
DESC OPERATOR <name:operator> <type:identifier>
DESC PROCEDURE AS VIEW <name:identifier> ( [<procedureParameter>
[,<procedureParameter>]*] )
<procedureParameter> ::= <value>
DESC WRAPPER { ARN | CUSTOM | DF | GS | ITP | JDBC | ODBC | WS | XML }
<name:identifier>
DESC SESSION
DESC VQL { VIEW | PROCEDURE | TYPE } <name:identifier>
DESC VQL WRAPPER { ARN | CUSTOM | GS | DF | ITP | JDBC | ODBC | WS | XML }
<name:identifier>
DESC
VQL
MAP
{
<name:identifier>
I18N
|
INPUTREWRITE
|
OUTPUTREWRITE
|
SIMPLE
}
DESC VQL DATABASE [ <name:identifier> ]
Figura 46 Sintaxis de la sentencia DESC
En la Figura 46 se muestran las opciones disponibles para la descripción de distintos elementos del catálogo.
El primer grupo de sentencias permite obtener los diferentes elementos del catálogo, y una descripción de los
mismos:
La primera sentencia, permite solicitar la descripción de una base de datos, un usuario, un tipo de dato, un
procedimiento almacenado o una vista, a partir de su nombre. De forma opcional, cuando se describe una
vista se puede indicar el modificador TREE que permite obtener el conjunto de vistas sobre las que se
define la vista actual, junto con los operadores de álgebra relacional que las combinan.
La sentencia DESC DATASOURCE permite visualizar los diferentes tipos de datasources definidos en el
catálogo.
La sentencia DESC MAP permite visualizar el contenido de un mapa de tipo i18n, inputrewrite
o outputrewrite.
La sentencia DESC OPERATOR solicita la descripción de un operador para un tipo de dato específico.
La sentencia DESC PROCEDURE AS VIEW describe un procedimiento almacenado tratándolo como
una vista. Esto es útil porque los procedimientos almacenados de DataPort pueden aparecer en la cláusula
FROM de una consulta o vista (ver sección 10.2). En ese caso, es necesario especificar los parámetros de
invocación al procedimiento.
Descripción de Elementos del Catálogo
76
Virtual DataPort 4.0
-
Guía Avanzada de VQL
La sentencia DESC WRAPPER permite visualizar los diferentes tipos de wrappers definidos en el
catálogo.
Con la sentencia DESC SESSION un usuario puede obtener el nombre de base de datos contra la que está
conectado, y el nombre de login utilizado para la conexión.
El grupo de sentencias DESC VQL permite visualizar el conjunto de sentencias VQL necesarias para la creación de
una vista, tipo de datos, procedimiento almacenado, datasource o wrapper de uno de los tipos especificados. Se
muestran tanto las sentencias requeridas por la vista actual como las necesarias para crear todas las vistas de las
que depende. De la misma forma también se muestran las sentencias para crear los tipos, wrappers y datasources
necesarios para definir completamente el elemento del catálogo seleccionado. Antes de la sentencia de creación de
un elemento, se muestra la sentencia de borrado de ese elemento, de tal forma que la ejecución del conjunto de
sentencias mostrado resultará en la reconstrucción completa de ese elemento en el catálogo (borrando las
ocurrencias previas, si las había).
13.1
EXPORTACIÓN DE METADATOS
Mediante la sentencia DESC VQL DATABASE es posible exportar todos los metadatos de una determinada
base de datos de Virtual DataPort, o incluso de todo el sistema. Esto es especialmente útil para propósitos de backup
y de migración desde una instalación de Virtual DataPort a otra.
Si la sentencia DESC VQL DATABASE especifica el nombre de una base de datos, se exportarán todos los
metadatos de la base de datos especificada, si bien no se incluirán los usuarios ni las asignaciones de permisos
activas para la misma. Tampoco se incluirá la sentencia CREATE DATABASE necesaria para la creación de la
base de datos.
Si se utiliza DESC VQL DATABASE sin especificar el nombre de una base de datos, entonces se exportarán todos
los metadatos del sistema, incluyendo todas las bases de datos, los usuarios y las asignaciones de permisos. Para
ejecutar esta sentencia, es necesario utilizar un usuario de tipo administrador.
Descripción de Elementos del Catálogo
77
Virtual DataPort 4.0
14
Guía Avanzada de VQL
LISTADO DE ELEMENTOS DEL CATÁLOGO
La sentencia LIST permite listar los elementos existentes en el catálogo.
En la Figura 47 se muestran las diferentes opciones de utilización de esta sentencia:
La primera permite solicitar el listado de todas las bases de datos, usuarios, o configuraciones de
internacionalización.
LIST TYPES muestra todos los tipos de datos del catálogo o los de una característica determinada
(enumerados, array o registro).
LIST VIEWS permite listar las relaciones base o todas las vistas definidas en el servidor.
LIST PROCEDURES permite listar los procedimientos almacenados definidos en el servidor.
LIST PATTERNS permite listar las reglas de reescritura -de tipo raw o no- existentes para un método
de búsqueda de una relación o vista.
LIST OPERATORS permite listar los operadores que actúan sobre un tipo de dato específico, es decir,
los que admiten como operandos valores de un tipo de dato concreto.
LIST WRAPPERS muestra la enumeración de wrappers del tipo especificado (ver sección 17).
LIST DATASOURCES muestra el listado de orígenes de datos del tipo especificado (ver sección 17.3).
LIST MAPS permite listar todos los mapas de tipo simple, i18n, inputrewrite o outputrewrite .
LIST { DATABASES | USERS | I18NS ]
LIST TYPES [ ENUMERATED | ARRAY | REGISTER ]
LIST VIEWS [ BASE | ALL ]
LIST { INPUT | OUTPUT } PATTERNS [RAW] <view:identifier>
<container:identifier>
LIST OPERATORS [ <type:identifier> ]
LIST WRAPPERS { ARN | CUSTOM | DF | GS | ITP | JDBC | MY | ODBC | WS | XML }
LIST DATASOURCES { ARN | CUSTOM | DF | GS | JDBC | LDAP [ALL] | ODBC | WS |
XML }
LIST MAPS { I18N | INPUTREWRITE | OUTPUTREWRITE | SIMPLE }
LIST PROCEDURES
Figura 47 Sintaxis de la sentencia LIST
Por ejemplo, para listar las bases de datos existentes se ejecuta la siguiente sentencia:
LIST DATABASES;
Si se desean listar los mapas de tipo i18n, se utiliza la sentencia:
LIST MAPS I18N;
Listado de Elementos del Catálogo
78
Virtual DataPort 4.0
Guía Avanzada de VQL
Para listar las reglas de reescritura de entrada de tipo no raw para el método de búsqueda shopview_sm1 de la
vista base shopview, se ejecuta:
LIST INPUT PATTERNS shopview shopview_sm1;
Y para listar los operadores que operan sobre el tipo de dato int se utiliza la sentencia:
LIST OPERATORS int;
Listado de Elementos del Catálogo
79
Virtual DataPort 4.0
15
Guía Avanzada de VQL
ELIMINACIÓN DE ELEMENTOS DEL CATÁLOGO
El servidor Virtual DataPort también permite eliminar un elemento específico del diccionario de datos, mediante la
sentencia DROP.
DROP { DATABASE | USER } [ IF EXISTS ] <name:identifier>
DROP TYPE [ IF EXISTS ] <name:identifier> [ CASCADE ]
DROP { VIEW | TABLE } [ IF EXISTS ] { <name:identifier> | <name:literal> } [
CASCADE ]
DROP WRAPPER { ARN | CUSTOM | DF | GS | ITP | JDBC | ODBC | WS | XML } [ IF
EXISTS ] <name:identifier> [ CASCADE ]
DROP DATASOURCE { ARN | CUSTOM | DF | GS | JDBC | LDAP | ODBC | WS | XML } [
IF EXISTS ] <name:identifier> [ CASCADE ]
DROP MAP { INPUTREWRITE | OUTPUTREWRITE | I18N | SIMPLE } [ IF EXISTS ]
<name:identifier>
DROP PROCEDURE [ IF EXISTS ] <name:identifier>
Figura 48 Sintaxis de la sentencia DROP
En la Figura 48 se muestran los distintos usos de la sentencia DROP:
Eliminación de una base de datos o un usuario del sistema.
Eliminación de un tipo de datos.
Eliminación de una vista (base o derivada) a partir de su nombre.
Eliminación de un wrapper específico (ver sección 17) o un origen de datos (ver sección 17.3), indicando su
tipo y nombre.
Eliminación de un mapa concreto del diccionario de datos, a partir de su tipo (i18n, inputrewrite,
outputrewrite) y su nombre
Eliminación de un procedimiento almacenado.
En todos los casos anteriores es posible incluir el modificador IF EXISTS. En ese caso la sentencia DROP se
ejecutará solamente en caso de que el elemento especificado exista.
Las sentencias de borrado de vistas, tipos, wrappers y datasources admiten el modificador opcional CASCADE. Si
no se indica este modificador, cuando se intenta borrar uno de esos elementos se producirá un error si algún otro
elemento del catálogo depende de él (por ejemplo, si se borra un datasource y existe un wrapper que lo utiliza). En
este caso, el elemento no podrá ser borrado. Si se utiliza CASCADE, borra el elemento indicado, y todos los
elementos que dependían de él. Si el usuario que está realizando el borrado no dispone de permisos sobre todos los
elementos involucrados, la operación de borrado fallará.
A continuación se muestran algunos ejemplos de utilización de la sentencias DROP. Para eliminar la vista
shopview se ejecutaría la siguiente sentencia:
DROP VIEW shopview;
Para eliminar el wrapper ITP denominado shopview sería suficiente ejecutar:
DROP WRAPPER ITP shopview;
Eliminación de Elementos del Catálogo
80
Virtual DataPort 4.0
Guía Avanzada de VQL
Y para eliminar el mapa tipo i18n es_euro se utilizaría la sentencia:
DROP MAP I18N es_euro;
Eliminación de Elementos del Catálogo
81
Virtual DataPort 4.0
16
16.1
Guía Avanzada de VQL
OTROS COMANDOS
BORRADO DE ENTRADAS DE LA CACHÉ DEL DICCIONARIO DE DATOS
El contenido del catálogo de Virtual DataPort se almacena en disco, según una política de almacenamiento de
metadatos específica. Con el fin de reducir el tiempo de acceso a los elementos del catálogo, el servidor realiza
caché en memoria de algunos de sus elementos como son: vistas, tipos de datos, wrappers, datasources, usuarios,
bases de datos y mapas.
El sistema proporciona una sentencia que permite borrar el contenido de los diferentes sistemas caché que utiliza a
través de la sentencia CLEAR CACHE (ver Figura 49). De esta forma permite forzar la recarga de metadatos desde
su almacenamiento persistente.
CLEAR CACHE OF { ALL | VIEWS | TYPES | WRAPPERS | DATASOURCES |
USERS | DATABASES | PROCEDURES |
MAPS [I18N | INPUTREWRITE | OUTPUTREWRITE | SIMPLE ]
}
Figura 49 Sintaxis de la sentencia CLEAR CACHE
Si se desea borrar el contenido de la caché referente a las vistas, tipos de datos, wrappers, datasources, usuarios o
bases de datos, se debe parametrizar la sentencia CLEAR CACHE con las opciones VIEWS, TYPES,
WRAPPERS, DATASOURCES, USERS, DATABASES y PROCEDURES respectivamente.
Por otro lado, si se desea eliminar la caché de los mapas, de internacionalización y los utilizados por las funciones de
transformación de entrada y de salida MAP() (es decir, los mapas de tipo inputrewrite y
outputrewrite) la sentencia se debe parametrizar con la opción MAPS I18N, SIMPLE,
INPUTREWRITE, OUTPUTREWRITE, respectivamente.
Por último, la sentencia CLEAR CACHE ALL, permite borrar todos los sistemas de caché de metadatos
existentes en Virtual DataPort.
16.2
COMANDO DE AYUDA
Virtual DataPort incluye una sentencia de ayuda, HELP, que presenta al usuario una visión detallada de la sintaxis
de todos los comandos existentes. La sintaxis del comando HELP se muestra en la Figura 50.
La sentencia HELP, si no recibe ningún parámetro, presenta su propia sintaxis. Opcionalmente, admite como
parámetro el nombre del comando para el que se desea la ayuda. Por ejemplo, la sentencia de la Figura 51 permite al
usuario conocer en detalle la sintaxis del comando ALTER TABLE.
HELP <topic>
<topic> ::=
ALTER
| ALTER
XML }
| ALTER
| ALTER
Otros Comandos
DATABASE
DATASOURCE { ARN | CUSTOM | DF | GS | JDBC | LDAP | ODBC | WS |
PROCEDURE
TABLE
82
Virtual DataPort 4.0
Guía Avanzada de VQL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER USER
ALTER WRAPPER { ARN | CUSTOM | DF | GS | ITP | JDBC | ODBC | WS | XML }
BEGIN
CALL
CLEAR CACHE
CLOSE
COMMIT
CONNECT
CREATE DATABASE
CREATE MAP
CREATE PROCEDURE
CREATE TABLE
CREATE TYPE
CREATE USER
CREATE VIEW
CREATE WRAPPER { ARN | CUSTOM | DF | GS | ITP | JDBC | ODBC | WS | XML
|
XML }
|
|
|
|
|
|
|
XML }
|
|
|
|
CREATE DATASOURCE { ARN | CUSTOM | DF | GS | JDBC | LDAP | ODBC | WS |
}
DELETE
DESC
DROP
HELP HELP
INSERT
LIST
QUERY WRAPPER { ARN | CUSTOM | DF | GS | ITP | JDBC | MY | ODBC | WS |
ROLLBACK
SELECT
UPDATE
XML2BIN
Figura 50 Sintaxis de la sentencia HELP
HELP ALTER TABLE
Figura 51 Sentencia que solicita ayuda sobre el comando ALTER TABLE
Es posible obtener información detallada respecto a la sintaxis general VQL utilizando la sentencia HELP HELP.
Otros Comandos
83
Virtual DataPort 4.0
17
Guía Avanzada de VQL
GENERACIÓN DE WRAPPERS Y DATASOURCES
Los wrappers son componentes encargados de ofrecer al servidor una visión de las fuentes acorde a un modelo
común. Cada método de búsqueda en una relación base tiene asociado un wrapper que es el encargado de recibir las
consultas emitidas sobre ella, transformarlas en consultas sobre la fuente, y obtener sus resultados, devolviéndolos a
la capa lógica de acuerdo a un formato compatible con la relación base. Los wrappers hacen que para el servidor
sean transparentes las peculiaridades de la obtención de datos desde las fuentes.
Virtual DataPort incluye los siguientes tipos predefinidos de wrappers:
•
ITPilot: Se utiliza para incorporar en el sistema wrappers para fuentes semi-estructuradas creados con
Denodo ITPilot [6]. Estas fuentes pueden estar accesibles desde el sistema de ficheros local, vía web, o vía
FTP. El tipo de fuente más importante para el que se utiliza este envoltorio son las fuentes web, pero puede
ser utilizado para otras fuentes semi-estructuradas (ver documentación de Denodo ITPilot [6]).
•
JDBC: Extraen datos desde una Base de Datos Remota vía JDBC.
•
ODBC: Extraen datos desde una Base de Datos Remota vía ODBC.
•
Servicios Web: Extraen datos realizando invocaciones a operaciones definidas por servicios web.
•
XML: Son aquellos que permiten extraer datos encapsulados en ficheros XML, que pueden seguir
opcionalmente una cierta DTD o esquema.
•
DF: Extraen datos de ficheros de texto planos, que utilizan determinados caracteres como delimitadores de
tupla y campo. Entre los ficheros soportados se encuentran aquellos en formato CSV que suelen obtenerse
como resultado de volcar datos de bases de datos o documentos Excel.
•
ARACNE. Permiten acceder a índices sobre información no estructurada creados utilizando Denodo Aracne
[16].
•
GOOGLE MINI. Permiten acceder a índices sobre información no estructurada creados con la herramienta
de búsqueda Google Mini [17].
•
CUSTOM (también llamados MY): Extraen la información de una fuente, a través de una implementación
Java específica. Este tipo de wrapper permite la construcción ad-hoc de un programa envoltorio para un
tipo de fuente específico.
Para todos los wrappers excepto los de tipo ITPilot existen elementos datasource para encapsular cierta información
de acceso y configuración a la fuente de datos. Adicionalmente existe un tipo de datasource para representar los
servidores LDAP que pueden ser utilizados para autenticar a usuarios de DataPort (ver sección 12.3.3). Los
datasources LDAP no tienen wrappers asociados.
En esta sección se describe la forma de crear en Virtual DataPort nuevos wrappers (y sus datasources) de cualquiera
de estos tipos.
Generación de Wrappers y DataSources
84
Virtual DataPort 4.0
Guía Avanzada de VQL
El resto de esta sección se estructura cómo sigue. Las secciones 17.1 y 17.2 definen aspectos de interés general para
el resto de la sección: las conversiones válidas de tipos entre los wrappers y las relaciones base en Virtual DataPort,
y las formas de especificar rutas a recursos dentro de Virtual DataPort. La sección 17.3 especifica cómo añadir al
sistema fuentes de datos (DataSources) de los diversos tipos disponibles. Finalmente, la sección 17.4 muestra cómo
crear wrappers para cada uno de estos tipos de fuente.
17.1
CONVERSIONES VÁLIDAS ENTRE TIPOS EN LOS WRAPPERS Y VDP
En esta sección se describen los mappings de compatibilidad entre los tipos Java exportados por los wrappers y los
tipos de dato utilizados por Virtual DataPort en las relaciones base y vistas (ver sección 3.1). A la hora de asignar
wrappers a relaciones base será necesario tener en cuenta estas reglas de compatibilidad para asegurarse de que
los esquemas definidos para los wrappers y las relaciones base son compatibles.
La siguiente tabla muestra los mappings de tipos más comunes. Estos son también los mappings aplicados de forma
automática por la herramienta gráfica de administración de Virtual DataPort (ver Guía del Administrador [3]).
Tipos Java
int, java.lang.Short, java.lang.Integer
long, java.lang.Long
float, java.lang.Float
double, java.lang.Double
boolean, java.lang.Boolean
java.lang.String
java.util.Date, java.util.Calendar,
java.sql.Date, java.sql.Timestamp, java.sql.Time
byte[], java.sql.Blob
Tabla 2
Tipos Virtual DataPort
int
long
float
double
boolean
text
date
blob
Conversiones automáticas entre tipos JAVA y tipos Virtual DataPort
Por defecto, cualquier otro tipo de dato java no especificado en esta tabla, se asociará al tipo de dato VDP text.
Existen otros mappings posibles entre tipos Java y tipos Virtual DataPort, que pueden especificarse pero que no se
aplican de forma automática. Pueden verse en la siguiente tabla.
Tipos Java
long, java.lang.Long
java.lang.String
java.lang.String
java.lang.String
double, java.lang.Double
Tabla 3
Tipos Virtual DataPort
time
enumerated
link
xml
money
Otras conversiones válidas entre tipos JAVA y tipos Virtual DataPort
Por otra parte, los wrappers pueden proporcionar elementos compuestos como arrays y registros, que se asocian
directamente a arrays y registros utilizados por el servidor VDP.
17.1.1
Conversiones de tipo nativo de un wrapper a tipos Java
Cada tipo de wrapper posee sus propias asociaciones entre los tipos nativos de las fuentes que modelan y tipos java.
En los siguientes apartados se muestran las conversiones aplicadas a los diferentes tipos de wrappers soportados
por Virtual DataPort.
Generación de Wrappers y DataSources
85
Virtual DataPort 4.0
Guía Avanzada de VQL
En general, para aquellos wrappers que accedan a fuentes que puedan devolver objetos o arrays de objetos, el
wrapper es responsable de representar estas estructuras mediante registros y arrays respectivamente.
17.1.1.1
Tabla de conversiones de tipos para wrappers JDBC
Tipos JDBC
ARRAY
BIGINT
BINARY
BIT
BLOB
BOOLEAN
CHAR
CLOB
DATALINK
DATE
DECIMAL
DISTINCT
DOUBLE
FLOAT
INTEGER
JAVA_OBJECT
LONGVARBINARY
LONGVARCHAR
NULL
NUMERIC
OTHER
REAL
REF
SMALLINT
STRUCT
TIME
TIMESTAMP
TINYINT
VARBINARY
VARCHAR
Tipos Java
Clase propietaria JDBCArrayTypeVO
java.lang.Long
java.lang.String
java.lang.Boolean
byte []
java.lang.Boolean
java.lang.String
java.lang.String
java.lang.String
java.sql.Date
java.lang.Double
java.lang.String
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.String
java.lang.String
java.lang.String
java.lang.String
java.lang.Double
JDBCRegisterTypeVO
java.lang.Float
java.lang.String
java.lang.Short
JDBCRegisterTypeVO
java.sql.Time
java.sql.Timestamp
java.lang.Byte
java.lang.String
java.lang.String
Tabla 4
Conversiones de tipos JDBC
El resto de tipos se convierte a java.lang.String.
Dependiendo de la versión de base de datos a la que se accede, pueden existir diferentes conversiones.
17.1.1.2
Tabla de conversiones de tipos para wrappers ODBC
Para los wrappers ODBC se aplican las mismas convesiones que para los wrappers JDBC en los que se basa.
17.1.1.3
Tabla de conversiones de tipos para wrappers de fuentes web
Los wrappers para fuentes web generados con ITPilot 4.0 o posterior utilizan la siguiente tabla de conversión de
tipos:
Tipos ITPilot
boolean
date
Generación de Wrappers y DataSources
Tipos Java
boolean
java.util.Calendar
86
Virtual DataPort 4.0
double
float
int
string
url
Guía Avanzada de VQL
double
float
int
java.lang.String
java.lang.String
Tabla 5
Conversiones de tipos ITPilot
Los wrappers de fuentes web generados con versiones de ITPilot anteriores a la 4.0 no proporcionan información
relativa al tipo de los elementos que obtienen, por lo que se encapsulan utilizando la clase java
java.lang.String.
17.1.1.4
Tabla de conversiones de tipos para wrappers de Servicios Web
Tipos SOAP
xsd:base64Binary
xsd:boolean
xsd:byte
xsd:dateTime
xsd:decimal
xsd:double
xsd:float
xsd:hexBinary
xsd:int
xsd:integer
xsd:long
xsd:QName
Tipos Java
byte[]
boolean
byte
java.util.Calendar
java.math.BigDecimal
double
float
byte[]
int
java.math.BigInteger
long
java.lang.String con formato
"{namespace}localPart"
short
java.lang.String
xsd:short
xsd:string
Tabla 6
Conversiones de tipos de Web Services
El resto de elementos se tratan como objetos Java utilizando la API de instrospección para acceder a sus
propiedades y de esta forma poder reconstuir su estructura.
17.1.1.5
Tabla de conversiones de tipos para wrappers XML
Tipos XML-Schema
Positiveinteger
negativeinteger
nonpositiveinteger
nonnegativeinteger
int
unsignedint
gYear
gMonth
gDay
long
unsignedlong
Generación de Wrappers y DataSources
Tipos Java
java.lang.Integer
java.lang.Long
87
Virtual DataPort 4.0
byte
unsignedbyte
Double
Float
short
unsignedshort
Boolean
string
normalizedString
token
base64Binary
hexBinary
duration
dateTime
date
time
gYearMonth
gMonthDay
java.lang.Byte
java.lang.Double
java.lang.Float
java.lang.Short
java.lang.Boolean
java.lang.String
Tabla 7
17.1.1.6
Guía Avanzada de VQL
Conversiones de tipos XML
Tabla de conversiones de tipos para wrappers de ficheros delimitados
Un wrapper DF no posee metainformación que permita identificar valores de datos almacenados en un fichero con
sus tipos, por lo que un wrapper DF siempre trata los elementos obtenidos encapsulados en la clase java
java.lang.String.
17.1.1.7
Tabla de conversiones de tipos para wrappers CUSTOM
Un wrapper CUSTOM indica los tipos de sus campos con clases Java, por lo que no requiere conversiones.
17.1.1.8
Tabla de conversiones de tipos para wrappers Aracne
Todos los campos de los índices de Denodo Aracne serán traducidos a atributos de tipo text en DataPort.
Los wrappers creados en base a índices de Denodo Aracne incluyen algunos atributos adicionales a los contenidos
en el índice original que pueden ser de otros tipos. Ver sección 17.4.9.
17.1.1.9
Tabla de conversiones de tipos para wrappers Google Mini
Todos los campos de los índices de Google Mini serán traducidos a atributos de tipo text en DataPort, excepto el
campo RATING que es de tipo entero.
Los wrappers creados en base a índices de Google Mini incluyen algunos atributos adicionales a los contenidos en el
índice original que pueden ser de otros tipos. Ver sección 17.4.10.
17.2
ESPECIFICACIÓN DE RUTAS EN VIRTUAL DATAPORT
Virtual DataPort utiliza la especificación de rutas en diversos puntos de la creación de fuentes de datos
(DataSources) y wrappers. Estas rutas permiten localizar un determinado recurso (fichero, página web, etc.).
En Virtual DataPort existen tres tipos de rutas, que se describen a continuación junto con los parámetros que es
necesario especificar habitualmente para cada una de ellas en una sentencia VQL:
Generación de Wrappers y DataSources
88
Virtual DataPort 4.0
•
•
Guía Avanzada de VQL
LOCAL: Ruta que accede a un recurso dentro de un sistema de ficheros local. Necesita los siguientes
parámetros:
o
El nombre de la clase utilizada para implementar la conexión utilizada por la ruta. Para este tipo
de rutas, se proporciona una única clase conexión: LocalConnection.
o
La ruta local al recurso (e.g. fichero).
HTTP: Ruta que representa el acceso a un recurso a través de un servidor web. Es necesario especificar los
siguientes parámetros:
o
El nombre de la clase utilizada para implementar la conexión utilizada por la ruta. Para este tipo
de rutas, se proporcionan dos clases diferentes:
http.HTTPClientConnection: Realiza una conexión contra un servidor web
utilizando el protocolo http para acceder a un recurso remoto. Opcionalmente, recibe
como parámetro el tiempo máximo a esperar para obtener las cabeceras de respuesta
de la petición http realizada. Por ejemplo, la declaración de conexión siguiente indica
que se utilice este tipo de conexión con un tiempo máximo de respuesta de 2 minutos:
http.HTTPClientConnection,120000.
http.IEBrowserConnection: Realiza una conexión contra un servidor web
utilizando un pool de browsers de Denodo ITPilot [6]. Estos navegadores son capaces de
ejecutar secuencias de navegación avanzadas sobre el navegador Microsoft Internet
Explorer [10], escritas en el lenguaje definido por ITPilot. No recibe ningún parámetro.
•
o
Patrón de Acceso (urlpatron). Representa una secuencia de navegación a una fuente web,
cuyo formato debe ser entendible por la clase conexión utilizada. La clase
http.HTTPClientConnection permite especificar una petición http (expresada en el
formato habitual utilizado para peticiones GET). ITPilot [6] proporciona un lenguaje de secuencias
de navegación llamado NSEQL para la clase conexión http.IEBRowserConnection. En
ambos casos la ruta puede incluir variables de interpolación cuyo valor será obtenido en tiempo
de ejecución (ver sección 18.4).
o
Método de Acceso (method). Indica el método http de acceso a utilizar con la ruta. Puede
tomar los valores GET o POST. En la actualidad, este parámetro sólo se considera si se utiliza
la clase conexión http.HTTPClientConnection.
FTP: Ruta que accede a un archivo vía FTP. Recibe como parámetros:
o
El nombre de la clase utilizada para implementar la conexión utilizada por la ruta. Para este tipo
de rutas, se proporciona una única clase conexión: ftp.FTPBeanConnection.
o
URL del servidor apuntando al recurso (host:port/path/file).
Generación de Wrappers y DataSources
89
Virtual DataPort 4.0
17.3
o
Identificador del usuario que debe ser utilizado para el acceso, y
o
Contraseña para ese usuario.
Guía Avanzada de VQL
CREACIÓN DE DATASOURCES
Antes de describir en detalle cada uno de los tipos de wrappers existentes en Virtual DataPort, es necesario
introducir el concepto de DataSource. Los DataSources son utilizados por los wrappers para la localización de su
origen de datos.
Esto permite, además de la reutilización del localizador de la fuente en base a un nombre, mantener y configurar
pools de conexiones sobre la misma, (si este concepto es aplicable a ese tipo de fuente). Por ejemplo, el uso de pool
de conexiones es imprescindible por consideraciones de eficiencia a la hora de tratar orígenes de datos relacionales.
Las siguientes secciones describen el proceso manual de creación de cada tipo de DataSource.
NOTA: Se recomienda fuertemente que el proceso de creación de wrappers y datasources se realice de forma
gráfica mediante la herramienta de administración de DataPort (ver [3]).
17.3.1
DataSources JDBC
Para agilizar el acceso a fuentes JDBC, evitando el costoso proceso de creación de una nueva conexión cada vez que
se realiza una consulta, se permite especificar en los DataSources de tipo JDBC diferentes parámetros para el pool
de conexiones. En caso de no especificar todos los posibles parámetros implícitamente en la sentencia de creación,
se utilizarán los valores por defecto.
Para la definición de un origen de datos JDBC es necesario especificar:
DRIVERCLASSNAME: La clase driver a utilizar para la conexión al origen de datos.
DATABASEURI: El URL de conexión a la base de datos.
USERNAME: El nombre del usuario a utilizar para el acceso.
USERPASSWORD: La clave de acceso para el usuario utilizado.
CLASSPATH: Ruta al archivo JAR conteniendo el driver JDBC para la fuente especificada (opcional).
Parámetros de identificación de la base de datos a la que se accede (importantes para considerar las
características especiales de las diferentes bases de datos utilizadas como origen de información). Estos
campos son opcionales. Si no se especifican, entonces se utiliza la configuración general de acceso a una
base de datos.
o DATABASENAME: Nombre de la base de datos a la que acceder.
o DATABASEVERSION: Número de versión del origen de datos.
Parámetros de inicialización del pool de conexiones asociado a este origen de datos (opcionales).
o VALIDATIONQUERY: Consulta SQL utilizada por el pool para verificar el estado de las
conexiones que se encuentran cacheadas. Es preciso que la consulta sea sencilla y exista la tabla
en cuestión. Por defecto, si no se especifica, se utiliza “SELECT COUNT (*) FROM
SYS.DUAL”.
o INITIALSIZE: Número de conexiones con las que se desea inicializar el pool. Se establecen
y crean un número de conexiones en estado “idle” (ocioso), listas para ser usadas. Por defecto, si
no se especifica, su valor es 4.
o MAXACTIVE: Número máximo de conexiones que puede gestionar el pool al mismo tiempo. Por
defecto, si no se especifica, 8. (Cero implica sin límite)
Parámetros de configuración de la fuente de datos (SOURCECONFIGURATION). Virtual DataPort
permite indicar características concretas de las fuentes subyacentes para tenerlas en cuenta a la hora de
ejecutar sentencias sobre ellas. Ver sección 17.3.6 para más detalle.
Generación de Wrappers y DataSources
90
Virtual DataPort 4.0
Guía Avanzada de VQL
La sentencia de creación del origen de datos también permite especificar el modificador OR REPLACE. En ese
caso, si ya existe un origen de datos con el mismo nombre, su definición será sustituida por la nueva.
En la siguiente figura se muestra la sintaxis de creación de DataSources JDBC, con la opcionalidad de los diferentes
grupos de parámetros.
CREATE [ OR REPLACE ] DATASOURCE JDBC <name:identifier>
DRIVERCLASSNAME=<literal>
DATABASEURI=<literal>
USERNAME=<literal>
USERPASSWORD=<literal>
[ CLASSPATH=<literal> ]
[
DATABASENAME=<literal>
DATABASEVERSION=<literal>
]
[
VALIDATIONQUERY=<literal>
INITIALSIZE=<integer>
MAXACTIVE=<integer>
]
[
VALIDATIONQUERY=<literal>
INITIALSIZE=<integer>
MAXIDLE=<integer>
MINIDLE=<integer>
MAXACTIVE=<integer>
EXHAUSTEDACTION=<integer>
TESTONBORROW=<boolean>
TESTONRETURN=<boolean>
TESTWHILEIDLE=<boolean>
[
TIMEBETWEENEVICTION=<integer>
NUMTESTPEREVICTION=<integer>
MINEVIDECTABLETIME=<integer>
[
POOLPREPAREDSTATEMENTS=<boolean>
MAXSLEEPINGPS=<integer>
INITIALCAPACITYPS=<integer>
]
]
]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<source configuration property> ::=
DELEGATEALLOPERATORS = { true | false | DEFAULT }
| DELEGATEARRAYLITERAL = { true | false | DEFAULT }
| DELEGATECOMPOUNDFIELDPROJECTION = { true | false | DEFAULT }
| DELEGATEGROUPBY = { true | false | DEFAULT }
| DELEGATEHAVING = { true | false | DEFAULT }
| DELEGATEINNERJOIN = { true | false | DEFAULT }
| DELEGATEJOIN = { true | false | DEFAULT }
| DELEGATELEFTFUNCTION = { true | false | DEFAULT }
Generación de Wrappers y DataSources
91
Virtual DataPort 4.0
Guía Avanzada de VQL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DELEGATELEFTLITERAL = { true | false | DEFAULT }
DELEGATENATURALOUTERJOIN = { true | false | DEFAULT }
DELEGATENOTCONDITION = { true | false | DEFAULT }
DELEGATEORCONDITION = { true | false | DEFAULT }
DELEGATEORDERBY = { true | false | DEFAULT }
DELEGATEPROJECTION = { true | false | DEFAULT }
DELEGATEREGISTERLITERAL = { true | false | DEFAULT }
DELEGATERIGHTFIELD = { true | false | DEFAULT }
DELEGATERIGHTFUNCTION = { true | false | DEFAULT }
DELEGATERIGHTLITERAL = { true | false | DEFAULT }
DELEGATESELECTION = { true | false | DEFAULT }
DELEGATEUNION = { true | false | DEFAULT }
SUPPORTSAGGREGATEFUNCTIONSOPTIONS = { true | false | DEFAULT }
SUPPORTSBRANCHOUTERJOIN = { true | false | DEFAULT }
SUPPORTSEQOUTERJOINOPERATOR = { true | false | DEFAULT }
SUPPORTSEXPLICITCROSSJOIN = { true | false | DEFAULT }
SUPPORTSFULLEQOUTERJOIN = { true | false | DEFAULT }
SUPPORTSFULLNOTEQOUTERJOIN = { true | false | DEFAULT }
SUPPORTSFUSINGINUSINGANDNATURALJOIN = { true | false | DEFAULT }
SUPPORTSJOINONCONDITION = { true | false | DEFAULT }
SUPPORTSNATURALJOIN = { true | false | DEFAULT }
SUPPORTSUSINGJOIN = { true | false | DEFAULT }
DELEGATEAGGREGATEFUNCTIONS = { DEFAULT | ( <function:identifier>
[, <function:identifier> ]* ] ) }
| DELEGATESCALARFUNCTIONS = { DEFAULT | ( <function:identifier>
[, <function:identifier> ]* ] ) }
| DELEGATEOPERATORSLIST = { DEFAULT | ( <operator:identifier>
[, <operator:identifier> ]* ] ) }
Figura 52 Sintaxis de la sentencia de creación de un datasource JDBC
Existe una sentencia de modificación de un datasource JDBC (ALTER DATASOURCE JDBC). Su sintaxis permite
indicar los mismos parámetros que la sentencia de creación.
ALTER DATASOURCE JDBC <name:identifier>
DRIVERCLASSNAME=<literal>
DATABASEURI=<literal>
USERNAME=<literal>
USERPASSWORD=<literal>
[ CLASSPATH=<literal> ]
[
DATABASENAME=<literal>
DATABASEVERSION=<literal>
]
[
VALIDATIONQUERY=<literal>
INITIALSIZE=<integer>
MAXACTIVE=<integer>
]
[
VALIDATIONQUERY=<literal>
INITIALSIZE=<integer>
MAXIDLE=<integer>
MINIDLE=<integer>
Generación de Wrappers y DataSources
92
Virtual DataPort 4.0
Guía Avanzada de VQL
MAXACTIVE=<integer>
EXHAUSTEDACTION=<integer>
TESTONBORROW=<boolean>
TESTONRETURN=<boolean>
TESTWHILEIDLE=<boolean>
[
TIMEBETWEENEVICTION=<integer>
NUMTESTPEREVICTION=<integer>
MINEVIDECTABLETIME=<integer>
[
POOLPREPAREDSTATEMENTS=<boolean>
MAXSLEEPINGPS=<integer>
INITIALCAPACITYPS=<integer>
]
]
]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] )
]
<source configuration property> ::= (see CREATE DATASOURCE JDBC for
details)
Figura 53 Sintaxis de la sentencia de modificación de un datasource JDBC
17.3.2
DataSources ODBC
Virtual DataPort permite definir bases de datos accesibles vía ODBC como fuentes del sistema.
En la Figura 54 se muestra la sintaxis de la sentencia VQL de creación de un origen de datos ODBC. Para mayor
información respecto a los diferentes parámetros que es necesario establecer para definir la conexión y para definir
el pool de conexiones contra la fuente de datos, ver creación de datasources JDBC.
La sentencia de creación del origen de datos permite especificar el modificador OR REPLACE. En ese caso, si ya
existe un origen de datos con el mismo nombre, su definición será sustituida por la nueva.
También se permite especificar diferentes parámetros de configuración de la fuente de datos
(SOURCECONFIGURATION), que Virtual DataPort tendrá en cuenta a la hora de ejecutar sentencias sobre ella.
Ver sección 17.3.6 para más detalle.
En el caso de datasources ODBC puede no especificarse la clase driver a utilizar para la conexión contra el gestor.
Para ello debe especificarse el atributo DSN en lugar del DATABASEURI junto con el DRIVERCLASSNAME.
Cuando se especifica el atributo DSN, el driver utilizado será el driver puente JDBC-ODBC.
NOTA: En el caso de tipos de fuentes ODBC, el sistema gestor debe encontrarse en la máquina local al servidor
Virtual DataPort o en su defecto debe instalarse un gestor ODBC en el que registrar el driver ODBC del servidor de
bases de datos remota. En cualquier caso, la conexión entre VDP y el gestor de ODBC o de Base de Datos ODBC será
local.
CREATE [OR REPLACE] DATASOURCE ODBC <name:identifier>
{ DSN=<literal>
|
DATABASEURI=<literal>
Generación de Wrappers y DataSources
93
Virtual DataPort 4.0
Guía Avanzada de VQL
DRIVERCLASSNAME=<literal>
}
USERNAME=<literal>
USERPASSWORD=<literal>
[ PROPERTIES=<literal> ]
[ CLASSPATH=<literal> ]
[
DATABASENAME=<literal>
DATABASEVERSION=<literal>
]
[
INITIALSIZE=<integer>
MAXACTIVE=<integer>
VALIDATIONQUERY=<literal>
]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<source configuration property> ::=
DELEGATEALLOPERATORS = { true | false | DEFAULT }
| DELEGATEARRAYLITERAL = { true | false | DEFAULT }
| DELEGATECOMPOUNDFIELDPROJECTION = { true | false | DEFAULT }
| DELEGATEGROUPBY = { true | false | DEFAULT }
| DELEGATEHAVING = { true | false | DEFAULT }
| DELEGATEINNERJOIN = { true | false | DEFAULT }
| DELEGATEJOIN = { true | false | DEFAULT }
| DELEGATELEFTFUNCTION = { true | false | DEFAULT }
| DELEGATELEFTLITERAL = { true | false | DEFAULT }
| DELEGATENATURALOUTERJOIN = { true | false | DEFAULT }
| DELEGATENOTCONDITION = { true | false | DEFAULT }
| DELEGATEORCONDITION = { true | false | DEFAULT }
| DELEGATEORDERBY = { true | false | DEFAULT }
| DELEGATEPROJECTION = { true | false | DEFAULT }
| DELEGATEREGISTERLITERAL = { true | false | DEFAULT }
| DELEGATERIGHTFIELD = { true | false | DEFAULT }
| DELEGATERIGHTFUNCTION = { true | false | DEFAULT }
| DELEGATERIGHTLITERAL = { true | false | DEFAULT }
| DELEGATESELECTION = { true | false | DEFAULT }
| DELEGATEUNION = { true | false | DEFAULT }
| SUPPORTSAGGREGATEFUNCTIONSOPTIONS = { true | false | DEFAULT }
| SUPPORTSBRANCHOUTERJOIN = { true | false | DEFAULT }
| SUPPORTSEQOUTERJOINOPERATOR = { true | false | DEFAULT }
| SUPPORTSEXPLICITCROSSJOIN = { true | false | DEFAULT }
| SUPPORTSFULLEQOUTERJOIN = { true | false | DEFAULT }
| SUPPORTSFULLNOTEQOUTERJOIN = { true | false | DEFAULT }
| SUPPORTSFUSINGINUSINGANDNATURALJOIN = { true | false | DEFAULT }
| SUPPORTSJOINONCONDITION = { true | false | DEFAULT }
| SUPPORTSNATURALJOIN = { true | false | DEFAULT }
| SUPPORTSUSINGJOIN = { true | false | DEFAULT }
| DELEGATEAGGREGATEFUNCTIONS = { DEFAULT | ( <function:identifier>
[, <function:identifier> ]* ] ) }
| DELEGATESCALARFUNCTIONS = { DEFAULT | ( <function:identifier>
[, <function:identifier> ]* ] ) }
| DELEGATEOPERATORSLIST = { DEFAULT | ( <operator:identifier>
Generación de Wrappers y DataSources
94
Virtual DataPort 4.0
Guía Avanzada de VQL
[, <operator:identifier> ]* ] ) }
Figura 54 Sintaxis de la sentencia de creación de un datasource ODBC
De forma análoga a los datasources JDBC, existe una sentencia de modificación de datasources ODBC (ALTER
DATASOURCE ODBC), con la misma sintaxis que la sentencia de creación.
ALTER DATASOURCE ODBC <name:identifier>
{ DSN=<literal>
|
DATABASEURI=<literal>
DRIVERCLASSNAME=<literal>
}
USERNAME=<literal>
USERPASSWORD=<literal>
[ PROPERTIES=<literal> ]
[ CLASSPATH=<literal> ]
[
DATABASENAME=<literal>
DATABASEVERSION=<literal>
]
[
INITIALSIZE=<integer>
MAXACTIVE=<integer>
VALIDATIONQUERY=<literal>
]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<source configuration property> ::= (see CREATE DATASOURCE ODBC for details)
Figura 55 Sintaxis de la sentencia de modificación de un datasource ODBC
17.3.3
DataSources para Servicios Web
Para configurar como origen de datos un servicio web es necesario especificar el URI al fichero WSDL que define el
Servicio Web. En la Figura 56 se muestra la sintaxis de creación de un datasource para un servicio Web.
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
CREATE [OR REPLACE] DATASOURCE WS <name:identifier>
WSDLURI <literal>
Figura 56 Sintaxis de la sentencia de creación de un datasource WS.
La sentencia de modificación de un datasource de este tipo es similar.
ALTER DATASOURCE WS <name:identifier>
WSDLURI = <literal>
Figura 57 Sintaxis de la sentencia de modificación de un datasource WS.
Generación de Wrappers y DataSources
95
Virtual DataPort 4.0
Guía Avanzada de VQL
Un fichero WSDL permite definir uno o varios servicios web, y cada servicio web puede disponer de varios puertos
con una o varias operaciones. Un origen de datos para servicios web, permitirá crear wrappers modelando cualquiera
de las operaciones que define.
17.3.4
DataSources XML
Virtual DataPort permite definir ficheros XML como orígenes de datos para extraer información. Para definir un origen
de datos XML es necesario especificar la ruta de acceso al documento XML y, opcionalmente, la ruta de acceso al
fichero conteniendo el esquema del mismo, tal y como se explica a continuación:
SCHEMA o DTD (opcional): Ruta al fichero que contiene la metainformación del fichero XML origen de
datos. Puede ser un XML-Schema o una DTD. Si no se especifica, Virtual DataPort tratará de inferir un
esquema adecuado analizando la estructura del documento XML indicado en el siguiente parámetro.
ROUTE: Especificación de la ruta de acceso al fichero XML que representa el origen de datos. Puede incluir
variables de interpolación para parametrizar la ruta de acceso en función de las condiciones de la consulta
efectuada sobre el datasource (ver sección 18.4).
La especificación de rutas en DataPort fue descrita en la sección 17.2.
La sintaxis de creación se puede ver en la Figura 58:
CREATE [OR REPLACE] DATASOURCE XML <name:identifier>
[ { SCHEMA | DTD } <route>]
ROUTE <route>
<route> ::=
LOCAL <connection class name:literal> <uri:literal>
| HTTP <connection class name:literal> { GET | POST } <uri:literal>
| FTP <connection class name:literal> <uri:literal>
<login:literal> <password:literal>
Figura 58 Sintaxis de la sentencia de creación de un datasource XML
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
A continuación se muestra la sintaxis de la sentencia de modificación de un datasource XML.
ALTER DATASOURCE XML <name:identifier>
[{ SCHEMA | DTD } <route>]
ROUTE <route>
<route> ::=
LOCAL <connection class name:literal> <uri:literal>
| HTTP <connection class name:literal> { GET | POST } <uri:literal>
| FTP <connection class name:literal> <uri:literal>
<login:literal> <password:literal>
Figura 59 Sintaxis de la sentencia de modificación de un datasource XML
17.3.5
DataSources DF
Este tipo de origen de datos permite que Denodo Virtual DataPort pueda acceder a los datos contenidos en ficheros
planos en formato CSV (Comma Separated Values) o similar.
Para definir un origen de datos de fichero delimitado es necesario especificar los siguientes elementos:
Generación de Wrappers y DataSources
96
Virtual DataPort 4.0
-
-
-
-
Guía Avanzada de VQL
ROUTE: La ruta al fichero de texto de tipo delimitado del que extraer la información. Puede incluir variables
de interpolación para parametrizar la ruta de acceso en función de las condiciones de la consulta efectuada
sobre el datasource (ver sección 18.4).
COLUMNDELIMITER: Cadena de caracteres utilizada como separador de elementos en el fichero
delimitado.
ENDOFLINEDELIMITER: Cadena de caracteres utilizada como separador de tuplas de datos en el fichero
delimitado (por defecto se utilizará el retorno de carro, \n).
BEGINDELIMITER: Expresión regular (en formato JAVA) que identifica el lugar del fichero delimitado dónde
se comenzará a buscar tuplas (o cabeceras si la opción “header” ha sido seleccionada). Si no se especifica
se asume como valor el comienzo del fichero. Si se añade el modificador ISDATA entonces el texto que
encaje con la expresión regular se considerará como parte del espacio de búsqueda.
ENDDELIMITER: Expresión regular (en formato JAVA) que identifica el lugar del fichero delimitado hasta el
que se buscarán tuplas. Si no se especifica se asume como valor el fin del fichero. Si se añade el
modificador ISDATA entonces el texto que encaje con la expresión regular de fin se considerará como
parte del espacio de búsqueda de tuplas.
HEADER: Permite especificar si la primera tupla de datos del fichero debe utilizarse como cabecera, es
decir, como metainformación que proporciona el nombre de los diferentes campos que componen una tupla
del fichero delimitado.
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
CREATE [OR REPLACE] DATASOURCE DF <name:identifier>
ROUTE <route>
COLUMNDELIMITER = <literal>
[ ENDOFLINEDELIMITER = <literal> ]
[ BEGINDELIMITER = <literal> [ISDATA] ]
[ ENDDELIMITER = <literal> [ISDATA] ]
[ HEADER = <boolean> ]
<route> ::=
LOCAL <connection class name:literal> <uri:literal>
| HTTP <connection class name:literal> { GET | POST } <uri:literal>
| FTP <connection class name:literal> <login:literal>
<password:literal> <uri:literal>
Figura 60 Sintaxis de la sentencia de creación de un datasource DF
La Figura 61 muestra la sintaxis de la sentencia de modificación de un datasource de ficheros delimitados.
ALTER DATASOURCE DF <name:identifier>
ROUTE <route>
COLUMNDELIMITER = <literal>
[ ENDOFLINEDELIMITER = <literal> ]
[ BEGINDELIMITER = <literal> [ISDATA] ]
[ ENDDELIMITER = <literal> [ISDATA] ]
[ HEADER = <boolean> ]
<route> ::=
LOCAL <connection class name:literal> <uri:literal>
| HTTP <connection class name:literal> { GET | POST } <uri:literal>
| FTP <connection class name:literal> <login:literal>
<password:literal> <uri:literal>
Generación de Wrappers y DataSources
97
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 61 Sintaxis de la sentencia de modificación de un datasource DF
La especificación de rutas en DataPort fue descrita en la sección 17.2.
17.3.6
DataSources Denodo Aracne
Virtual DataPort permite importar un servidor de búsqueda de Denodo Aracne[16] como fuente de datos. Es
necesario específicar los siguientes parámetros:
-
name: Nombre con el que se denominará a la fuente de datos dentro de Virtual DataPort.
ARNURI. URI de acceso al servidor de búsqueda de Aracne que se desea importar. El formato de URI es
host:port, donde host es el nombre de la máquina en la que está accesible el buscador y port es
el puerto en el que se ejecuta. En la instalación por defecto de Aracne, este puerto es el 4000.
La sintaxis de creación se puede ver en la Figura 62:
CREATE [ OR REPLACE ] DATASOURCE ARN <name:identifier>
ARNURI = <literal>
Figura 62 Sintaxis de la sentencia de creación de un datasource Aracne
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
A continuación se muestra la sintaxis de la sentencia de modificación de un datasource Aracne.
ALTER DATASOURCE ARN <name:identifier>
ARNURI = <literal>
Figura 63 Sintaxis de la sentencia de modificación de un datasource Aracne
17.3.7
DataSources Google Mini
Virtual DataPort permite importar un servidor de búsqueda de Google Mini [17] como fuente de datos. Es necesario
específicar los siguientes parámetros:
-
name: Nombre con el que se denominará a la fuente de datos dentro de Virtual DataPort.
GSURI. URI de acceso al servidor de búsqueda de Google Mini que se desea importar. El formato de URI
es host:port, donde host es el nombre de la máquina en la que está accesible el buscador y port
es el puerto en el que se ejecuta.
La sintaxis de creación se puede ver en la Figura 64:
CREATE [ OR REPLACE ] DATASOURCE GS <name:identifier>
GSURI = <literal>
Figura 64 Sintaxis de la sentencia de creación de un datasource Google Mini
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
A continuación se muestra la sintaxis de la sentencia de modificación de un datasource Google Mini.
Generación de Wrappers y DataSources
98
Virtual DataPort 4.0
Guía Avanzada de VQL
ALTER DATASOURCE GS <name:identifier>
GSURI = <literal>
Figura 65 Sintaxis de la sentencia de modificación de un datasource Google Mini
17.3.8
DataSources LDAP
Virtual DataPort permite importar un servidor LDAP como fuente de datos. Los servidores LDAP importados pueden
utilizarse para que los usuarios de DataPort se autentiquen contra ellos (ver sección 12.3.3). Para añadir un nuevo
datasource LDAP es necesario especificar los siguientes parámetros:
-
name: Nombre con el que se denominará a la fuente de datos dentro de Virtual DataPort.
URI. URI de acceso al servidor LDAP que se desea importar. El formato de URI es
ldap://host:port, donde host es el nombre de la máquina en la que está accesible el servidor y
port es el puerto en el que se ejecuta.
La sintaxis de creación se puede ver en la Figura 66:
CREATE [ OR REPLACE ] DATASOURCE LDAP <name:identifier>
URI=<serverURI:literal>
Figura 66 Sintaxis de la sentencia de creación de un datasource LDAP
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
A continuación se muestra la sintaxis de la sentencia de modificación de un datasource Aracne.
ALTER DATASOURCE LDAP <name:identifier>
URI=<serverURI:literal>
Figura 67 Sintaxis de la sentencia de modificación de un datasource LDAP
17.3.9
DataSources Custom
Virtual DataPort permite crear wrappers ad-hoc para fuentes de datos para las que no exista un conector específico
proporcionado por DataPort. Para ello es necesario crear dos clases JAVA que implementen el comportamiento
deseado (ver sección 17.4.11). Una vez creada dicha clase, es posible importar la fuente de datos en DataPort
mediante un datasource CUSTOM. Es necesario específicar los siguientes parámetros:
-
name:Nombre con el que se denominará a la fuente de datos dentro de Virtual DataPort.
CLASSNAME. Nombre de la clase que implementa el wrapper específico para la fuente. Debe extender
com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperImpl. V er sección 17.4.9.
CLASSPATH. (Opcional) Classpath adicional requerido para la ejecución del wrapper.
La sintaxis de creación se puede ver en la Figura 68:
CREATE [ OR REPLACE ] DATASOURCE CUSTOM <name:identifier>
CLASSNAME=<className:literal>
[ CLASSPATH=<classPath:literal> ]
Generación de Wrappers y DataSources
99
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 68 Sintaxis de la sentencia de creación de un datasource Custom
El modificador OR REPLACE permite que, si ya existe un origen de datos con el mismo nombre, su definición sea
reemplazada por la nueva.
A continuación se muestra la sintaxis de la sentencia de modificación de un datasource Custom.
ALTER DATASOURCE CUSTOM <name:identifier>
CLASSNAME=<className:literal>
[ CLASSPATH=<classPath:literal> ]
Figura 69 Sintaxis de la sentencia de modificación de un datasource Custom
17.3.10
Propiedades de Configuración de Fuentes de Datos
Virtual DataPort mantiene propiedades para cada una de las fuentes de datos y wrappers, que permiten configurar
características concretas de las fuentes subyacentes, como su capacidad de soporte de transacciones distribuidas, o
si permite operaciones de inserción. Esta funcionalidad permite al administrador del sistema el configurar
óptimamente las características de cada fuente de datos y wrapper y, por ende, sus posibilidades de combinación y
ejecución.
Las propiedades de cada fuente de datos pueden configurarse añadiendo pares parámetro-valor a la sentencia de
creación del DataSource, o gráficamente mediante la herramienta de administración (ver Guía del Administrador de
Virtual DataPort [3]). Las propiedades configurables son las siguientes:
•
Delegate All Operators (DELEGATEALLOPERATORS, DS: JDBC, ODBC). Indica si la fuente permite
delegación de todos los operadores. Por defecto, el valor es “false”.
•
Delegate Array Literal (DELEGATEARRAYLITERAL, DS: JDBC, ODBC). Indica si la fuente permite
delegar constantes compuestas de tipo array. Por defecto, el valor es “true” para las fuentes JDBC y ODBC.
•
Delegate Compound Field Projection (DELEGATECOMPOUNDFIELDPROJECTION, DS: JDBC,
ODBC). Indica si la fuente permite la delegación de proyecciones sobre campos compuestos. Por defecto, el
valor es “true” para fuentes JDBC y ODBC.
•
Delegate GROUP BY (DELEGATEGROUPBY, DS: JDBC, ODBC). Indica si la fuente permite la delegación
de la cláusula GROUP BY. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate HAVING clause (DELEGATEHAVING, DS: JDBC, ODBC). Indica si la fuente permite la
delegación de la cláusula HAVING. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate Inner Join (DELEGATEINNERJOIN, DS: JDBC, ODBC). Indica si la fuente permite la
delegación del operador Inner Join. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate Join (DELEGATEJOIN, DS: JDBC, ODBC). Indica si la fuente permite la delegación del
operador Join. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
Generación de Wrappers y DataSources
100
Virtual DataPort 4.0
Guía Avanzada de VQL
•
Delegate Left Function (DELEGATELEFTFUNCTION, DS: JDBC, ODBC). Indica si la fuente permite
delegar condiciones con funciones en la parte izquierda. Por defecto, el valor es “true” para fuentes JDBC y
ODBC.
•
Delegate Left Literal (DELEGATELEFTLITERAL, DS: JDBC, ODBC). Indica si la fuente permite delegar
condiciones con constantes en la parte izquierda. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate Natural Outer Join (DELEGATENATURALOUTERJOIN, DS: JDBC, ODBC). Indica si la fuente
permite la delegación del operador Natural Outer Join. Por defecto, el valor es “false” para fuentes JDBC y
ODBC.
•
Delegate NOT Condition (DELEGATENOTCONDITION, DS: JDBC, ODBC). Indica si la fuente permite la
delegación de la condición NOT. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate OR Condition (DELEGATEORCONDITION, DS: JDBC, ODBC). Indica si la fuente permite la
delegación de la condición OR. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate ORDER BY (DELEGATEORDERBY, DS: JDBC, ODBC). Indica si la fuente permite la delegación
de la cláusula ORDER BY. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate Projection (DELEGATEPROJECTION, DS: JDBC, ODBC). Indica si la fuente permite la
delegación de proyecciones. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate Register Literal (DELEGATEREGISTERLITERAL, DS: JDBC, ODBC). Indica si la fuente
permite la utilización de literales con tipo de dato registro. Por defecto, el valor es ”false” para fuentes
JDBC y ODBC.
•
Delegate Right Field (DELEGATERIGHTFIELD, DS: JDBC, ODBC). Indica si la fuente permite la
utilización de campos en la parte derecha de las condiciones. Por defecto, el valor es “true” para fuentes
JDBC y ODBC.
•
Delegate Right Function (DELEGATERIGHTFUNCTION, DS: JDBC, ODBC). Indica si la fuente permite
delegar condiciones con funciones en la parte derecha. Por defecto, el valor es “true” para fuentes JDBC y
ODBC.
•
Delegate Right Literal (DELEGATERIGHTLITERAL, DS: JDBC, ODBC). Indica si la fuente permite
delegar condiciones con constantes en la parte derecha. Por defecto, el valor es “true” para fuentes JDBC y
ODBC.
•
Delegate Selection (DELEGATESELECTION, DS: JDBC, ODBC). Indica si la fuente permite la
delegación de condiciones. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
•
Delegate UNION (DELEGATEUNION, DS: JDBC, ODBC). Indica si la fuente permite la delegación del
operador de unión. Por defecto, el valor es “true” para fuentes JDBC y ODBC.
Generación de Wrappers y DataSources
101
Virtual DataPort 4.0
•
Guía Avanzada de VQL
Supports Modifier in Aggregate Function (SUPPORTSAGGREGATEFUNCTIONSOPTIONS, DS:
JDBC, ODBC). Indica si la fuente soporta modificadores DISTINCT/ALL en las funciones de agregación.
Por defecto el valor es “true” para fuentes JDBC y ODBC.
•
Supports Branch Outer Join (SUPPORTSBRANCHOUTERJOIN, DS: JDBC, ODBC). Indica si la fuente
acepta los modificadores (left | right) outer sobre la cláusula join. Por defecto, el valor es “false” para
fuentes JDBC y ODBC.
•
Supports Eq Outer Join (SUPPORTSEQOUTERJOINOPERATOR, DS: JDBC, ODBC). Indica si la fuente
soporta el operador Equality Outer Join. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Explicit Cross Join (SUPPORTSEXPLICITCROSSJOIN, DS: JDBC, ODBC). Indica si la
fuente soporta el operador Explicit Cross Join. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Full Eq Outer Join (SUPPORTSFULLEQOUTERJOIN, DS: JDBC, ODBC). Indica si la fuente
soporta el operador Full Equality Outer Join. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Full NotEq Outer Join (SUPPORTSFULLNOTEQOUTERJOIN, DS: JDBC, ODBC). Indica si la
fuente soporta el operador Full Not Equality Outer Join. Por defecto, el valor es “false” para fuentes JDBC y
ODBC.
•
Supports Fusing in using AND Natural Join (SUPPORTSFUSINGINUSINGANDNATURALJOIN, DS:
JDBC, ODBC). Indica si la fuente fusiona los campos iguales al ejecutar un join natural o un join con la
clausula USING. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Join On Condition (SUPPORTSJOINONCONDITION, DS: JDBC, ODBC). Indica si la fuente
soporta la cláusula Join On. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Natural Join (SUPPORTSNATURALJOIN, DS: JDBC, ODBC). Indica si la fuente soporta la
cláusula Natural Join. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Supports Using Join (SUPPORTSUSINGJOIN, DS: JDBC, ODBC). Indica si la fuente soporta la cláusula
Using Join. Por defecto, el valor es “false” para fuentes JDBC y ODBC.
•
Delegate Aggregate Functions List (DELEGATEAGGREGATEFUNCTIONS, DS: JDBC, ODBC). Indica
qué funciones de agregación son delegables. En las fuentes JDBC y ODBC, la lista está compuesta por las
funciones AVG, COUNT, MAX, MIN y SUM.
•
Delegate Scalar Functions List (DELEGATESCALARFUNCTIONS, DS: JDBC, ODBC). Indica qué
funciones escalares son delegables. En las fuentes JDBC y ODBC, la lista está compuesta por las funciones
ABS, CEIL, COALESCE, CONCAT, DIV, FLOOR, GETDAY, GETHOUR,
GETMINUTE, GETSECOND, GETMONTH, GETYEAR, LEN, LOG, LOWER, MOD,
MULT,
NOW,
POWER,
REPLACE,
ROUND,
SQRT,
SUBTRACT,
SUM,
TEXTCONSTANT, TRIM y UPPER.
Generación de Wrappers y DataSources
102
Virtual DataPort 4.0
•
Guía Avanzada de VQL
Delegate Operators List (DELEGATEOPERATORSLIST, DS: JDBC, ODBC). Indica qué operadores son
delegables. En las fuentes JDBC y ODBC, la lista está compuesta por los operadores =, <>, <, <=,
>, >=, in, between, contains, containsor, like, is null, is not
null, is true e is false.
•
Operator Properties. Permite especificar propiedades sobre el soporte proporcionado por la fuente de datos
para un operador específico. Para cada operador, se especifica su nombre (atributo operator_name) y
su lista de propiedades. En la actualidad, estas propiedades existen solamente para el operador
contains (ver sección 17.3.10.1).
Ejemplo: Supóngase que la creación de un DataSource procedente de una fuente relacional MySQL de una versión
muy antigua no admite la cláusula USING en joins. Por defecto, VDP tiene este parámetro con un valor “true”, por lo
que es necesario cambiarlo. Para ello, es necesario modificar el valor en la sentencia de creación de la siguiente
manera:
CREATE DATASOURCE JDBC OldMySQL
DRIVERCLASSNAME = 'com.mysql.jdbc.Driver'
DATABASEURI = 'jdbc:mysql://localhost/vdp_demo'
USERNAME = 'user'
USERPASSWORD = 'userpwd'
#Configuration parameters …
SOURCECONFIGURATION (
SUPPORTSUSINGJOIN = false
);
Figura 70 Ejemplo de modificación de configuración de un datasource.
Virtual DataPort tiene valores por defecto para algunas bases de datos relacionales concretas (MySQL, Oracle,
Postgres, …) que pueden variar con respecto a los arriba descritos.
17.3.10.1 Propiedades de Configuración del Operador CONTAINS
El operador CONTAINS permite ejecutar búsquedas booleanas complejas por palabra clave sobre atributos de tipo
text procedentes de un índice de información no estructurada externo (e.g. datasources tipo Aracne y/o Google
Mini).
La sintaxis del lenguaje de búsqueda sobre información no estructurada se describe en la sección 19.1. Sin embargo,
las opciones de búsqueda disponible dependen de las capacidades proporcionadas nativamente por la fuente de
datos. La sección 19.2 detalla con exactitud las capacidades de búsqueda soportadas para fuentes Google Mini y
para fuentes Aracne.
Los wrappers de tipo Custom que permitan el acceso a otras fuentes de datos pueden especificar qué capacidades
del lenguaje de búsqueda para contains soportan a través de la propiedad operator properties de las
Propiedades de Configuración. Esta sección describe dichas propiedades
•
Supports And. Toma el valor true si se soportan las búsquedas con el operador lógico AND y el valor
false en caso contrario.
•
Supports OR. Toma el valor true si se soportan las búsquedas con el operador lógico OR y el valor
false en caso contrario.
Generación de Wrappers y DataSources
103
Virtual DataPort 4.0
•
Guía Avanzada de VQL
Supports Not. Toma el valor true si se soportan las búsquedas con el operador lógico NOT y el valor
false en caso contrario.
•
Supports Exact Search. Toma el valor true si se soportan las búsquedas por frase exacta y el valor
false en caso contrario.
•
Supports One Wildcards First Position. Toma el valor true si se soporta el comodín que encaja con un
solo carácter (i.e. el comodín ‘?’) en la primera posición de un término.
•
Supports One Wildcards Rest Position. Toma el valor true si se soporta el comodín que encaja con un
solo carácter (i.e. el comodín ‘?’) en el resto de posiciones de un término excepto la primera.
•
Supports Multi Wildcards First Position. Toma el valor true si se soportan los comodines que encajan con
múltiples caracteres (i.e. el comodín ‘*’) en la primera posición de un término.
•
Supports Multi Wildcards Rest Position. Toma el valor true si se soportan los comodines que encajan
con múltiples caracteres (i.e. el comodín ‘*’) en el resto de posiciones de un término, excepto la primera.
•
Supports Fuzzy Terms Without Minimum Relevance. Toma el valor true si se soportan búsquedas difusas
sin especificar una similitud mínima entre los términos de búsqueda y las concordancias encontradas.
•
Supports Fuzzy Terms With Minimum Relevance. Toma el valor true si se soportan búsquedas difusas
especificando una similitud mínima entre los términos de búsqueda y las concordancias encontradas.
•
Supports Proximity Terms Without Maximum Distance. Toma el valor true si se soportan búsquedas por
proximidad sin especificar una distancia máxima entre los términos de la frase de búsqueda.
•
Supports Proximity Terms With Maximum Distance.. Toma el valor true si se soportan búsquedas por
proximidad especificando una distancia máxima entre los términos de la frase de búsqueda.
•
Supports Boosting Terms Without Boosting Factor. Toma el valor true si se soportan la especificación de
aumento de la relevancia de un término sin especificar un factor de aumento concreto.
•
Supports Boosting Terms With Boosting Factor. Toma el valor true si se soportan la especificación de
aumento de la relevancia de un término especificando un factor de aumento concreto.
•
Supports Inclusive Range Search. Toma el valor true si se soportan búsquedas por rango (inclusivas).
•
Supports Exclusive Range Search. Toma el valor true si se soportan búsquedas por rango (exclusivas).
•
Supports Field Grouping. Toma el valor true si se soporta la combinación de operadores lógicos AND y
OR haciendo uso de paréntesis. Por ejemplo:
Generación de Wrappers y DataSources
104
Virtual DataPort 4.0
Guía Avanzada de VQL
title contains '(term1 AND term2) OR (term3) '
•
Supports Grouping. Toma el valor true si se soporta la combinación de operadores lógicos AND y OR
que vayan en distintas condiciones de consulta. Por ejemplo:
title contains 'term1'
summary contains 'term3')
17.4
AND
(content
contains
'term2'
OR
CREACIÓN DE WRAPPERS
Para cada tipo de wrapper soportado por Virtual DataPort, existe una sentencia de creación de wrappers. Los
siguientes subapartados describen en mayor detalle el proceso de creación manual de cada tipo de wrapper.
NOTA: Se recomienda fuertemente que el proceso de creación de wrappers y datasources se realice de forma
gráfica mediante la herramienta de administración de DataPort (ver [3]).
Previamente la sección 17.4.1 introduce los conceptos de contexto de ejecución y cadenas de interpolación, que
serán utilizados en la creación de algunos tipos de wrappers, mientras que la sección 17.4.2 proporciona información
general acerca del esquema de los resultados devueltos por un wrapper.
17.4.1
Contexto de Ejecución y Cadenas de Interpolación
Como ya se ha comentado en secciones anteriores, la misión del wrapper de una fuente es ejecutar consultas y/o
modificaciones sobre la misma de forma transparente para las capas superiores del servidor DataPort.
Cuando DataPort solicita a un wrapper que ejecute una consulta utiliza dos maneras diferentes para proporcionarle la
información sobre las condiciones consulta que el wrapper debe ejecutar sobre la fuente:
•
Como una lista estructurada de condiciones de consulta. Esta es la forma utilizada por la mayor parte de
tipos de wrappers.
•
Como un conjunto de variables de interpolación incluidas en un contexto de ejecución. Esta forma de
acceso es utilizada por los wrappers de tipo ITPilot que utilicen versiones de Denodo ITPilot anteriores a la
4.0 (ver sección 17.4.5.2) y por los wrappers JDBC que utilizan una consulta SQL patrón (ver sección
17.4.3.2). Los detalles sobre el uso de cadenas de interpolación pueden consultarse en la sección 18.4.
17.4.2
Metainformacion de un wrapper
De forma opcional en la mayoría de los wrappers, es posible especificar metainformación del esquema de salida que
proporcionan (OUTPUTSCHEMA), esto es, los campos que van a representar la información extraída de la fuente.
Estos campos pueden ser de tres tipos:
•
SIMPLE: campos univaluados o multivaluados de valores pertenecientes a tipos de datos básicos,
como cadenas de texto, enteros, etc. De forma opcional se puede indicar si son campos de consulta
(obligatorios u opcionales). Un wrapper esperará recibir condiciones sobre campos especificados como
obligatorios para poder ejecutarse. También especifican los tipos de datos Java asociados a los
elementos procedentes del origen de datos, en base a las tablas de conversión especificadas en la
sección 17.1.1.
•
REGISTER: formado por uno o varios campos, tanto simples como compuestos.
Generación de Wrappers y DataSources
105
Virtual DataPort 4.0
•
Guía Avanzada de VQL
ARRAY: listas formadas por campos de tipo registro.
Esta información posibilita la generación automática de relaciones base a partir de wrappers.
Adicionalmente, para cada campo del esquema de salida pueden indicarse una serie de restricciones:
Si el campo puede tomar valores nulos (NULL) o no puede tomarlos (NOT NULL). Por defecto, se asume
el valor NULL.
Si los resultados pueden ser ordenados por el campo (SORTABLE) o no (NOT SORTABLE).También es
posible especificar que los resultados pueden ser ordenados por el campo pero sólo en orden ascendente
(SORTABLE ASC) o descendente (SORTABLE DESC). Por defecto se asume el valor SORTABLE.
Si el campo puede ser actualizado en una sentencia UPDATE (UPDATEABLE) o no puede (NOT
UPDATEABLE). Por defecto se asume el valor UPDATEABLE.
17.4.3
Wrapper JDBC
Un wrapper JDBC, extrae información desde una Base de Datos remota vía JDBC. La sintaxis para la creación de un
wrapper de este tipo, se muestra en la Figura 71.
CREATE [ OR REPLACE ] WRAPPER JDBC <name:identifier>
DATASOURCENAME=<name:identifier>
{ RELATIONNAME=<name:literal> | SQLSENTENCE=<literal> }
[ OUTPUTSCHEMA ( <field> [, <field>]* ) ]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> [ = <mapping:literal> ] : <type:literal>
[ ( { OBL | OPT } ) ] [ <inline constraints> ]*
| <name:identifier> [ = <mapping:literal> ] : ARRAY OF (<register field> )
[ <inline constraints> ]*
| <name:register field>
<register field> ::=
<name:identifier> [ = <mapping:literal> ] :
REGISTER OF ( <field> [, <field> ]* ) [ <inline constraints> ]*
<inline constraint> ::=
[ NOT ] NULL
| [ NOT ] UPDATEABLE
| { SORTABLE [ ASC | DESC ] | NOT SORTABLE }
| EXTERN
<source configuration property> ::=
ALLOWDELETE = { true | false | DEFAULT }
| ALLOWINSERT = { true | false | DEFAULT }
| ALLOWUPDATE = { true | false | DEFAULT }
| DATAINORDERFIELDSLIST = { ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* ) | DEFAULT }
| SUPPORTSDISTRIBUTEDTRANSACTIONS = { true | false | DEFAULT }
Figura 71 Sintaxis de creación de un wrapper JDBC
ALTER
[
[
[
[
WRAPPER JDBC <name:identifier>
DATASOURCENAME=<name:identifier>]
RELATIONNAME=<name:identifier> | SQLSENTENCE=<literal> ]
OUTPUTSCHEMA ( <field> [, <field>]* ) ]
SOURCECONFIGURATION ( [ <source configuration property>
Generación de Wrappers y DataSources
106
Virtual DataPort 4.0
Guía Avanzada de VQL
[, <source configuration property> ]* ] ) ]
<field> ::= (see CREATE WRAPPER JDBC for details)
<source configuration property> ::= (see CREATE WRAPPER JDBC for details)
Figura 72 Sintaxis de modificación de un wrapper JDBC
Para especificar un wrapper de tipo JDBC es preciso indicar el nombre del datasource JDBC a utilizar
(DATASOURCENAME) e información relativa a los datos de la base de datos especificada por el datasource a los
que accederá el wrapper.
Para indicar la información a la que el wrapper accederá se pueden utilizar dos mecanismos:
Indicar el nombre de una tabla en la base de datos (RELATIONNAME).
Especificar una sentencia SQL (SQLSENTENCE). La sentencia SQL puede ser una cadena de
interpolación (ver apartado 18.4).
Otra consideración importante es que los resultados devueltos por la consulta efectuada deben ser compatibles con
el esquema de la relación base a la que dicho wrapper está asociado en el servidor. Más concretamente, los
nombres de los atributos obtenidos como resultado de la consulta, deben coincidir con los de la relación base, y
además sus valores deben ser compatibles con sus tipos de dato en la relación base.
Para dar mayor flexibilidad e independencia entre las relaciones base y las fuentes de información, de forma opcional
el wrapper JDBC permite definir el esquema de salida de la información que propocionará (ver apartado 17.4.2). Para
cada elemento de tipo simple es necesario especificar su tipo. Además, es posible indicar una asociación entre el
nombre del campo devuelto por el wrapper y el nombre del campo en la base de datos (especificado en el mapping).
La sentencia de creación del wrapper admite el modificador OR REPLACE. En caso de ser especificado, si ya
existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 71), y son explicadas en la sección
17.4.12.
17.4.3.1
Especificación de una tabla en la base de datos remota
La primera alternativa para especificar los datos a obtener de la base de datos remota es indicar el nombre de la
tabla o vista en la base de datos de la que extraer los datos.
En tiempo de ejecución, el wrapper recibirá una lista de condiciones y una lista con los nombres de los campos de
salida que se le solicitan al wrapper. En base a estos elementos, el wrapper construirá automáticamente una
sentencia SQL válida para ejecutar en el gestor de base de datos remoto.
17.4.3.2
Utilización de una sentencia SQL patrón
El otro mecanismo para modelar el proceso de selección de información en un wrapper JDBC se basa en definir una
sentencia SQL con la consulta a realizar sobre la base de datos. El uso de este mecanismo puede ser útil, por
ejemplo, para utilizar como relación base el resultado de la ejecución de una consulta SQL ad-hoc o, incluso, de un
procedimiento almacenado en la base de datos remota.
La sentencia SQL especificada es una cadena de interpolación que puede ser parametrizada con variables recibidas
del contexto de ejecución (ver en la sección 18.4 los detalles sobre las mismas).
Generación de Wrappers y DataSources
107
Virtual DataPort 4.0
17.4.4
Guía Avanzada de VQL
Wrapper ODBC
Un wrapper ODBC permite la adición de orígenes de datos que cumplen el estándar de interoperabilidad de datos
ODBC, en el sistema Virtual DataPort.
La Figura 73 muestra la sintaxis de creación de un wrapper ODBC, que sigue la misma estructura que la definida para
un wrapper JDBC. Para crear un wrapper de este tipo, es necesario especificar la cadena de conexión al origen de
datos (datasource ODBC previamente definido), la relación de la que extrae datos o la consulta SQL patrón, y el
esquema de salida que proporciona el wrapper, con su estructura de tipos. Para más información, ver apartado
17.4.3.
CREATE [ OR REPLACE ] WRAPPER ODBC <name:identifier>
DATASOURCENAME=<name:identifier>
{ RELATIONNAME=<name:literal> | SQLSENTENCE=<literal> }
[ OUTPUTSCHEMA ( <field> [, <field>]* ) ]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> [ = <mapping:literal> ] : <type:literal>
[ ( { OBL | OPT } ) ] [ <inline constraints> ]*
| <name:identifier> [ = <mapping:literal> ] : ARRAY OF (<register field>)
[ <inline constraints> ]*
| <name:register field>
<register field> ::=
<name:identifier> [ = <mapping:literal> ] :
REGISTER OF ( <field> [, <field> ]* ) [ <inline constraints> ]*
<inline constraint> ::=
[ NOT ] NULL
| [ NOT ] UPDATEABLE
| { SORTABLE [ ASC | DESC ] | NOT SORTABLE }
| EXTERN
<source configuration property> ::=
ALLOWDELETE = { true | false | DEFAULT }
| ALLOWINSERT = { true | false | DEFAULT }
| ALLOWUPDATE = { true | false | DEFAULT }
| DATAINORDERFIELDSLIST = { ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* ) | DEFAULT }
| SUPPORTSDISTRIBUTEDTRANSACTIONS = { true | false | DEFAULT }
Figura 73 Sintaxis de creación de un wrapper ODBC
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 73), y son explicadas en la sección
17.4.12.
ALTER
[
[
[
[
WRAPPER ODBC <name:identifier>
DATASOURCENAME=<name:identifier> ]
RELATIONNAME=<name:identifier> | SQLSENTENCE=<literal> ]
OUTPUTSCHEMA ( <field> [, <field>]* ) ]
SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ]) ]
<field> ::= (see CREATE WRAPPER ODBC for details)
Generación de Wrappers y DataSources
108
Virtual DataPort 4.0
Guía Avanzada de VQL
<source configuration property> ::= (see CREATE WRAPPER ODBC for details)
Figura 74 Sintaxis de modificación de un wrapper ODBC
17.4.5
Wrapper ITPilot
Los wrappers de tipo ITPilot se utilizan para incorporar en el sistema fuentes semi-estructuradas (típicamente fuentes
web semi-estructuradas). Estas fuentes pueden ser accedidas a través de la web, del sistema de ficheros local o de
un servicio FTP. Este tipo de wrappers requieren Denodo ITPilot [6] para su ejecución (ITPilot también permite crear
gráficamente estos wrappers y mantenerlos de forma automática).
Es importante destacar que el administrador DataPort no tiene que crear las sentencias VQL para importar estos
wrappers manualmente. ITPilot incluye opciones para generar automáticamente el VQL necesario para estas tareas.
Se recomienda fuertemente utilizar las sentencias generadas automáticamente por ITPilot.
La sintaxis para la creación de un wrapper de tipo ITPilot se muestra en la Figura 75.
CCREATE [ OR REPLACE ] WRAPPER ITP <name:identifier>
[ MAINTENANCE { TRUE | FALSE } ]
([ OUTPUTSCHEMA ( <field> [, <field>]* ) ] SEQUENCE ( <sequence clause> )
[ <substitution_clause> ]*
| <scriptcode:literal> <xmlcontent:literal>)
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> [<regexp>] [ ( { OBL | OPT } ) ]
[ ( <alias:literal> [, <alias:literal> ]* ) ]
[ <inline constraints> ]*
| <name:identifier>:ARRAY OF ( <register field> ) [ <inline constraints>
]*
| <name:register field>
<register field> ::=
<name:identifier>:REGISTER OF ( <field> [, <field> ]* )
[ <inline constraints> ]*
<sequence clause> ::=
CONNECTIONNAME=<connection class name:literal>
CREATENEWINSTANCE=<boolean>
ADD ROUTE <route>
<route> ::=
LOCAL <connection class name:literal> <specification:literal>
<uri:literal>
| HTTP <connection class name:literal> <specification:literal>
{ GET | POST } <uri:literal>
| FTP <connection class name:literal> <specification:literal>
<uri:literal> <login:literal> <pwd:literal>
<substitution_clause> ::=
ADD SUBSTITUTION <precondition_1> [,<precondition_i>]*
( <sequence_clause> )
<inline
[
| [
| {
constraint> ::=
NOT ] NULL
NOT ] UPDATEABLE
SORTABLE [ ASC | DESC ] | NOT SORTABLE }
Generación de Wrappers y DataSources
109
Virtual DataPort 4.0
Guía Avanzada de VQL
<source configuration property> ::=
DATAINORDERFIELDSLIST = { DEFAULT | ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* )
}
Figura 75 Sintaxis de creación de un wrapper de tipo ITPilot
La sintaxis de la sentencia de modificación de un wrapper ITPilot es similar a la de creación.
ALTER WRAPPER ITP <name:identifier>
[ MAINTENANCE { TRUE | FALSE } ]
[[ OUTPUTSCHEMA ( <field> [, <field>]* ) ] SEQUENCE ( <sequence clause> )
[ <substitution_clause> ]*)
| <scriptcode:literal> <xmlcontent:literal> ]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::= (see CREATE WRAPPER ITP for details)
<sequence clause> ::= (see CREATE WRAPPER ITP for details)
<substitution_clause> ::= (see CREATE WRAPPER ITP for details)
<source configuration property> ::= (see CREATE WRAPPER ITP for details)
Figura 76 Sintaxis de modificación de un wrapper de tipo ITPilot
Existen dos maneras alternativas de crear un wrapper ITPilot según la versión de ITPilot utilizada sea anterior o
posterior a la 4.0. La sección 17.4.5.1 se ocupa de los wrappers creados con ITPilot 4.0 o posterior y la sección
17.4.5.2 se ocupa de los wrappers creados con versiones anteriores. A continuación se describen las opciones
comunes a ambos casos.
La cláusula MAINTENANCE permite activar o desactivar el sistema de mantenimiento automático de ITPilot para el
wrapper. Véase la documentación de ITPilot [6] para más detalle.
La sentencia de creación del wrapper admite el modificador OR REPLACE. En caso de ser especificado, si ya
existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
También se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que DataPort
tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de la
sentencia correspondiente se indican las propiedades aplicables (Figura 75), y son explicadas en la sección 17.4.12
17.4.5.1
Wrappers ITPilot con la Versión 4.0 y posteriores
A partir de la versión 4.0, los wrappers creados con Denodo ITPilot se modelan como flujos de componentes que se
compilan al lenguaje Javascript. En este caso, los wrappers serán creados especificando el código Javascript
generado por ITPilot para el wrapper (<scriptcode:literal> en la sintaxis) y la descripción del flujo de
componentes que forman el wrapper, también generada por ITPilot (<xmlcontent:literal> en la sintaxis). La
Figura 77 muestra un ejemplo (no se muestra el código Javascript completo ni la descripción completa del flujo de
componentes):
CREATE WRAPPER ITP AcmeWrapper
MAINTENANCE FALSE
"function getInit() {
… (rest of Javascript code)"
"<?xml version='1.0' encoding='ISO-8859-1' ?>
<InitComponent className='com.denodo.itp.model.components
… (rest of flow description)"
Generación de Wrappers y DataSources
110
Virtual DataPort 4.0
Guía Avanzada de VQL
Figura 77 Ejemplo de wrapper ITPIlot 4.0
17.4.5.2
Wrappers ITPilot con versiones anteriores de ITPilot anteriores a la 4.0
En versiones anteriores a ITPilot 4.0, la creación de un wrapper ITPilot requiere la especificación de una secuencia de
acceso. Una secuencia de acceso representa a una serie de localizaciones (rutas a páginas), dónde el sistema
buscará consecutivamente, y en orden, los resultados a extraer de la fuente.
Las rutas de acceso a los recursos de los que se extrae la información se especifican mediante cadenas de
interpolación (ver sección 18.4).
Una secuencia de acceso contiene la siguiente información:
•
CONNECTIONNAME: Clase Java utilizada para realizar la conexión. Una conexión se crea a partir de una
cadena de caracteres compuesta por dos partes: el nombre de la conexión y los parámetros de
inicialización de la misma (opcionales, pueden indicarse sin asociar ningún valor). Ambos elementos deben
ir separados por comas. La clase especificada aquí actúa como clase por defecto para aquellas rutas del
wrapper que no especifiquen explícitamente su clase conexión. Por defecto se utilizará la clase
http.HTTPClientConnection.
Virtual DataPort incluye diversas clases conexión para los diversos tipos de rutas disponibles. En la
descripción de la sintaxis de cada tipo de ruta (ver sección 17.2) se muestran las clases conexión
disponibles.
•
CREATENEWINSTANCE: Si es necesario crear una nueva conexión para cada petición o se deben
intentar reutilizar conexiones existentes (este parámetro sólo se tiene en cuenta en las rutas que no
especifiquen su propia clase conexión).
•
La lista de rutas a las que es necesario acceder para obtener la información de la fuente externa. La
especificación de rutas se realiza tal y como se vio en la sección 17.2, añadiendo una especificación de
extracción de los datos que contiene el recurso apuntado por la ruta definida (la especificación debe estar
escrita utilizando el lenguaje de extracción de datos DEXTL de ITPilot [6]). Además, los patrones de acceso
pueden ser parametrizados utilizando variables del contexto y funciones de interpolación (ver sección 18.4).
Otra consideración importante a la hora de construir el wrapper, es que los resultados devueltos por la consulta
efectuada deben ser compatibles con el esquema de la relación base a la que dicho wrapper está asociado en Virtual
DataPort. Más concretamente, los nombres de los atributos obtenidos como resultado de la extracción de datos,
deben coincidir con los de la relación base, y además sus valores deben ser compatibles con sus tipos de datos en la
relación base.
A la metainformación general que se puede indicar relativa al esquema de salida que proporciona el wrapper (ver
apartado 17.4.2), se puede además añadir sobre los campos de tipo simple una expresión regular con la que deben
encajar todos los resultados (se descartarán aquellas tuplas en las que el valor para un campo no encaje con su
expresión regular asociada). En el caso de los wrappers ITPilot de versiones anteriores a ITPilot 4.0, los campos de
tipo simple son todos textuales.
También es posible añadir una lista de alias para cada campo del wrapper. Estos alias podrán ser utilizados por
ITPilot para las labores de mantenimiento automático de los wrappers (véase [6] para más información).
Adicionalmente, tanto en la sentencia de creación como de modificación de un wrapper ITPilot es posible indicar si
se desea activar el mantenimiento automático para el wrapper.
Generación de Wrappers y DataSources
111
Virtual DataPort 4.0
Guía Avanzada de VQL
17.4.5.2.1 Sustituciones
Los wrappers ITPilot utilizados con las versiones de ITPilot anteriores a la 4.0 pueden ser configurado para utilizar
secuencias de acceso diferentes en función de las condiciones de la consulta que Virtual DataPort le pide resolver.
Para ello, el administrador puede especificar las denominadas sustituciones. Una sustitución especifica:
•
Una lista de precondiciones sobre los atributos incluidos en la consulta. Una precondición representa un
requisito que deben satisfacer las condiciones de consulta.
•
Una secuencia, que se ejecutará si se cumplen todas las precondiciones de la sustitución.
Si las condiciones de consulta no verifican las precondiciones de ninguna sustitución, entonces se accederá a la
fuente a través de la secuencia por defecto.
El formato de la lista de precondiciones consiste en una lista de cadenas, donde cada cadena representa un nombre
de una variable del contexto de ejecución del wrapper. Una condición de una sustitución se verifica si la variable que
referencia existe en el contexto de ejecución (ver sección 18.4). Las precondiciones se especifican con la forma
<atributo>#<operador>.
Por ejemplo, supóngase que se desea utilizar una determinada secuencia de acceso en el caso de que se realice una
consulta sobre el wrapper que contenga una condición sobre el atributo TITLE con el operador containsor
(esto es, condiciones de la forma “TITLE containsor ‘values’”): para ello, se crearía una sustitución
con una precondición de la forma “TITLE#containsor”.
En laFigura 78 se muestra un wrapper ITPilot con una secuencia por defecto que utiliza una ruta HTTP, con patrón de
acceso ACCESSPAT1 (que debe ser acorde a alguno de los formatos soportados por ITPilot [6]) y especificación de
extracción de datos DATAEXTRACTSPEC1 (que debe estar escrita en el lenguaje de extracción de datos de
ITPilot, DEXTL [6]).
Además, se incluye una substitución a utilizar en caso de que se consulte la fuente con el operador containsor
sobre el atributo TITLE. En ese caso, se utilizaría otra secuencia consistente en una ruta HTTP con patrón de
acceso ACCESSPAT2 y especificación de extracción DATAEXTRACTSPEC2.
CREATE WRAPPER ITP shopview
SEQUENCE (
CONNECTIONNAME='http.HTTPClientConnection,120000'
CREATENEWINSTANCE=TRUE
ADD ROUTE HTTP '' ‘DATAEXTRACTSPEC1’ POST 'ACCESSPAT1'
)
ADD SUBSTITUTION 'TITLE#containsor' (
CONNECTIONNAME='http.HTTPClientConnection,120000'
CREATENEWINSTANCE=TRUE
ADD ROUTE HTTP '' 'DATAEXTRACTSPEC2' POST 'ACCESSPAT2'
)
Figura 78 Ejemplo de creación de un wrapper ITPilot
17.4.6
Wrapper de Servicios Web
Virtual DataPort soporta la creación de wrappers para servicios Web. Mediante la información contenida en un
fichero WSDL de especificación de un servicio web (indicado al crear el datasource de servicio web), el wrapper
debe seleccionar una operación concreta a modelar como una relación base, definiendo cómo se establecen los
Generación de Wrappers y DataSources
112
Virtual DataPort 4.0
Guía Avanzada de VQL
diferentes parámetros requeridos para la ejecución de la operación y qué datos de salida formarán parte del
resultado del wrapper.
En la Figura 79 se muestra la sintaxis de la sentencia VQL de creación de un wrapper de servicios web.
CREATE [ OR REPLACE ] WRAPPER WS <name:identifier>
DATASOURCENAME=<name:identifier>
SERVICENAME=<literal>
PORTNAME=<literal>
OPERATIONNAME=<literal>
[
INPUTMESSAGE=<literal>
OUTPUTMESSAGE=<literal>
]
[ OUTPUTSCHEMA ( <field> [, <field>]* )]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> = <mapping:literal> [ VALUE <literal> ]
[ ( { OBL | OPT } ) ] [ <inline constraints> ]*
| <name:identifier> = <mapping:literal> : ARRAY OF ( <register field> )
[ <inline constraints>]*
| <name:register field>
<register field> ::=
<name:identifier> = <mapping:literal> :
REGISTER OF ( [ <field> [, <field> ]* ] ) [ <inline constraints> ]*
<inline constraint> ::=
[ NOT ] NULL
| [ NOT ] UPDATEABLE
| { SORTABLE [ ASC | DESC ] | NOT SORTABLE }
<source configuration property> ::=
DATAINORDERFIELDSLIST = { DEFAULT | ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* ) }
| DELEGATEOPERATORSLIST = { DEFAULT | ( <operator:identifier>
[, <operator:identifier> ]* ) }
Figura 79 Sintaxis de creación de un wrapper de servicios Web
La sintaxis de modificación de un wrapper de servicios web es similar y se muestra en la Figura 80.
ALTER
[
[
[
[
[
[
[
WRAPPER WS <name:identifier>
DATASOURCENAME = <name:identifier> ]
SERVICENAME = <name:literal> ]
PORTNAME = <name:literal> ]
OPERATIONNAME = <operation:literal> ]
INPUTMESSAGE = <input:literal> OUTPUTMESSAGE = <output:literal> ]
OUTPUTSCHEMA ( <field> [, <field>]* ) ]
SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::= (see CREATE WRAPPER WS for details)
<source configuration property> ::= (see CREATE WRAPPER WS for details)
Figura 80 Sintaxis de modificación de un wrapper de servicios Web
Generación de Wrappers y DataSources
113
Virtual DataPort 4.0
Guía Avanzada de VQL
Además del nombre de datasource de servicio web que identifica el fichero WSDL de definición, es necesario indicar
otros parámetros que definen de forma unívoca la operación del servicio web a utilizar por el wrapper:
SERVICENAME: Nombre del servicio web sobre el que invocar la operación. Un fichero WSDL puede
contener la definición de varios servicios web.
PORTNAME: Nombre del puerto del que seleccionar la operación concreta a modelar.
OPERATIONNAME: Nombre de la operación a modelar. Puede haber varias operaciones diferentes con
el mismo nombre, que se diferencian en los mensajes de entrada/salida que permiten. Estos se indican en
los siguientes parámetros.
INPUTMESSAGE: Nombre del mensaje que define los parámetros de entrada de la operación del
método de búsqueda a modelar (opcional).
OUTPUTMESSAGE: Nombre del mensaje que define los parámetros de salida de la operación del
método de búsqueda a invocar (opcional).
Los atributos de los mensajes de la operación seleccionada y su estructura de tipos definen el esquema de salida del
wrapper de servicios web. Es decir, un wrapper de servicio web posee como esquema los atributos de entrada, de
salida y de entrada- salida, con los nombres definidos en el fichero WSDL.
NOTA: Desde la versión 3.1 de Virtual DataPort se permite que las operaciones utilicen parámetros compuestos
también en el mensaje de entrada. Estos parámetros se convertirán a tipos compuestos DataPort (ver sección 18.1)
de la misma forma que los del mensaje de salida y podrán especificarse condiciones sobre ellos utilizando los
constructores de valores compuestos ROW y ‘{’ ‘}’ (ver sección 6.3.1).
A partir de la lista de condiciones recibidas, el wrapper creará los parámetros necesarios para la invocación del
servicio web y obtener los resultados deseados.
Como en el resto de los wrappers, es posible indicar de forma explícita el esquema de salida del wrapper
(OUTPUTSCHEMA), junto con las asociaciones entre los atributos externos y los parámetros del servicio web. El
atributo “name” de un campo del OUTPUTSCHEMA indica el nombre con el que el wrapper exportará el elemento.
El atributo “mapping” indica el nombre utilizado por el servicio Web. Para referenciar los diferentes elementos de un
servicio web en los mappings a realizar, se utiliza la siguiente notación:
- $<parameterNumber> Æ referencia al parámetro de la posición indicada de la operación del
servicio web.
- $$ Æ referencia al parámetro de salida, devuelto por la invocación de la operación del servicio web.
Ésta es la notación utilizada para los elementos de primer nivel (parámetros y salida del servicio web). Para el resto
de elementos (campos de un objeto resultado o parámetro del servicio web), el mapping se obtiene del nombre real
de la propiedad en el objeto correspondiente.
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 79), y son explicadas en la sección
17.4.12.
17.4.7
Wrapper XML
Virtual DataPort soporta la creación de wrappers que tienen como origen ficheros de datos XML. En la Figura 81 se
muestra la sintaxis de creación de un wrapper XML.
CREATE [ OR REPLACE ] WRAPPER XML <name:identifier>
DATASOURCENAME=<name:identifier>
[ OUTPUTSCHEMA ( <field> [, <field>]* ) ]
Generación de Wrappers y DataSources
114
Virtual DataPort 4.0
Guía Avanzada de VQL
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> [ = <mapping:literal> ] [: <type:literal>]
[ ( { OBL | OPT } ) [ EXTERN ] ]
[ ( [ <value:literal> [, <value:literal> ]* ] ) ]
[ <inline constraints> ]*
| <name:identifier> [ = <mapping:literal> ] : ARRAY OF (<register field>)
[ <inline constraints> ]*
| <name:register field>
<register field> ::=
<name:identifier> [ = <mapping:literal> ] :
REGISTER OF ( <field> [, <field> ]* ) [ <inline constraints> ]*
<inline constraint> ::=
[ NOT ] NULL
| [ NOT ] UPDATEABLE
| { SORTABLE [ ASC | DESC ] | NOT SORTABLE }
<source configuration property> ::=
DATAINORDERFIELDSLIST = { DEFAULT | ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* ) }
Figura 81 Sintaxis de creación de un wrapper XML
La sintaxis de modificación de un wrapper XML es similar y puede verse en la Figura 82.
ALTER
[
[
[
WRAPPER XML <name:identifier>
DATASOURCENAME=<name:identifier> ]
OUTPUTSCHEMA ( <field> [, <field>]* ) ]
SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::= (see CREATE WRAPPER XML for details)
<source configuration property> ::= (see CREATE WRAPPER XML for details)
Figura 82 Sintaxis de modificación de un wrapper XML
Un wrapper XML se define a través de un datasource XML, que identifica un recurso XML local o remoto.
El wrapper XML analiza la estructura del documento XML y devuelve como atributos las etiquetas XML de primer
nivel (utilizando su nombre como nombre de atributo), encapsulando el resto de elementos en tipos compuestos.
Pueden utilizarse operaciones de “aplanamiento” (ver sección 6.1.2) para transformar la relación base resultante de
la forma deseada.
Al igual que en el resto de wrappers, es posible especificar el esquema de salida de los datos proporcionados por el
wrapper, permitiendo seleccionar sólo aquellos elementos del documento XML que interesan e incluso cambiar su
nombre (en mapping se especifica el nombre en el wrapper; name almacena el nombre externo).
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
Generación de Wrappers y DataSources
115
Virtual DataPort 4.0
Guía Avanzada de VQL
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 81), y son explicadas en la sección
17.4.12.
17.4.8
Wrapper DF
Virtual DataPort soporta la creación de wrappers de ficheros delimitados CSV y similares. Para crear un wrapper de
este tipo es necesario indicar el nombre del origen de datos (cómo acceder al fichero que contiene los datos) –
DATASOURCENAME -. De forma opcional como en el resto de wrappers, es posible especificar el esquema de
datos devuelto por el wrapper (OUTPUTSCHEMA).
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva.
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 83), y son explicadas en la sección
17.4.12.
NOTA: En este tipo de wrappers, actualmente no se soporta el “mapping” ni la especificación de registros o arrays
como elementos del outputschema.
En la siguiente figura se muestra la sintaxis de creación de un wrapper de ficheros delimitados.
CREATE [ OR REPLACE ] WRAPPER DF <name:identifier>
DATASOURCENAME=<name:identifier>
[ OUTPUTSCHEMA ( <field> [, <field>]* ) ]
[ SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::=
<name:identifier> [ = <mapping:literal> ]
[ ( { OBL | OPT } ) [ EXTERN ] ]
[ ( [ <value:literal> [, <value:literal> ]* ) ] ]
[ <inline constraints> ]*
| <name:register field>
<register field> ::=
<name:identifier> [ = <mapping:literal> ] :
REGISTER OF ( <field> [, <field> ]* ) [ <inline constraints> ]*
<inline
[
| [
| {
constraint> ::=
NOT ] NULL
NOT ] UPDATEABLE
SORTABLE [ ASC | DESC ] | NOT SORTABLE }
<source configuration property> ::=
DATAINORDERFIELDSLIST = { DEFAULT | ( <name:identifier> { ASC | DESC }
[, <name:identifier> { ASC | DESC } ]* ) }
Figura 83 Sintaxis de creación de un wrapper DF
Generación de Wrappers y DataSources
116
Virtual DataPort 4.0
Guía Avanzada de VQL
La sintaxis de la sentencia de modificación de un wrapper de ficheros delimitados es similar.
ALTER
[
[
[
WRAPPER DF <name:identifier>
DATASOURCENAME=<name:identifier> ]
OUTPUTSCHEMA ( <field> [, <field>]* ) ]
SOURCECONFIGURATION ( [ <source configuration property>
[, <source configuration property> ]* ] ) ]
<field> ::= (see CREATE WRAPPER DF for details)
<source configuration property> ::= (see CREATE WRAPPER DF for details)
Figura 84 Sintaxis de modificación de un wrapper DF
17.4.9
Wrapper Denodo Aracne
Virtual DataPort soporta la creación de wrappers sobre índices de información no estructurada creados con Denodo
Aracne [16].
Para crear un wrapper de este tipo es necesario indicar el nombre del origen de datos – DATASOURCENAME – y
el nombre del manejador Aracne – HANDLERNAME – a partir del cuál se va a crear el wrapper.
Como en el resto de wrappers, es posible especificar el esquema de datos devuelto por el wrapper
(OUTPUTSCHEMA). En este caso, el esquema debe contener una serie de atributos fijos que deben estar presentes
siempre que el manejador escogido de Denodo Aracne los exporte. De estos atributos fijos sólo será posible
modificar su nombre. Además, el esquema puede incluir también atributos específicos que se correspondan con otros
campos específicos exportados por el manejador Aracne.
A continuación se describen los atributos fijos (véase [16] para más detalle):
•
•
•
•
•
•
•
•
•
•
•
•
•
TASK. Nombre de la tarea Aracne que obtuvo e indexó este documento. Es de tipo cadena de caracteres.
PUBDATE. Fecha de publicación del documento. Sólo aparece en el caso de que el índice contenga
documentos de tipo RSS. Es de tipo cadena de caracteres.
TITLE. Título generado por Aracne para el documento. Es de tipo cadena de caracteres.
ANCHORTEXT. Si se trata de un documento que Aracne obtuvo mediante un proceso de crawling web,
contiene el texto del enlace utilizado para acceder al documento. Es de tipo cadena de caracteres.
SUMMARY. Resumen generado por Aracne para el documento. Es de tipo cadena de caracteres.
URL. En el caso de documentos obtenidos a través de la web, contiene laURL original del documento. En el
caso de documentos RSS se corresponde con el valor del campo link del item RSS. En el caso de documentos
obtenidos de un sistema de ficheros local, contiene la ruta al mismo. En el caso de documentos obtenidos a
partir de un servidor de correo electrónico contiene el nombre del servidor de correo y el nombre de la cuenta a
la que pertenece el correo. Es de tipo cadena de caracteres.
IDENTIFIER. URL normalizada. Es de tipo cadena de caracteres.
CONTENT. Contenido “útil” del documento generado por Aracne. Véase la Guía del Administrador de Aracne
[16] para más detalle. Es de tipo cadena de caracteres.
DESCRIPTION. Sólo aparece en el caso de que el índice contenga documentos de tipo RSS. En ese caso
toma el valor del elemento DESCRIPTION del documento RSS. Es de tipo cadena de caracteres.
MODIFIED. Fecha de última modificación del documento en el índice.
SEARCHABLECONTENT. Campo añadido por DataPort que almacena la concatenación del contenido de los
principales campos fijos textuales del índice (título, resumen, contenido, anchortext,…), así como de los campos
específicos que el índice pueda contener. Es el campo sobre el que se suelen realizar las búsquedas.
LEVEL Nivel de profundidad de crawling en el que se obtuvo el documento. Es de tipo cadena de caracteres.
TYPE. Tipo de contenido: html, pdf, rss, etc. Es de tipo cadena de caracteres.
Generación de Wrappers y DataSources
117
Virtual DataPort 4.0
•
•
•
•
•
•
Guía Avanzada de VQL
TITLEXML. Título del documento en XML con información sobre la estructura visual del contenido (párrafos).
Este campo se utiliza para la representación visual del título, no para búsquedas. Es de tipo cadena de
caracteres.
SUMMARYXML. Resumen del documento en XML que informan sobre la estructura visual del contenido
(párrafos). Este campo se utiliza para la representación visual del resumen, no para búsquedas. Es de tipo
cadena de caracteres.
PATH. En el caso de que el servidor Aracne guarde una copia local al documento, contiene la ruta al mismo. Es
de tipo cadena de caracteres.
SCORE. Indicación de la relevancia relativa del documento para la consulta. Habitualmente los resultados de
una búsqueda se devuelven ordenados decrecientemente por SCORE. Es de tipo flotante.
MAXDOCS. Atributo añadido por DataPort que permite restringir el número máximo de resultados devueltos por
una búsqueda. Es de tipo entero.
CATEGORIES. Sólo puede aparecer en el caso de que el índice contenga documentos de tipo RSS que
contengan un elemento CATEGORIES. En ese caso toma el valor de dicho elemento del documento RSS. Es de
tipo cadena de caracteres.
Además, Denodo Aracne es capaz de generar automáticamente las palabras más relevantes de un documento o de
un campo del mismo, de acuerdo a la medida de relevancia TFIDF (Term Frequency Inverse Document Frequency).
Estos términos pueden ser incluidos en campos adicionales del esquema del wrapper DataPort. El uso de la cláusula
FILTERMAINTERMS está también relacionado con esta funcionalidad. Véase la sección 17.4.9.1.
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva. La sintaxis de creación
se muestra en la Figura 88.
CREATE [ OR REPLACE ] WRAPPER ARN <name:identifier>
DATASOURCENAME=<name:identifier>
HANDLERNAME=<literal>
[ OUTPUTSCHEMA ( <field> [, <field>]* )]
[ FILTERMAINTERMLIST ( <literal> [, <literal>]* )]
<field> ::=
<name:identifier> = <mapping:literal> [ VALUE <literal> ] :
<type:literal>
[ ( { OBL | OPT } ) ]
| <name:identifier> = <mapping:literal> : ARRAY OF ( <register field> )
[ <inline constraints>]*
| <name:register field>
<register field> ::=
<name:identifier> = <mapping:literal> :
REGISTER OF ( [ <field> [, <field> ]* ] )
<inline constraint> ::=
MAINTERMS ( <name:identifier>,<num_of_mainterms_integer> [, { (
<literal> [, <literal>]* ) }] )
Figura 85 Sintaxis de creación de un wrapper Denodo Aracne
En la siguiente figura se muestra un ejemplo de creación de un wrapper Aracne. Los campos del wrapper deben
incluir los antes expuestos siempre que el manejador escogido de Denodo Aracne también los incluya. En esos
campos, para que el wrapper funcione correctamente, la única modificación posible es posible cambiar su nombre.
Generación de Wrappers y DataSources
118
Virtual DataPort 4.0
Guía Avanzada de VQL
En el ejemplo, el nombre del campo TITLE es cambiado por DOCNAME. En el ejemplo, también se añade un
campo para contener los términos más relevantes del documento (ver sección 17.4.9.1).
CREATE WRAPPER ARN aracneview3
DATASOURCENAME=aracnesearch
HANDLERNAME='default'
OUTPUTSCHEMA (
TASK : 'java.lang.String' (OPT),
PUBDATE : 'java.lang.String' (OPT),
DOCNAME='TITLE' : 'java.lang.String' (OPT),
ANCHORTEXT : 'java.lang.String' (OPT),
SUMMARY : 'java.lang.String' (OPT),
IDENTIFIER : 'java.lang.String' (OPT),
URL : 'java.lang.String' (OPT),
CONTENT : 'java.lang.String' (OPT),
DESCRIPTION : 'java.lang.String' (OPT),
MODIFIED : 'java.lang.String' (OPT),
SEARCHABLECONTENT : 'java.lang.String' (OPT) EXTERN,
LEVEL : 'java.lang.String' (OPT),
TYPE : 'java.lang.String' (OPT),
TITLEXML : 'java.lang.String' (OPT),
SUMMARYXML : 'java.lang.String' (OPT),
PATH : 'java.lang.String' (OPT),
SCORE : 'java.lang.Float',
MAXDOCS : 'java.lang.Integer' (OPT) EXTERN,
SEARCHABLECONTENT_MAIN_TERM = 'SEARCHABLECONTENT_MAIN_TERM': ARRAY OF (
SEARCHABLECONTENT_MAIN_TERM_REG: REGISTER OF (
SEARCHABLECONTENT_SCORE : 'java.lang.Integer',
SEARCHABLECONTENT_TERM : 'java.lang.String'
)
)MAINTERMS (SEARCHABLECONTENT ,10,( 'usualterm1' , 'usualterm2') )
);
Figura 86 Ejemplo de creación de un wrapper Denodo Aracne
La sintaxis de la sentencia de modificación del wrapper es similar y se muestra en la Figura 90.
ALTER WRAPPER ARN <name:identifier>
DATASOURCENAME=<name:identifier>
HANDLERNAME=<literal>
[ OUTPUTSCHEMA ( <field> [, <field>]* )]
[ FILTERMAINTERMLIST ( <literal> [, <literal>]* )]
<field> ::=
<name:identifier> = <mapping:literal> [ VALUE <literal> ] :
<type:literal>
[ ( { OBL | OPT } ) ]
| <name:identifier> = <mapping:literal> : ARRAY OF ( <register field> )
[ <inline constraints>]*
| <name:register field>
<register field> ::=
Generación de Wrappers y DataSources
119
Virtual DataPort 4.0
Guía Avanzada de VQL
<name:identifier> = <mapping:literal> :
REGISTER OF ( [ <field> [, <field> ]* ] )
<inline constraint> ::=
MAINTERMS ( <name:identifier>,<num_of_mainterms_integer> [, { (
<literal> [, <literal>]* ) }] )
Figura 87 Sintaxis de modificación de un wrapper Denodo Aracne
17.4.9.1
Añadiendo campos con los términos más relevantes
Denodo Aracne es capaz de generar automáticamente las palabras más relevantes de un documento o de un campo
del mismo, de acuerdo a la medida de relevancia TFIDF (Term Frequency Inverse Document Frequency). Estos
términos pueden ser accedidos a través de campos adicionales en el wrapper DataPort, tal y cómo se describe en
esta sección.
Por ejemplo, en la Figura 86 se añade un nuevo atributo llamado SEARCHABLECONTENT_MAIN_TERM para
contener los términos más relevantes del campo del índice SEARCHABLECONTENT. El nuevo atributo debe ser
un atributo compuesto de tipo array de registros (ver sección 18.1). Cada registro debe tener dos campos:
•
•
El término relevante. En nuestro ejemplo, toma el nombre del campo del índice añadiéndole el sufijo _TERM
(SEARCHABLECONTENT_TERM).
Su posición en la lista de más relevantes. En nuestro ejemplo, toma el nombre del campo del índice
añadiéndole el sufijo _SCORE (SEARCHABLECONTENT_SCORE). Es de tipo entero. El término más
relevante tomará la posición 1.
Además se debe utilizar el modificador MAINTERMS para especificar el contenido del nuevo campo. Para ello, es
posible especificar los siguientes parámetros:
•
•
•
Name (Obligatorio). Nombre del campo afectado. En nuestro ejemplo, SEARCHABLECONTENT.
Number of main terms (Obligatorio). Número máximo de términos relevantes que se incluirán para cada
documento.
Filter main terms words (Opcional). Lista de “palabras usuales” (separadas por comas) que no deben aparecer
entre los términos más relevantes de este campo. Si Aracne generase entre los términos más relevantes del
contenido del atributo alguno que apareciese en dicha lista, sería eliminado de la lista de términos relevantes.
Es importante darse cuenta de que aquí es necesario especificar solamente palabras usuales específicas de la
aplicación. Las palabras usuales del lenguaje utilizado tales como artículos, pronombres, etc. (comúnmente
llamadas “stopwords”) son ya eliminadas por Denodo Aracne.
Además, la sintaxis de creación de wrappers Aracne incluye la cláusula FILTERMAINTERMS (ver Figura 85). Esta
claúsula permite especificar una lista de palabras usuales comunes a todos los campos de la vista base.
Nuevamente, no es necesario preocuparse de especificar palabras usuales del lenguaje utilizado tales como
artículos, pronombres, etc. (comúnmente llamadas “stopwords”), debido a que son ya eliminadas por Denodo Aracne.
17.4.10 Wrapper Google Mini
Virtual DataPort soporta la creación de wrappers sobre buscadores creados con la herramienta Google Mini[17].
Como es habitual, para crear un wrapper de este tipo es necesario indicar el nombre del origen de datos –
DATASOURCENAME -. También es posible especificar los siguientes parámetros:
•
SITECOLLECTIONS. Este parámetro es obligatorio. Especifica, dentro del servidor GoogleMini, sobre qué
colecciones buscar. Las colecciones son creadas por el administrador del servidor Google Mini. Su nombre es
sensible a mayúsculas/minúsculas. Es posible especificar varias colecciones separadas por comas. En ese caso,
Generación de Wrappers y DataSources
120
Virtual DataPort 4.0
•
•
•
Guía Avanzada de VQL
se buscará por todas ellas. Si se está accediendo a un servidor externo, la colección a buscar puede obtenerse
normalmente examinando el valor del parámetro site en los URLs de invocación.
CLIENT: Este parámetro es opcional. Identifica al cliente que realiza las consultas. El servidor Google Mini
puede estar configurado para comportarse de forma diferente en función del cliente que emita una consulta.
LANGUAGES: Este parámetro es opcional. Si se especifica, se devolverán sólo documentos en el lenguaje
especificado. El lenguaje debe ser un valor de los enumerados en la documentación de Google Mini [18].
NUMKEYMATCH: Este parámetro es opcional. Google Mini permite al administrador
determinar manualmente la prioridad de las páginas a la hora de mostrarse en
los resultados de una búsqueda. Este parámetro recibe un valor entero entre 0 y 5, dónde 5 siginifica la máxima
prioridad.
Si
se
establece
este
valor,
las
búsquedas
sólo
devolverán
las
páginas
cuya
prioridad sea la especificada o superior.
Como en el resto de wrappers, es posible especificar el esquema de datos devuelto por el wrapper
(OUTPUTSCHEMA). En este caso, el esquema debe constar de una serie de campos fijos y sólo será posible
modificar su nombre. A continuación se describe cada campo:
•
•
•
•
•
•
•
•
•
•
TITLE. Título generado por Google Mini para el documento. Es de tipo cadena de caracteres.
SUMMARY. Resumen generado por Google Mini para el documento. Es de tipo cadena de caracteres.
URL. URL del documento. Es de tipo cadena de caracteres.
MIMETYPE. Tipo MIME del documento. Es de tipo cadena de caracteres.
RATING. Prioridad asignada manualmente por el administrador de Google Mini para el documento. Puede
tomar valores entre 0 y 5, donde 5 significa máxima prioridad. Es de tipo entero.
MAXDOCS. Campo añadido por DataPort que permite restringir el número máximo de resultados devueltos por
una búsqueda. Es de tipo entero.
METAS. Atributo compuesto de tipo array de registros (ver sección 18.1) que contiene los tags meta del
documento. Cada registro tiene dos campos de tipo cadena de caracteres, que indican el nombre del metatag
(metakey) y su valor (metavalue).
CONTENT. Contenido del documento. Es el campo utilizado habitualmente para las búsquedas. Es de tipo
cadena de caracteres.
SITE. Permite restringir los documentos devueltos a aquellos que pertenezcan a un dominio determinado (e.g.
‘acme.com’). Es de tipo cadena de caracteres.
FILETYPE. Extensión del fichero del documento. Es de tipo cadena de caracteres.
La sentencia de creación del wrapper también admite el modificador OR REPLACE. En caso de ser especificado, si
ya existiese un wrapper con el mismo nombre, su definición sería reemplazada por la nueva. La sintaxis de creación
se muestra en la Figura 88.
CREATE [ OR REPLACE ] WRAPPER GS <name:identifier>
DATASOURCENAME=<name:identifier>
SITECOLLECTIONS ( <literal> [, <literal>]* )
[ CLIENT=<literal> ]
[ LANGUAGES ( <literal> [, <literal>]* ) ]
[ NUMKEYMATCH=<integer> ]
[ OUTPUTSCHEMA ( <field> [, <field>]* )]
<field> ::=
<name:identifier> = <mapping:literal> [ VALUE <literal> ] :
<type:literal>
[ ( { OBL | OPT } ) ]
| <name:identifier> = <mapping:literal> : ARRAY OF ( <register field> )
Generación de Wrappers y DataSources
121
Virtual DataPort 4.0
Guía Avanzada de VQL
| <name:register field>
<register field> ::=
<name:identifier> = <mapping:literal> :
REGISTER OF ( [ <field> [, <field> ]* ] )
Figura 88 Sintaxis de creación de un wrapper Google Mini
En la siguiente figura se muestra un ejemplo de creación de un wrapper Google Mini. Los campos del wrapper deben
ser los especificados. Para que la sentencia funcione correctamente, tan sólo es posible cambiar, si se desea, el
nombre de los campos de salida. En el ejemplo, el nombre del campo TITLE es cambiado por DOCNAME.
CREATE WRAPPER GS acme_com
DATASOURCENAME=acme_com
SITECOLLECTIONS (
'Acme_com'
)
OUTPUTSCHEMA (
DOCNAME='TITLE' : 'java.lang.String' (OPT),
SUMMARY : 'java.lang.String',
URL : 'java.lang.String' (OPT),
MIMETYPE : 'java.lang.String',
RATING : 'java.lang.Integer',
MAXDOCS : 'java.lang.Integer' (OPT) EXTERN,
METAS: ARRAY OF (
METAS: REGISTER OF (
METAKEY : 'java.lang.String',
METAVALUE : 'java.lang.String'
)
),
CONTENT : 'java.lang.String' (OPT) EXTERN,
SITE : 'java.lang.String' (OPT) EXTERN,
FILETYPE : 'java.lang.String' (OPT) EXTERN,
LANGUAGE : 'java.lang.String'
)
Figura 89 Ejemplo de creación de un wrapper Google Mini
La sintaxis de la sentencia de modificación del wrapper es similar y se muestra en la Figura 90.
ALTER WRAPPER GS <name:identifier>
DATASOURCENAME=<name:identifier>
SITECOLLECTIONS ( <literal> [, <literal>]* )
[ CLIENT=<literal> ]
[ LANGUAGES ( <literal> [, <literal>]* ) ]
[ NUMKEYMATCH=<integer> ]
[ OUTPUTSCHEMA ( <field> [, <field>]* )]LTER WRAPPER GS <name:identifier>
<field> ::=
<name:identifier> = <mapping:literal> [ VALUE <literal> ] :
<type:literal>
[ ( { OBL | OPT } ) ]
| <name:identifier> = <mapping:literal> : ARRAY OF ( <register field> )
Generación de Wrappers y DataSources
122
Virtual DataPort 4.0
Guía Avanzada de VQL
| <name:register field>
<register field> ::=
<name:identifier> = <mapping:literal> :
REGISTER OF ( [ <field> [, <field> ]* ] )
Figura 90 Sintaxis de modificación de un wrapper Google Mini
17.4.11 Wrapper CUSTOM
El tipo de wrapper CUSTOM permite acceder a una fuente mediante una implementación específica. De este modo,
es posible construir un wrapper ad-hoc para el acceso a una fuente externa. Los wrappers CUSTOM están asociados
a un datasource CUSTOM. En el proceso de creación de este tipo de datasources (ver sección 17.3.9), es necesario
especificar una clase que implementa los wrappers de este tipo. Como se explica a continuación, esta clase debe
extender com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperImpl.
Para crear un nuevo wrapper de tipo CUSTOM, es necesario extender dos clases Java:
•
La clase abstracta com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperImpl.
Extendiendo esta clase se definirá el esquema de salida del nuevo wrapper, así como cierta
metainformación adicional.
•
com.denodo.vdb.engine.wrapper.raw.my.MyAccessImpl. Se extenderá esta clase
para implementar el comportamiento específico del wrapper.
Las siguientes subsecciones se ocupan, respectivamente, de cada una de ellas. Posteriormente se indica como dar de
alta el nuevo wrapper CUSTOM en el servidor DataPort una vez que este ha sido implementado.
DataPort
incluye
una
serie
de
wrappers
CUSTOM
de
ejemplo
en
la
ruta
$DENODO_HOME/samples/vdp/wrappersCustom. El fichero README en dicha ruta contiene
instrucciones sobre cómo compilarlos, instalarlos y utilizarlos.
17.4.11.1 Definiendo la metainformación del wrapper CUSTOM
Para definir la metainformación del nuevo wrapper CUSTOM es necesario extender la clase abstracta
com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperImpl. En particular, es necesario
redefinir los siguientes métodos (véase la documentación Javadoc [4] y los ejemplos para más detalle):
•
public
abstract
MyAccessImpl
doCreate()
throws
CreateWrapperException. Este método es responsable de crear la clase wrapper que realizará
la ejecución de la consulta. Dicha clase será discutida en la siguiente sección.
•
public
com.denodo.vdb.catalog.wrapper.metadata.MetaRegisterRaw
getOutputSchema()throws LoadWrapperException. Este método debe devolver el
esquema de los datos que serán obtenidos a través de las consultas efectuadas por el wrapper. Para cada
uno de los atributos contenidos en las tuplas de respuesta debe indicarse:
o
Su tipo de dato.
o
Si el atributo es consultable en la fuente (es decir, si el wrapper es capaz de aplicar condiciones
de selección sobre dicho atributo en la fuente). Si el atributo es consultable, puede ser además
Generación de Wrappers y DataSources
123
Virtual DataPort 4.0
Guía Avanzada de VQL
obligatorio. Eso indica que el wrapper sólo será capaz de ejecutar consultas que incluyan al
menos una condición de selección para dicho atributo.
•
public List getWrapperParameters(). (OPCIONAL) Este método debe devolver
una lista conteniendo los parámetros de configuración del wrapper. Cada parámetro se representa
mediante
un
objeto
com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperParameter. Al crear un
parámetro de configuración debe especificarse en el constructor su nombre y si el parámetro es obligatorio
(true) u opcional (false). Si no se implementa este método, el wrapper no tendrá parámetros de
configuración.
•
public
com.denodo.vdb.catalog.wrapper.SourceConfiguration
getSourceConfiguration().(OPCIONAL) Este método permite especificar las propiedades
de configuración del datasource CUSTOM (ver sección 17.3.10). La implementación de este método en el
wrapper puede llamar a la implementación de este método en la superclase para obtener las propiedades
de configuración por defecto. Si no se implementa este método, el wrapper utilizará las propiedades de
configuración por defecto.
Para simplificar el proceso se proporciona una implementación por defecto para la jerarquía de clases que definen el
esquema
de
un
wrapper
CUSTOM
(ver
com.denodo.vdb.catalog.wrapper.my.metadata.MyMetaRegisterRaw
en
la
documentación javadoc [4]).
17.4.11.2 Creando el wrapper
Una vez definida la clase que encapsula la metainformación del wrapper, es necesario crear la clase que definirá el
comportamiento específico del mismo.
Esta clase extenderá com.denodo.vdb.engine.wrapper.raw.my.MyAccessImpl y, tal y como
se comentó en la sección anterior, será devuelta por el método doCreate. de
com.denodo.vdb.catalog.wrapper.my.MetaMyWrapperImpl (véase la documentación
Javadoc [4] para más detalle).
Es posible redefinir los siguientes métodos principales:
•
doRun. (obligatorio) Este método será invocado por DataPort para ejecutar una consulta sobre el wrapper.
Recibe como parámetro la lista de condiciones de consulta que DataPort delega al wrapper para su
ejecución sobre la fuente.
Esta lista está compuesta por objetos de tipo
com.denodo.vdb.engine.wrapper.condition.WrapperCondition
(ver
documentación Javadoc[4]).
•
doInsert. En el caso de que el wrapper soporte inserciones, este método será invocado por DataPort
para ejecutar una sentencia INSERT. Recibe como parámetro una lista de nombres de atributos y una
lista de los valores a insertar.
•
doUpdate. En el caso de que el wrapper soporte actualizaciones, este método será invocado por
DataPort para ejecutar una sentencia UPDATE. Recibe como parámetros una lista de los atributos a
modificar, una lista con los nuevos valores y una lista de condiciones de consulta compuesta por objetos
com.denodo.vdb.engine.wrapper.condition.WrapperCondition
(ver
documentación Javadoc [4]).
Generación de Wrappers y DataSources
124
Virtual DataPort 4.0
Guía Avanzada de VQL
•
doDelete. En el caso de que el wrapper soporte borrados, este método será invocado por DataPort para
ejecutar una sentencia DELETE sobre el wrapper. Recibe como parámetro una lista de condiciones de
consulta
compuesta
por
objetos
com.denodo.vdb.engine.wrapper.condition.WrapperCondition
(ver
documentación Javadoc[4]).
•
prepare. En el caso de que el wrapper soporte transacciones, este método será invocado para preparar
una transacción.
•
commit. En el caso de que el wrapper soporte transacciones, este método será invocado para confirmar
una transacción.
•
rollback. En el caso de que el wrapper soporte transacciones, este método será invocado para
deshacer los cambios de una transacción.
•
stop. (obligatorio) Este método será invocado por DataPort para detener la ejecución de un wrapper.
La implementación de estos métodos puede acceder al valor de los parámetros de configuración del wrapper a través
del método Map getParameters(). Para cada parámetro, existe una clave en el mapa de la forma
MetaPayRollWrapper.PNAME donde PNAME es el nombre del parámetro.
La ejecución del wrapper debe proporcionar los resultados de acuerdo
com.denodo.vdb.engine.IRawResult (ver documentación Javadoc [4]).
a
la
interfaz
Para añadir tuplas a este resultado, el wrapper seguirá los siguientes pasos:
•
Invocar el método createRawRow en el objeto MyAccessImpl para crear una nueva tupla vacía
(que será un objeto com.denodo.vdb.engine.IRawRow)
•
Rellenar la tupla con los datos obtenidos por el wrapper.
•
Añadirla al resultado invocando el método addRawRow en el objeto MyAccessImpl.
Es importante tener en cuenta que los resultados devueltos por el wrapper deben ser compatibles con el esquema de
la relación base a la que dicho wrapper está asociado en el servidor Virtual DataPort. Más concretamente, los
nombres de los atributos obtenidos como resultado de la consulta, deben coincidir con los de la relación base, y
además sus valores deben ser compatibles con sus tipos de dato en la relación base.
17.4.11.3 Creando o modificando el wrapper CUSTOM en el servidor DataPort
La Figura 91 muestra la sintaxis de creación de un wrapper de tipo CUSTOM. El único parámetro obligatorio que
recibe en su creación –además de un nombre que lo identifica- es el nombre del datasource a partir del cuál se
creará (ver sección 17.3.9).
Si los wrappers del datasource admiten parámetros de configuración, la cláusula PARAMETERS permite
especificarlos.
También se admite el modificador OR REPLACE. En caso de ser especificado, si ya existiese un wrapper con el
mismo nombre, su definición sería reemplazada por la nueva.
Generación de Wrappers y DataSources
125
Virtual DataPort 4.0
Guía Avanzada de VQL
Por último, también se permite especificar ciertas propiedades del wrapper (SOURCECONFIGURATION) que
DataPort tendrá en cuenta para determinar qué operaciones pueden realizarse sobre el mismo. En la declaración de
la sentencia correspondiente se indican las propiedades aplicables (Figura 91), y son explicadas en la sección
17.4.12.
CREATE [ OR REPLACE ] WRAPPER CUSTOM <name:identifier>
DATASOURCENAME=<name:identifier>
[ PARAMETERS ( <paramName:identifier>=<paramValue:literal>
[,<paramName:identifier>=<paramValue:literal>]* ) ]
Figura 91 Sintaxis de creación de un wrapper tipo CUSTOM
La Figura 92 muestra un ejemplo de creación de un wrapper CUSTOM. El wrapper recibe el nombre testcustom
y es asociado al datasource CUSTOM llamado testcustomds. Los wrappers del datasource testcustomds
reciben dos parámetros de configuración llamados ENTERPRISE y YEAR. El nuevo wrapper es configurado con
los valores 'enterprise1' y , '2006' respectivamente.
CREATE WRAPPER CUSTOM testcustom
DATASOURCENAME=testcustomds
PARAMETERS (
ENTERPRISE='enterprise1', YEAR='2006'
) ;
Figura 92 Ejemplo de creación de un wrapper CUSTOM
La sintaxis de la sentencia de modificación de un wrapper CUSTOM es la que se muestra en la Figura 93.. Las
opciones disponibles son las mismas que para la creación del wrapper.
ALTER WRAPPER CUSTOM <name:identifier>
[ DATASOURCENAME=<name:identifier> ]
[ PARAMETERS ( <paramName:identifier>=<paramValue:literal>
[,<paramName:identifier>=<paramValue:literal>]* ) ]
Figura 93 Sintaxis de modificación de un wrapper tipo CUSTOM
17.4.12
Propiedades de Configuración de Wrappers
Tal y como ya se ha comentado en el apartado 17.3.6, Virtual DataPort mantiene propiedades para cada una de las
fuentes de datos y wrappers, que permiten configurar características concretas de las fuentes subyacentes, como su
capacidad de soporte de transacciones distribuidas, o si permite operaciones de inserción. En el apartado 17.3.6 se
comentaron las propiedades de configuración de las fuentes de datos. En esta sección se describen aquellas
propiedades configurables en cada uno de los wrappers, dependiendo del tipo de fuente de datos de donde
provienen.
Las propiedades de cada wrapper pueden configurarse en la sentencia de creación de wrappers, añadiendo pares
parámetro-valor, o desde la herramienta de administración de Virtual DataPort si se desea realizar la operación de
manera gráfica (ver Guía del Administrador de VDP [3] para más información). Las propiedades configurables son las
siguientes:
-
Allow Insert (ALLOWINSERT): indica si la fuente de datos subyacente admite operaciones de inserción. Es
aplicable a bases de datos relacionales (accesibles mediante JDBC y ODBC) y wrappers CUSTOM. Los posibles
valores son:
Generación de Wrappers y DataSources
126
Virtual DataPort 4.0
Guía Avanzada de VQL
Default: VDP asigna un valor por defecto dependiendo del tipo de fuente. En el caso de fuentes
relacionales, el valor por defecto es “true”.
o true: la fuente de datos permite las operaciones de inserción.
o false: la fuente de datos no permite las operaciones de inserción.
Allow Delete (ALLOWDELETE): indica si la fuente de datos subyacente admite operaciones de borrado de
filas. Es aplicable a bases de datos relacionales (accesibles mediante JDBC y ODBC) y wrappers CUSTOM. Los
posibles valores son:
o Default: VDP asigna un valor por defecto dependiendo del tipo de fuente. En el caso de fuentes
relacionales, el valor por defecto es “true”.
o true: la fuente de datos permite las operaciones de borrado.
o false: la fuente de datos no permite las operaciones de borrado.
Allow Update (ALLOWUPDATE): indica si la fuente de datos subyacente admite operaciones de actualización
de filas. Es aplicable a bases de datos relacionales (accesibles mediante JDBC y ODBC) y wrappers CUSTOM.
Los posibles valores son:
o Default: VDP asigna un valor por defecto dependiendo del tipo de fuente. En el caso de fuentes
relacionales, el valor por defecto es “true”.
o true: la fuente de datos permite las operaciones de actualización.
o false: la fuente de datos no permite las operaciones de actualización.
Delegate All Operators (DELEGATEALLOPERATORS). Indica si la fuente permite delegación de todos los
operadores. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate AND Condition (DELEGATEANDCONDITION). Indica si la fuente permite la delegación de la
condición AND. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true” para vistas base procedentes
de wrappers CUSTOM.
Delegate Array Literal (DELEGATEARRAYLITERAL): Indica si la fuente permite delegar constantes
compuestas de tipo array. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Compound Field Projection (DELEGATECOMPOUNDFIELDPROJECTION): Indica si la fuente
permite la delegación de proyecciones sobre campos compuestos. Aplicable a wrappers CUSTOM. Por defecto,
el valor es “true”.
Delegate Left Function (DELEGATELEFTFUNCTION): Indica si la fuente permite delegar condiciones con
funciones en la parte izquierda. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Left Literal (DELEGATELEFTLITERAL): Indica si la fuente permite delegar condiciones con
constantes en la parte izquierda. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate NOT Condition (DELEGATENOTCONDITION): Indica si la fuente permite la delegación de la
condición NOT. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate OR Condition (DELEGATEORCONDITION): Indica si la fuente permite la delegación de la
condición OR. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate ORDER BY (DELEGATEORDERBY): Indica si la fuente permite la delegación de la cláusula ORDER
BY. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Register Literal (DELEGATEREGISTERLITERAL): Indica si la fuente permite delegar constantes
compuestas de tipo registro. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Right Field (DELEGATERIGHTFIELD): Indica si la fuente permite delegar condiciones con campos
en la parte derecha. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Right Function (DELEGATERIGHTFUNCTION): Indica si la fuente permite delegar condiciones
con funciones en la parte derecha. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Delegate Right Literal (DELEGATERIGHTLITERAL): Indica si la fuente permite delegar condiciones con
constantes en la parte derecha. Aplicable a wrappers CUSTOM. Por defecto, el valor es “true”.
Supports Distributed Transactions (SUPPORTSDISTRIBUTEDTRANSACTIONS): indica si la fuente de
datos subyacente puede participar en una transacción distribuída XA [14]. Es aplicable a bases de datos
relacionales (accesibles mediante JDBC y ODBC) y wrappers CUSTOM. Los posibles valores son:
o Default: VDP asigna un valor por defecto dependiendo del tipo de fuente. En el caso de fuentes
relacionales, el valor por defecto es “true”.
o true: la fuente de datos cumple la especificación XA.
o
-
-
-
-
-
Generación de Wrappers y DataSources
127
Virtual DataPort 4.0
o
-
-
Guía Avanzada de VQL
false: la fuente de datos no cumple la especificación XA.
Data in Order Field List (DATAINORDERFIELDSLIST): Esta propiedad determina la lista de campos por los
que vienen ordenados los datos (si es el caso). Además, para cada campo debe especificarse si la ordenación es
ascendente (ASC) o descendente (DESC). Cada par nombre de campo con su criterio de ordenación, se separa
por una coma. Esta propiedad es aplicable en todas las fuentes de datos,
Delegate Operators List (DELEGATEOPERATORSLIST)t: esta propiedad determina la lista de operadores
delegables a la fuente de datos. Esto permite a VDP optimizar el plan de consulta creado a partir de la consulta
realizada por el usuario, delegando parte del procesamiento a la fuente nativa. Mientras que VDP realiza
automáticamente esta acción en bases de datos relacionales (dejando que las operaciones de selección,
proyección, unión o join sean ejecutadas por la base de datos de la que la vista base concreta proviene), otros
tipos de fuentes no proveen esa información en sus metadatos, aunque a veces sea posible. VDP permite indicar
la lista de operadores delegables en el tipo de datos Web Service (por defecto todos) y CUSTOM (por defecto
“=”).
Ejemplo: si se desea establecer que un wrapper CUSTOM no acepta transacciones (es decir, no permite operaciones
de inserción, actualización y borrado, ni soporta transacciones distribuidas), la sentencia de creación del wrapper
tendría que ser como sigue:
CREATE WRAPPER MY roll
CLASSNAME = 'com.denodo.vdp.demo.wrapper.my.MetaPayRollWrapper'
SOURCECONFIGURATION (
ALLOWINSERT = false,
ALLOWDELETE = false,
ALLOWUPDATE = false,
SUPPORTSDISTRIBUTEDTRANSACTIONS=false
);
Figura 94 Ejemplo de configuración de un Wrapper CUSTOM
17.5
SENTENCIAS DE CONSULTA DE WRAPPERS
Virtual DataPort permite realizar consultas directamente sobre wrappers (sin tener que definir relaciones base sobre
ellos ni métodos de búsqueda).
En la Figura 95 se muestra la sintaxis general de las sentencia para realizar consultas sobre wrappers. Es necesario
indicar el tipo y nombre del wrapper, y una lista opcional de condiciones, en el formato <value>, <operador
binario>, <value> (ver sintaxis general de valores de condiciones en sección 4.8.1). No permite operadores
unarios ni binarios multivaluados. Se trata de una versión simplificada de consulta, orientada a realizar pruebas
sobre los wrappers.
QUERY WRAPPER {ARN | DF | GS | JDBC | CUSTOM | ODBC | WS | XML }
<name:identifier>
[ ( <value> <binary operator> <value>
[, <value> <binary operator> <value> ]* ) ]
<value> ::= (ver sección 4.8)
Figura 95 Sintaxis de las sentencias de consulta de wrappers
La sintaxis de la sentencia de consulta de un wrapper ITPilot es un poco diferente y se muestra en la Figura 96. Sólo
permite indicar una lista de pares clave=valor, separados por comas, que serán directamente recibidos por el
contexto de ejecución del wrapper.
Generación de Wrappers y DataSources
128
Virtual DataPort 4.0
Guía Avanzada de VQL
QUERY WRAPPER ITP <name:identifier>
[
(
<name:identifier> = <value:literal>
[, <name:identifier> = <value:literal>]*
)
]
Figura 96 Sintaxis de la sentencias de consulta de wrappers ITPilot
Generación de Wrappers y DataSources
129
Virtual DataPort 4.0
18
Guía Avanzada de VQL
CARACTERÍSTICAS AVANZADAS
En esta sección se describen algunas características avanzadas de Virtual DataPort que, si bien no siempre son
necesarias en las labores de administración más habituales, pueden ser de interés en ciertos casos.
18.1
GESTIÓN DE VALORES DE TIPOS COMPUESTOS
Virtual DataPort posee dos clases de tipos: los tipos simples y los tipos compuestos. Los tipos compuestos (array y
register) permiten representar fácilmente datos con estructura jerárquica en las vistas y relaciones base de
DataPort. Por lo tanto, es necesario definir algún mecanismo que permita navegar por la estructura interna de un
valor compuesto para acceder a sus subelementos (simples o compuestos) en cualquier nivel del árbol.
NOTA: En Virtual DataPort un elemento de tipo array debe ser visto como una subrelación; en realidad un
array DataPort siempre tendrá asociado internamente un tipo register. Cada subelemento contenido en el
array pertenecerá a dicho tipo de datos register. De esta forma, los campos de este registro pueden verse
como el esquema de la subrelación que está modelando. Es importante tener esto en cuenta a la hora de aplicar
operadores sobre subelementos de un campo compuesto.
Los valores en Virtual DataPort están siempre contenidos dentro de vistas (también llamadas relaciones). Una vista
posee un esquema, es decir: una lista de atributos, cada uno de ellos perteneciente a un tipo de dato.
Todo valor de un atributo de una vista puede ser identificado unívocamente dentro de una tupla mediante una
expresión llamada URI. El URI asociado al valor de un atributo perteneciente a un tipo simple consiste simplemente
en el nombre del atributo.
Por el contrario, el valor de un atributo de tipo compuesto se representa mediante un árbol, en el cuál las hojas son
valores atómicos (esto es, pertenecientes a tipos de datos simples). En estos árboles, existen dos tipos de nodos no
hoja:
•
Arrays (tipo array): Desde ellos sale un arco hacia cada uno de los nodos que representan a los
subelementos que componen el array (todos pertenecerán a un mismo tipo de dato register). Cada
arco está etiquetado con el índice de posición del subelemento del array al que apunta, escrito entre los
símbolos "[" y "]".
•
Registros (tipo register): Desde ellos sale un arco hacia cada uno de los nodos que representan a
los subelementos que componen el registro (cada subelemento puede pertenecer a un tipo de dato
diferente). Cada arco está etiquetado con el nombre del subelemento.
Además, la raíz del árbol es apuntada por un arco con el nombre del atributo.
Dado este árbol, el URI que identifica a un nodo del mismo se obtiene comenzando por la raíz, y bajando por el árbol,
concatenando (separados por el carácter ".", salvo en los casos de índices de arrays en los cuáles se indica sólo el
valor del índice entre corchetes) los nombres de los diferentes arcos que es necesario atravesar hasta llegar al nodo
deseado. Finalmente, se concatena al principio de la cadena, el nombre del atributo. Además, si en un URI, para un
nodo de tipo array, no se especifica ninguno de sus arcos salientes (mediante el correspondiente índice), entonces el
URI apuntará a la lista de valores que se obtiene atravesando todos los arcos del array que no fue indexado.
Por lo tanto, desde el punto de vista de la evaluación de URIs sobre tuplas, pueden distinguirse dos tipos:
•
Las que apuntan a un valor de tipo simple o de tipo register.
Características Avanzadas
130
Virtual DataPort 4.0
•
Guía Avanzada de VQL
Las que apuntan a una lista de valores, consecuencia de no haber indexado un elemento de tipo array que
se encuentra en la estructura de árbol del tipo. Un URI de este tipo apunta a una serie de nodos que se
encuentran en el mismo nivel del árbol. Estos URIs se corresponden con valores de tipo array DataPort
y, por tanto, pueden verse como una subrelación donde cada elemento del array es una tupla y el esquema
de dicha tupla viene definido por los campos del elemento register que el array lleva asociado.
Los URIs del primer tipo pueden ser siempre utilizados en la cláusula SELECT de las consultas o como atributos de
agrupación en una cláusula GROUP BY. Si además el valor apuntado es de tipo simple, entonces este URI puede
ser utilizado de la misma forma que cualquier otro atributo de tipo simple en una sentencia de consulta: en las
cláusulas SELECT, WHERE, GROUP BY, etc. Utilizando los constructores ROW y ‘{‘ ‘}’ (ver sección 6.3.1) es
también posible construir valores compuestos y utilizarlos en la parte derecha de una condición. En este caso las
condiciones sólo podrán utilizar los operadores ‘=’ y ‘<>’, y los tipos de las URIs de la parte derecha y la parte
izquierda de la condición deben ser compatibles (es decir, sus árboles deben ser iguales exceptuando los nombres de
los arcos).
Respecto a los URIs del segundo tipo pueden aparecer en los siguientes casos:
•
En las condiciones de las cláusulas WHERE, cuando estas URIs aparecen en la parte izquierda de una
condición y en la parte derecha aparece una URI del primer tipo. En este caso las condiciones se evalúan
como si se tratase de una condición sobre la subrelación modelada por la URI.
•
En una FLATTEN VIEW utilizada en la claúsula FROM. Ver sección 6.1.2.
•
Las funciones de agregación (ver sección 6.4.1) soportan este tipo de URIs. Por ejemplo, la función de
agregación LIST, cuando recibe este tipo de URIs como parámetro, devuelve como resultado un array de
registros que tienen como único subelemento a cada uno de los valores referenciados por ese URI.
Además de los árboles que representan valores, existen también árboles para representar la estructura interna de los
tipos de dato compuestos. En este caso, los nodos de tipo array tienen un solo subelemento (el nodo registro que
representa a su registro asociado), ya que se pretende representar la estructura interna del tipo, y no una instancia
con valores.
18.1.1
Manejo de Tipos Compuestos: Ejemplo
Supóngase que se desea definir una relación que modele libros con un título y varios autores. Podríamos tener los
atributos:
•
TITLE, de tipo simple (text, por ejemplo)
•
AUTHOR, de tipo compuesto. Más concretamente, podemos tener varios autores y, para cada autor, se
desea representar su nombre, sus apellidos y una lista de direcciones de contacto. Como ya se ha
explicado anteriormente, un tipo array modela una subrelación, con lo cual es necesario indicar mediante
un tipo registro el esquema de esa relación. La subrelación AUTHOR tendrá pues asociado un tipo registro
con subatributos de tipo simple NAME, SURNAME y otro atributo compuesto de tipo array para contener
la lista de direcciones de contacto (CONTACTADDRESS). CONTACTADDRESS representa otra
subrelación, con un esquema compuesto por los subatributos MAIL y ADDRESS; MAIL tiene tipo simple
y ADDRESS es un registro compuesto por los subatributos: STREET, CITY y COUNTRY.
El árbol del tipo AUTHOR se muestra en la Figura 97. El tipo de dato para representar elementos de tipo AUTOR
puede crearse con las siguientes sentencias:
CREATE TYPE address AS REGISTER OF (
STREET:text,
Características Avanzadas
131
Virtual DataPort 4.0
Guía Avanzada de VQL
CITY:text,
COUNTRY:text
);
CREATE TYPE contactAddress AS REGISTER OF (
MAIL:text,
ADDRESS:address
);
CREATE TYPE contactAddressArray AS ARRAY OF contactAddress;
CREATE TYPE author AS REGISTER OF (
NAME:text,
SURNAME:text,
CONTACTADDRESS:contactAddressArray
);
CREATE TYPE authorArray AS ARRAY OF author;
RE
DD
TA
AC
NT
CO
register
NA
M
E
text
SURNAME
SS
text
text
register
S
ES
DR
AD
M
L
AI
register
CO
ST
R
CITY
text
RY
text
T
UN
EE
T
text
register
Figura 97 Árboles de tipos compuestos
En la Figura 98 se muestra un ejemplo de tupla de esta vista y su representación interna:
TITLE
Book1
AUTHOR
NAME
Name1
SURNAME
Surname1
CONTACTADDRESS
MAIL
Author1@authors.com
MAIL
Author2@authors.com
Características Avanzadas
ADDRESS
STREET
Street1
ADDRESS
STREET
Street2
CITY
City1
COUNTRY
Country1
CITY
City2
COUNTRY
Country2
132
Virtual DataPort 4.0
NAME
Name3
SURNAME
Surname3
Guía Avanzada de VQL
CONTACTADDRESS
MAIL
Author3@authors.com
ADDRESS
STREET
Street3
ADDRESS
STREET
Street4
MAIL
Author4@authors.com
CITY
City3
COUNTRY
Country03
CITY
City4
COUNTRY
Country04
Figura 98 Tupla con elementos compuestos
La estructura del árbol de valores se muestra en la Figura 99.
book1
array
[0]
[1]
M
E
NA
SURNAME
[0]
ET
ET
ST
RE
ST
RE
author4@au
thors.com
register
street3
CITY
city3
AI
country3
AD
L
DR
ES
S
register
street4
CITY
city4
Y
TR
UN
country2
M
S
CO
city2
DR
ES
Y
TR
UN
street2
CITY
Y
TR
UN
country1
author3@au
thors.com
CO
city1
Y
TR
UN
street1
CITY
register
L
AI
register
CO
author2@au
thors.com
register
M
AD
ST
RE
M
CO
author1@au
thors.com
ET
M
register
AD
DR
ES
S
L
AI
[1]
[0]
register
AD
DR
ES
S
array
surname3
[1]
register
L
AI
name3
ET
array
surname1
ST
RE
name1
SS
SS
RE
RE
DD
TA
DD
TA
SURNAME
AC
NT
register
AC
NT
NA
M
E
CO
CO
register
country4
Figura 99 Árbol de valores de tipos compuestos
A continuación, puede crearse una relación base que modele esta relación:
CREATE TABLE BOOK I18N es_euro (
TITLE:text (SEARCH),
AUTHOR:authorArray
);
Figura 100
Creación de una relación base con tipos compuestos
Será necesario también crear un wrapper para la relación. Nótese que, como siempre, el esquema de los datos
devueltos por el wrapper debe ser compatible con el esquema de la relación, lo que en este caso significa que el
wrapper precisará devolver sus datos en la forma de valores compuestos.
Por ejemplo, la siguiente figura muestra parte de una sentencia VQL para la creación de un wrapper ITPilot para
obtener la información deseada. Nótese cómo el esquema de salida definido es compatible con el de la relación:
Características Avanzadas
133
Virtual DataPort 4.0
Guía Avanzada de VQL
CREATE WRAPPER ITP BOOK_sm1
OUTPUTSCHEMA (
TITLE,
AUTHOR:ARRAY OF
AUTHOR:REGISTER OF (
NAME,
SURNAME,
CONTACTADDRESS:ARRAY OF
CONTACTADDRESS:REGISTER OF (
MAIL,
ADDRESS:ARRAY OF
ADDRESS:REGISTER OF (
STREET,
CITY,
COUNTRY
)
)
)
)
… Wrapper definition …;
Figura 101
Creando un método de búsqueda con tipos compuestos
Una vez creado el wrapper, puede definirse un método de búsqueda para la relación BOOK. Normalmente, sólo los
URIs que apunten a tipos de datos simples tendrán definidas restricciones de consulta (esto es coherente con el
hecho de considerar los atributos de tipos compuestos como si se tratase de subrelaciones). Sin embargo también es
posible añadir restricciones para URIs que apunten a tipos compuestos (en ese caso, recuérdese que los operandos
de la parte derecha de las condiciones se construirán con los constructores ROW y ‘{‘ ‘}’ y que sólo podrán utilizarse
los operadores ‘=’ y ‘<>’). La siguiente sentencia añade un posible método de búsqueda (nótese que se ha incluido
una restricción para la URI compuesta AUTHOR.CONTACTADDRESS):
ALTER TABLE BOOK
ADD SEARCHMETHOD BOOK_SM1 (
CONSTRAINTS (
ADD TITLE
ADD AUTHOR.NAME
ADD AUTHOR.SURNAME
ADD AUTHOR.CONTACTADDRESS
ADD AUTHOR.CONTACTADDRESS.MAIL
ADD AUTHOR.CONTACTADDRESS.ADDRESS.STREET
ADD AUTHOR.CONTACTADDRESS.ADDRESS.CITY
ADD AUTHOR.CONTACTADDRESS.ADDRESS.COUNTRY
)
OUTPUTLIST (TITLE, AUTHOR)
WRAPPER (ITP book)
);
Figura 102
NOS
NOS
NOS
NOS
NOS
NOS
NOS
NOS
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
()
()
()
()
()
()
()
()
Adición de un método de búsqueda con tipos compuestos
NOTA: En el caso de especificación de atributos compuestos en condiciones de consulta y para evitar ambigüedades
entre nombre de tabla y nombre de atributo, los nombres de atributo (opcionalmente <nombre de
tabla>.<nombre de atributo>) se especificarán entre paréntesis, especificando los campos de los
elementos compuestos a continuación (separados por puntos o indexados con un entero entre corchetes).
Finalmente, se muestran algunos ejemplos de consultas que podrían realizarse sobre la relación:
1. Para todos los libros que contienen en su título la palabra ‘java’, se obtiene su título y el nombre de cada uno de
sus autores.
SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
FROM BOOK
WHERE TITLE like '%java%'
GROUP BY TITLE;
Características Avanzadas
134
Virtual DataPort 4.0
Guía Avanzada de VQL
2. Para todos los libros que contienen en su título la palabra ‘java’, se obtiene el título y la lista de contactos de cada
uno de sus autores.
SELECT TITLE, LIST((AUTHOR).CONTACTADDRESS) AS AUTHORLIST
FROM BOOK
WHERE TITLE like '%java%'
GROUP BY TITLE;
3. Para todos los libros que contienen en su título la palabra ‘java’, se obtiene su título y la primera dirección de
correo de cada uno de sus autores.
SELECT TITLE,LIST((AUTHOR).CONTACTADDRESS[0].MAIL) AS AUTHORLIST
FROM BOOK
WHERE TITLE like '%java%'
GROUP BY TITLE;
4. Para todos los libros que contienen en su título la palabra ‘java’ y que tengan al menos un autor con alguna
dirección de correo que contenga la palabra ‘.es’, se obtiene el título y el nombre de cada uno de sus autores.
SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
FROM BOOK
WHERE (TITLE like '%java%')
AND ( (AUTHOR).CONTACTADDRESS.MAIL like '%.es%' )
GROUP BY TITLE;
5. Para todos los libros que contienen en su título la palabra ‘java’ y que tengan al menos un autor con alguna
dirección en la calle ‘Real’, se obtiene el título y el nombre de cada uno de sus autores.
SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
FROM BOOK
WHERE (TITLE like '%java%')
AND ((AUTHOR).CONTACTADDRESS.ADDRESS.STREET like '%Real%')
GROUP BY TITLE;
6. Se obtienen los libros con algún autor que tenga una única dirección de contacto cuyo e-mail sea
john@mail.com, y que viva en la ciudad de Madrid (España) en la calle Real.
SELECT TITLE, AUTHOR
FROM BOOK
WHERE (AUTHOR).CONTACTADDRESS = {ROW('john@mail.com',{ROW('Real', 'Madrid',
'España')})}
18.2
OPTIMIZACIÓN DE CONSULTAS
Esta sección describe diversos aspectos de interés con respecto a la optimización de las consultas efectuadas
mediante Virtual DataPort.
En primer lugar se discuten las posibles estrategias de ejecución para las operaciones de join y cómo escoger la
estrategia más adecuada para una vista o una consulta. A continuación se discuten las opciones de configuración de
la cache DataPort para una vista determinada. Finalmente se describe cómo configurar la política de “swapping” a
disco de DataPort durante la ejecución de consultas que involucren resultados intermedios de gran tamaño.
18.2.1
Optimización de Operaciones de join
Un aspecto clave de la optimización de consultas en Virtual DataPort es la elección de la estrategia más adecuada
para la realización de las operaciones de join. Si bien Virtual DataPort intentará utilizar la estrategia más adecuada
en cada caso basándose en información de costes interna, es posible forzar una determinada estrategia de ejecución
para la operación de join que se desee.
Características Avanzadas
135
Virtual DataPort 4.0
Guía Avanzada de VQL
Una estrategia de ejecución para un join consta de dos elementos: el método utilizado para implementar la operación
de join y el orden en el que deben considerarse las relaciones de entrada del join. Virtual DataPort soporta los
siguientes métodos de ejecución:
•
MERGE. Sólo puede ejecutarse en aquellos casos en los que los datos de las relaciones de entrada están
ordenados por los atributos de join. En ese caso, esta estrategia suele ser la más eficiente y la que menos
memoria consume. En el caso de que los datos no estén ordenados, será posible la utilización de esta
técnica de join si las fuentes involucradas son todas bases de datos (accedidas a través de los wrappers
JDBC u ODBC) ya que en ese caso DataPort puede recuperar los datos ordenados de las fuentes origen. Si
se intenta forzar el uso de esta estrategia en un caso en el que no sea aplicable, DataPort producirá un
mensaje de error.
•
NESTED: Este método de ejecución obtiene en primer lugar las tuplas de la primera relación de entrada
que verifican la condición de join y posteriormente, para cada combinación de valores obtenida para los
atributos que participan en el join, se emite una sub-consulta que obtiene las tuplas que se corresponden
con dicha combinación de valores en la segunda relación de entrada. En el caso de que la segunda relación
de entrada provenga de una base de datos, DataPort optimizará este proceso emitiendo una sola subconsulta que recupere todos los datos necesarios de la segunda relación. Este método suele ser altamente
eficiente cuando la primera relación de entrada es relativamente pequeña con respecto a la segunda y,
además, la latencia por consulta de la segunda fuente es baja. Al utilizar este método es especialmente
importante el orden de las relaciones de entrada de forma que la primera sea la de menor tamaño
esperado.
•
NESTED PARALLEL: Este método de ejecución es similar al método NESTED. La diferencia es que
las sub-consultas emitidas sobre la segunda relación de entrada pueden emitirse en paralelo, mientras que
en el caso de NESTED se emiten secuencialmente. Admite un parámetro adicional que especifica el
número máximo de sub-consultas emitidas en paralelo.
•
HASH. Este tipo de join suele ser el más eficiente cuando los datos en las relaciones de entrada no están
ordenados y son grandes. También suele ser el más eficiente cuándo los tiempos de latencia de consulta
de las fuentes de las que proceden los datos son altos (e.g. fuentes web), ya que este tipo de join minimiza
el número de sub-consultas efectuadas sobre las fuentes.
Al crear una vista de tipo join o al escribir una consulta es posible especificar el método de ejecución deseado
especificando los modificadores NESTED, NESTED PARALLEL, MERGE o HASH. Ejemplos:
FROM
FROM
FROM
FROM
view1
view1
view1
view1
HASH JOIN view2 ON (joinCondition)
MERGE LEFT OUTER JOIN view2 ON (joinCondition)
NESTED NATURAL INNER JOIN view2
NESTED PARALLEL JOIN 5 view2 ON (joinCondition)
Nótese cómo en el ultimo ejemplo se limita a 5 el número máximo de subconsultas en paralelo ejecutadas mediante
el método NESTED PARALLEL.
Adicionalmente es possible fijar el orden deseado de las relaciones de entrada utilizando los modificadores
ORDERED (indica que las relaciones de entrada deben considerarse en el orden especificado en la cláusula join) y
REVERSEORDER (indica que las relaciones de entrada deben considerarse en el orden inverso al especificado en
la cláusula join). Ejemplos:
FROM view1 NESTED ORDERED JOIN view2 ON (joinCondition)
FROM view1 NESTED REVERSEORDER LEFT OUTER JOIN view2 ON (joinCondition)
Características Avanzadas
136
Virtual DataPort 4.0
18.2.1.1
Guía Avanzada de VQL
Elección dinámica de la estrategia de join
Cuando se ejecuta una consulta que utiliza en su claúsula FROM vistas derivadas y la definición de dichas vistas
derivadas involucra operaciones de join, es posible especificar dinámicamente una estrategia de ejecución para cada
una de estas operaciones (cambiando sólo para esta consulta la estrategia que se hubiese especificado en el
momento de creación de la vista).
Para especificar dinámicamente la estrategia de ejecución debe utilizarse la cláusula CONTEXT con la opción
QUERYPLAN. Asimismo es también posible utilizar la sentencia ALTER VIEW (ver sección 7.1) para modificar
la estrategia de ejecución de los joins que participan en la definición de una vista determinada. La sintaxis formal de
la opción QUERYPLAN puede verse en la Figura 103 .
QUERYPLAN = <query_plan>
<query plan> ::= { }
| [<view name:identifier> : <view plans>]+
<view plans> ::= <view plan>
| [ ( [<view plan>] ) ]+
<view plan> ::= <any method type> <any order type>
| NESTED PARALLEL [nestedParallelNumber:integer] <any order type>
<any method type> ::= <method type> | ANY
<any order type> ::= <order type> | ANY
<method type> ::= HASH | NESTED | MERGE
<order type> ::= ORDERED | REVERSEORDER
Figura 103
Sintaxis de QUERYPLAN
Considérese el siguiente ejemplo. Supongamos tres relaciones base V1, V2 y V3. V1 está compuesta por los
atributos A y B, V2 por los atributos B y C, y V3 por los atributos C, D y E. Supongamos ahora que se ejecutan las
siguientes sentencias VQL:
CREATE VIEW V4 AS
SELECT A,B,C
FROM V1 MERGE JOIN V2 USING (B)
y
CREATE VIEW V5 AS
SELECT A,B,C,D,E
FROM V4 NESTED ORDERED JOIN V3 USING (C)
WHERE A>a
La Figura 104 muestra el árbol de definición de la vista V5 (este árbol puede obtenerse fácilmente con ayuda de la
herramienta de administración gráfica de Virtual DataPort. Ver [3]). Cómo puede verse hay dos operaciones de join
que forman parte del árbol: la utilizada al crear la vista intermedia V4 (dónde se fuerza el método de ejecución
MERGE) y la utilizada para crear V5 (dónde se fuerza el método de ejecución NESTED con V4 como primera
relación).
Características Avanzadas
137
Virtual DataPort 4.0
Figura 104
Guía Avanzada de VQL
Árbol de definición de la vista V5
Supóngase ahora que se desea ejecutar la consulta VQL:
SELECT * FROM V5 WHERE D=d
En este caso puede desearse forzar una estrategia de ejecución diferente para los joins que componen el árbol de
V5. Por ejemplo, es posible que haya muy pocas tuplas en V3 que verifiquen la nueva condición D=d, con lo cuál
sería esperable que entren al join de creación de V5 menos tuplas por parte de V3 que por parte de V4. En esas
condiciones, y sólo para esta consulta, sería deseable cambiar el orden de las relaciones de entrada para que V3 sea
considerada como primera relación y V4 como segunda.
Esto puede hacerse mediante la opción QUERYPLAN de la cláusula CONTEXT. Para cada operación join que haya
en el árbol de nuestra consulta, podemos especificar el nombre de la vista intermedia que la utiliza y la preferencia
para el método de ejecución y el orden de las relaciones de entrada. ANY se utiliza para indicar que se desea que la
elección la realice DataPort.
Así, en nuestro ejemplo podríamos forzar para esta consulta que el join de creación de V5 se realice con el orden
deseado:
SELECT * FROM V5 WHERE D=d
CONTEXT ('QUERYPLAN ' = 'V5:NESTED REVERSEORDER')
También sería posible cambiar la estrategia de ejecución del join utilizado para crear V4. Por ejemplo, si
deseásemos cambiar dicha estrategia para utilizar el método HASH y dejando que sea DataPort quién escoja el
orden de las relaciones de entrada, escribiríamos:
SELECT * FROM V5 WHERE D=d
CONTEXT ('QUERYPLAN ' = 'V5:NESTED REVERSEORDER V4:HASH ANY ')
Características Avanzadas
138
Virtual DataPort 4.0
Guía Avanzada de VQL
Cómo ya se ha comentado, la opción QUERYPLAN está también disponible en la sentencia ALTER VIEW para
modificar las estrategias de ejecución de los joins involucrados en la definición de una vista determinada. Por
ejemplo, si deseásemos modificar las estrategias de ejecución de los joins de la vista V5 podríamos escribir:
ALTER VIEW V5 QUERYPLAN = V5:NESTED REVERSEORDER V4:HASH ANY;
18.2.2
Uso de la Cache
Los comandos de modificación de una relación base (ALTER TABLE. Ver sección 5.1) y de modificación de una
vista (ALTER VIEW. Ver sección 7.1) permiten activar el sistema cache (opción CACHE) para, respectivamente,
una relación base o una vista derivada. En ese caso se materializarán en la base de datos local que actúa como
cache las tuplas que se vayan obteniendo como resultado de la ejecución de consultas sobre la vista. El comando
ALTER DATABASE (ver sección 12.3.2) permite fijar la configuración por defecto para las relaciones base y las
vistas de una base de datos determinada.
Nótese, que si una vista tiene activada esta opción, puede utilizarse también para la realización de precargas
periódicas simplemente ejecutando sobre la relación, con la periodicidad que se desee, una consulta que obtenga los
datos a precargar.
El sistema caché permite configurar dos tipos de comportamiento diferentes:
Caché de consulta exacta: En este caso el sistema indicará un acierto caché sólo si previamente se ha
realizado una consulta idéntica a la actual. Este modo será el utilizado al utilizar la opción CACHE ON en
los comandos antes mencionados.
Caché de consulta más general: (opción CACHE POST). Si esta opción está habilitada, el sistema
detectará si una consulta dada puede ser contestada en función de otra consulta previa (aunque ésta no
sea igual a la nueva consulta), mediante la aplicación de una serie de operaciones de post-procesado. Por
ejemplo, si los resultados de una consulta previa select * from view where field1 = a
están en la cache y el sistema recibe la query select * from view where field1 = a
and field2 = b, sería posible responderla tomando como base los resultados de la primera
consulta y aplicando una operación de post-procesado que elimine aquellas tuplas en las cuáles no se
cumpla que field2 = b. Si esta opción se encuentra deshabilitada, el sistema sólo utilizará la cache
si la consulta recibida es la misma que alguna consulta previa.
El uso de esta opción puede no ser deseable si un wrapper no devuelve siempre todos los resultados de
una consulta efectuada sobre una determinada fuente. Por ejemplo, si un wrapper que accede a una fuente
web devuelve sólo los primeros 100 resultados devueltos por la fuente para la consulta select *
from view where field1 = a , entonces el resultado de aplicar la condición de postprocesado (field2 = b) sobre los resultados de la consulta puede ser diferente del resultado
obtenido al ejecutar directamente sobre la fuente select * from view where field1 =
a and field2 = b.
Si no se desea utilizar la caché en la relación base, basta usar la opción CACHE OFF. También se permite la
modificación del tiempo de vida de los datos en caché, es decir, el timeout de expiración de los datos en la caché,
utilizando la propiedad TIMETOLIVEINCACHE (expresado en segundos).
18.2.2.1
Uso de DELEGATEUNNAMEDVIEWS con Cache
La cláusula CONTEXT permite modificar el contexto de ejecución para una consulta determinada (ver sección 6.8).
Entre sus opciones incluye el parámetro DELEGATEUNNAMEDVIEWS, cuyo uso presenta ciertas implicaciones
en el comportamiento de la cache. Dichas implicaciones se describen en esta sección.
El parámetro DELEGATEUNNAMEDVIEWS puede tomar los valores ‘YES’ o ‘NO’. Si no se indica, se asume el
valor ‘YES’.
Características Avanzadas
139
Virtual DataPort 4.0
Guía Avanzada de VQL
Al crear vistas utilizando la herramienta de administración gráfica de Virtual DataPort, es posible que el sistema cree
vistas intermedias adicionales (normalmente, de tipo proyección). Estas vistas reciben un nombre interno creado por
DataPort y, por ello, se denominan “vistas sin nombre”. Por ejemplo, supóngase que se crea gráficamente una vista
tipo unión a la que llamaremos U, que se obtiene en base a dos vistas A y B. Si durante el proceso de creación
gráfica de la vista, el usuario elimina un atributo de la vista unión procedente de la vista base A, DataPort añadirá
transparentemente al árbol de U una vista proyección sin nombre por encima de A.
DataPort también puede generar una vista sin nombre cuando se ejecuta una consulta que realiza una proyección o
agregación sobre una vista existente. Por ejemplo, considérese la siguiente consulta:
SELECT ATTR1, ATTR2 FROM VIEW
Para ejecutar esta consulta, DataPort creará por encima de VIEW una vista proyección temporal sin nombre, que
será la encargada de quedarse con los atributos ATTR1 y ATTR2 (en este sentido, es interesante notar que una
consulta como SELECT * FROM VIEW no requiere crear ninguna vista adicional).
Por otro lado, DataPort intenta delegar siempre la mayor cantidad de procesamiento que sea posible a las fuentes de
datos origen para optimizar los tiempos de ejecución de consultas. En ciertos casos, la delegación a la fuente de las
operaciones efectuadas por las vistas sin nombre puede llevar a que en ciertas consultas no se utilice la cache de
una vista, incluso aunque la cache haya sido activada. En estos casos, el usuario puede decidir fijar el valor de esta
propiedad a ‘NO’.
Considérese el ejemplo anterior de una vista unión U compuesta a partir de las vistas base A y B. A se corresponde
con una tabla en una base de datos relacional mientras que B se corresponde con una operación de un Servicio Web.
Al crear U gráficamente, se eliminó un atributo procedente de la vista A, por lo que en el árbol de U DataPort
introdujo una vista proyección sin nombre sobre A. Supóngase también que la cache está activada para la vista A.
Si ahora se ejecuta una consulta sobre U, la cache de A nunca entrará en funcionamiento. La razón es la siguiente:
DataPort, al alcanzar durante el proceso de ejecución el nodo del árbol de U correspondiente la vista proyección sin
nombre por encima de A, detectará que es posible delegar a la base de datos fuente tanto la subconsulta que el plan
de ejecución especifique sobre A como la proyección sin nombre a aplicar sobre ella. Por lo tanto, el proceso de
ejecución no descenderá hasta el nodo que representa a la vista base A y no se considerará su cache.
Por el contrario, si se escoge la opción ‘NO’ para DELEGATEUNNAMEDVIEWS, DataPort no delegará a la fuente
las operaciones que se corresponden con proyecciones sin nombre. Por lo tanto, en nuestro ejemplo, la cache de A sí
sería considerada.
18.2.3
Configuración de Políticas de “Swapping”
Durante la ejecución de consultas que involucren el manejo y combinación de grandes volúmenes de datos es posible
que DataPort precise realizar de forma automática operaciones de “swapping” a disco para evitar posibles errores de
desbordamiento de memoria.
Los comandos de modificación de una relación base (ALTER TABLE. Ver sección 5.1), de modificación de una
vista (ALTER VIEW. Ver sección 7.1) y de ejecución de una consulta (cláusula CONTEXT del comando SELECT.
Ver sección 6.8) permiten habilitar o deshabilitar el swapping a disco de resultados intermedios mediante la opción
SWAP ON o SWAP OFF. El comando ALTER DATABASE (ver sección 12.3.2) permite fijar la configuración
por defecto para las relaciones base y las vistas de una base de datos determinada.
DataPort realizará “swapping”cuándo se haya escogido SWAP ON y además algún resultado intermedio producido
durante la ejecución de la consulta o vista supere un determinado tamaño máximo. Este tamaño puede indicarse (en
Características Avanzadas
140
Virtual DataPort 4.0
Guía Avanzada de VQL
megabytes) utilizando la opción SWAPSIZE de los comandos anteriormente mencionados (el valor por defecto es
de 50 Mb).
Para evitar operaciones de acceso a disco innecesarias que pueden ralentizar la ejecución, puede ser conveniente
deshabilitar el swapping para una determinada vista o para una determinada consulta en la que no se prevean
desbordamientos de memoria.
También puede ser conveniente incrementar para una vista o consulta el valor de SWAPSIZE. Esto es útil cuando
es posible que algún resultado intermedio supere el valor por defecto pero, aún en ese caso, sabemos que el sistema
tendrá memoria suficiente para que no se produzca un desbordamiento. Como norma general, se recomienda que el
valor de SWAPSIZE no sea mayor que la tercera parte de la memoria disponible para la máquina virtual JAVA en la
que se ejecuta el servidor DataPort.
Ejemplos:
1) Deshabilitar el swapping en una vista:
ALTER VIEW V SWAP OFF;
2) Habilitar el swapping en una vista, fijando un SWAPSIZE de 100 Mb:
ALTER VIEW V SWAP ON SWAPSIZE 100;
3) Ejecutar una consulta deshabilitando el swapping:
SELECT … CONTEXT ('SWAP' = 'OFF')
4) Ejecutar una consulta con swapping habilitado y un SWAPSIZE de 100 Mb:
SELECT … CONTEXT ('SWAP' = 'ON', 'SWAPSIZE'= '100' )
18.3
CREACIÓN DE CONFIGURACIONES DE INTERNACIONALIZACIÓN
Virtual DataPort puede trabajar con datos que provienen de un conjunto de paises/localizaciones diferentes. Para
cada uno de los paises/localizaciones de los que pueden proceder los datos que maneja el servidor, existe una
configuración de internacionalización, que se representa por medio de un mapa. Existen varios parámetros
configurables para cada una de las localizaciones contempladas. Algunos ejemplos de parámetros configurables son:
moneda, símbolos utilizados como separadores decimales y de miles para la moneda, formato de fecha, etc.
Si bien DataPort incluye configuraciones de internacionalización ya creadas para las situaciones más comunes, crear
nuevas configuraciones es un proceso muy sencillo. Esta sección describe detalladamente dicho proceso.
Los parámetros de internacionalización de una localización se pueden dividir en varios grupos. A continuación se
citan los diferentes grupos y se describen en detalle cada uno de los parámetros que los componen:
NOTA: Los parámetros de internacionalización no son sensibles a mayúsculas y minúsculas; por ejemplo,
“timeZone” y “timezone” corresponden a la misma clave.
•
Genéricos
o
language – Indica el lenguaje que se utiliza en esta localización. Es un código ISO de lenguaje
válido. Estos códigos se especifican con dos letras en minúsculas tal y como se define en ISO-639
[1]. Ejemplos: es (Español), en (Inglés), fr (Francés).
Características Avanzadas
141
Virtual DataPort 4.0
•
•
o
country – Especifica el país asociado a esta localización. Es un código ISO de país válido. Estos
códigos se corresponden con dos letras en mayúsculas, definidos por ISO-3166 [2]. Ejemplos:
ES (España), ES_EURO (España con moneda EURO), GB (Inglaterra), FR (Francia), FR_EURO
(Francia con moneda EURO), US (Estados Unidos).
o
timeZone – Indica la franja horaria de la localización (e.g., Europe/Madrid para España =
GMT+01:00 = MET = CET).
Configuración de la moneda: Permite configurar diferentes propiedades de los valores de tipo money.
o
currencyDecimalPosition – Número de decimales que admite la moneda de la localización.
Por ejemplo, para el euro este valor es 2.
o
currencyDecimalSeparator – Carácter que se utiliza como separador decimal en la moneda.
Por ejemplo, el separador decimal para el euro es la coma.
o
currencyGroupSeparator – Separador de grupos en la moneda que se utiliza para la
localización. Por ejemplo, para el euro el separador de grupos es el punto.
o
currency – Nombre de la moneda. Ejemplo: EURO, LIBRA, FRANCO.
o
moneyPattern – Especifica el formato para las monedas. Para el formato de monedas siempre
se utiliza la coma como separador de miles y el punto como separador de decimales. El carácter
‘¤’ representa el símbolo de la moneda, e indica en qué lugar se debe posicionar el carácter o
caracteres que lo representa. Ejemplo: ###,###,###.## ¤. Para analizar las monedas se
utilizan los patrones que define la clase java.text.DecimalFormat, de la API
estándar Java Developer Kit (véase su documentación Javadoc [9] para más información).
Configuración del tipo de dato time:
o
•
Guía Avanzada de VQL
timePattern – Unidad de tiempo en la que se expresan los valores de este tipo en esta
localización. Los valores posibles son: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH y
YEAR.
Configuración de fechas: Configuración del tipo de dato date.
o
Símbolo
G
y
M
datePattern – Indica el formato para las fechas. Para especificar el formato de fechas, se
utilizan caracteres ASCII para indicar las diferentes unidades de tiempo. En la Tabla 8 se muestra
el significado de cada uno de los caracteres reservados que se utilizan en el formato de una
fecha, su presentación y un ejemplo de su utilización. Ejemplo de un formato de fecha: d-MMMyyyy H'h' m'm'. Para más información, ver [9], clases java.text.DateFormat y/o
java.text.SimpleDateFormat.
Significado
Especifica una Era
Año
Mes en año
Características Avanzadas
Presentación
(Texto)
(Número)
(Texto & Número)
Ejemplo
AD
1996
July & 07
142
Virtual DataPort 4.0
d
h
H
m
s
S
E
D
F
w
W
a
k
K
z
'
''
Día en mes
Hora en am/pm (1~12)
Hora en día (0~23)
Minuto en hora
Segundo en minuto
Milisegundo
Día de la semana
Día del año
Día de la semana en el mes
Semana del año
Semana en mes
Marca de am/pm
Hora en el día (1~24)
Hora en am/pm (0~11)
Zona horario
Carácter de escape para texto
Comilla simple
Tabla 8
Guía Avanzada de VQL
(Número)
(Número)
(Número)
(Número)
(Número)
(Número)
(Texto)
(Número)
(Número)
(Número)
(Número)
(Texto)
(Número)
(Número)
(Texto)
(Delimitador)
(Literal)
10
12
0
30
55
978
Tuesday
189
2(2nd Web in July)
27
2
PM
24
0
Pacific Standard Time
‘
Caracteres reservados para el formato de una fecha
En la Tabla 8, para indicar la presentación de los caracteres reservados, se utilizan diferentes valores.
El formato concreto de representación de salida depende del número de repeticiones de los diferentes
elementos:
o
Texto: con 4 o más caracteres para utilizar forma completa; menos de 4 caracteres para
utilizar la forma abreviada.
o
Número: utiliza el mínimo número de dígitos posibles. A los números más cortos se le añaden
los 0’s a su izquierda. El año es un caso especial: si el número de ‘y’ es 2, el año se truncará a 2
dígitos.
o
Texto & Número: 3 o más caracteres para representarlo como texto; en otro caso usa un
número.
En un formato de fecha, los caracteres que no se encuentran en los rangos ['a'..'z'] ni
['A'..'Z'], se consideran como texto entrecomillado. Es decir, caracteres como ':', '.', ' ',
'#' y '@' aparecerán en la fecha resultante incluso aunque no vayan entrecomillados en el texto de
formato.
•
Configuración de los números reales: Permiten configurar los tipos de datos float y double.
o
doubleDecimalPosition – Indica el número de posiciones decimales a utilizar para representar
un valor de tipo double o float (un número real).
o
doubleDecimalSeparator – Representa al separador de decimales que se utiliza en un número
real.
o
doubleGroupSeparator – Especifica cual es el separador de grupos para los números reales.
A continuación se muestra la sentencia necesaria para la creación de la configuración de internacionalización
es_euro, que contiene los valores utilizados habitualmente en España:
CREATE MAP i18n i18n_es_euro (
Características Avanzadas
143
Virtual DataPort 4.0
Guía Avanzada de VQL
'language' = 'es'
'country' = 'ES_EURO'
'timezone' = 'Europe/Madrid'
'currencydecimalposition' = '2'
'currencydecimalseparator' = ''
'currencygroupseparator' = ''
'currencysymbol' = ''
'currency' = 'EURO'
'timepattern' = 'DIA'
'datepattern' = 'd-MMM-yyyy H\'h\' m\'m\''
'moneypattern' = '###,###,###.## ¤'
'doubledecimalposition' = '2'
'doubledecimalseparator' = ''
'doublegroupseparator' = ''
);
Figura 105
18.3.1
Internacionalización es_euro
Acceso y Mantenimiento de la Información de Cambio de Divisas
Los valores de cambio de divisas que se utilizan para la conversión de monedas, se obtienen a través de una vista
predefinida dentro de la base de datos admin de Virtual DataPort llamada CURRENCY. La vista CURRENCY
posee tres campos para especificar el nombre de un país (COUNTRY), el cambio de su moneda con respecto al euro
(CHANGE) (es decir, cuántas unidades de esa moneda constituyen un euro) y una descripción (DESCRIPTION).
Los tres campos son de tipo text. El formato para los códigos de país es el de un código de país ISO válido [2].
DataPort podrá realizar conversiones entre cualesquiera monedas para las que exista una entrada válida en la vista
CURRENCY.
Para alimentar automáticamente la vista CURRENCY con datos actualizados pueden importarse en el sistema
fuentes externas que proporcionen esta información. Por ejemplo la web del Banco Central Europeo [7] proporciona
los cambios con respecto al euro de las principales monedas del mundo en formatos HTML, XML y CSV. El conversor
de divisas on-line OANDA [8] también proporciona información a este respecto. Por defecto, la vista CURRENCY
contiene los valores de cambio fijo de varias antiguas monedas europeas con respecto al EURO.
18.4
CONTEXTO DE EJECUCIÓN DE UNA CONSULTA Y CADENAS DE INTERPOLACIÓN
En esta sección se describen los conceptos de contexto de ejecución y cadena de interpolación. Estos instrumentos
se utilizan en Virtual DataPort para parametrizar ciertas expresiones utilizadas por el wrapper o el datasource
asociado a una determinada relación base en función de las consultas efectuadas sobre dicha relación (véase
sección 17).
El contexto de ejecución de una consulta está compuesto por un conjunto de variables que toman la forma de pares
clave-valor, dónde tanto la clave como el valor son cadenas de caracteres. Cuando se ejecuta una determinada
consulta, por cada condición de consulta se añade una variable al contexto. El nombre asociado a esta variable es el
nombre del atributo junto con el operador utilizado en la condición, separados por el carácter ‘#’
(ATRIBUTO#operador). El valor asociado a la variable será el valor indicado en la parte derecha de la
condición. Si la consulta sólo incluye una condición de consulta para ese atributo, puede utilizarse también el nombre
de variable ATRIBUTO, sin especificar operador.
NOTA: La variables pueden funcionar incorrectamente cuándo el wrapper reciba más de una condición de consulta
utilizando el mismo atributo y operador.
Características Avanzadas
144
Virtual DataPort 4.0
Guía Avanzada de VQL
Las variables contenidas en el contexto de ejecución pueden utilizarse en las denominadas cadenas de interpolación.
Una cadena de interpolación es una expresión en función de las variables del contexto de ejecución, que genera
como resultado una cadena de caracteres. Una variable en una cadena de interpolación debe especificarse prefijada
con el símbolo “@”, seguido del nombre de la variable, siempre que dicho nombre sea una cadena de caracteres
alfanumérica (letras y los caracteres ‘#’ y ‘_’). Pueden especificarse variables cuyo nombre incluya cualquier otro
carácter, aunque no sea alfanumérico, incluyendo el nombre entre los símbolos “@{“ y ‘}’.
NOTA: Cuando en las partes constantes de la cadena de interpolación aparezca alguno los símbolos ‘@’, ‘\’, ‘^’,
‘{‘, ‘}’, deben ser escapados con el carácter ‘\’ (i.e. \@, \\, \^, \{, \}). Nótese que esto implica que al
especificar rutas de tipo fichero local en Sistemas Operativos Windows es necesario escapar el carácter ‘\’ como
‘\\’.
Considérense el siguiente ejemplo a efectos de obtener una idea intuitiva del funcionamiento de las cadenas de
interpolación.
Ejemplo: Supongamos que tenemos un servidor web que permite acceder a ciertos informes de los departamentos
de una determinada empresa codificados en XML. La ruta para acceder al informe de cada departamento es la misma
excepto por el nombre del fichero, que coincide con el nombre del departamento (e.g.
http://examplesite.com/exampleroute/reports/DPT1.xml
http://examplesite.com/exampleroute/reports/DPT2.xml ...).
Supongamos ahora que deseamos construir una relación base de DataPort que nos permita acceder a dichos
informes. Para ello deberemos crear un datasource de tipo XML (ver sección 17.3.4) y un wrapper de tipo XML (ver
sección 17.4.7). Deseamos que esta relación base (a la que llamaremos DPT_REPORTS) contenga una tupla para
cada departamento. Cada tupla tendrá dos atributos: DPT_NAME (de tipo text) y REPORT (que contendrá los
datos del informe. Tipicamente este atributo será de un tipo compuesto DataPort. Ver sección 18.1).
A la hora de crear el datasource para esta relación base, nos surge el problema de que el fichero de datos que debe
accederse depende de a qué departamento se refiere la consulta efectuada. Para solucionar este problema
podríamos especificar en el parámetro ROUTE una ruta http con una cadena de conexión como:
http://examplesite.com/exampleroute/reports/@{DPT_NAME}.xml
De esta forma, podríamos ejecutar consultas tales como:
SELECT REPORT FROM DPT_REPORTS WHERE DPT_NAME = ‘DptName’
Y el sistema accedería transparentemente a los datos del fichero correspondiente al departamento especificado para
contestar la consulta. Por ejemplo, para la consulta anterior la ruta accedida sería:
http://examplesite.com/exampleroute/reports/DptName.xml
Por último, cuando una variable de interpolación tiene como valor una lista de elementos (esto ocurre en los casos de
operadores que permiten una lista de valores como operandos), el valor asociado a la variable será la concatenación
de los elementos simples separados por el carácter ‘+’. Esto puede ser utilizado en la parametrización de ciertos
aspectos de los wrappers ITPilot (ver sección 17.4.5).
Características Avanzadas
145
Virtual DataPort 4.0
19
Guía Avanzada de VQL
APÉNDICES
19.1
SINTAXIS DE EXPRESIONES DE BÚSQUEDA DEL OPERADOR CONTAINS
Esta sección describe la sintaxis de expresiones de búsqueda del operador contains de DataPort.
19.1.1
Términos y Frases exactas
Una consulta se compone de términos y operadores. Existen dos tipos de términos: Términos Individuales y Frases
exactas.
Un Término Individual es una única palabra. Una frase es un grupo de palabras entre comillas dobles. Los términos
pueden combinarse entre sí mediante el uso de operadores Booleanos para formar consultas complejas (véase más
abajo).
19.1.2
Modificadores de términos
Se admite el uso de los siguientes modificadores:
19.1.2.1
Comodines de búsqueda
El símbolo “?” sustituye el ? por un único carácter en la palabra. El símbolo “*” sustituye el * por 0 o más
caracteres. Por ejemplo, si se desea buscar “información” o “informática”, se introduciría el siguiente término:
inform*
19.1.2.2
Búsquedas difusas (Fuzzy Searches)
Se permiten búsquedas difusas (las fuentes pueden implementar esta funcionalidad utilizando, por ejemplo, técnicas
de distancia de edición de cadenas). Para realizar búsquedas difusas es necesario usar el símbolo "~" al final de un
término sencillo. Por ejemplo, para buscar términos que se escriban de forma similar a "tarjeta" se usaría la siguiente
búsqueda difusa:
Tarjeta~
Esta encontraría términos como “tarjta”.
Se puede añadir un parámetro (opcional) que especifique la similitud mínima requerida. Por ejemplo:
tarjeta~0.8
19.1.2.3
Búsquedas por proximidad
Se permiten búsquedas de términos entre los que haya cierta cercanía espacial. Para realizarla se utiliza el símbolo
"~" al final de una frase exacta. También se puede especificar el número máximo de palabras que pueden separar los
Apéndices
146
Virtual DataPort 4.0
Guía Avanzada de VQL
términos. Por ejemplo, para buscar "denodo" y "technologies" con una distancia de hasta 8 palabras en el mismo
documento se utilizaría la búsqueda:
"denodo technologies"~8
19.1.2.4
Búsquedas por rango
Las búsquedas por rango permiten recuperar documentos cuyo/s valores se encuentren dentro de un rango
determinado. El rango especificado puede incluír los límites inferior y superior o no. Los rangos inclusivos se
especifican mediante corchetes y los exclusivos mediante llaves. La clasificación se lleva a cabo siguiendo el orden
lexicográfico. Por ejemplo:
[20020101 TO 20030101]
Esta consulta encuentra los documentos cuyo valor posea valores entre 20020101 y 20030101, inclusive. La
búsqueda por rango no está limitada a los campos que contengan fechas como valor:
{Aida TO Carmen}
Esta consulta recupera todos los documentos cuyos títulos se encuentren entre Aida y Carmen, no inclusive.
19.1.2.5
Aumento del nivel de relevancia de un término
Es posible aumentar el peso de un término de la búsqueda en el cálculo del nivel de relevancia utilizando el símbolo
"^" con un factor de incremento (un número) al final del término de búsqueda. Cuanto más alto sea ese factor más
relevante será ese término en la búsqueda.
Esto permite controlar la relevancia de un documento aumentando el nivel de relevancia de sus términos. Por
ejemplo, si se desea buscar
denodo technologies
y se desea que el témino "denodo" sea más relevante se utilizaría el símbolo ^ con un factor de aumento del nivel de
relevancia al lado del término:
denodo^4 technologies
Con esto se consigue que los documentos en los que aparece el témino "denodo" resulten más relevantes para la
búsqueda. Esta técnica también se puede utilizar con frases.
Apéndices
147
Virtual DataPort 4.0
Guía Avanzada de VQL
El factor de relevancia por defecto es 1. Debe ser un número positivo, pero puede ser menor que 1 (por ejemplo 0.2).
19.1.3
Operadores Booleanos
Los operadores Booleanos permiten combinar términos mediante operadores lógicos. Se admiten los siguientes
operadores Booleanos: AND, OR, y NOT. (Nota: Los operadores Booleanos deben escribirse en mayúsculas).
19.1.4
Agrupaciones
Se permite el uso de paréntesis. Por ejemplo, para buscar "Corp" o "Inc" y "Denodo" se usaría la consulta:
(Corp OR Inc) AND denodo
19.1.5
Escapar caracteres especiales
La lista de caracteres especiales es:
(){}[]^"~*?:\
Para escapar estos caracteres se utiliza \ antes del carácter.
19.2
SOPORTE PARA EL OPERADOR CONTAINS DE CADA TIPO DE FUENTE
La sintaxis del lenguaje de búsqueda sobre información no estructurada utilizado con el operador contains se
describe en la sección 19.1. Sin embargo, es necesario tener presente que las opciones de búsqueda disponible
dependen de las capacidades proporcionadas nativamente por la fuente de datos. Por ejemplo, Google Mini no
soporta diversas características del lenguaje de búsqueda como, por ejemplo, las búsquedas por proximidad. Por lo
tanto, cuando se utilice el operador contains con atributos procedentes de fuentes Google Mini, dichas
capacidades no estarán disponibles.
Esta sección detalla con exactitud las capacidades de búsqueda soportadas para cada tipo de fuente. Estas
capacidades se especifican también en las Propiedades de Configuración de cada fuente de datos (ver sección
17.3.10.1) consultables mediante la sentencia DESC VIEW (ver sección 13).
En la actualidad, los tipos de fuente de datos que permiten el uso del operador contains son las fuentes de tipo
Aracne (ver sección 17.3.6), Google Mini (ver sección 17.3.7) y Custom (ver sección 17.3.9).
Las siguientes secciones describen, respectivamente las capacidades soportadas para los wrappers Aracne y Google
Mini. Los wrappers de tipo Custom pueden especificar qué capacidades soportan a través de las Propiedades de
Configuración (ver sección 17.3.10.1 y sección 17.4.11).
19.2.1
Aracne
Las siguientes características del lenguaje de búsqueda del operador contains no están soportadas en fuentes
de tipo Denodo Aracne:
-
Apéndices
Los comodines ? y * no pueden aparecer en la primera posición de un término.
Las búsquedas con el operador de proximidad ~ deben especificar obligatoriamente el número máximo de
palabras que pueden separar los términos de la frase.
148
Virtual DataPort 4.0
-
Guía Avanzada de VQL
Para funcionar correctamente, el operador lógico NOT debe aparecer al mismo nivel que un operador
lógico AND. Ejemplo: la búsqueda (term1 AND NOT term2) funcionaría correctamente, no así la
búsqueda (term1 OR NOT term2).
El resto de capacidades del lenguaje de búsqueda están soportadas en fuentes de tipo Denodo Aracne.
19.2.2
Google Mini
Las siguientes características del lenguaje de búsqueda del operador contains no están soportadas en fuentes
de tipo Google Mini:
-
-
Apéndices
Las búsquedas por frase exacta no están soportadas en el atributo site. Sí lo están en el resto de
atributos.
Los comodines, las búsquedas difusas, las búsquedas por proximidad, las búsquedas con aumento de
relevancia y las búsquedas por rango no están soportadas.
Las búsquedas con los operadores lógicos AND, OR y NOT en los atributos title, url y site sólo
son válidas si las condiciones son terminos simples o frases exactas (es decir, en las búsquedas sobre
estos atributos no es posible anidar condiciones lógicas). Esta restricción no existe para el resto de
atributos.
Para funcionar correctamente, el operador lógico NOT debe aparecer al mismo nivel que un operador
lógico AND. Ejemplo: la búsqueda (term1 AND NOT term2) funcionaría correctamente, no así la
búsqueda (term1 OR NOT term2).
149
Virtual DataPort 4.0
Guía Avanzada de VQL
BIBLIOGRAFÍA
[1] Código de lenguaje ISO-639 (http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt)
[2] Código de país ISO-3166 (http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html)
[3] Guía del Administrador de Virtual DataPort 4.0. Denodo Technologies, 2007.
[4] Documentación Javadoc de la API del Desarrollador. DENODO_HOME/docs/vdp/api/index.html
[5] Guía del Desarrollador de Virtual DataPort 4.0. Denodo Technologies, 2007.
[6] Manual de usuario de ITPilot 4.0. Denodo Technologies, 2007.
[7] Tabla de cambios de moneda del Banco Central Europeo http://www.ecb.int/home/eurofxref.htm
[8] Conversor de divisas on-line OANDA http://www.oanda.com
[9] Documentación Javadoc de la API estándar Java Developer Kit 1.4.2
[10] Microsoft Internet Explorer. http://www.microsoft.com/windows/ie/default.asp
[11] Expresiones regulares en JAVA. http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
[12] Formatos de fecha JAVA. http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
[13] XPath Language. http://www.w3.org/TR/xpath
[14] X/Open Company Ltd. Distributed Transaction Processing: The XA Specification. The Open Group, February 1992.
[15] Apache Lucene, http://lucene.apache.org/
[16] Guía de Administración de Denodo Aracne 4.0. Denodo Technologies 2007.
[17] Google Mini. http://www.google.com/enterprise/mini/
[18] Lenguajes soportados por Google Mini.
http://code.google.com/enterprise/documentation/xml_reference.html#request_subcollections_auto
Apéndices
150
Descargar