Operadores para json en pg 9.2

Post on 21-Jun-2015

511 views 1 download

description

extensión que agrega operadores para JSON en postgresql 9.2 , además de un indice HASH, Postgresql 9.2 extension with JSON operator and hash index

Transcript of Operadores para json en pg 9.2

“Operadores para JSON en PostgreSQL 9.2”

Anthony R. Sotolongo León(asotolongo@uci.cu)Daymel Bonne Solis

Introducción

Septiembre 2012

9.2

Introducción

•Tipo de rango.•Replicación en cascada.•Index-only scans•PLV8•JSON

9.2

Introducción

JSON

Dos funciones:

•row_to_json()•array_to json()

select row_to_json (tabla1) from tabla1

Introducción

JSON

Dos funciones:

•row_to_json()•array_to json()

select row_to_json (row (tabla1.columna1,tabla1.columna2)) from tabla1

Introducción

JSON

Aun no cuenta con operadores ni índices para mejorar los tiempos de respuestas

Desarrollo

Los mecanismos de extensión del gestor.

Agregar:•Tipos de datos•Operadores•Funciones•Indices

Desarrollo

Los mecanismos de extensión del gestor.

Agregar:•Tipos de datos•Operadores•Funciones•Índices

Extensiones(SQL, C, python,etc.)

Desarrollo

Extensiones en PostgreSQL

Dos archivos como mínimo

.control --- .SQL

• Incluirlas en directorio extension.

CREATE EXTESION nombre_de_extensión

Desarrollo

Extensiones en PostgreSQL

.control # extensioncomment = 'extension …postgresql'default_version = '0.1‘superuser = true

•nombre--version.SQLCreate type …

Desarrollo

Extensiones en PostgreSQL

Tipo de dato Hstore

Operadores:

hstore || hstore Concatena dos atributos

hstore

hstore ? text Pregunta si el tipo de dato

tiene una llave específica.

hstore @> hstore Si el hstore contiene otro

hstore

Desarrollo

JSON:

Fue especificado por Douglas Crockford como

una notación de datos, descrito en la RFC 4627,

para el mismo no existe operadores estándares.

JSON ejemplo ={“id": "file", "value": “archivo.txt}

Desarrollo

JSON:Operadores propuestos

=Verifica si son iguales en estructura y datos los JSON?Pregunta si el tipo de dato tiene una llave específica.@>Pregunta si el JSON contiene un par llave/valor

= Verifica si son iguales en

estructura y datos los JSON

? Pregunta si el tipo de dato

tiene una llave específica.

@> Pregunta si el JSON

contiene un par llave/valor

Desarrollo

Operadores:

CREATE OPERATOR ? (leftarg = json,rightarg = character varying,procedure = contains);

CREATE OPERATOR @> (leftarg = json,rightarg = character varying,procedure = containsvalue);

CREATE OPERATOR = (leftarg = json,rightarg = json,procedure = equals);

Desarrollo

Funciones:

CREATE OR REPLACE FUNCTION equals(doc1 json, doc2 json)RETURNS boolean AS$BODY$declarebegin

if ( $1::character varying=$2::character varying ) thenreturn true;

elsereturn false;

end if;end;$BODY$ LANGUAGE plpgsql VOLATILE;

Desarrollo

Ejemplo:

CREATE TABLE tabla2( campo1 serial NOTNULL, campo2 json);

with datos as(select'{"field1":"valor1","field2":'||generate_series(1,1000)::text||'}' as son)

insert into tabla2 ( campo2) select son::jsonfrom datos;

Desarrollo

Ejemplo:

select * from tabla2 where campo2='{"field1":"valor1","field2":10}'::json

Desarrollo

Ejemplo:

select * from tabla2 where campo2='{"field1":"valor1","field2":10}'::json

ERROR: el operador no existe: json = json

Desarrollo

Ejemplo:

select * from tabla2 where campo2='{"field1":"valor1","field2":10}'::json

Después de instalada la extensiónCreate extension jsonutils;Descarga:http://pgxn.org/dist/json_utils/

Resultado: 11;"{"field1":"valor1","field2":10}".

Desarrollo

Ejemplo:

select * from tabla1 where campo2 @> '"field2":340'

Resultado: 340;"{"field1":"valor1","field2“:340}".

Desarrollo

Índices:Se definió un índice hash, con el operador de =

CREATE OPERATOR CLASS json_equal_opsDEFAULT FOR TYPE json USING hash ASOPERATOR 1 = ,FUNCTION 1 jsonhash(json);

Desarrollo

Índices:

Explain analyze select * from tabla1 wherecampo2 ='{"field1":"valor1","field2":34}'

"Total runtime: 14.135 ms"

Desarrollo

Índices:

CREATE INDEX test_index_json ON tabla1USING hash(campo2);

Explain analyze select * from tabla1 wherecampo2 ='{"field1":"valor1","field2":34}'

"Total runtime: 0.491 ms"

POSTGRESQL

Conclusiones

•Se puede apreciar la capacidad de extensibilidad del

gestor.

•Se define una extensión con un conjunto de

operadores y funciones que mejoran el trabajo con el

tipo de dato JSON

•Se agrega el índice de tipo “hash”, y se mostraron

ejemplos de su utilización.

POSTGRESQL

Descarga de:

http://pgxn.org/dist/json_utils/

“Operadores para JSON en PostgreSQL 9.2”

Anthony R. Sotolongo León(asotolongo@uci.cu)Daymel Bonne Solis