Advertisement
Guest User

Untitled

a guest
May 6th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION get_pwo_id(integer, character varying, character varying, character varying, character varying)
  2.   RETURNS SETOF json AS
  3. $BODY$
  4. DECLARE
  5.     product_ids integer = $1;
  6.     site_names character varying = $2;
  7.     guest_token character varying = $3;
  8.     access_token character varying = $4;
  9.     image_size character varying = $5;
  10.     level_global INTEGER;
  11.     json_result json;
  12. BEGIN
  13.  
  14.     --Определяем количество уровней
  15.     SELECT INTO level_global max(product_type_to_product_options.level) as level
  16.     FROM product_type_to_product_options, products
  17.     WHERE product_type_to_product_options.product_type_name = products.product_type_name AND products.id = product_ids;
  18.  
  19.     IF (level_global = 1) THEN
  20.         with
  21.             --Получаем продукты и их количество в корзине
  22.             basket_pwo as (
  23.                 SELECT * from get_basket(guest_token, access_token)
  24.             ),
  25.  
  26.             --Получаем PWO и цены
  27.             pwo_v as (
  28.                 SELECT sp.products_with_options_id as products_with_options_id, sp.price, COALESCE(check_price(access_token), False) as is_visible_price
  29.                 FROM products_with_options as pwo, sale_price as sp
  30.                 WHERE pwo.id=sp.products_with_options_id AND pwo.product_id = product_ids AND sp.site_name= site_names
  31.             ),
  32.  
  33.             full_pwo as (
  34.                 SELECT pwo_v.*, COALESCE(basket_pwo.quantity, 0) as quantity
  35.                 FROM pwo_v
  36.                 LEFT JOIN basket_pwo
  37.                 ON pwo_v.products_with_options_id = basket_pwo.pwo_id
  38.             ),
  39.  
  40.             --Находим связи со значениями характеристик
  41.             pwo_to_po_v as (
  42.                 SELECT pwo_to_pov.product_options_value_id, full_pwo.products_with_options_id,
  43.                        full_pwo.price, full_pwo.quantity, full_pwo.is_visible_price,
  44.                        COALESCE(get_image(product_ids, pwo_to_pov.product_options_value_id, image_size, site_names)) as image
  45.                 FROM products_with_options_to_product_options_value as pwo_to_pov, full_pwo
  46.                 WHERE pwo_to_pov.products_with_options_id=full_pwo.products_with_options_id    
  47.             ),
  48.  
  49.             --Получаем PWO_id, product_options_id, value_id, value и сортируем по полю value
  50.             pov_v as (
  51.                 SELECT pwo_to_po_v.products_with_options_id, pov.product_options_id, pov.id as id_value,
  52.                        value, pwo_to_po_v.price, pwo_to_po_v.quantity, pwo_to_po_v.is_visible_price, pwo_to_po_v.image
  53.                 FROM product_options_value as pov, pwo_to_po_v
  54.                 WHERE pov.id=pwo_to_po_v.product_options_value_id
  55.                 ORDER BY value
  56.             ),
  57.  
  58.             --Получаем название характеристики
  59.             po_v as (
  60.                 SELECT po.name as level1
  61.                 FROM pov_v, product_options as po
  62.                 WHERE pov_v.product_options_id=po.id
  63.                 LIMIT 1
  64.             ),
  65.  
  66.             --Пихаем в JSON структуру level1
  67.             json_level1_virtual as (
  68.                 SELECT json_agg(
  69.                 row_to_json (((
  70.                     SELECT t FROM (SELECT products_with_options_id, id_value, value, price, quantity, is_visible_price, image)
  71.                     as t( products_with_options_id, id_value, value, price, quantity, is_visible_price, image))))
  72.                 ) as level1
  73.                 FROM pov_v
  74.             ),
  75.  
  76.             --Пихаем в JSON структуру name
  77.             json_name_virtual as (
  78.                 SELECT row_to_json(po_v) as names
  79.                 FROM po_v
  80.             ),
  81.  
  82.             --Связыем level1 и name в одну таблицу
  83.             level1_name_virtual as (
  84.                 SELECT json_name_virtual.names, json_level1_virtual.level1
  85.                 FROM json_name_virtual, json_level1_virtual
  86.             ),
  87.  
  88.             --Пихаем в JSON структуру products_with_options
  89.             json_pwo_virtual as (
  90.                 SELECT row_to_json(level1_name_virtual) as products_with_options
  91.                 FROM level1_name_virtual
  92.         )
  93.  
  94.         SELECT INTO json_result products_with_options FROM json_pwo_virtual;
  95.         RETURN NEXT json_result;
  96.  
  97.  
  98.     ELSEIF (level_global = 2) THEN
  99.          WITH
  100.             --Получаем продукты и их количество в корзине
  101.             basket_pwo as (
  102.                 SELECT * from get_basket(guest_token, access_token)
  103.             ),
  104.  
  105.             -- Получаем уровни для значений
  106.             po_values AS (
  107.                 SELECT product_type_to_product_options.product_options_id, product_type_to_product_options.level AS level
  108.                 FROM product_type_to_product_options, products
  109.                 WHERE product_type_to_product_options.product_type_name = products.product_type_name AND products.id = product_ids AND NOT level = 0
  110.             ),
  111.  
  112.             -- Получаем PWO и цены
  113.             pwo_v AS (
  114.                 SELECT sp.products_with_options_id AS products_with_options_id, sp.price, COALESCE(check_price(access_token), False) as is_visible_price
  115.                 FROM products_with_options AS pwo, sale_price AS sp
  116.                 WHERE pwo.id=sp.products_with_options_id AND pwo.product_id = product_ids AND sp.site_name= site_names
  117.             ),
  118.  
  119.             -- получаем продукты и их количество в корзине
  120.             full_pwo as (
  121.                 SELECT pwo_v.*, COALESCE(basket_pwo.quantity, 0) as quantity
  122.                 FROM pwo_v
  123.                 LEFT JOIN basket_pwo
  124.                 ON pwo_v.products_with_options_id = basket_pwo.pwo_id
  125.             ),
  126.  
  127.             -- Находим связи со значениями характеристик
  128.             pwo_to_po_v AS (
  129.                 SELECT pwo_to_pov.product_options_value_id, full_pwo.products_with_options_id, full_pwo.price, full_pwo.quantity, full_pwo.is_visible_price,
  130.                        COALESCE(get_image(product_ids, pwo_to_pov.product_options_value_id, image_size, site_names)) as image
  131.                 FROM products_with_options_to_product_options_value AS pwo_to_pov, full_pwo
  132.                 WHERE pwo_to_pov.products_with_options_id=full_pwo.products_with_options_id
  133.             ),
  134.  
  135.             -- Получаем PWO_id, product_options_id, value_id, value и сортируем по полю value и добавляем к ним level
  136.             pov_v AS (
  137.                 SELECT pwo_to_po_v.products_with_options_id, pov.product_options_id, pov.id AS id_value,
  138.                        value, pwo_to_po_v.price, pwo_to_po_v.quantity, pwo_to_po_v.is_visible_price, pwo_to_po_v.image
  139.                 FROM product_options_value AS pov, pwo_to_po_v
  140.                 WHERE pov.id=pwo_to_po_v.product_options_value_id
  141.             ),
  142.  
  143.             pov_values AS (
  144.                 SELECT pov_v.*, po_values.level
  145.                 FROM pov_v
  146.                 FULL JOIN po_values
  147.                 ON pov_v.product_options_id = po_values.product_options_id
  148.             ),
  149.  
  150.             -- Объединение в пары двух уровней
  151.             join_pov AS (
  152.                 SELECT p1.products_with_options_id, p1.value as val, p1.id_value as id_v,
  153.                        p2.value as value, p2.price, p2.quantity, p2.id_value, p2.is_visible_price, p1.image as image1, p2.image as image2
  154.                 from pov_values as p1
  155.                 JOIN pov_values as p2
  156.                 ON p1.products_with_options_id = p2.products_with_options_id
  157.                 WHERE p1.level = 1 AND p2.level = 2
  158.                 ORDER BY NULLIF(regexp_replace(p2.value, E'\\^[0-9+\.]', '', 'g'), '')::float
  159.             ),
  160.  
  161.             -- Разбивка на уровни характеристик
  162.             pov_json AS (
  163.                 SELECT val as value, id_v as id_value, image1 as image, json_agg (
  164.                 row_to_json (
  165.                     (SELECT t FROM (SELECT products_with_options_id, id_value, value, price, quantity, is_visible_price, image2)
  166.                      AS t( products_with_options_id, id_value, value, price, quantity, is_visible_price, image2))
  167.                     )
  168.                 ) as level2
  169.                 FROM join_pov
  170.                 GROUP BY val, id_v, image
  171.             ),
  172.  
  173.             -- Пихаем в JSON структуру level1
  174.             pov_level1_json as (
  175.                 SELECT json_agg(pov_json) AS level1
  176.                 FROM pov_json
  177.             ),
  178.  
  179.             -- Получаем название характеристики
  180.             po_v_1 AS (
  181.                 SELECT 1 as indx, po.name AS level1
  182.                 FROM pov_values, product_options AS po
  183.                 WHERE pov_values.product_options_id=po.id AND level=1
  184.                 LIMIT 1
  185.             ),
  186.  
  187.             po_v_2 AS (
  188.                 SELECT 1 as indx, po.name AS level2
  189.                 FROM pov_values, product_options AS po
  190.                 WHERE pov_values.product_options_id=po.id AND level=2
  191.                 LIMIT 1
  192.             ),
  193.  
  194.             po_v as (
  195.                 select po_v_1.level1, po_v_2.level2
  196.                 from po_v_1
  197.                 join po_v_2
  198.                 on po_v_1.indx = po_v_2.indx
  199.             ),
  200.  
  201.             -- Пихаем в JSON структуру name
  202.             json_name_v AS (
  203.                 SELECT row_to_json(po_v) AS names
  204.                 FROM po_v
  205.             ),
  206.  
  207.             -- Связыем level1 и name в одну таблицу
  208.             level1_name_virtual AS (
  209.                 SELECT json_name_v.names, pov_level1_json.level1
  210.                 FROM json_name_v, pov_level1_json
  211.             ),
  212.  
  213.             -- Пихаем в JSON структуру products_with_options
  214.             json_pwo_virtual AS (
  215.                 SELECT row_to_json(level1_name_virtual) AS products_with_options
  216.                 FROM level1_name_virtual
  217.             )
  218.  
  219.         SELECT INTO json_result products_with_options FROM json_pwo_virtual;
  220.         RETURN NEXT json_result;
  221.  
  222.     ELSE
  223.         with
  224.             --Получаем продукты и их количество в корзине
  225.             basket_pwo as (
  226.                 SELECT * from get_basket(guest_token, access_token)
  227.             ),
  228.  
  229.             --Находим PWO_id и price
  230.             pwo_v as (
  231.                 SELECT sp.products_with_options_id as products_with_options_id, sp.price
  232.                 FROM products_with_options as pwo, sale_price as sp
  233.                 WHERE pwo.id=sp.products_with_options_id AND pwo.product_id = product_ids AND sp.site_name= site_names
  234.             ),
  235.  
  236.             full_pwo as (
  237.                 SELECT pwo_v.*, COALESCE(basket_pwo.quantity, 0) as quantity, COALESCE(check_price(access_token), False) as is_visible_price
  238.                 FROM pwo_v
  239.                 LEFT JOIN basket_pwo
  240.                 ON pwo_v.products_with_options_id = basket_pwo.pwo_id
  241.             ),
  242.  
  243.             -- Пихаем в JSON
  244.             json_pwo as (
  245.                 SELECT json_agg(full_pwo) as products_with_options
  246.                 FROM full_pwo  
  247.             )
  248.         SELECT INTO json_result products_with_options FROM json_pwo;
  249.         RETURN NEXT json_result;
  250.     END IF;
  251. END
  252. $BODY$
  253.   LANGUAGE plpgsql VOLATILE
  254.   COST 100
  255.   ROWS 1000;
  256. ALTER FUNCTION get_pwo_id(integer, character varying, character varying, character varying, character varying)
  257.   OWNER TO "ros-zdravnica";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement