activerecord-cockroachdb-adapter 6.1.0.pre.beta.2 → 6.1.0.pre.beta.3

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: 856c8a5b793b12c32950311165d759ca18ae2ad2eadf28fe840f2fc3408f69af
4
- data.tar.gz: 1826396e865d87ff66729cdad7b68f89aeec84ffc7a83cdfb9de8141661f1c09
3
+ metadata.gz: 5bc55cc2cb9bfa57e9e0d5757aa2e4e892361b68f9f216de0627d3fc01c165dd
4
+ data.tar.gz: 36582fada5f267b47c827c6b30112c8db955cac8606b3ae5d9c3f73cb77c9424
5
5
  SHA512:
6
- metadata.gz: 8ded85319e0d91018cef909714262f0474485f814aa0d35b0230a9e0a4adc31f66184a4203163aeef971d0fc3263631b3adb807b79263778212b742cfc243419
7
- data.tar.gz: a730aef8f48b921d78df77f636699728ef37c6047bc28ad599aca252ea8c0967adae03a39a0b78e027e1fb4d5c7b95035b1efa53d3f4ef55b606db15dcc5621e
6
+ metadata.gz: c23656edaccbd223d6573d1a3636263d779ae437b5628d657cd5ed2c0d7773dfa75ea52fd7b228cf06fce477ee35ea9179fa612716dc9d5bbf893d78a8dee797
7
+ data.tar.gz: 566d24599b0a74edec6bdba172639130b4d6a92dc688870ee9848d124f4523ea400bf334bfa017e92cdc289f39e06c951301f1a8deb2dc74e7b0889cd617b08e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.1.0-beta.3 - 2021-04-02
4
+
5
+ - Added a configuration option named `use_follower_reads_for_type_introspection`.
6
+ If true, it improves the speed of type introspection by allowing potentially stale
7
+ type metadata to be read. Defaults to false.
8
+
3
9
  ## 6.1.0-beta.2 - 2021-03-06
4
10
 
5
11
  - Improved connection performance by refactoring an introspection
data/README.md CHANGED
@@ -22,6 +22,12 @@ development:
22
22
  user: <username>
