Índice para uuid [] Tipo de dados de matriz

O PostgreSQL não inclui um tipo de índice para colunas do array uuid.

Aqui está uma tabela com uma coluna de matriz uuid:

CREATE TABLE items (
things uuid
[]
);

mas quando tentamos criar um índice nele:

CREATE INDEX items_things_idx ON items USING GIN(things);
ERROR
: data type uuid[] has no default operator class for access method "gin"

portanto, devemos criar um tipo de índice que entenda como comparar elementos em uma matriz de UUIDs:

CREATE OPERATOR CLASS _uuid_ops DEFAULT FOR TYPE _uuid USING gin AS
OPERATOR
1 &&(anyarray, anyarray),
OPERATOR
2 @>(anyarray, anyarray),
OPERATOR
3 <@(anyarray, anyarray),
OPERATOR
4 =(anyarray, anyarray),
FUNCTION
1 uuid_cmp(uuid, uuid),
FUNCTION
2 ginarrayextract(anyarray, internal, internal),
FUNCTION
3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION
4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE uuid
;

Agora nosso índice criará e os SELECTs para itens no array UUID serão rápidos. Por exemplo, encontre todas as linhas que contêm um UUID específico em qualquer lugar da matriz:

SELECT * FROM items WHERE things @> ARRAY['a6e34e5d-b1fb-4240-8ad9-21ddf23134bb']::uuid[];