sequel-xtdb 0.3.0 → 0.3.2

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: feef2fdeeefa8b1adfd9d214aab772c02250814aa8e6ef36a79bc7eddc4a8386
4
- data.tar.gz: 417e16888185230ad9f7714b7d0d322594457f6f0d8645c033a9203463103293
3
+ metadata.gz: d0f7d61f6d6a7c9ccb319122b964eb284815e959dfc2fa2b529f00195e2b8c91
4
+ data.tar.gz: 142f6c92856959dff66759cabef3c5cfbbe480eafda22d50ccc62d1e7178ebdb
5
5
  SHA512:
6
- metadata.gz: 28456e08dfc22572d63a5de8dbfba0b8f849a78478f1ec43336e2495212a4217bacf665d53faf7f205d54c75ef8df931064288dd079bf496dd85389bcb3d1911
7
- data.tar.gz: cb4e306b7641e07812e146843d982104e143935c83d58ffc7cd480246f1dec99fc0f5946fa2ebd964eed4c50e338051785fa772119fe497d156cf88e82e2925c
6
+ metadata.gz: '0089ee3ce060d52540bac403359f66e334630787f1314a238482a28a8c2c49dd9415655d49c3d653cb8acefd052640d2c337f62b41e30f89ca3edd822625ca36'
7
+ data.tar.gz: 0f9a8848f64aba9c29424c073add18d6e64f78430add511866ce02b428254b741926ab89787473acfe8c72b9137ae6f61b0a8b1e2640b1fd8c346003faf4b8ba
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
- # Sequel::XTDB
1
+ # sequel-xtdb
2
2
 
3
- Adapter to connect to XTDB v2 using Sequel.
3
+ [![Gem Version](https://badge.fury.io/rb/sequel-xtdb.svg?icon=si%3Arubygems)](https://badge.fury.io/rb/sequel-xtdb)
4
+
5
+ Adapter to connect to [XTDB](https://docs.xtdb.com/) v2 using [Sequel](https://sequel.jeremyevans.net/).
4
6
 
5
7
  ## Installation
6
8
 
@@ -34,22 +36,20 @@ irb(main)> DB["select * from products"].all
34
36
 
35
37
  ### time-travel
36
38
 
37
- _these examples use the [activesupport time helpers](https://api.rubyonrails.org/classes/ActiveSupport/Duration.html)_
38
-
39
39
  ```ruby
40
+ def shift_days(n, from: Time.now)= from + (60 * 60 * 24 * n)
40
41
  DB = Sequel.connect("xtdb://localhost:5432/xtdb")
41
42
 
42
43
  # get a dataset (ie query)
43
44
  users = DB[:users]
44
- past, future = 2.days.ago, 2.days.from_now
45
- ds1, ds2 = users.as_of(valid: past), users.as_of(valid: future)
45
+ ds1, ds2 = users.as_of(valid: shift_days(-2)), users.as_of(valid: shift_days(2))
46
46
 
47
47
  # expect empty
48
48
  ds1.all
49
49
  ds1.insert(_id: 1, name: "James")
50
50
 
51
51
  # expect a user
52
- ds1.as_of(valid: 2.days.ago).all
52
+ ds1.as_of(valid: shift_days(-1)).all
53
53
 
54
54
  # add to future
55
55
  ds2.insert(_id: 2, name: "Jeremy")
@@ -57,21 +57,24 @@ ds2.insert(_id: 2, name: "Jeremy")
57
57
  # expect only James
58
58
  users.all
59
59
  # expect both James and Jeremy
60
- ds2.as_of(valid: 2.days.from_now).all
60
+ ds2.as_of(valid: shift_days(3)).all
61
61
  ```
62
62
 
63
-
64
63
  ## Status
65
64
 
66
- Very early days :)
67
- Currently it's essentially the postgres-adapter with support for a xtdb-scheme url.
65
+ Very early days :)
68
66
 
69
67
 
70
68
  ## Development
71
69
 
72
70
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
73
71
 
74
- You can also run `bin/console [xtdb-url]` for an interactive prompt that will allow you to experiment. The script will pick up on env-var `XTDB_URL`, though the argument takes precedence.
72
+ You can also run `bin/console [xtdb-url]` for an interactive prompt that will allow you to experiment. The script will pick up on env-var `XTDB_URL`, though the argument takes precedence. The console-script sets up (query-)logging.
73
+
74
+ Speaking of logging: best to start the XTDB docker container with debug-logging:
75
+ ```
76
+ docker run -it --pull=always -e XTDB_LOGGING_LEVEL=debug -v $PWD/tmp/db:/var/lib/xtdb -p 6543:3000 -p 5432:5432 ghcr.io/xtdb/xtdb:nightly
77
+ ```
75
78
 
76
79
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
77
80
 
@@ -1,6 +1,25 @@
1
+ require "sequel/adapters/utils/unmodified_identifiers"
2
+
1
3
  module Sequel
2
4
  module XTDB
5
+ Sequel::Database.set_shared_adapter_scheme :xtdb, self
6
+
7
+ def self.mock_adapter_setup(db)
8
+ db.instance_exec do
9
+ @server_version = 0
10
+
11
+ # def schema_parse_table(*)
12
+ # []
13
+ # end
14
+ # singleton_class.send(:private, :schema_parse_table)
15
+ # adapter_initialize
16
+ # extend(MockAdapterDatabaseMethods)
17
+ end
18
+ end
19
+
3
20
  module DatabaseMethods
21
+ include UnmodifiedIdentifiers::DatabaseMethods # ensure lowercase identifiers
22
+
4
23
  def database_type
5
24
  :xtdb
6
25
  end
@@ -11,41 +30,19 @@ module Sequel
11
30
  end
12
31
 
13
32
  # Get a dataset with `current`, `valid` and `system` set.
14
- #
15
- # For selects this creates the SETTING pre-amble, e.g. 'SETTING DEFAULT VALID_TIME ...':
16
- # ```
17
- # DB.as_of(current: 2.weeks.ago).select(Sequel.lit('current_timestamp')).single_value
18
- # ```
19
- #
20
- # A block can be provided as a convenience to stay in SQL-land (selects only):
21
- # ```
22
- # DB.as_of(current: 2.hours.ago) do
23
- # DB["select current_timestamp"]
24
- # end.sql
25
- # =>
26
- # SETTING
27
- # CURRENT_TIME TO TIMESTAMP '2024-12-17T12:59:48+01:00'
28
- # select current_timestamp
29
- # ```
30
- #
31
- # When doing inserts, the `_valid_from` will be added (if not provided):
32
- # ```
33
- # DB[:products].as_of(valid: 2.weeks.ago).insert(_id: 1, name: 'Spam')
34
- # ```
35
33
  def as_of(...)
36
- ds = @default_dataset.as_of(...)
37
- return ds unless block_given?
38
-
39
- yield.clone(append_sql: ds.select_setting_sql(""))
34
+ @default_dataset.as_of(...)
40
35
  end
41
36
  end
42
37
 
43
38
  module DatasetMethods
39
+ include UnmodifiedIdentifiers::DatasetMethods # ensure lowercase identifiers
40
+
44
41
  Dataset.def_sql_method(self, :select,
45
42
  [["if opts[:values]",
46
43
  %w[values compounds order limit]],
47
44
  ["else",
48
- %w[setting select distinct columns from join where group having compounds order limit lock]]])
45
+ %w[select distinct columns from join where group having compounds order limit lock]]])
49
46
 
