activerecord-spanner-adapter 0.7.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/blunderbuss.yml +2 -0
  3. data/.github/sync-repo-settings.yaml +1 -1
  4. data/.github/workflows/acceptance-tests-on-emulator.yaml +8 -6
  5. data/.github/workflows/acceptance-tests-on-production.yaml +3 -3
  6. data/.github/workflows/ci.yaml +8 -6
  7. data/.github/workflows/nightly-acceptance-tests-on-emulator.yaml +9 -5
  8. data/.github/workflows/nightly-acceptance-tests-on-production.yaml +2 -2
  9. data/.github/workflows/nightly-unit-tests.yaml +9 -5
  10. data/.github/workflows/release-please-label.yml +4 -4
  11. data/.github/workflows/release-please.yml +12 -11
  12. data/.github/workflows/rubocop.yaml +4 -4
  13. data/.release-please-manifest.json +3 -0
  14. data/CHANGELOG.md +48 -26
  15. data/CONTRIBUTING.md +1 -1
  16. data/Gemfile +2 -1
  17. data/README.md +3 -3
  18. data/acceptance/cases/models/insert_all_test.rb +150 -0
  19. data/acceptance/cases/type/all_types_test.rb +24 -25
  20. data/acceptance/cases/type/json_test.rb +0 -2
  21. data/acceptance/schema/schema.rb +2 -4
  22. data/acceptance/test_helper.rb +1 -1
  23. data/activerecord-spanner-adapter.gemspec +1 -1
  24. data/examples/rails/README.md +8 -8
  25. data/lib/active_record/connection_adapters/spanner/schema_creation.rb +10 -4
  26. data/lib/active_record/connection_adapters/spanner_adapter.rb +64 -31
  27. data/lib/active_record/type/spanner/array.rb +19 -5
  28. data/lib/activerecord_spanner_adapter/base.rb +72 -5
  29. data/lib/activerecord_spanner_adapter/connection.rb +46 -20
  30. data/lib/activerecord_spanner_adapter/information_schema.rb +2 -1
  31. data/lib/activerecord_spanner_adapter/transaction.rb +52 -21
  32. data/lib/activerecord_spanner_adapter/version.rb +1 -1
  33. data/lib/arel/visitors/spanner.rb +10 -0
  34. data/lib/spanner_client_ext.rb +4 -0
  35. data/release-please-config.json +19 -0
  36. metadata +17 -17
  37. data/examples/snippets/interleaved-tables/README.md +0 -152
  38. data/examples/snippets/interleaved-tables/Rakefile +0 -13
  39. data/examples/snippets/interleaved-tables/application.rb +0 -109
  40. data/examples/snippets/interleaved-tables/config/database.yml +0 -8
  41. data/examples/snippets/interleaved-tables/db/migrate/01_create_tables.rb +0 -44
  42. data/examples/snippets/interleaved-tables/db/schema.rb +0 -32
  43. data/examples/snippets/interleaved-tables/db/seeds.rb +0 -40
  44. data/examples/snippets/interleaved-tables/models/album.rb +0 -15
  45. data/examples/snippets/interleaved-tables/models/singer.rb +0 -20
  46. data/examples/snippets/interleaved-tables/models/track.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8f379074a93053e240a8dc13c74b3a3f85cf2b767830901fffd7bcf3bf2b3ba
4
- data.tar.gz: f5ac8e18ed5cc732b753c40b36add02b164a39ea14396fa720371b7d65645684
3
+ metadata.gz: 9a2ada6b62b88752f24052c1071bb3df30e1057e711045d26ecf1403b891d5b7
4
+ data.tar.gz: 831ec65b5bb4b25ce13970213a5f626e327d9ab6972f86f21076363218fc3ef7
5
5
  SHA512:
6
- metadata.gz: 39062a1c09f09cc4da8c1dd7d592905a61ae4b6e914aa88060572c9bda1dbe2626808ab92efcdef21ca18c61c7c116c3a4f55903c5829ff5044984e72e69763c
7
- data.tar.gz: 41a26004516514ec6573e554ba664824105a5f0687d4a831057ff69a92ba9d329fbb185d310d9e5e2d6f1449470aaf573873ffddb038063166aee64c360f10d1
6
+ metadata.gz: 781bb93f7a9d505864b7b242088b51921df1386c4859e112057bd8b1d3c7bcbee1e3f941af2bcf99324537c136b667464c6328630aa6bd7a769fb9ee52ace690
7
+ data.tar.gz: 485369ec08bd2d3dac01edb57425dd003cace09581bf01fd4d7300a1d4142bc8a701a4d83f18b56c740c7b52f9d2c58d7af0eb3683bafb3e4e81afc59e2e2dc5
@@ -0,0 +1,2 @@
1
+ assign_issues:
2
+ - hengfengli
@@ -2,7 +2,7 @@ rebaseMergeAllowed: true
2
2
  squashMergeAllowed: true
3
3
  mergeCommitAllowed: false
4
4
  branchProtectionRules:
5
- - pattern: master
5
+ - pattern: main
6
6
  isAdminEnforced: true
7
7
  requiredStatusCheckContexts:
8
8
  - 'cla/google'
@@ -1,7 +1,7 @@
1
1
  on:
2
2
  push:
3
3
  branches:
4
- - master
4
+ - main
5
5
  pull_request:
6
6
  name: acceptance tests on emulator
7
7
  jobs:
@@ -19,13 +19,17 @@ jobs:
19
19
  max-parallel: 4
20
20
  matrix:
21
21
  ruby: [2.6, 2.7, 3.0]
22
- ar: [6.0.4, 6.1.4]
23
- # Exclude Ruby 3.0 and ActiveRecord 6.0.x as that combination is not supported.
22
+ ar: [6.0.4, 6.1.4, 7.0.2.4]
23
+ # Exclude combinations that are not supported.
24
24
  exclude:
25
25
  - ruby: 3.0
26
26
  ar: 6.0.4
27
+ - ruby: 2.6
28
+ ar: 7.0.2.4
29
+ env:
30
+ AR_VERSION: ${{ matrix.ar }}
27
31
  steps:
28
- - uses: actions/checkout@v2
32
+ - uses: actions/checkout@v3
29
33
  - name: Set up Ruby
30
34
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby
31
35
  # (see https://github.com/ruby/setup-ruby#versioning):
@@ -33,8 +37,6 @@ jobs:
33
37
  with:
34
38
  bundler-cache: false
35
39
  ruby-version: ${{ matrix.ruby }}
36
- - name: Set ActiveRecord version
37
- run: sed -i "s/\"activerecord\", \"~> 6.1.4\"/\"activerecord\", \"${{ matrix.ar }}\"/" activerecord-spanner-adapter.gemspec
38
40
  - name: Install dependencies
39
41
  run: bundle install
40
42
  - name: Run acceptance tests on emulator
@@ -1,7 +1,7 @@
1
1
  on:
2
2
  push:
3
3
  branches:
4
- - master
4
+ - main
5
5
  pull_request:
6
6
  name: acceptance tests on production
7
7
  jobs:
@@ -26,7 +26,7 @@ jobs:
26
26
  matrix:
27
27
  ruby: [3.0]
28
28
  steps:
29
- - uses: actions/checkout@v2
29
+ - uses: actions/checkout@v3
30
30
  - name: Set up Ruby
31
31
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby
32
32
  # (see https://github.com/ruby/setup-ruby#versioning):
@@ -35,7 +35,7 @@ jobs:
35
35
  bundler-cache: true
36
36
  ruby-version: ${{ matrix.ruby }}
37
37
  - name: Setup GCloud
38
- uses: google-github-actions/setup-gcloud@master
38
+ uses: google-github-actions/setup-gcloud@v0
39
39
  with:
40
40
  project_id: ${{ secrets.GCP_PROJECT_ID }}
41
41
  service_account_key: ${{ secrets.GCP_SA_KEY }}
@@ -1,7 +1,7 @@
1
1
  on:
2
2
  push:
3
3
  branches:
4
- - master
4
+ - main
5
5
  pull_request:
6
6
  name: ci
7
7
  jobs:
@@ -11,13 +11,17 @@ jobs:
11
11
  max-parallel: 4
12
12
  matrix:
13
13
  ruby: [2.6, 2.7, 3.0]
14
- ar: [6.0.4, 6.1.4]
15
- # Exclude Ruby 3.0 and ActiveRecord 6.0.x as that combination is not supported.
14
+ ar: [6.0.4, 6.1.4, 7.0.2.4]
15
+ # Exclude combinations that are not supported.
16
16
  exclude:
17
17
  - ruby: 3.0
18
18
  ar: 6.0.4
19
+ - ruby: 2.6
20
+ ar: 7.0.2.4
21
+ env:
22
+ AR_VERSION: ${{ matrix.ar }}
19
23
  steps:
20
- - uses: actions/checkout@v2
24
+ - uses: actions/checkout@v3
21
25
  - name: Set up Ruby
22
26
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby
23
27
  # (see https://github.com/ruby/setup-ruby#versioning):
@@ -25,8 +29,6 @@ jobs:
25
29
  with:
26
30
  bundler-cache: false
27
31
  ruby-version: ${{ matrix.ruby }}
28
- - name: Set ActiveRecord version
29
- run: sed -i "s/\"activerecord\", \"~> 6.1.4\"/\"activerecord\", \"${{ matrix.ar }}\"/" activerecord-spanner-adapter.gemspec
30
32
  - name: Install dependencies
31
33
  run: bundle install
32
34
  - name: Run tests
@@ -19,8 +19,8 @@ jobs:
19
19
  matrix:
20
20
  # Run acceptance tests all supported combinations of Ruby and ActiveRecord.
21
21
  ruby: [2.5, 2.6, 2.7, 3.0]
22
- ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.0, 6.1.1, 6.1.2.1, 6.1.3.2, 6.1.4]
23
- # Exclude Ruby 3.0 and ActiveRecord 6.0.x as that combination is not supported.
22
+ ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.0, 6.1.1, 6.1.2.1, 6.1.3.2, 6.1.4, 7.0.2.4]
23
+ # Exclude combinations that are not supported.
24
24
  exclude:
25
25
  - ruby: 3.0
26
26
  ar: 6.0.0
@@ -32,16 +32,20 @@ jobs:
32
32
  ar: 6.0.3.7
33
33
  - ruby: 3.0
34
34
  ar: 6.0.4
35
+ - ruby: 2.5
36
+ ar: 7.0.2.4
37
+ - ruby: 2.6
38
+ ar: 7.0.2.4
39
+ env:
40
+ AR_VERSION: ${{ matrix.ar }}
35
41
  steps:
36
- - uses: actions/checkout@v2
42
+ - uses: actions/checkout@v3
37
43
  - name: Set up Ruby
38
44
  uses: ruby/setup-ruby@v1
39
45
  with:
40
46
  # Disable caching as we are overriding the ActiveRecord below.
41
47
  bundler-cache: false
42
48
  ruby-version: ${{ matrix.ruby }}
43
- - name: Set ActiveRecord version
44
- run: sed -i "s/\"activerecord\", \"~> 6.1.4\"/\"activerecord\", \"${{ matrix.ar }}\"/" activerecord-spanner-adapter.gemspec
45
49
  - name: Install dependencies
46
50
  run: bundle install
47
51
  - name: Run acceptance tests on emulator
@@ -12,7 +12,7 @@ jobs:
12
12
  matrix:
13
13
  ruby: [3.0]
14
14
  steps:
15
- - uses: actions/checkout@v2
15
+ - uses: actions/checkout@v3
16
16
  - name: Set up Ruby
17
17
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby
18
18
  # (see https://github.com/ruby/setup-ruby#versioning):
@@ -21,7 +21,7 @@ jobs:
21
21
  bundler-cache: true
22
22
  ruby-version: ${{ matrix.ruby }}
23
23
  - name: Setup GCloud
24
- uses: google-github-actions/setup-gcloud@master
24
+ uses: google-github-actions/setup-gcloud@v0
25
25
  with:
26
26
  project_id: ${{ secrets.GCP_PROJECT_ID }}
27
27
  service_account_key: ${{ secrets.GCP_SA_KEY }}
@@ -11,8 +11,8 @@ jobs:
11
11
  matrix:
12
12
  # Run unit tests all supported combinations of Ruby and ActiveRecord.
13
13
  ruby: [2.5, 2.6, 2.7, 3.0]
14
- ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.0, 6.1.1, 6.1.2.1, 6.1.3.2, 6.1.4]
15
- # Exclude Ruby 3.0 and ActiveRecord 6.0.x as that combination is not supported.
14
+ ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.0, 6.1.1, 6.1.2.1, 6.1.3.2, 6.1.4, 7.0.2.4]
15
+ # Exclude combinations that are not supported.
16
16
  exclude:
17
17
  - ruby: 3.0
18
18
  ar: 6.0.0
@@ -24,16 +24,20 @@ jobs:
24
24
  ar: 6.0.3.7
25
25
  - ruby: 3.0
26
26
  ar: 6.0.4
27
+ - ruby: 2.5
28
+ ar: 7.0.2.4
29
+ - ruby: 2.6
30
+ ar: 7.0.2.4
31
+ env:
32
+ AR_VERSION: ${{ matrix.ar }}
27
33
  steps:
28
- - uses: actions/checkout@v2
34
+ - uses: actions/checkout@v3
29
35
  - name: Set up Ruby
30
36
  uses: ruby/setup-ruby@v1
31
37
  with:
32
38
  # Disable caching as we are overriding the ActiveRecord below.
33
39
  bundler-cache: false
34
40
  ruby-version: ${{ matrix.ruby }}
35
- - name: Set ActiveRecord version
36
- run: sed -i "s/\"activerecord\", \"~> 6.1.4\"/\"activerecord\", \"${{ matrix.ar }}\"/" activerecord-spanner-adapter.gemspec
37
41
  - name: Install dependencies
38
42
  run: bundle install
39
43
  - name: Run tests
@@ -2,21 +2,21 @@ name: release-please-label
2
2
  on:
3
3
  pull_request_target:
4
4
  branches:
5
- - master
5
+ - main
6
6
  types:
7
7
  - opened
8
8
  jobs:
9
9
  release-please-label:
10
- if: "${{ github.event.sender.login == 'yoshi-code-bot' && startsWith(github.event.pull_request.title, 'chore: release ') }}"
10
+ if: "${{ github.event.sender.login == 'yoshi-code-bot' && startsWith(github.event.pull_request.title, 'chore(main): release ') }}"
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - name: ReleaseLabel
14
- uses: actions/github-script@v4
14
+ uses: actions/github-script@v6
15
15
  with:
16
16
  github-token: ${{secrets.YOSHI_APPROVER_TOKEN}}
17
17
  script: |
18
18
  core.info('Labeling release');
19
- await github.issues.addLabels({
19
+ await github.rest.issues.addLabels({
20
20
  owner: context.repo.owner,
21
21
  repo: context.repo.repo,
22
22
  issue_number: context.payload.pull_request.number,
@@ -1,7 +1,7 @@
1
1
  name: Release-Please
2
2
  on:
3
3
  schedule:
4
- - cron: '27 8 * * *'
4
+ - cron: '57 10 * * *'
5
5
  workflow_dispatch:
6
6
  inputs:
7
7
  gem:
@@ -20,20 +20,21 @@ jobs:
20
20
  RELEASE_PLEASE_DISABLE: ${{ secrets.RELEASE_PLEASE_DISABLE }}
21
21
  steps:
22
22
  - name: Checkout repo
23
- uses: actions/checkout@v2
24
- - name: Install Ruby 2.7
23
+ uses: actions/checkout@v3
24
+ - name: Install Ruby 3.0
25
25
  uses: ruby/setup-ruby@v1
26
26
  with:
27
- ruby-version: "2.7"
28
- - name: Install NodeJS 12.x
29
- uses: actions/setup-node@v2
27
+ ruby-version: "3.0"
28
+ - name: Install NodeJS 16.x
29
+ uses: actions/setup-node@v3
30
30
  with:
31
- node-version: "12.x"
31
+ node-version: "16.x"
32
32
  - name: Install tools
33
- run: "gem install --no-document toys && npm install release-please"
33
+ run: "gem install --no-document toys"
34
34
  - name: execute
35
35
  run: |
36
- toys release please -v --fork \
36
+ toys release manifest -v \
37
+ --fork --skip-labeling \
37
38
  --github-event-name=${{ github.event_name }} \
38
- --version-file=lib/activerecord_spanner_adapter/version.rb \
39
- ${{ github.event.inputs.args }} -- ${{ github.event.inputs.gem }}
39
+ ${{ github.event.inputs.args }} \
40
+ -- ${{ github.event.inputs.gem }}
@@ -4,7 +4,7 @@ on:
4
4
  pull_request:
5
5
  types: [opened, synchronize]
6
6
  push:
7
- branches: [ master ]
7
+ branches: [ main ]
8
8
 
9
9
  jobs:
10
10
  build:
@@ -12,13 +12,13 @@ jobs:
12
12
  timeout-minutes: 10
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v2
15
+ - uses: actions/checkout@v3
16
16
  - name: setup ruby
17
17
  uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: '2.5'
19
+ ruby-version: '2.7'
20
20
  - name: cache gems
21
- uses: actions/cache@v1
21
+ uses: actions/cache@v3
22
22
  with:
23
23
  path: vendor/bundle
24
24
  key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock') }}
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.1.0"
3
+ }
data/CHANGELOG.md CHANGED
@@ -1,42 +1,64 @@
1
1
  # Changelog
2
2
 
3
- ## [0.7.0](https://www.github.com/googleapis/ruby-spanner-activerecord/compare/activerecord-spanner-adapter/v0.6.0...activerecord-spanner-adapter/v0.7.0) (2021-10-03)
3
+ ### 1.1.0 (2022-06-24)
4
4
 
5
+ #### Features
5
6
 
6
- ### Features
7
+ * Support insert_all and upsert_all with DML and mutations
7
8
 
8
- * add support for query hints ([#134](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/134)) ([f4b5b1e](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/f4b5b1e5b959d43756258e84f95f26f375b7fba8))
9
+ ### 1.0.1 (2022-04-21)
9
10
 
10
- ## [0.6.0](https://www.github.com/googleapis/ruby-spanner-activerecord/compare/activerecord-spanner-adapter/v0.5.0...activerecord-spanner-adapter/v0.6.0) (2021-09-09)
11
+ #### Bug Fixes
11
12
 
13
+ * ActiveRecord::Type::Spanner::Array does not use element type
12
14
 
13
- ### Features
15
+ #### Documentation
14
16
 
15
- * support JSON data type ([#123](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/123)) ([d177ddf](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/d177ddfc7326f02189bd4054571564b94d162b02))
16
- * support single stale reads ([#127](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/127)) ([a600628](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/a600628267355b808f478ed543bc505e73f95d4a))
17
- * support stale reads in read-only transactions ([#126](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/126)) ([8bf7730](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/8bf77300283c01e951725dd5e457270db20e98d2))
17
+ * add limitation of interleaved tables
18
+ * fix a couple of minor formatting issues
18
19
 
19
- ## 0.5.0 (2021-08-31)
20
+ ### 1.0.0 (2021-12-07)
20
21
 
22
+ * GA release
21
23
 
22
- ### Features
24
+ ### 0.7.1 (2021-11-21)
23
25
 
24
- * Add support for NUMERIC type ([#73](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/73)) ([176cf99](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/176cf99dc8c26b3fd34d9e85d82a91dbde2b15c8))
25
- * Add support for ARRAY data type ([#86](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/86)) ([0c66a62](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/0c66a620cab968779de04faf48e03eec643ebea9))
26
- * google-cloud-spanner version upgraded to 2.2 ([#55](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/55)) ([d7581d6](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/d7581d60bd9a9e7b9989565449119f73e2caa694))
27
- * Support interleaved tables ([#83](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/83)) ([82265f9](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/82265f94ace79964639a2c65554714752be39724))
28
- * retry session not found ([#81](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/81)) ([88fd3b7](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/88fd3b70a03a90de2b667bb0f2e86efe5dc9328b))
29
- * support and test multiple ActiveRecord versions ([#107](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/107)) ([db9d96c](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/db9d96c44b9560f6904209df1a9aa42bf50a5844))
30
- * support DDL batches on connection ([#72](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/72)) ([0d18cd4](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/0d18cd49641bdb567012d6ac88b1909461d42551))
31
- * support generated columns ([#94](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/94)) ([68664eb](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/68664eb5c617abc2954dea274430f416e616a324))
32
- * support interleaved indexes + test other index features ([#101](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/101)) ([812e0f7](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/812e0f7f60b36ec26a974f6fb48266de5d840652))
33
- * support optimistic locking ([#92](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/92)) ([9eb71d8](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/9eb71d8a207a8df0406241bff5780593eb0afd34))
34
- * support PDML transactions ([#106](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/106)) ([fa0599a](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/fa0599afe986a184bb6ab26340305eeaa753dafa))
35
- * support prepared statements and query cache ([#74](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/74)) ([fed8258](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/fed825862c95e3e052410e3576de18fc3b7849b7))
36
- * support read only transactions ([#80](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/80)) ([2d6097b](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/2d6097bd8f4530634a41dcdbcbb3a02614f482b8))
37
- * support setting attributes to commit timestamp ([#89](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/89)) ([cdd8448](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/cdd844852da92fa4e2c43fd06eeef31310d6ff8a))
26
+ #### Performance Improvements
38
27
 
28
+ * inline BeginTransaction with first statement in the transaction
39
29
 
40
- ### Performance Improvements
30
+ ### 0.7.0 (2021-10-03)
41
31
 
42
- * add benchmarks ([#98](https://www.github.com/googleapis/ruby-spanner-activerecord/issues/98)) ([80cbadc](https://www.github.com/googleapis/ruby-spanner-activerecord/commit/80cbadc5063f2f257ca1e6e7bf563fc376967428))
32
+ #### Features
33
+
34
+ * add support for query hints
35
+
36
+ ### 0.6.0 (2021-09-09)
37
+
38
+ #### Features
39
+
40
+ * support JSON data type
41
+ * support single stale reads
42
+ * support stale reads in read-only transactions
43
+
44
+ ### 0.5.0 (2021-08-31)
45
+
46
+ #### Features
47
+
48
+ * Add support for NUMERIC type
49
+ * Add support for ARRAY data type
50
+ * google-cloud-spanner version upgraded to 2.2
51
+ * retry session not found
52
+ * support and test multiple ActiveRecord versions
53
+ * support DDL batches on connection
54
+ * support generated columns
55
+ * support interleaved indexes + test other index features
56
+ * support optimistic locking
57
+ * support PDML transactions
58
+ * support prepared statements and query cache
59
+ * support read only transactions
60
+ * support setting attributes to commit timestamp
61
+
62
+ #### Performance Improvements
63
+
64
+ * add benchmarks
data/CONTRIBUTING.md CHANGED
@@ -70,7 +70,7 @@ $ cd ruby-spanner-activerecord
70
70
  $ bundle exec rubocop
71
71
  ```
72
72
 
73
- The rubocop settings depend on [googleapis/ruby-style](https://github.com/googleapis/ruby-style/), in addition to [.rubocop.yml](https://github.com/googleapis/ruby-spanner-activerecord/blob/master/.rubocop.yml).
73
+ The rubocop settings depend on [googleapis/ruby-style](https://github.com/googleapis/ruby-style/), in addition to [.rubocop.yml](https://github.com/googleapis/ruby-spanner-activerecord/blob/main/.rubocop.yml).
74
74
 
75
75
  ## Code of Conduct
76
76
 
data/Gemfile CHANGED
@@ -3,7 +3,8 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in activerecord-spanner.gemspec
4
4
  gemspec
5
5
 
6
- gem "minitest", "~> 5.14.0"
6
+ gem "activerecord", ENV.fetch("AR_VERSION", "~> 6.1.4")
7
+ gem "minitest", "~> 5.15.0"
7
8
  gem "pry", "~> 0.13.0"
8
9
  gem "pry-byebug", "~> 3.9.0"
9
10
 
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ![rubocop](https://github.com/googleapis/ruby-spanner-activerecord/workflows/rubocop/badge.svg)
6
6
 
7
- This project provides a Cloud Spanner adapter for ActiveRecord. It has the __Preview__ release status and supports the following versions:
7
+ This project provides a Cloud Spanner adapter for ActiveRecord. It supports the following versions:
8
8
 
9
9
  - ActiveRecord 6.0.x with Ruby 2.6 and 2.7.
10
10
  - ActiveRecord 6.1.x with Ruby 2.6 and higher.
@@ -69,13 +69,13 @@ Some noteworthy examples in the snippets directory:
69
69
  - [mutations](examples/snippets/mutations): Shows how you can use [mutations instead of DML](https://cloud.google.com/spanner/docs/dml-versus-mutations)
70
70
  for inserting, updating and deleting data in a Cloud Spanner database. Mutations can have a significant performance
71
71
  advantage compared to DML statements, but do not allow read-your-writes semantics during a transaction.
72
- - [interleaved-tables](examples/snippets/interleaved-tables): Shows how to create and work with a hierarchy of `INTERLEAVED IN` tables.
73
72
  - [array-data-type](examples/snippets/array-data-type): Shows how to work with `ARRAY` data types.
74
73
 
75
74
  ## Limitations
76
75
 
77
76
  Limitation|Comment|Resolution
78
77
  ---|---|---
78
+ Interleaved tables are not supported|Cloud Spanner requires to use composite primary keys for interleaved tables, but Active Record does not support composite primary keys. More details: [#160](https://github.com/googleapis/ruby-spanner-activerecord/issues/160) |Use non-interleaved tables.
79
79
  Lack of DEFAULT for columns [change_column_default](https://apidock.com/rails/v5.2.3/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default)|Cloud Spanner does not support DEFAULT values for columns. The use of default must be enforced in your controller logic| Always set a value in your model or controller logic.
80
80
  Lack of sequential and auto-assigned IDs|Cloud Spanner doesn't autogenerate IDs and this integration instead creates UUID4 to avoid [hotspotting](https://cloud.google.com/spanner/docs/schema-design#uuid_primary_key) so you SHOULD NOT rely on IDs being sorted| UUID4s are automatically generated for primary keys.
81
81
  Table without Primary Key| Cloud Spanner support does not support tables without a primary key.| Always define a primary key for your table.
@@ -93,4 +93,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
93
93
 
94
94
  ## Code of Conduct
95
95
 
96
- Everyone interacting in the Activerecord::Spanner project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/googleapis/ruby-spanner-activerecord/blob/master/CODE_OF_CONDUCT.md).
96
+ Everyone interacting in the Activerecord::Spanner project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/googleapis/ruby-spanner-activerecord/blob/main/CODE_OF_CONDUCT.md).
@@ -0,0 +1,150 @@
1
+ # Copyright 2022 Google LLC
2
+ #
3
+ # Use of this source code is governed by an MIT-style
4
+ # license that can be found in the LICENSE file or at
5
+ # https://opensource.org/licenses/MIT.
6
+
7
+ # frozen_string_literal: true
8
+
9
+ require "test_helper"
10
+ require "models/author"
11
+
12
+ module ActiveRecord
13
+ module Model
14
+ class InsertAllTest < SpannerAdapter::TestCase
15
+ include SpannerAdapter::Associations::TestHelper
16
+
17
+ def setup
18
+ super
19
+ end
20
+
21
+ def teardown
22
+ super
23
+ Author.destroy_all
24
+ end
25
+
26
+ def test_insert_all
27
+ values = [
28
+ { id: Author.next_sequence_value, name: "Alice" },
29
+ { id: Author.next_sequence_value, name: "Bob" },
30
+ { id: Author.next_sequence_value, name: "Carol" },
31
+ ]
32
+
33
+ assert_raise(NotImplementedError) { Author.insert_all(values) }
34
+ end
35
+
36
+ def test_insert_all!
37
+ values = [
38
+ { id: Author.next_sequence_value, name: "Alice" },
39
+ { id: Author.next_sequence_value, name: "Bob" },
40
+ { id: Author.next_sequence_value, name: "Carol" },
41
+ ]
42
+
43
+ Author.insert_all!(values)
44
+
45
+ authors = Author.all.order(:name)
46
+
47
+ assert_equal "Alice", authors[0].name
48
+ assert_equal "Bob", authors[1].name
49
+ assert_equal "Carol", authors[2].name
50
+ end
51
+
52
+ def test_insert_all_with_transaction
53
+ values = [
54
+ { id: Author.next_sequence_value, name: "Alice" },
55
+ { id: Author.next_sequence_value, name: "Bob" },
56
+ { id: Author.next_sequence_value, name: "Carol" },
57
+ ]
58
+
59
+ ActiveRecord::Base.transaction do
60
+ Author.insert_all!(values)
61
+ end
62
+
63
+ authors = Author.all.order(:name)
64
+
65
+ assert_equal "Alice", authors[0].name
66
+ assert_equal "Bob", authors[1].name
67
+ assert_equal "Carol", authors[2].name
68
+ end
69
+
70
+ def test_insert_all_with_buffered_mutation_transaction
71
+ values = [
72
+ { id: Author.next_sequence_value, name: "Alice" },
73
+ { id: Author.next_sequence_value, name: "Bob" },
74
+ { id: Author.next_sequence_value, name: "Carol" },
75
+ ]
76
+
77
+ ActiveRecord::Base.transaction isolation: :buffered_mutations do
78
+ Author.insert_all!(values)
79
+ end
80
+
81
+ authors = Author.all.order(:name)
82
+
83
+ assert_equal "Alice", authors[0].name
84
+ assert_equal "Bob", authors[1].name
85
+ assert_equal "Carol", authors[2].name
86
+ end
87
+
88
+ def test_upsert_all
89
+ Author.create id: 1, name: "David"
90
+ authors = Author.all.order(:name)
91
+ assert_equal 1, authors.length
92
+ assert_equal "David", authors[0].name
93
+
94
+ values = [
95
+ { id: 1, name: "Alice" },
96
+ { id: 2, name: "Bob" },
97
+ { id: 3, name: "Carol" },
98
+ ]
99
+
100
+ Author.upsert_all(values)
101
+
102
+ authors = Author.all.order(:name)
103
+
104
+ assert_equal 3, authors.length
105
+ assert_equal "Alice", authors[0].name
106
+ assert_equal "Bob", authors[1].name
107
+ assert_equal "Carol", authors[2].name
108
+ end
109
+
110
+ def test_upsert_all_with_transaction
111
+ values = [
112
+ { id: Author.next_sequence_value, name: "Alice" },
113
+ { id: Author.next_sequence_value, name: "Bob" },
114
+ { id: Author.next_sequence_value, name: "Carol" },
115
+ ]
116
+
117
+ err = assert_raise(NotImplementedError) do
118
+ ActiveRecord::Base.transaction do
119
+ Author.upsert_all(values)
120
+ end
121
+ end
122
+ assert_match "Use upsert outside a transaction block", err.message
123
+ end
124
+
125
+ def test_upsert_all_with_buffered_mutation_transaction
126
+ Author.create id: 1, name: "David"
127
+ authors = Author.all.order(:name)
128
+ assert_equal 1, authors.length
129
+ assert_equal "David", authors[0].name
130
+
131
+ values = [
132
+ { id: 1, name: "Alice" },
133
+ { id: 2, name: "Bob" },
134
+ { id: 3, name: "Carol" },
135
+ ]
136
+
137
+ ActiveRecord::Base.transaction isolation: :buffered_mutations do
138
+ Author.upsert_all(values)
139
+ end
140
+
141
+ authors = Author.all.order(:name)
142
+
143
+ assert_equal 3, authors.length
144
+ assert_equal "Alice", authors[0].name
145
+ assert_equal "Bob", authors[1].name
146
+ assert_equal "Carol", authors[2].name
147
+ end
148
+ end
149
+ end
150
+ end