Используйте шаблоны усов с входами 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)
 $$

;

Другие вопросы по тегам