Manual de Uso JavaScriptSQL (versi�n 2.1)
Otros manuales disponibles:- Manual de uso de la librería JSBD_Conversor
- Manual de uso de la librería JSBD_Indexador
- Descripción de la estructura de la JSBD
�ndice
- Dise�o Inicial
- Funcionalidades
- Posibles Aplicaciones
- Requisitos e instalaci�n
- Ejemplo B�sico de Uso
- Referencias de la clase JSSQL
- Tipos de Datos
- Sintaxis SQL
- Uso de �ndices
- Indexado de documentos
- Particionado de Tablas
I. Dise�o Inicial
A continuaci�n se muestra el diagrama de dise�o inicial que describe la relaci�n entre los distintos m�dulos utilizados para el funcionamiento de la base de datos en JavaScript.
El funcionamiento b�sico de la base de datos para JavaScript consiste en generar mediante un conversor de bases de datos y un indexador de documentos los archivos de definiciones, tablas, �ndices y dem�s componentes de la base de datos JSBD. Luego el motor JSSQL permite acceder de manera eficiente a la base de datos JSBD mediante consultas SQL.
Cada uno de estos componentes o subsistemas est�n conformados por una o m�s clases a ser usadas por los desarrolladores. El conversor y el indexador est�n desarrollados en PHP mientras que el motor JSSQL esta desarrollado �ntegramente en JavaScript.
Una vez generada una base de datos JSBD, se pueden realizar consultas SQL mediante el motor JSSQL sin necesidad de acceder a ning�n otro motor de bases de datos y sin necesidad de utilizar ning�n lenguaje de scripting que funcione del lado del servidor (PHP, ASP, etc.).
II. Funcionalidades
El motor de base de datos JSSQL es una clase enteramente desarrollada en JavaScript que permite realizar consultas SQL sobre la base de datos JSBD generada a tal efecto.
JSSQL es un motor de base de datos solamente de consulta, una vez generada la base de datos no es posible agregar m�s registros ni tablas.
Las consultas que procesa SQL deben son de la forma:
SELECT
[DISTINCT]
* | expresi�n_de_select [ AS alias_campo ] [, ...]
FROM nombre_tabla [alias_tabla] [, ...]
[ WHERE condici�n_where ]
[ GROUP BY numero_campo [, ... ] [HAVING condici�n_having ] ]
[ ORDER BY numero_campo [ ASC | DESC ] [, ...] ]
[ LIMIT cantidad ]
Donde:
expresi�n_de_select:
Es una expresi�n o conjunto de funciones aplicadas sobre los campos de las tablas listadas en la cl�usula FROM. En estas expresiones pueden utilizarse funciones y operadores propios de JavaScript, funciones previamente definidas por el usuario o funciones de agregaci�n (COUNT, SUM, AVG) en caso de agrupar registros mediante la cl�usula GROUP BY. Por ejemplo "campo1" o "COUNT(pedidos)" o "nombre.ToUpperCase()".
condici�n_where:
Es una expresi�n que devuelve �nicamente los valores true o false, puede estar compuesta por campos de las tablas listadas en la cl�usula FROM. Pueden utilizarse funciones y operadores propios de JavaScript y funciones previamente definidas por el usuario.
condici�n_having:
Es una expresi�n que devuelve �nicamente los valores true o false, puede estar compuesta por campos o expresiones enumeradas en la cl�usula SELECT y marcadas como campos de agrupaci�n en la cl�usula GROUP BY. Pueden utilizarse funciones y operadores propios de JavaScript y funciones previamente definidas por el usuario.
numero_campo:
Es el n�mero de campo dentro del listado de campos del SELECT, estos n�meros no pueden repetirse dentro del listado definido en las cl�usulas ORDER BY y GROUP BY.
cantidad:
Es la cantidad m�xima de registros que se desea que devuelva la consulta.
La versi�n actual posee las siguientes caracter�sticas:
- Permite la consulta de datos offline sin intervenci�n de servidores WEB o servidores de bases de datos.
- Permite flexibilidad en la sintaxis SQL, aceptando el uso de alias de campos y tablas, es case-insensitive en las cl�usulas y campos y permite el uso de espacios m�ltiples, de manera de que la escritura de las sentencias SQL es sencilla e intuitiva.
- Permite el uso de todas las funciones y operadores de JavaScript de manera que su uso para desarrolladores JavaScript es totalmente intuitivo. Adem�s permite el uso de funciones definidas externamente por los usuarios.
- Permite la definici�n y uso de �ndices para acelerar las consultas.
- Permite la paginaci�n de tablas de manera que puedan utilizarse tablas de gran cantidad de registros sin sobrecargar la memoria utilizada por el navegador.
- Incluye funcionalidades para la b�squeda de texto dentro de documentos indexados mediante el indexador JSBD_Indexador y asociados mediante campos del tipo link en las tablas de la base de datos.
- Informa claramente los errores de sintaxis, de ejecuci�n y de carga de la base de datos y de las consultas SQL.
- Prover mecanismos de debug para ayudar en el desarrollo, mantenimiento y testeo del motor.
- Utiliza una estructura clara para la definici�n de las bases de datos y las estructuras de almacenamiento de los datos e �ndices. Utilizando estructuras compatibles con JSON.
- Su uso e instalaci�n es sencilla, de bajos requerimientos y compatible con los navegadores m�s utilizados.
III. Posibles Aplicaciones:
Cualquier tipo de aplicaci�n que requiera la consulta y b�squeda de documentos desconectada de una base de datos, por ejemplo:
- Un diccionario o enciclopedia.
- Un cat�logo.
- Una recopilaci�n de documentos.
- Cualquier aplicaci�n WEB con manejo de datos donde se necesite mayor dinamismo sin intervenci�n del servidor. Por ejemplo una tabla din�mica de datos (o planilla de c�lculos) que permita filtrar los valores presentados, realizar ordenamientos por los distintas columnas y realizar c�lculos auxiliares (sumas, subtotales, promedios, etc.)
- Un sistema de Business Intelligence (BI) donde los datos son agrupados por distintos campos mostrando de manera din�mica las distintas estad�sticas. Por ejemplo en una aplicaci�n de BI donde se analiza las ventas de una compa��a, poder ver de manera din�mica las ventas por pa�s, vendedor, tipo de cliente, producto, etc. Sin la necesidad de realizar reiteradas consultas al servidor.
IV. Requisitos e instalaci�n
El motor JSSQL funciona en la mayor�a de los navegadores modernos con JavaScrit habilitado, y fue probado formalmente en los siguientes navegadores:
- Firefox 4.0
- Internet Explorer 6.0
- Google Crome 5.0
Para utilizar JSSQL simplemente deber� copiar el archivo JSSQL.js al directorio donde desea instalarlo y copiar la base de datos JSBD en el directorio 'bases' dentro del directorio de instalaci�n.
Por ejemplo si el directorio de instalaci�n es 'basedir' y la base de datos JSBD se llama 'neptuno' se tiene la siguiente estructura de archivos
basedir\JSSQL.js
basedir\bases\neptuno\
Por defecto el directorio de almacenamiento de los archivos de la JSBD es 'bases', pero puede modificarse mediante el método SetBaseDir(BaseDir).
Dentro del directorio 'basedir\bases\neptuno\' se encuentran todos los archivos de definici�n de la base de datos.
Es recomendable crear la base de datos JSBD mediante el conversor desarrollado a tal efecto ( JSBD_Conversor) e indexar los campos del tipo link mediante el indexador desarrollado a tal efecto (JSBD_Indexador).
V. Ejemplo B�sico de Uso
A continuaci�n se muestra un ejemplo de c�mo utilizar la clase para realizar una consulta a la base de datos JSBD.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo de uso JSSQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<!-- AGREGADO DE LA CLASE JSSQL ------------------------------------------ --->
<script LANGUAGE="JavaScript1.2" type="text/javascript" SRC="JSSQL.js"></script>
<!-- ---------------------------------------------------------------------- --->
</head>
<body>
<script LANGUAGE="JavaScript1.2" type="text/javascript">
//Creacion del motor JSSQL
myJSSQL= new JSSQL();
//Apertura de la base de datos neptuno
if (!myJSSQL.Open('neptuno'))
{
alert(myJSSQL.GetError()); //si falla se muestra un mensaje de error
}
//Consulta SQL
sql="select nombrecompania as comp, nombrecontacto as cont, cargocontacto as cargo
from clientes order by 3, 2 desc" ;
//Ejecuci�n de la consulta
res=myJSSQL.Query(sql)
if(res===false)
{
//si falla se muestra un mensaje de error
alert( myJSSQL.GetError() );
}
else
{
//Impresi�n de resultados
for (i=0;i < res.length;i++){
document.write(res[i]["comp"]);
document.write(" | ");
document.write(res[i]["cont"]);
document.write(" | ");
document.write(res[i]["cargo"]);
document.write(" | <br>");
}
}
</script>
</body>
</html>
VI. Referencias de la clase JSSQL
A continuaci�n se describen los m�todos y atributos de la clase JSSQL
VI.i useDebug
Establece si se utiliza o no la generaci�n de informaci�n de debug. Como ser tiempos de respuesta, cantidad de registros devueltos, cantidad de registros recorridos, estructuras utilizadas, etc. Por defecto se encuentra activada. Al desactivar esta opci�n el motor ser� un poco m�s r�pido.
VI.ii useIndex
Establece si se analiza las condiciones del WHERE para utilizar los �ndices (de estar definidos), en caso de estar activado se supone que dichas condiciones est�n expresadas de una manera simple que impiden resultados inexactos (vea la secci�n "Uso de �ndices" para mas informaci�n). Por defecto se encuentra deshabilitada.
VI.iii docsMaxLen
Establece la cantidad m�xima de caracteres que puede tener una palabra en los �ndices de contenido. Si se realiza una b�squeda de una palabra con mayor cantidad de caracteres se la omite en la b�squeda.
VI.iv docsMinLen
Establece la cantidad m�nima de caracteres que puede tener una palabra en los �ndices de contenido. Si se realiza una b�squeda de una palabra con cantidad menor de caracteres se la omite en la b�squeda.
VI.v Open(JSBD)
Abre la base de datos JSBD, cargando en memoria las tablas de datos, �ndices y definiciones correspondientes.
Par�metros:
JSBD: Nombre de la base de datos JSBD a abrir.
Devuelve:
true/false en caso de poder o no abrir las estructuras correspondientes. Utilizar GetError() para obtener una descripci�n del error.
VI.vi Query(sql)
Ejecuta una consulta a la base de datos.
Par�metros:
Sql: Consulta SQL a ejecutar.
Devuelve:
Un array con el conjunto de registros resultantes, el array tiene la forma:
[
{"campo1":valor, "campo2":valor, (...) } , // Registro 1
(..)
{"campo1":valor, "campo2":valor, (...) } // Registro n
]
Devuelve false en caso de error. Utilizar GetError() para obtener una descripci�n del error.
VI.vii GetError()
Devuelve la descripci�n del �ltimo error generado.
VI.viii GetDebug()
Devuelve un array con los datos de debug generados en la �ltima consulta, el array tiene la siguiente estructura:
[
{"nombre_propiedad_1":["descripci�n", valor] } , // propiedad 1
(..)
{"nombre_propiedad_n":["descripci�n", valor] } // propiedad n
]
VI.ix GetDef()
Devuelve un array con la definici�n de las tablas de la base de datos abierta, la estructura es la definida para la JSBD.
VI.x SetBaseDir(BaseDir)
Setea el directorio donde se almacenan las bases de datos JSBD
Par�metros:
Basedir: Directorio de almacenamiento de las bases JSBD.
Devuelve:
true/false en caso de poder o no abrir las estructuras correspondientes. Utilizar GetError() para obtener una descripci�n del error.
VII. Tipos de Datos
Los tipos posibles de los campos de la base JSBD son los siguientes:
- numeric: n�meros enteros, o flotantes.
- string: cadenas de caracteres.
- boolean: variables l�gicas (true/false).
- date: tiempo expresado en cantidad de milisegundos desde el 01/01/1970.
- link: hace referencia a un documento cuyo contenido ha sido indexado.
VIII. Sintaxis SQL
Las consultas que procesa SQL deben son de la forma:
SELECT
[DISTINCT]
* | expresi�n_de_select [ AS alias_campo ] [, ...]
FROM nombre_tabla [alias_tabla] [, ...]
[ WHERE condici�n_where ]
[ GROUP BY numero_campo [, ... ] [HAVING condici�n_having ] ]
[ ORDER BY numero_campo [ ASC | DESC ] [, ...] ]
[ LIMIT cantidad ]
En todos los casos las cl�usulas, nombres de tablas, nombres de campos y alias son case-insensitive, es decir que la cl�usulas 'SELECT' y 'select' y 'SeLeCt' son v�lidas y son interpretadas de la misma manera.
Las funciones SUM, AVG, COUNT, CONTENT, ALL y ANY, son funciones definidas por el motor JSSQL y deben ser escritas en may�scula.
VIII.i. SELECT
A continuaci�n del SELECT debe incluirse un listado de expresiones que conforman los campos del resultado.
Haciendo referencia a los campos de una tabla:
select nombre, apellidos from empleados
Utilizando alias para las expresiones:
select nombre as N, apellidos as A from empleados
Cabe aclarar que no es correcto que se repitan los alias de las expresiones, si esto ocurre solo se devolver� el alias de la �ltima expresi�n.
INCORRECTO:
select nombre as N, apellidos as N from empleados
Utilizando el '*'
select * from empleados
select *, idempleado as ID2 from empleados
En las expresiones pueden utilizarse cualquier operador o funci�n definida fuera de la clase JSSQL
Utilizando operadores
select idempleado *2 as IDx2 , nombre + ' ' + apellidos as NombreCompleto
from empleados
Utilizando funciones y atributos de JavaScript
Select nombre.length , nombre.match(/nancy/i), "CONSTANTE" as C, escape(pais) as P
from empleados
Convirtiendo una fecha dentro de la consulta
Select nombre, (new Date(fechanacimiento)).getFullYear() as AnioNacimiento from empleados
Utilizando funciones externas. Suponiendo definidas las funciones pad() y DateFormat()
select pad(idempleado,4) as id, DateFormat(E.Fechanacimiento) as FechaNacimiento
from empleados E
VIII.ii. FROM
A continuaci�n del FROM se listan las tablas a ser incluidas en la consulta.
En caso de ser m�s de una tabla el motor recorre las tablas como un producto cartesiano.
Cada tabla puede asociarse a un alias de tabla
Select e.* from empleados e
El alias por defecto es el nombre completo de la tabla
Select empleados.idempleado from empleados
Juntando tablas
Select j.Apellidos, 'Es jefe de' as Relacion, e.apellidos
from empleados e, empleados j
where j.idempleado == e.jefe
(relaciona cada empleado con su jefe)
En caso de que no sean ambiguos los nombres de campos referidos en las expresiones del SELECT puede obviarse el uso de alias
Select nombreproducto, nombrecategoria
from categorias, productos
VIII.iii.WHERE
A continuaci�n del WHERE debe escribirse una expresi�n l�gica que devuelva true o false.
En esta expresi�n los operadores, funciones, m�todos y propiedades son los disponibles en JavaScript y los definidos externamente por los usuarios.
select nombre, apellidos from empleados
where apellidos.length>5 && (nombre=='Nancy' || nombre=='Andrew')
select nombre, apellidos from empleados
where nombre.match(/an/i) != null
Select nombre from empleados
where(new Date(fechanacimiento)).getFullYear() > 1960
En esta condici�n tambi�n puede hacerse referencia a los alias de tablas
Select nombreproducto, nombrecategoria from categorias c , productos p
where c.idcategoria == p.idcategoria &&
p.idcategoria != 5 && nombrecategoria != 'Bebidas'
En el caso de estar habilitado el uso de �ndices mediante la propiedad useIndex del motor JSSQL, hay que ser cuidadosos con las condiciones a utilizar, en algunos casos los resultados pueden ser inexactos. Vea mas adelante la secci�n "Uso de �ndices" para mas informaci�n.
VIII.iv. GROUP BY
A continuaci�n del GROUP BY debe listarse las expresiones que deben agruparse. Este listado debe contener �nicamente n�meros no repetidos donde cada uno haga referencia a una expresi�n del SELECT que no sea una funci�n de agregaci�n, es decir aquellas expresiones donde no se haga referencia a las funciones COUNT, AVG o SUM.
Al utilizar GROUP BY todas las expresiones del SELECT deben estar listadas en el GROUP BY o bien ser funciones de agrupaci�n.
Un GROUP BY sin funciones de agrupaci�n:
Select pais, ciudad from empleados group by 1,2
A continuaci�n las definiciones de las funciones de agrupaci�n
SUM(NombreCampo)
Descripcion:
Devuelve la suma de los valores agrupados del campo NombreCampo.
Par�metros:
NombreCampo: el nombre del campo a sumar (debe ser de tipo numeric)
Ejemplos:
select idpedido, SUM(cantidad) from detalledepedido group by 1
select SUM(cargo) from pedidos
COUNT(NombreCampo)
Descripcion:
Devuelve la cuenta de los valores agrupados del campo NombreCampo. En caso de que el nombre del campo sea '*' se cuentan todos los valores, caso contrario se cuentan todos los valores no nulos
Par�metros:
NombreCampo: el nombre del campo a contar (debe ser de tipo numeric), para contar todos los registros se puede utilizar la cadena '*'
Ejemplos:
select idpedido, COUNT('*') from detalledepedido group by 1
select COUNT(jefe) from empleados
(devuelve la cantidad de empleados con jefe no nulo)
select COUNT('*') from empleados
(devuelve la cantidad total de empleados)
AVG(NombreCampo)
Descripcion:
Devuelve el promedio de los valores agrupados del campo.
Par�metros:
NombreCampo: el nombre del campo a promediar (debe ser de tipo numeric)
Ejemplos:
select idpedido, AVG(cantidad) from detalledepedido group by 1
select AVG(cargo) from pedidos
VIII.v. HAVING
A continuaci�n del HAVING se escribe una condici�n l�gica donde se hace referencia a las expresiones del SELECT.
Esta condici�n es evaluada luego de realizarse el agrupamiento de los datos
select idproveedor, AVG(idproducto) from productos where idproveedor>=5
group by 1
having AVG(idproducto)>58
La �nica restricci�n es que la expresi�n debe citarse tal cual se encuentra en el SELECT
INCORRECTO:
select idproveedor, AVG(idproducto) from productos p group by 1 having AVG(p.idproducto) >58
No es correcto ya que 'AVG(idproducto)' no es igual a 'AVG(p.idproducto)'
VIII.vi. ORDER BY
A continuaci�n del ORDER BY se lista los n�meros de expresiones por las que se realizan el ordenamiento.
Todos los n�meros listados deben corresponde a un n�mero de expresi�n del SELECT, los n�meros no deben repetirse.
Ordenamiento simple
Select pais, ciudad from empleados order by 1
Ordenamiento multiple
Select pais, ciudad from empleados order by 1,2
Adicionalmente se puede agregar a cada n�mero de expresi�n ASD o DESC para indicar el orden ascendente o descendente respectivamente, el ordenamiento por defecto es ascendente.
Select pais, ciudad from empleados
order by 1 desc, 2 asc
VIII.vii. DISTINCT
Opcionalmente luego del SELECT puede indicarse la cl�usula DISTINCT, esto indica que deben devolverse los registros sin repetir los grupos de valores.
Select distinct pais from empleados
Devuelve los valores del campo pa�s
Select distinct pais, ciudad from empleados
Devuelve todos los valores posibles de la dupla (pa�s, ciudad) encontrado en la tabla empleados.
VIII.viii. LIMIT
Opcionalmente al final de la sentencia SQL puede usarse la cl�usula LIMIT para limitar la cantidad de registros resultantes, evitando una consulta muy extensa.
A continuaci�n de LIMIT se escribe el n�mero de registros m�ximos a devolver.
Select nombre from empleados limit 5
La cl�usula LIMIT termina la consulta una vez llegado a la cantidad de registros encontrados, por lo que puede entrar en conflicto con la cl�usula GROUP BY devolviendo resultados inexactos en las funciones de agrupaci�n.
Por ejemplo:
Suponiendo las siguientes ciudades de los empleados:
| IdEmpleado | Ciudad |
|---|---|
| 0 | Seattle |
| 1 | Tacoma |
| 2 | Kirkland |
| 3 | Redmond |
| 4 | Londres |
| 5 | Londres |
| 6 | Seattle |
| 7 | Londres |
| 8 | Londres |
Select ciudad, COUNT('*') from empleados
group by 1 limit 5
Devolver�:
| Reg. | ciudad | COUNT |
|---|---|---|
| 0 | Seattle | 1 |
| 1 | Tacoma | 1 |
| 2 | Kirkland | 1 |
| 3 | Redmond | 1 |
| 4 | Londres | 1 |
Select ciudad, COUNT('*') from empleados
group by 1
| Reg. | ciudad | COUNT |
|---|---|---|
| 0 | Seattle | 2 |
| 1 | Tacoma | 1 |
| 2 | Kirkland | 1 |
| 3 | Redmond | 1 |
| 4 | Londres | 4 |
IX. Uso de �ndices
Para el uso de �ndices se busca en la condici�n del WHERE expresiones del tipo campo=='valor', luego si el campo mencionado posee un �ndice se obtiene la lista de registros de la tabla asociados a dicho valor.
En caso de que todos los operadores utilizados sean && (AND) para todas las expresiones indexadas de la misma tabla se realiza una intersecci�n en la lista de registros filtrados.
En caso de que exista al menos un operador || (OR) el listado de registros a filtrar es la uni�n de los listados de los valores buscados.
Como se vio anteriormente, la condici�n del WHERE se eval�a en un �nico paso, lo que permite gran flexibilidad en la escritura de la sentencia SQL ya que permite el uso de funciones propias de JavaScript o bien definidas externamente por el usuario.
Al no limitar el uso de funciones no se puede realizar un parseo exhaustivo de la condici�n del WHERE. Esto hace imposible afirmar la exactitud de un resultado, al utilizar un �ndice, en todo el universo posible de consultas.
Por ejemplo suponiendo que se quiere evaluar la siguiente condici�n del WHERE
(nombre=='juan') || true
En este caso la evaluaci�n siempre seria verdadera, pero serian equ�voco utilizar un �ndice y restringir la b�squeda a aquellos registros donde el campo nombre sea igual a 'juan'.
Las condiciones pueden ser tan complejas como se deseen haciendo imposible determinar con exactitud en que momento debe utilizarse los �ndices.
Por este motivo el motor JSSQL permite el uso de �ndices para reducir el n�mero de iteraciones y de evaluaciones, pero esta funcionalidad debe ser habilitada mediante la propiedad useIndex.
Al habilitar el uso de �ndices se asume que la condici�n del WHERE sigue las premisas que se detallan a continuaci�n.
Definamos los siguientes t�rminos:
Subconsultas: una expresi�n l�gica elemental, que tiene como resultado un valor true o false
Ejemplos:
nombre=='juan'
costo ==12
costo>= 12
EsHombre()
(suponiendo que EsHombre() es una funci�n que devuelve true o false)
Subconsulta indexada: Es una subconsultas que asocia un campo de una tabla a un valor y dicho campo esta indexado.
Ejemplos:
Actualmente las �nicas subconsultas indexadas son las que tienen la forma campo=='valor', donde campo es un campo indexado.
nombre=='juan'
costo ==12
Llamemos Ai a las subconsultas indexadas asociadas a la tabla A, Es decir
A1 es equivalente a
TablaA.Campo1==Valor1(Donde campo1 esta indexado)
Y F() a cualquier subconsulta no indexada, ya sea una funci�n o comparaci�n sobre la cual no se utiliza �ndice alguno
Subconsultas Excluyentes: son aquellas expresiones l�gicas elementales que de ser falsas hacen falsa toda la consulta sin importar los valores que toman las dem�s subconsultas.
Ejemplos:
(Vale aclarar que el operador && corresponde al operador AND y el operador || corresponde al operador OR)
Dada la consulta
A1 && A2 && B2 && F() && (C2 || C3 )
A1, A2 , B2 y F() son excluyentes, C2 y C3 no lo son
Subconsultas Determinantes: Son aquellas expresiones l�gicas elementales que, de ser verdaderas, hacen verdaderas toda la consulta sin importar los valores que toman las dem�s subconsultas.
Ejemplos:
Dada la consulta
A1 || B2 || F() || ( C2 && C3 )
A1, B2 y F() son determinantes , C2 y C3 no lo son
Podemos afirmar que el resultado de la consulta ser� exacto si cumple con alguna de las siguientes pautas:
- No utiliza ninguna subconsultas indexada.
En este caso no se utiliza los �ndices. - Todas las subconsultas son excluyentes
Por ejemplo:
A1 && A2 && B1 && F() - Por cada subconsulta indexada no excluyente hay una subconsulta indexada excluyente asociada a la misma tabla.
Por ejemplo:
A1 && ( A2 || F() )
A2 es no excluyente pero esta asociada a la misma tabla que A1
A1 && B1 && ( A2 || B2 || F() )
A2 es no excluyente pero esta asociada a la misma tabla que A1
B2 es no excluyente pero esta asociada a la misma tabla que B1
- Hay al menos una subconsulta indexada determinante y todas las dem�s subconsultas indexadas est�n asociadas a la misma tabla. Y adem�s no hay subconsultas no indexadas determinantes (F() determinantes).
Por ejemplo:
A1 || A2 || A3
Son todas determinantes asociadas a la misma tabla
A1 || ( A2 && A3 && F() )
A2 y A3 son no determinantes asociadas a la misma tabla que A1,F() es no determinante.
Otros casos donde son validas:
F() && ( A1 || A2 ) && ( B1 || B2 ) && ( A3 || B3 )
Esto es v�lido porque: (A1 || A2 ) pueden verse como una subconsulta indexada asociada a la tabla A que es excluyente (B1 || B2 ) pueden verse como una subconsulta indexada asociada a la tabla B que es excluyente A3 y B3 son subconsultas no excluyentes pero asociadas a la misma tabla que una subconsultas excluyente.
Para concluir se muestra algunos ejemplos de casos v�lidos e inv�lidos en una base de prueba.
Tabla: Productos| Campo | Tipo | Indexado |
|---|---|---|
| Improducto | numeric | NO |
| NombreProducto | string | NO |
| Idcategoria | numeric | SI |
| IdProveedor | numeric | SI |
Tabla: Proveedores
| Campo | Tipo | Indexado |
|---|---|---|
| ImProveedor | numeric | NO |
| NombreCompania | string | NO |
| Pais | string | SI |
Sea la consulta:
select A.idproducto, A.nombreproducto, B.idproveedor, B.nombrecompania
from productos A , proveedores B
where CONDICION
Condiciones v�lidas: (se resaltan las subcondiciones indexadas )
A.IdProveedor == B.IdProveedor
A.IdProveedor == B.IdProveedor && A.IdProveedor==4
A.IdCategoria==2 && ( A.IdProveedor==1 || B.pais> "S")
A.IdCategoria==2 || A.IdProveedor==4
A.IdProveedor == B.IdProveedor && (A.IdCategoria==2 || A.IdProveedor==4)
Condiciones inv�lidas
A.IdCategoria==2 || B.IdProveedor==4
A.IdCategoria==2 || B.pais> "S"
(A.IdCategoria==2 && A.IdProveedor==1 ) || B.pais> "S"
A.IdProveedor == B.IdProveedor && (A.IdCategoria==2 || B.Pais=='Francia')
X.Indexado de documentos
En JSSQL se puede utilizar campos del tipo link, esto implica que se asocia un registro a un documento (ya sea de texto, pdf, etc.). Todos los enlaces mencionados deben ser indexados mediante el JSBD_Indexador. Esto permite realizar b�squedas de texto dentro del contenido de los documentos indexados.
Para acceder al contenido de dichos documentos se implementaron las siguientes funciones que pueden utilizarse dentro de una consulta SQL
CONTENT( NombreCampo )
Descripcion:
Devuelve el contenido del documento mencionado en el valor del campo del tipo link.
Par�metros:
NombreCampo: el nombre del campo del tipo link
Ejemplo:
select CONTENT(notas) from empleados
ALL(NombreCampo, ArrayPalabras)
Descripcion:
Devuelve verdadero si encuentra todas las palabras incluidas en ArrayPalabras dentro del documento asociado al registro recorrido del campo NombreCampo
Par�metros:
NombreCampo: el nombre del campo del tipo link
ArrayPalabras: Vector con las palabras a buscar
Ejemplos:
select CONTENT(notas) from empleados where ALL(notas,['formaci�n','boston'])
ANY(NombreCampo, ArrayPalabras)
Descripcion:
Devuelve verdadero si encuentra alguna de las palabras incluidas en ArrayPalabras dentro del documento asociado al registro recorrido del campo NombreCampo
Par�metros:
NombreCampo: el nombre del campo del tipo link
ArrayPalabras: Vector con las palabras a buscar
devuelve verdadero si el numero de registro se encuentra en el listado asociado.
Ejemplos:
select CONTENT(notas) from empleados where ANY(notas,['licenciatura','formacion'])
EXACT(NombreCampo, Frase [, Estricto ] )
Descripcion:
Devuelve verdadero si encuentra la frase buscada dentro del documento asociado al registro recorrido del campo NombreCampo
Par�metros:
NombreCampo: el nombre del campo del tipo link
Frase: Cadena de texto a buscar dentro del contenido de los documentos
Estricto: Valor booleano que determina si la frase se busca teniendo en cuenta mayusculas y min�sculas y acentos. Es optativo y por defecto es verdadero
Ejemplos:
select CONTENT(notas) from empleados where EXACT(notas,' ingres� en la empresa')
select CONTENT(notas) from empleados where EXACT(notas,'Ingreso en la empresa',false)
Las funciones ALL, ANY y EXACT hace uso de los �ndices invertidos por palabra asociados a los campos del tipo link, por lo que optimizan los tiempos de b�squeda sin leer el contenido de todos los documentos.
En estos �ndices las palabras se encuentran en may�sculas y sin acentos, para reducir la cantidad de palabras a indexar.
No se encuentran en el �ndice palabras que se encuentren en el listado de palabras frecuentes asociadas al campo o aquellas que est�n fuera del l�mite establecido por los par�metros docsMaxLen y docsMinLen.
XI. Particionado de Tablas
Las tablas de la base JSBD pueden particionarse en porciones peque�as de datos para evitar el uso excesivo de memoria al utilizar tablas con gran cantidad de registros.
La definici�n del tama�o de las particiones de las tablas se realiza en el momento de la creaci�n de la JSBD (generalmente mediante el conversor JSBD_Conversor).
El uso de tablas particionadas es totalmente transparente al usuario en el momento de realizar las consultas al motor JSSQL.
