sequel-xtdb 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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