23
23
  ```
24
24
 
25
+ ## Configuration
26
+
27
+ In addition to the standard adapter settings, CockroachDB also supports the following:
28
+
29
+ - `use_follower_reads_for_type_introspection`: Use follower reads on queries to the `pg_type` catalog when set to `true`. This helps to speed up initialization by reading historical data, but may not find recently created user-defined types.
30
+
25
31
  ## Working with Spatial Data
26
32
 
27
33
  The adapter uses [RGeo](https://github.com/rgeo/rgeo) and [RGeo-ActiveRecord](https://github.com/rgeo/rgeo-activerecord) to represent geometric and geographic data as Ruby objects and easily interface them with the adapter. The following is a brief introduction to RGeo and tips to help setup your spatial application. More documentation about RGeo can be found in the [YARD Docs](https://rubydoc.info/github/rgeo/rgeo) and [wiki](https://github.com/rgeo/rgeo/wiki).
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "activerecord-cockroachdb-adapter"
7
- spec.version = "6.1.0-beta.2"
7
+ spec.version = "6.1.0-beta.3"
8
8
  spec.licenses = ["Apache-2.0"]
9
9
  spec.authors = ["Cockroach Labs"]
10
10
  spec.email = ["cockroach-db@googlegroups.com"]
@@ -173,6 +173,10 @@ module ActiveRecord
173
173
  @crdb_version >= 202
174
174
  end
175
175
 
176
+ def supports_partitioned_indexes?
177
+ false
178
+ end
179
+
176
180
  # This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
177
181
  # migration from PostgreSQL to CockroachDB. In practice, this limitation
178
182
  # is arbitrary since CockroachDB supports index name lengths and table alias
@@ -440,6 +444,97 @@ module ActiveRecord
440
444
  false
441
445
  end
442
446
 
447
+ # override
448
+ # This method loads info about data types from the database to
449
+ # populate the TypeMap.
450
+ #
451
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
452
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
453
+ def load_additional_types(oids = nil)
454
+ if @config[:use_follower_reads_for_type_introspection]
455
+ initializer = OID::TypeMapInitializer.new(type_map)
456
+
457
+ query = <<~SQL
458
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
459
+ FROM pg_type as t
460
+ LEFT JOIN pg_range as r ON oid = rngtypid AS OF SYSTEM TIME '-10s'
461
+ SQL
462
+
463
+ if oids
464
+ query += "WHERE t.oid IN (%s)" % oids.join(", ")
465
+ else
466
+ query += initializer.query_conditions_for_initial_load
467
+ end
468
+
469
+ execute_and_clear(query, "SCHEMA", []) do |records|
470
+ initializer.run(records)
471
+ end
472
+ else
473
+ super
474
+ end
475
+ rescue ActiveRecord::StatementInvalid => e
476
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
477
+ # use original if database is younger than 10s
478
+ super
479
+ end
480
+
481
+ # override
482
+ # This method maps data types to their proper decoder.
483
+ #
484
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
485
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
486
+ def add_pg_decoders
487
+ if @config[:use_follower_reads_for_type_introspection]
488
+ @default_timezone = nil
489
+ @timestamp_decoder = nil
490
+
491
+ coders_by_name = {
492
+ "int2" => PG::TextDecoder::Integer,
493
+ "int4" => PG::TextDecoder::Integer,
494
+ "int8" => PG::TextDecoder::Integer,
495
+ "oid" => PG::TextDecoder::Integer,
496
+ "float4" => PG::TextDecoder::Float,
497
+ "float8" => PG::TextDecoder::Float,
498
+ "numeric" => PG::TextDecoder::Numeric,
499
+ "bool" => PG::TextDecoder::Boolean,
500
+ "timestamp" => PG::TextDecoder::TimestampUtc,
501
+ "timestamptz" => PG::TextDecoder::TimestampWithTimeZone,
502
+ }
503
+
504
+ known_coder_types = coders_by_name.keys.map { |n| quote(n) }
505
+ query = <<~SQL % known_coder_types.join(", ")
506
+ SELECT t.oid, t.typname
507
+ FROM pg_type as t AS OF SYSTEM TIME '-10s'
508
+ WHERE t.typname IN (%s)
509
+ SQL
510
+
511
+ coders = execute_and_clear(query, "SCHEMA", []) do |result|
512
+ result
513
+ .map { |row| construct_coder(row, coders_by_name[row["typname"]]) }
514
+ .compact
515
+ end
516
+
517
+ map = PG::TypeMapByOid.new
518
+ coders.each { |coder| map.add_coder(coder) }
519
+ @connection.type_map_for_results = map
520
+
521
+ @type_map_for_results = PG::TypeMapByOid.new
522
+ @type_map_for_results.default_type_map = map
523
+ @type_map_for_results.add_coder(PG::TextDecoder::Bytea.new(oid: 17, name: "bytea"))
524
+ @type_map_for_results.add_coder(MoneyDecoder.new(oid: 790, name: "money"))
525
+
526
+ # extract timestamp decoder for use in update_typemap_for_default_timezone
527
+ @timestamp_decoder = coders.find { |coder| coder.name == "timestamp" }
528
+ update_typemap_for_default_timezone
529
+ else
530
+ super
531
+ end
532
+ rescue ActiveRecord::StatementInvalid => e
533
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
534
+ # use original if database is younger than 10s
535
+ super
536
+ end
537
+
443
538
  def arel_visitor
444
539
  Arel::Visitors::CockroachDB.new(self)
445
540
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-cockroachdb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.0.pre.beta.2
4
+ version: 6.1.0.pre.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cockroach Labs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-06 00:00:00.000000000 Z
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord