Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

gr-index-ratings.sql 3.2 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  1. -- index book clusters since those can't be done before indexing
  2. CREATE MATERIALIZED VIEW IF NOT EXISTS gr_book_cluster
  3. AS SELECT DISTINCT gr_book_id, cluster
  4. FROM gr_book_isbn JOIN isbn_cluster USING (isbn_id);
  5. CREATE UNIQUE INDEX IF NOT EXISTS gr_book_cluster_book_idx ON gr_book_cluster (gr_book_id);
  6. CREATE INDEX IF NOT EXISTS gr_book_cluster_cluster_idx ON gr_book_cluster (cluster);
  7. ANALYZE gr_book_cluster;
  8. -- users
  9. CREATE TABLE IF NOT EXISTS gr_user (
  10. gr_user_rid SERIAL PRIMARY KEY,
  11. gr_user_id VARCHAR NOT NULL
  12. );
  13. CREATE TEMPORARY TABLE gr_new_users
  14. AS SELECT gr_int_data->>'user_id' AS gr_user_id
  15. FROM gr_raw_interaction LEFT JOIN gr_user ON (gr_user_id = gr_int_data->>'user_id')
  16. WHERE gr_user_rid IS NULL;
  17. INSERT INTO gr_user (gr_user_id)
  18. SELECT DISTINCT gr_user_id FROM gr_new_users;
  19. CREATE UNIQUE INDEX IF NOT EXISTS gr_user_id_idx ON gr_user (gr_user_id);
  20. ANALYZE gr_user;
  21. -- Rating data
  22. CREATE TABLE IF NOT EXISTS gr_interaction
  23. AS SELECT gr_int_rid, book_id, gr_user_rid, rating, (gr_int_data->'isRead')::boolean AS is_read, date_added, date_updated
  24. FROM gr_raw_interaction,
  25. jsonb_to_record(gr_int_data) AS
  26. x(book_id INTEGER, user_id VARCHAR, rating INTEGER,
  27. date_added TIMESTAMP WITH TIME ZONE, date_updated TIMESTAMP WITH TIME ZONE),
  28. gr_user
  29. WHERE user_id = gr_user_id;
  30. DO $$
  31. BEGIN
  32. ALTER TABLE gr_interaction ADD CONSTRAINT gr_interaction_pk PRIMARY KEY (gr_int_rid);
  33. EXCEPTION
  34. WHEN invalid_table_definition THEN
  35. RAISE NOTICE 'primary key already exists';
  36. END;
  37. $$;
  38. CREATE INDEX IF NOT EXISTS gr_interaction_book_idx ON gr_interaction (book_id);
  39. CREATE INDEX IF NOT EXISTS gr_interaction_user_idx ON gr_interaction (gr_user_rid);
  40. DO $$
  41. BEGIN
  42. ALTER TABLE gr_interaction ADD CONSTRAINT gr_interaction_book_fk FOREIGN KEY (book_id) REFERENCES gr_book_ids (gr_book_id);
  43. EXCEPTION
  44. WHEN duplicate_object THEN
  45. RAISE NOTICE 'book FK already exists';
  46. END;
  47. $$;
  48. DO $$
  49. BEGIN
  50. ALTER TABLE gr_interaction ADD CONSTRAINT gr_interaction_user_fk FOREIGN KEY (gr_user_rid) REFERENCES gr_user (gr_user_rid);
  51. EXCEPTION
  52. WHEN duplicate_object THEN
  53. RAISE NOTICE 'user FK already exists';
  54. END;
  55. $$;
  56. ANALYZE gr_interaction;
  57. -- ratings
  58. CREATE MATERIALIZED VIEW IF NOT EXISTS gr_rating
  59. AS SELECT gr_user_rid AS user_id, cluster AS book_id,
  60. MEDIAN(rating) AS med_rating,
  61. (array_agg(rating ORDER BY date_updated DESC))[1] AS last_rating,
  62. COUNT(rating) AS nratings
  63. FROM gr_interaction
  64. JOIN gr_book_cluster ON (gr_book_id = book_id)
  65. WHERE rating > 0
  66. GROUP BY gr_user_rid, cluster;
  67. CREATE INDEX IF NOT EXISTS gr_rating_user_idx ON gr_rating (user_id);
  68. CREATE INDEX IF NOT EXISTS gr_rating_item_idx ON gr_rating (book_id);
  69. ANALYZE gr_rating;
  70. CREATE MATERIALIZED VIEW IF NOT EXISTS gr_add_action
  71. AS SELECT gr_user_rid AS user_id, cluster AS book_id,
  72. COUNT(rating) AS nactions
  73. FROM gr_interaction
  74. JOIN gr_book_cluster ON (gr_book_id = book_id)
  75. GROUP BY gr_user_rid, cluster;
  76. CREATE INDEX IF NOT EXISTS gr_add_action_user_idx ON gr_add_action (user_id);
  77. CREATE INDEX IF NOT EXISTS gr_add_action_item_idx ON gr_add_action (book_id);
  78. ANALYZE gr_add_action;
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...