|
10 | 10 | (java.time.temporal ChronoUnit) |
11 | 11 | (java.time.format DateTimeFormatter))) |
12 | 12 |
|
| 13 | +(defn get-temporal-partitions |
| 14 | + "Returns a vector of {:table full-table-name :part partition-key} |
| 15 | + values for all the existing partitions associated with the |
| 16 | + name-prefix, e.g. request for \"reports\" might produce a vector of |
| 17 | + maps like {:table \"reports_20200802z\" :part \"20200802z\"}." |
| 18 | + [name-prefix] |
| 19 | + ;; FIXME: use this in other relevant places. |
| 20 | + ;; FIXME: restrict to our schema. |
| 21 | + (mapv (fn [{:keys [tablename]}] |
| 22 | + {:table tablename |
| 23 | + :part (subs tablename (inc (count name-prefix)))}) |
| 24 | + (jdbc/query-to-vec |
| 25 | + (str "select tablename from pg_tables where tablename ~ " |
| 26 | + (jdbc/single-quote |
| 27 | + (str "^" name-prefix "_[0-9]{8}z$")))))) |
| 28 | + |
13 | 29 | (defn date-suffix |
14 | 30 | [date] |
15 | 31 | (let [formatter (.withZone (DateTimeFormatter/BASIC_ISO_DATE) (ZoneId/of "UTC"))] |
|
95 | 111 | (format "CREATE UNIQUE INDEX IF NOT EXISTS resource_events_hash_%s ON %s (event_hash)" |
96 | 112 | iso-week-year full-table-name)]))) |
97 | 113 |
|
| 114 | +;; This var is used in testing to simulate migration 74 being applied without |
| 115 | +;; adding the idx_reports_id index to partitions. Changing this behavior in |
| 116 | +;; migration 74 should be safe because the index creation is guarded by |
| 117 | +;; 'if not exists' in both the changed migration 74 and in the newer 76. |
| 118 | +(def ^:dynamic add-report-id-idx? true) |
| 119 | + |
98 | 120 | (defn create-reports-partition |
99 | 121 | "Creates a partition in the reports table" |
100 | 122 | [date] |
|
115 | 137 | " FOREIGN KEY (status_id) REFERENCES report_statuses(id) ON DELETE CASCADE") |
116 | 138 | iso-week-year)]) |
117 | 139 | (fn [full-table-name iso-week-year] |
118 | | - [(format "CREATE INDEX IF NOT EXISTS idx_reports_compound_id_%s ON %s USING btree (producer_timestamp, certname, hash) WHERE (start_time IS NOT NULL)" |
119 | | - iso-week-year full-table-name) |
120 | | - (format "CREATE INDEX IF NOT EXISTS idx_reports_noop_pending_%s ON %s USING btree (noop_pending) WHERE (noop_pending = true)" |
121 | | - iso-week-year full-table-name) |
122 | | - (format "CREATE INDEX IF NOT EXISTS idx_reports_prod_%s ON %s USING btree (producer_id)" |
123 | | - iso-week-year full-table-name) |
124 | | - (format "CREATE INDEX IF NOT EXISTS idx_reports_producer_timestamp_%s ON %s USING btree (producer_timestamp)" |
125 | | - iso-week-year full-table-name) |
126 | | - (format "CREATE INDEX IF NOT EXISTS idx_reports_producer_timestamp_by_hour_certname_%s ON %s USING btree (date_trunc('hour'::text, timezone('UTC'::text, producer_timestamp)), producer_timestamp, certname)" |
127 | | - iso-week-year full-table-name) |
128 | | - (format "CREATE INDEX IF NOT EXISTS reports_cached_catalog_status_on_fail_%s ON %s USING btree (cached_catalog_status) WHERE (cached_catalog_status = 'on_failure'::text)" |
129 | | - iso-week-year full-table-name) |
130 | | - (format "CREATE INDEX IF NOT EXISTS reports_catalog_uuid_idx_%s ON %s USING btree (catalog_uuid)" |
131 | | - iso-week-year full-table-name) |
132 | | - (format "CREATE INDEX IF NOT EXISTS reports_certname_idx_%s ON %s USING btree (certname)" |
133 | | - iso-week-year full-table-name) |
134 | | - (format "CREATE INDEX IF NOT EXISTS reports_end_time_idx_%s ON %s USING btree (end_time)" |
135 | | - iso-week-year full-table-name) |
136 | | - (format "CREATE INDEX IF NOT EXISTS reports_environment_id_idx_%s ON %s USING btree (environment_id)" |
137 | | - iso-week-year full-table-name) |
138 | | - (format "CREATE UNIQUE INDEX IF NOT EXISTS reports_hash_expr_idx_%s ON %s USING btree (encode(hash, 'hex'::text))" |
139 | | - iso-week-year full-table-name) |
140 | | - (format "CREATE INDEX IF NOT EXISTS reports_job_id_idx_%s ON %s USING btree (job_id) WHERE (job_id IS NOT NULL)" |
141 | | - iso-week-year full-table-name) |
142 | | - (format "CREATE INDEX IF NOT EXISTS reports_noop_idx_%s ON %s USING btree (noop) WHERE (noop = true)" |
143 | | - iso-week-year full-table-name) |
144 | | - (format "CREATE INDEX IF NOT EXISTS reports_status_id_idx_%s ON %s USING btree (status_id)" |
145 | | - iso-week-year full-table-name) |
146 | | - (format "CREATE INDEX IF NOT EXISTS reports_tx_uuid_expr_idx_%s ON %s USING btree (((transaction_uuid)::text))" |
147 | | - iso-week-year full-table-name)]))) |
| 140 | + (let [indexes |
| 141 | + [(format "CREATE INDEX IF NOT EXISTS idx_reports_compound_id_%s ON %s USING btree (producer_timestamp, certname, hash) WHERE (start_time IS NOT NULL)" |
| 142 | + iso-week-year full-table-name) |
| 143 | + (format "CREATE INDEX IF NOT EXISTS idx_reports_noop_pending_%s ON %s USING btree (noop_pending) WHERE (noop_pending = true)" |
| 144 | + iso-week-year full-table-name) |
| 145 | + (format "CREATE INDEX IF NOT EXISTS idx_reports_prod_%s ON %s USING btree (producer_id)" |
| 146 | + iso-week-year full-table-name) |
| 147 | + (format "CREATE INDEX IF NOT EXISTS idx_reports_producer_timestamp_%s ON %s USING btree (producer_timestamp)" |
| 148 | + iso-week-year full-table-name) |
| 149 | + (format "CREATE INDEX IF NOT EXISTS idx_reports_producer_timestamp_by_hour_certname_%s ON %s USING btree (date_trunc('hour'::text, timezone('UTC'::text, producer_timestamp)), producer_timestamp, certname)" |
| 150 | + iso-week-year full-table-name) |
| 151 | + (format "CREATE INDEX IF NOT EXISTS reports_cached_catalog_status_on_fail_%s ON %s USING btree (cached_catalog_status) WHERE (cached_catalog_status = 'on_failure'::text)" |
| 152 | + iso-week-year full-table-name) |
| 153 | + (format "CREATE INDEX IF NOT EXISTS reports_catalog_uuid_idx_%s ON %s USING btree (catalog_uuid)" |
| 154 | + iso-week-year full-table-name) |
| 155 | + (format "CREATE INDEX IF NOT EXISTS reports_certname_idx_%s ON %s USING btree (certname)" |
| 156 | + iso-week-year full-table-name) |
| 157 | + (format "CREATE INDEX IF NOT EXISTS reports_end_time_idx_%s ON %s USING btree (end_time)" |
| 158 | + iso-week-year full-table-name) |
| 159 | + (format "CREATE INDEX IF NOT EXISTS reports_environment_id_idx_%s ON %s USING btree (environment_id)" |
| 160 | + iso-week-year full-table-name) |
| 161 | + (format "CREATE UNIQUE INDEX IF NOT EXISTS reports_hash_expr_idx_%s ON %s USING btree (encode(hash, 'hex'::text))" |
| 162 | + iso-week-year full-table-name) |
| 163 | + (format "CREATE INDEX IF NOT EXISTS reports_job_id_idx_%s ON %s USING btree (job_id) WHERE (job_id IS NOT NULL)" |
| 164 | + iso-week-year full-table-name) |
| 165 | + (format "CREATE INDEX IF NOT EXISTS reports_noop_idx_%s ON %s USING btree (noop) WHERE (noop = true)" |
| 166 | + iso-week-year full-table-name) |
| 167 | + (format "CREATE INDEX IF NOT EXISTS reports_status_id_idx_%s ON %s USING btree (status_id)" |
| 168 | + iso-week-year full-table-name) |
| 169 | + (format "CREATE INDEX IF NOT EXISTS reports_tx_uuid_expr_idx_%s ON %s USING btree (((transaction_uuid)::text))" |
| 170 | + iso-week-year full-table-name)]] |
| 171 | + (if add-report-id-idx? |
| 172 | + (conj indexes (format "CREATE UNIQUE INDEX IF NOT EXISTS idx_reports_id_%s ON %s USING btree (id)" |
| 173 | + iso-week-year full-table-name)) |
| 174 | + indexes))))) |
0 commit comments