pgslice 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d02cf8d6926bc4ed8908f1c9cc06bf406a3a926d99c08cba1e23f1ef8279f8fc
4
- data.tar.gz: 4d68a0f7e771714d488f5e1c0bb4410f342f9f2e7e561fece795ee8d90b0e479
3
+ metadata.gz: 7b29363ba9973cca9be997f3bc62c748b27bee61d25da67f3d3af60f9166cec9
4
+ data.tar.gz: bb6be94d05a1ff1e059f3386ce4ba34a1a4698a25f89e676d8d3117d4d203ac4
5
5
  SHA512:
6
- metadata.gz: 419d9ca61bc0fd990d5680fbb35c9b8a2de88b169b2882c5b28a8233082bf5f2c75e0cb9c531fb9538d0815777500ea773e2a61fff4d93b1e481ae81dc2d48a2
7
- data.tar.gz: 55555b66db960941e2d766af939637d10b6fac19301ee5b3eb141ccb860963fdbdfd98bb2fac0f459184f75b084d1d463e095d644efc16161dae18285b36f66a
6
+ metadata.gz: abceaedcfa90cfa78954c3184baa02e270244d89b4be19016eb0e1c570902008745845018120182f4dbe543a42cf8d6d8926a52238245d95976946fcf1a49d6e
7
+ data.tar.gz: b5adb37599b3651e737f81193f50495a9ae416544cc96acb77f371c26083cae000c27dc740a9992d303815eb3a250881c7ce5c0dd7bf571e7c1b58f4df4dff66
@@ -1,3 +1,9 @@
1
+ ## 0.4.4
2
+
3
+ - Added partitioning by `year`
4
+ - Fixed `--source-table` and `--dest-table` options
5
+ - Added descriptions to options
6
+
1
7
  ## 0.4.3
2
8
 
3
9
  - Fixed sequence ownership
data/README.md CHANGED
@@ -32,7 +32,7 @@ This will give you the `pgslice` command.
32
32
  pgslice prep <table> <column> <period>
33
33
  ```
34
34
 
35
- Period can be `day` or `month`.
35
+ Period can be `day`, `month`, or `year`.
36
36
 
37
37
  This creates a table named `<table>_intermediate` with the appropriate trigger for partitioning.
38
38
 
@@ -98,7 +98,7 @@ BEGIN;
98
98
 
99
99
  CREATE TABLE visits_intermediate (LIKE visits INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING STORAGE INCLUDING COMMENTS) PARTITION BY RANGE (created_at);
100
100
 
101
- COMMENT ON TABLE visits_intermediate is 'column:created_at,period:day';
101
+ COMMENT ON TABLE visits_intermediate is 'column:created_at,period:month';
102
102
 
103
103
  COMMIT;
104
104
 
@@ -261,7 +261,7 @@ To add partitions, use:
261
261
  pgslice add_partitions <table> --future 3
262
262
  ```
263
263
 
264
- Add this as a cron job to create a new partition each day or month.
264
+ Add this as a cron job to create a new partition each day, month, or year.
265
265
 
266
266
  ```sh
267
267
  # day
@@ -269,6 +269,9 @@ Add this as a cron job to create a new partition each day or month.
269
269
 
270
270
  # month
271
271
  0 0 1 * * pgslice add_partitions <table> --future 3 --url ...
272
+
273
+ # year
274
+ 0 0 1 1 * pgslice add_partitions <table> --future 3 --url ...
272
275
  ```
273
276
 
274
277
  Add a monitor to ensure partitions are being created.
@@ -283,11 +286,12 @@ WHERE
283
286
  n.nspname = 'public' AND
284
287
  c.relname = '<table>_' || to_char(NOW() + INTERVAL '3 days', 'YYYYMMDD')
285
288
  -- for months, use to_char(NOW() + INTERVAL '3 months', 'YYYYMM')
289
+ -- for years, use to_char(NOW() + INTERVAL '3 years', 'YYYY')
286
290
  ```
287
291
 
288
292
  ## Archiving Partitions
289
293
 
290
- Back up and drop older partitions each day or month.
294
+ Back up and drop older partitions each day, month, or year.
291
295
 
292
296
  ```sh
293
297
  pg_dump -c -Fc -t <table>_201609 $PGSLICE_URL > <table>_201609.dump
@@ -2,8 +2,8 @@ module PgSlice
2
2
  class Client < Thor
3
3
  check_unknown_options!
4
4
 
5
- class_option :url
6
- class_option :dry_run, type: :boolean, default: false
5
+ class_option :url, desc: "Database URL"
6
+ class_option :dry_run, type: :boolean, default: false, desc: "Print statements without executing"
7
7
 
8
8
  map %w[--version -v] => :version
9
9
 
@@ -13,7 +13,8 @@ module PgSlice
13
13
 
14
14
  SQL_FORMAT = {
15
15
  day: "YYYYMMDD",
16
- month: "YYYYMM"
16
+ month: "YYYYMM",
17
+ year: "YYYY"
17
18
  }
18
19
 
19
20
  def initialize(*args)
@@ -24,10 +25,10 @@ module PgSlice
24
25
  end
25
26
 
26
27
  desc "prep TABLE [COLUMN] [PERIOD]", "Create an intermediate table for partitioning"
27
- option :partition, type: :boolean, default: true
28
- option :trigger_based, type: :boolean, default: false
28
+ option :partition, type: :boolean, default: true, desc: "Partition the table"
29
+ option :trigger_based, type: :boolean, default: false, desc: "Use trigger-based partitioning"
29
30
  def prep(table, column=nil, period=nil)
30
- table = Table.new(qualify_table(table))
31
+ table = qualify_table(table)
31
32
  intermediate_table = table.intermediate_table
32
33
  trigger_name = table.trigger_name
33
34
 
@@ -102,7 +103,7 @@ COMMENT ON TRIGGER #{quote_ident(trigger_name)} ON #{quote_table(intermediate_ta
102
103
 
103
104
  desc "unprep TABLE", "Undo prep"
104
105
  def unprep(table)
105
- table = Table.new(qualify_table(table))
106
+ table = qualify_table(table)
106
107
  intermediate_table = table.intermediate_table
107
108
  trigger_name = table.trigger_name
108
109
 
@@ -116,11 +117,11 @@ COMMENT ON TRIGGER #{quote_ident(trigger_name)} ON #{quote_table(intermediate_ta
116
117
  end
117
118
 
118
119
  desc "add_partitions TABLE", "Add partitions"
119
- option :intermediate, type: :boolean, default: false
120
- option :past, type: :numeric, default: 0
121
- option :future, type: :numeric, default: 0
120
+ option :intermediate, type: :boolean, default: false, desc: "Add to intermediate table"
121
+ option :past, type: :numeric, default: 0, desc: "Number of past partitions to add"
122
+ option :future, type: :numeric, default: 0, desc: "Number of future partitions to add"
122
123
  def add_partitions(table)
123
- original_table = Table.new(qualify_table(table))
124
+ original_table = qualify_table(table)
124
125
  table = options[:intermediate] ? original_table.intermediate_table : original_table
125
126
  trigger_name = original_table.trigger_name
126
127
 
@@ -245,17 +246,17 @@ CREATE OR REPLACE FUNCTION #{quote_ident(trigger_name)}()
245
246
  end
246
247
 
247
248
  desc "fill TABLE", "Fill the partitions in batches"
248
- option :batch_size, type: :numeric, default: 10000
249
- option :swapped, type: :boolean, default: false
250
- option :source_table
251
- option :dest_table
252
- option :start
253
- option :where
254
- option :sleep, type: :numeric
249
+ option :batch_size, type: :numeric, default: 10000, desc: "Batch size"
250
+ option :swapped, type: :boolean, default: false, desc: "Use swapped table"
251
+ option :source_table, desc: "Source table"
252
+ option :dest_table, desc: "Destination table"
253
+ option :start, type: :numeric, desc: "Primary key to start"
254
+ option :where, desc: "Conditions to filter"
255
+ option :sleep, type: :numeric, desc: "Seconds to sleep between batches"
255
256
  def fill(table)
256
- table = Table.new(qualify_table(table))
257
- source_table = Table.new(options[:source_table]) if options[:source_table]
258
- dest_table = Table.new(options[:dest_table]) if options[:dest_table]
257
+ table = qualify_table(table)
258
+ source_table = qualify_table(options[:source_table]) if options[:source_table]
259
+ dest_table = qualify_table(options[:dest_table]) if options[:dest_table]
259
260
 
260
261
  if options[:swapped]
261
262
  source_table ||= table.retired_table
@@ -345,9 +346,9 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
345
346
  end
346
347
 
347
348
  desc "swap TABLE", "Swap the intermediate table with the original table"
348
- option :lock_timeout, default: "5s"
349
+ option :lock_timeout, default: "5s", desc: "Lock timeout"
349
350
  def swap(table)
350
- table = Table.new(qualify_table(table))
351
+ table = qualify_table(table)
351
352
  intermediate_table = table.intermediate_table
352
353
  retired_table = table.retired_table
353
354
 
@@ -371,7 +372,7 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
371
372
 
372
373
  desc "unswap TABLE", "Undo swap"
373
374
  def unswap(table)
374
- table = Table.new(qualify_table(table))
375
+ table = qualify_table(table)
375
376
  intermediate_table = table.intermediate_table
376
377
  retired_table = table.retired_table
377
378
 
@@ -392,9 +393,9 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
392
393
  end
393
394
 
394
395
  desc "analyze TABLE", "Analyze tables"
395
- option :swapped, type: :boolean, default: false
396
+ option :swapped, type: :boolean, default: false, desc: "Use swapped table"
396
397
  def analyze(table)
397
- table = Table.new(qualify_table(table))
398
+ table = qualify_table(table)
398
399
  parent_table = options[:swapped] ? table : table.intermediate_table
399
400
 
400
401
  existing_tables = table.existing_partitions
@@ -502,8 +503,10 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
502
503
  case period.to_sym
503
504
  when :day
504
505
  "%Y%m%d"
505
- else
506
+ when :month
506
507
  "%Y%m"
508
+ else
509
+ "%Y"
507
510
  end
508
511
  end
509
512
 
@@ -512,8 +515,10 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
512
515
  case period.to_sym
513
516
  when :day
514
517
  date
515
- else
518
+ when :month
516
519
  Date.new(date.year, date.month)
520
+ else
521
+ Date.new(date.year)
517
522
  end
518
523
  end
519
524
 
@@ -522,8 +527,10 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
522
527
  case period.to_sym
523
528
  when :day
524
529
  date.next_day(count)
525
- else
530
+ when :month
526
531
  date.next_month(count)
532
+ else
533
+ date.next_year(count)
527
534
  end
528
535
  end
529
536
 
@@ -540,7 +547,7 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
540
547
  end
541
548
 
542
549
  def qualify_table(table)
543
- table.to_s.include?(".") ? table : [schema, table].join(".")
550
+ Table.new(table.to_s.include?(".") ? table : [schema, table].join("."))
544
551
  end
545
552
 
546
553
  def settings_from_trigger(original_table, table)
@@ -555,7 +562,7 @@ INSERT INTO #{quote_table(dest_table)} (#{fields})
555
562
 
556
563
  unless period
557
564
  needs_comment = true
558
- function_def = execute("select pg_get_functiondef(oid) from pg_proc where proname = $1", [trigger_name])[0]
565
+ function_def = execute("SELECT pg_get_functiondef(oid) FROM pg_proc WHERE proname = $1", [trigger_name])[0]
559
566
  return [] unless function_def
560
567
  function_def = function_def["pg_get_functiondef"]
561
568
  sql_format = SQL_FORMAT.find { |_, f| function_def.include?("'#{f}'") }
@@ -42,6 +42,8 @@ module PgSlice
42
42
  8
43
43
  when "month"
44
44
  6
45
+ when "year"
46
+ 4
45
47
  else
46
48
  "6,8"
47
49
  end
@@ -1,3 +1,3 @@
1
1
  module PgSlice
2
- VERSION = "0.4.3"
2
+ VERSION = "0.4.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgslice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-17 00:00:00.000000000 Z
11
+ date: 2018-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor