From: | Nikita Glukhov <n(dot)gluhov(at)postgrespro(dot)ru> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: OPERATOR CLASS |
Date: | 2019-04-10 22:58:09 |
Message-ID: | e74bf466-c22b-ab29-be29-fa960aeb84d0@postgrespro.ru |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
> Есть вопросы по сабжу.
> 1. Можно ли как-то их просматривать в консоли (команды \d* не нашел).
У нас есть патч для psql, который реализует требуемые команды для показа
информации об опклассах.
(см. тред "Psql patch to show access methods info"
https://www.postgresql.org/message-id/flat/1529675324.14193.5.camel%40postgrespro.ru)
Но он, к сожалению, уже не войдет в PostgreSQL 12.
Пример вывода этих команд для интересующего Вас jsonb_path_ops:
\dAo+ gin jsonb_path_ops
List operators of family related to access method
AM | Opfamily Schema | Opfamily Name | Operator | Strategy | Purpose | Sort family
-----+-----------------+----------------+----------------------+----------+---------+-------------
gin | pg_catalog | jsonb_path_ops | @> (jsonb, jsonb) | 7 | search |
gin | pg_catalog | jsonb_path_ops | @? (jsonb, jsonpath) | 15 | search |
gin | pg_catalog | jsonb_path_ops | @@ (jsonb, jsonpath) | 16 | search |
\dAp+ gin jsonb_path_ops
List of operator family procedures
AM | Family schema | Family name | Left | Right | Number | Proc name
-----+---------------+----------------+-------+-------+--------+------------------------------
gin | pg_catalog | jsonb_path_ops | jsonb | jsonb | 1 | btint4cmp
gin | pg_catalog | jsonb_path_ops | jsonb | jsonb | 2 | gin_extract_jsonb_path
gin | pg_catalog | jsonb_path_ops | jsonb | jsonb | 3 | gin_extract_jsonb_query_path
gin | pg_catalog | jsonb_path_ops | jsonb | jsonb | 4 | gin_consistent_jsonb_path
gin | pg_catalog | jsonb_path_ops | jsonb | jsonb | 6 | gin_triconsistent_jsonb_path
(5 rows)
\dAc gin jsonb*
Operator classes for index AM "gin"
Input type | Storage type | Operator class | Default?
------------+--------------+----------------------+----------
jsonb | text | jsonb_ops | yes
jsonb | integer | jsonb_path_ops | no
Если есть какие-то пожелания, каким хотелось бы видеть вывод этих
команд, мы рады будем их выслушать (а сообщение в том треде о полезности
этих команд от пользователя-разработчика опклассов, думаю, очень поможет
их продвижению в PostgreSQL 13).
> Если нет - в каких-то внутренних схемах?
pg_opclass, pg_opfamily, pg_amop, pg_amproc:
SELECT
amopstrategy AS "Strategy",
amoppurpose AS "Purpose",
oprname AS "Operator",
amoplefttype::regtype AS "Left type",
amoprighttype::regtype AS "Right type"
FROM
pg_amop amop,
pg_opfamily opf,
pg_operator opr
WHERE
opfname = 'jsonb_path_ops' AND
amopfamily = opf.oid AND
amopopr = opr.oid;
Strategy | Purpose | Operator | Left type | Right type
----------+---------+----------+-----------+------------
7 | s | @> | jsonb | jsonb
15 | s | @? | jsonb | jsonpath
16 | s | @@ | jsonb | jsonpath
(3 rows)
SELECT
amprocnum AS "Number",
amproc::regproc AS "Function",
amproclefttype::regtype AS "Left type",
amprocrighttype::regtype AS "Right type"
FROM
pg_amproc,
pg_opfamily
WHERE
opfname = 'jsonb_path_ops' AND
amprocfamily = pg_opfamily.oid;
Number | Function | Left type | Right type
--------+------------------------------+-----------+------------
1 | btint4cmp | jsonb | jsonb
2 | gin_extract_jsonb_path | jsonb | jsonb
3 | gin_extract_jsonb_query_path | jsonb | jsonb
4 | gin_consistent_jsonb_path | jsonb | jsonb
6 | gin_triconsistent_jsonb_path | jsonb | jsonb
(5 rows)
> 2. Можно ли как-то определить свой класс операторов по методу "такой
же как оператор класс с таким-то именем, но оператор сравнения у него
вот такой?"
> 3. Если п.2 нельзя, то можно ли вынуть из сабжа ссылки на его
функции/операторы как-то?
Создать новый опкласс на основе имеющегося, переопределяя только лишь
некоторые его операторы или функции, к сожалению, невозможно.
Но, используя CREATE OPERATOR CLASS, действительно можно выполнить эту
задачу, вручную добавив в него все переиспользумые операторы и функции,
помимо своего оператора сравнения. Как получить ссылки на
функции/операторы — описано выше.
> Все вопросы про SQL, а не C
> PS: что хочу
> хочу GIN индекс по jsonb со своим оператором сортировки.
> Насколько я понимаю для того что мне хочется нужно проделать следующее:
> 1. Создать свой класс аналогичный jsonb_path_ops у которого будет
всё так же как у предка, но моя функция FUNCTION 1 mycompare(jsonb, jsonb)
> 2. Построить индекс по полю jsonb указав этот opclass
> 3. PROFIT
Если переиспользовать jsonb_path_ops, то функция сравнения должна быть
не для jsonb, а для int4 — того типа, что используется для хранения
внутри (pg_opclass.opckeytype, "Storage type" в \dAc). Функцию
mycompare(jsonb, jsonb) вместе со своим оператором сравнения имеет смысл
использовать в опклассе для btree, а не для gin.
jsonb_path_ops хранит int4-хеши вида "hash (key1, key2, ..., keyN,
value)", где "key1, key2, ..., keyN" — это путь к полю объекта или
элемента массива "value", состоящий из названий ключей (массивы не
учитываются в путях).
jsonb_ops же хранит text'овые строки вида "Tvalue", где "T" это префикс
типа (key, string, number, boolean, null), а "value" это
название/значение поля объекта или значение элемента массива в тестовом
виде.
Поэтому для нового gin-опкласса, возможно, имеет смысл взять за основу
jsonb_ops, а не на jsonb_path_ops. Но вообще, хотелось бы поподробнее
узнать об этом новом операторе сравнения, тогда мы сможем лучше Вам помочь.
Вот на всякий случай пример создания копии jsonb_path_ops.
CREATE OPERATOR CLASS my_jsonb_path_ops
FOR TYPE jsonb USING gin AS
OPERATOR 7 @>,
OPERATOR 15 @? (jsonb, jsonpath),
OPERATOR 16 @@ (jsonb, jsonpath),
FUNCTION 1 btint4cmp,
FUNCTION 2 gin_extract_jsonb_path,
FUNCTION 3 gin_extract_jsonb_query_path,
FUNCTION 4 gin_consistent_jsonb_path,
FUNCTION 6 gin_triconsistent_jsonb_path,
STORAGE integer;
--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
From | Date | Subject | |
---|---|---|---|
Next Message | Dmitry E. Oboukhov | 2019-04-11 02:40:01 | Re: OPERATOR CLASS |
Previous Message | Dmitry E. Oboukhov | 2019-04-09 17:04:31 | OPERATOR CLASS |