Advertisement
Guest User

Untitled

a guest
Oct 30th, 2014
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. --testing table
  2. CREATE TABLE public.test_patient_table (
  3. entity_id INTEGER NOT NULL,
  4. site_held_at INTEGER NOT NULL,
  5. CONSTRAINT entityid_pk PRIMARY KEY (entity_id)
  6. );
  7.  
  8. CREATE TABLE public.test_messageq_table (
  9. entity_id VARCHAR NOT NULL,
  10. master_id INTEGER NOT NULL,
  11. message_body VARCHAR NOT NULL,
  12. CONSTRAINT mq_entity_id_pk PRIMARY KEY (entity_id)
  13. );
  14.  
  15. CREATE INDEX test_patient_table_siteid_idx
  16. ON public.test_patient_table
  17. ( site_held_at );
  18.  
  19. ALTER TABLE public.test_messageq_table
  20. ADD CONSTRAINT test_patient_table_test_messageq_table_fk
  21. FOREIGN KEY (master_id)
  22. REFERENCES public.test_patient_table (entity_id)
  23. ON DELETE NO ACTION
  24. ON UPDATE NO ACTION
  25. NOT DEFERRABLE;
  26.  
  27. --test patient data
  28. insert into test_patient_table values (1, 11111);
  29. insert into test_patient_table values (2, 11111);
  30. insert into test_patient_table values (3, 11111);
  31. insert into test_patient_table values (4, 11111);
  32.  
  33. insert into test_patient_table values (5, 22222);
  34. insert into test_patient_table values (6, 22222);
  35. insert into test_patient_table values (7, 22222);
  36. insert into test_patient_table values (8, 22222);
  37.  
  38. insert into test_patient_table values (9, 33333);
  39. insert into test_patient_table values (10, 33333);
  40.  
  41. insert into test_patient_table values (11, 44444);
  42.  
  43. --testing message
  44. insert into test_messageq_table values (1, 1, 'aaa');
  45. insert into test_messageq_table values (2, 1, 'aaa');
  46. insert into test_messageq_table values (3, 1, 'aaa');
  47. insert into test_messageq_table values (4, 1, 'aaa');
  48. insert into test_messageq_table values (5, 2, 'aaa');
  49. insert into test_messageq_table values (6, 2, 'aaa');
  50. insert into test_messageq_table values (7, 5, 'aaa');
  51. insert into test_messageq_table values (8, 8, 'aaa');
  52. insert into test_messageq_table values (9, 11, 'aaa');
  53. insert into test_messageq_table values (10, 11, 'bbb');
  54.  
  55. WITH patient_msg_in_branches AS (
  56. select distinct test_messageq_table.master_id AS patient_id,
  57. test_patient_table.site_held_at as site_id
  58. from test_messageq_table
  59. inner join test_patient_table
  60. ON test_messageq_table.master_id = test_patient_table.entity_id
  61. and site_held_at in (11111,22222) order by patient_id
  62. ),
  63. messages_for_patients AS(
  64. select * from test_messageq_table where master_id in
  65. (select patient_msg_in_branches.patient_id
  66. from patient_msg_in_branches)
  67. )select * from messages_for_patients
  68.  
  69. "1";1;"aaa"
  70. "2";1;"aaa"
  71. "3";1;"aaa"
  72. "4";1;"aaa"
  73. "5";2;"aaa"
  74. "6";2;"aaa"
  75. "7";5;"aaa"
  76. "8";8;"aaa"
  77.  
  78. drop function getMessageFromSites(text);
  79. CREATE OR REPLACE FUNCTION getMessageFromSites(IN ids TEXT) RETURNS
  80. setof test_messageq_table AS $$
  81. DECLARE
  82. sites INT[];
  83. result test_messageq_table%rowtype;
  84.  
  85. BEGIN
  86. sites = string_to_array(ids,',');
  87. raise info 'entire array: %', sites;
  88.  
  89. WITH patient_msg_in_branches AS (
  90. select distinct test_messageq_table.master_id AS patient_id,
  91. test_patient_table.site_held_at as site_id
  92. from test_messageq_table
  93. inner join test_patient_table
  94. ON test_messageq_table.master_id = test_patient_table.entity_id
  95. and site_held_at = ANY(sites) order by patient_id
  96. ),
  97. messages_for_patients AS(
  98. select * from test_messageq_table where master_id in
  99. (select patient_msg_in_branches.patient_id
  100. from patient_msg_in_branches)
  101. )select * into result from messages_for_patients;
  102. return query select * from result;
  103. END;
  104. $$ LANGUAGE plpgsql;
  105.  
  106. select * from getMessageFromSites('11111,22222');
  107. select * from getMessageFromSites('1')
  108. select * from getMessageFromSites('33333')
  109.  
  110. "1";1;"aaa"
  111. "2";1;"aaa"
  112. "3";1;"aaa"
  113. "4";1;"aaa"
  114. "5";2;"aaa"
  115. "6";2;"aaa"
  116. "9";11;"aaa"
  117. "10";11;"bbb"
  118.  
  119. CREATE OR REPLACE FUNCTION getMessageFromSites(IN ids TEXT) RETURNS
  120. setof test_messageq_table AS $$
  121. DECLARE
  122. sites INT[];
  123. result test_messageq_table%rowtype;
  124.  
  125. BEGIN
  126. sites = string_to_array(ids,',');
  127. raise info 'entire array: %', sites;
  128. return QUERY
  129.  
  130. WITH patient_msg_in_branches AS (
  131. select distinct test_messageq_table.master_id AS patient_id,
  132. test_patient_table.site_held_at as site_id
  133. from test_messageq_table
  134. inner join test_patient_table
  135. ON test_messageq_table.master_id = test_patient_table.entity_id
  136. and site_held_at = ANY(sites) order by patient_id
  137. ),
  138. messages_for_patients AS(
  139. select * from test_messageq_table where master_id in
  140. (select patient_msg_in_branches.patient_id
  141. from patient_msg_in_branches)
  142. )
  143. select * from messages_for_patients;
  144.  
  145. END;
  146. $$ LANGUAGE plpgsql;
  147.  
  148. CREATE OR REPLACE FUNCTION getMessageFromSites2(ids TEXT) RETURNS
  149. setof test_messageq_table
  150. AS
  151. $$
  152. WITH patient_msg_in_branches AS (
  153. select distinct test_messageq_table.master_id AS patient_id,
  154. test_patient_table.site_held_at as site_id
  155. from test_messageq_table
  156. join test_patient_table ON test_messageq_table.master_id = test_patient_table.entity_id
  157. and site_held_at = ANY (string_to_array($1,',')::int[])
  158. ),
  159. messages_for_patients AS
  160. (
  161. select *
  162. from test_messageq_table
  163. where master_id in (select patient_msg_in_branches.patient_id
  164. from patient_msg_in_branches)
  165. )
  166. select *
  167. from messages_for_patients;
  168. $$
  169. LANGUAGE sql;
  170.  
  171. select * from getMessageFromSites('11111,44444');
  172. select * from getMessageFromSites('22222');
  173. select * from getMessageFromSites('1')
  174. select * from getMessageFromSites('33333')
  175.  
  176. select * from getMessageFromSites2('11111');
  177. select * from getMessageFromSites2('22222');
  178. select * from getMessageFromSites2('33333');
  179. select * from getMessageFromSites('44444,11111');
  180. select * from getMessageFromSites('1');
  181.  
  182. CREATE OR REPLACE FUNCTION getMessageFromSites(ids TEXT) RETURNS
  183. setof test_messageq_table
  184. AS
  185. $$
  186. WITH patient_msg_in_branches AS (
  187. select distinct test_messageq_table.master_id AS patient_id,
  188. test_patient_table.site_held_at as site_id
  189. from test_messageq_table
  190. join test_patient_table ON test_messageq_table.master_id = test_patient_table.entity_id
  191. and site_held_at = ANY (string_to_array(ids,',')::int[])
  192. ),
  193. messages_for_patients AS
  194. (
  195. select *
  196. from test_messageq_table
  197. where master_id in (select patient_msg_in_branches.patient_id
  198. from patient_msg_in_branches)
  199. )
  200. select *
  201. from messages_for_patients;
  202. $$
  203. LANGUAGE sql;
  204.  
  205. begin
  206. ....
  207. return query
  208. WITH patient_msg_in_branches AS (
  209. select distinct test_messageq_table.master_id AS patient_id,
  210. test_patient_table.site_held_at as site_id
  211. from test_messageq_table
  212. inner join test_patient_table
  213. ON test_messageq_table.master_id = test_patient_table.entity_id
  214. and site_held_at = ANY(sites) order by patient_id
  215. ),
  216. messages_for_patients AS(
  217. select * from test_messageq_table where master_id in
  218. (select patient_msg_in_branches.patient_id
  219. from patient_msg_in_branches)
  220. )
  221. select * from messages_for_patients;
  222. end;
  223.  
  224. CREATE TABLE patient (
  225. patient_id int PRIMARY KEY
  226. , site_held_at int NOT NULL
  227. );
  228.  
  229. CREATE TABLE messageq (
  230. messageq_id varchar PRIMARY KEY -- varchar ?!
  231. , patient_id int NOT NULL REFERENCES patient
  232. , message_body varchar NOT NULL
  233. );
  234.  
  235. CREATE INDEX patient_site_idx ON patient(site_held_at);
  236. CREATE INDEX messageq_patient_id_idx ON patient(patient_id); -- !!
  237.  
  238. INSERT INTO patient VALUES
  239. (1, 11111)
  240. , (2, 11111)
  241. , (3, 11111)
  242. , (4, 11111)
  243. , (5, 22222)
  244. , (6, 22222)
  245. , (7, 22222)
  246. , (8, 22222)
  247. , (9, 33333)
  248. , (10, 33333)
  249. , (11, 44444);
  250.  
  251. INSERT INTO messageq VALUES
  252. ('m1', 1, 'aaa1')
  253. , ('m2', 1, 'aaa2')
  254. , ('m3', 1, 'aaa3')
  255. , ('m4', 1, 'aaa4')
  256. , ('m5', 2, 'aaa5')
  257. , ('m6', 2, 'aaa6')
  258. , ('m7', 5, 'aaa7')
  259. , ('m8', 8, 'aaa8')
  260. , ('m9', 11, 'aaa9')
  261. , ('m10', 11, 'bbb10');
  262.  
  263. CREATE OR REPLACE FUNCTION f_get_msg_from_sites(VARIADIC _id int[])
  264. RETURNS SETOF messageq AS
  265. $func$
  266. SELECT m.*
  267. FROM patient p
  268. JOIN messageq m USING (patient_id)
  269. WHERE p.site_held_at = ANY($1)
  270. $func$ LANGUAGE sql;
  271.  
  272. SELECT * FROM f_get_msg_from_sites(11111, 44444);
  273. SELECT * FROM f_get_msg_from_sites(22222);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement