Используйте шаблоны усов с входами PostgreSQL и JSONb
Пришло время использовать тип данных JSONb в качестве входных данных в шаблоне, а PostgreSQL запрашивает в качестве системы шаблонов... Усы будут идеальными, если есть какая-то реализация усов для PLpgSQL (или адаптированная для C)... Кажется, никого нет.
Но есть хороший исходный код для Javascript-усов: как использовать / адаптировать его для PLv8?
Какой лучший способ (производительность) назвать усы много раз в контексте, как SELECT tplEngine_plv8(input_jsonb,tpl_mustashe) as text_result FROM t
?
ПРИМЕЧАНИЯ для тестирования и обсуждения
Тест с: http://jsfiddle.net/47x341wu/
CREATE TABLE story (
id int NOT NULL PRIMARY KEY,
title text NOT NULL,
UNIQUE(title)
);
CREATE TABLE story_character (
id_story int REFERENCES story(id) NOT NULL,
name text NOT NULL,
UNIQUE(id_story,name)
);
INSERT INTO story (id,title) VALUES (1,'African jungle story'),
(2,'Story of India jungle');
INSERT INTO story_character(id_story,name) VALUES
(1,'Tarzan'), (1,'Jane'), (2,'Mowgli'), (2,'Baloo');
CREATE VIEW t AS
select id_story, jsonb_build_object('title',title,
'names', jsonb_agg( jsonb_build_object('name', name) )
) AS j
from story s INNER JOIN story_character c ON s.id=c.id_story
group by id_story,title;
Так что с VIEW т у нас есть имена и названия для шаблона усы,
SELECT tplEngine_plv8(
j,
'<br/>* <b>{{title}}</b> with: {{#names}} <i>{{name}}</i>; {{/names}}'
) as result
FROM t;
и сравните это с результатом JSFiddle.
Тесты производительности
С помощью EXPLAIN ANALYZE
... Возможно, добавив несколько сотен случайных значений в таблицах тестирования. И тестирование также вызывает стратегии: по одному или по массиву.
CREATE FUNCTION mustache_engine(
p_input JSONB,
p_template TEXT
) RETURNS TEXT language plv8 as $$
// copy https://rawgit.com/janl/mustache.js/master/mustache.js
// and somethings more
$$;
или же
CREATE FUNCTION mustache_engine(
p_inputs JSONB[], -- many inputs
p_templates TEXT -- one template
) RETURNS TEXT[] -- many resuts
language plv8 as $$ ... $$;
CREATE FUNCTION mustache_engine( -- many input-template pairs
p_inputs JSONB[],
p_templates TEXT[]
) RETURNS TEXT[] -- many resuts
language plv8 as $$ ... $$;
1 ответ
create or replace function mustache(template text, view json, partials json) returns text
language plv8 as
<< copy https://rawgit.com/janl/mustache.js/master/mustache.js >>
var mustache=this.Mustache;
return mustache.render(template, view, partials)
$$
;