50
47
  def as_of(valid: nil, system: nil, current: nil)
51
48
  {valid: valid, system: system, current: current}.reject { |_k, v| v.nil? }.then do |opts|
@@ -54,6 +51,8 @@ module Sequel
54
51
  end
55
52
 
56
53
  def server_version
54
+ # TODO 2_000_000 from xt.version() output
55
+ # requires all def_sql_methods
57
56
  0
58
57
  end
59
58
 
@@ -77,27 +76,49 @@ module Sequel
77
76
  super
78
77
  end
79
78
 
80
- def select_setting_sql(sql)
79
+ def select_sql
80
+ sql = super
81
+
82
+ if (setting = select_setting_sql)
83
+ if sql.frozen?
84
+ setting += sql
85
+ setting.freeze
86
+ elsif @opts[:append_sql] || @opts[:placeholder_literalizer]
87
+ setting << sql
88
+ else
89
+ setting + sql
90
+ end
91
+ else
92
+ sql
93
+ end
94
+ end
95
+
96
+ def select_setting_sql
81
97
  setting = opts.slice(:current, :valid, :system)
82
- return sql if setting.empty?
98
+ return if setting.empty?
83
99
 
84
100
  cast_value = ->(v) do
85
- case v
86
- when DateTime, Time
87
- literal_append "TIMESTAMP ", v.iso8601
88
- when Date
89
- literal_append "DATE ", v.iso8601
101
+ type = case v
102
+ when DateTime, Time then "TIMESTAMP"
103
+ when Date then "DATE"
90
104
  end
105
+ literal_append "#{type} ", v.iso8601
91
106
  end
92
- sql << "SETTING "
93
- sql << setting.map do |k, v|
107
+ sql = "SETTING "
108
+ sql.concat(setting.map do |k, v|
94
109
  if k == :current
95
- literal_append "CURRENT_TIME TO TIMESTAMP ", v.iso8601
110
+ "CURRENT_TIME TO #{cast_value[v.to_time]}"
96
111
  else
97
112
  "DEFAULT #{k.upcase}_TIME AS OF #{cast_value[v]}"
98
113
  end
99
- end.join(", ")
100
- sql << " "
114
+ end.join(", "))
115
+ sql.concat " "
116
+ end
117
+
118
+ private
119
+
120
+ def default_timestamp_format
121
+ "'%Y-%m-%d %H:%M:%S'"
101
122
  end
102
123
  end
103
124
  end
@@ -32,12 +32,6 @@ module Sequel
32
32
 
33
33
  class Dataset < Sequel::Postgres::Dataset
34
34
  include ::Sequel::XTDB::DatasetMethods
35
-
36
- private
37
-
38
- def default_timestamp_format
39
- "'%Y-%m-%d %H:%M:%S'"
40
- end
41
35
  end
42
36
  end
43
37
  end
@@ -3,6 +3,6 @@
3
3
  module Sequel
4
4
  module XTDB
5
5
  # NOTE when releasing the git-tag will replace the version below
6
- VERSION = "0.3.0"
6
+ VERSION = "0.3.2"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-xtdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gert Goet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-17 00:00:00.000000000 Z
11
+ date: 2024-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel