Пример использования Qbim для тестового объекта

Установка расширения

CREATE EXTENSION qbim CASCADE;

Создание тестового объекта

CREATE TABLE test (
	id BIGSERIAL NOT NULL,
	sd TIMESTAMP NOT NULL DEFAULT current_timestamp,
	ed TIMESTAMP NOT NULL DEFAULT 'infinity'::TIMESTAMP WITHOUT TIME ZONE,
	name TEXT NOT NULL,
	state BIGINT NOT NULL,
	val BIGINT NOT NULL,
	dsc TEXT NOT NULL,
	CONSTRAINT cls_id_sd_ed_excl exclude USING gist (id WITH =, tsrange(sd, ed) WITH &&) WHERE ((sd <> ed))
);
CREATE INDEX test_id_sd_ed_excl ON test USING gist (id, tsrange(sd, ed)) WHERE (sd <> ed);

Описание в таблицах описания объектов

INSERT INTO obj (tab,dsc,parent,is_temporal,is_logging,is_global) VALUES
	 ('test','Тестовый объект',NULL,true,true,false);

INSERT INTO obj_item (up,ord,"name",r_cls,r_obj,"option",dsc) VALUES
	 (1,1,'id',NULL,NULL,NULL,'идентификатор'),
	 (1,2,'sd',NULL,NULL,NULL,'время начала действия версии'),
	 (1,3,'ed',NULL,NULL,NULL,'время окончания действия версии'),
	 (1,4,'name',NULL,NULL,NULL,'название'),
	 (1,5,'state',NULL,NULL,NULL,'состояние объекта'),
	 (1,6,'val',NULL,NULL,NULL,'значение'),
	 (1,7,'dsc',NULL,NULL,NULL,'комментарий');

Создание реализации объекта

Примечание
Здесь и далее при вызове интерфейсных методов указывается случайный идентификатор пользователя '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid, который используется при регистрации действия.

SELECT qbim_create(1::bigint,null::text,null::bigint,
  '-infinity'::timestamp,null::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'name','Test record'::text,
  'state',1::bigint,
  'val',5::bigint
);

Изменение объекта — создание версий

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:30.0'::timestamp,null::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'state',2::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:36:30.0'::timestamp,null::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'state',3::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:30.0'::timestamp,'2021-03-30 13:36:00.0'::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'val',6::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:20.0'::timestamp,'2021-03-30 13:36:15.0'::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'val',7::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:36:00.0'::timestamp,null::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'val',9::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:20.0'::timestamp,'2021-03-30 13:36:15.0'::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'val',10::bigint,
  'state', 6::bigint
);

SELECT qbim_change(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:20.0'::timestamp,'2021-03-30 13:36:30.0'::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid,
  'val',11::bigint,
  'state', 7::bigint
);

Выборка, просмотр версий

Можно запускать на разных этапах изменения объекта.

Запрос версии «на момент времени»

SELECT * FROM test
WHERE '2021-03-30 13:35:45.0'::timestamp <@ tsrange(sd,ed)
ORDER BY id, sd, ed;

Запрос всех версий, кроме «схлопнувшихся»

SELECT * FROM test WHERE sd<>ed
ORDER BY id, sd, ed;

Запрос всех версий

SELECT * FROM test
ORDER BY id, sd, ed;

Закрытие версии

SELECT qbim_close(1::bigint,null::text,1::bigint,
  '2021-03-30 13:35:15.0'::timestamp,
  '463404e8-ee5d-4597-b9a9-e3b69e29d18a'::uuid
);

Регистрация действий

SELECT
    r_object, lnk_dt, fct_dt, action, pid, userid
FROM action;
r_objectlnk_dtfct_dtactionpiduserid
1:1-infinity2021-05-05 11:47:43.95759512522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:1-infinity2021-05-05 11:48:08.11745932522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:08.11764922522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:09.59536332522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:302021-05-05 11:48:09.59645722522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:1-infinity2021-05-05 11:48:10.98879932522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:10.98905332522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:10.98926422522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:1-infinity2021-05-05 11:48:12.51561132522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:12.51667932522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:002021-05-05 11:48:12.51769232522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:202021-05-05 11:48:12.51882922522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:12.51975522522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:15.09410332522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:152021-05-05 11:48:15.09430232522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:302021-05-05 11:48:15.09448932522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:002021-05-05 11:48:15.09466322522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:302021-05-05 11:48:15.09482922522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:1-infinity2021-05-05 11:48:17.11089132522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:202021-05-05 11:48:17.11109432522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:302021-05-05 11:48:17.11128632522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:002021-05-05 11:48:17.11147632522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:202021-05-05 11:48:17.11169222522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:1-infinity2021-05-05 11:48:19.3658432522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:202021-05-05 11:48:19.36607732522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:36:152021-05-05 11:48:19.36626532522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:202021-05-05 11:48:19.36644322522463404e8-ee5d-4597-b9a9-e3b69e29d18a
1:12021-03-30 13:35:152021-05-05 11:51:57.07987842522463404e8-ee5d-4597-b9a9-e3b69e29d18a

Значения полей описаны в разделе Описание версионируемых таблиц.

Примечание
Поля fct_dt и pid могут отличаться; в данной таблице они приведены как пример.