sequel 3.37.0 → 3.38.0
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.
- data/CHANGELOG +56 -0
- data/README.rdoc +82 -58
- data/Rakefile +6 -5
- data/bin/sequel +1 -1
- data/doc/active_record.rdoc +67 -52
- data/doc/advanced_associations.rdoc +33 -48
- data/doc/association_basics.rdoc +41 -51
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +47 -43
- data/doc/mass_assignment.rdoc +1 -1
- data/doc/migration.rdoc +4 -5
- data/doc/model_hooks.rdoc +3 -3
- data/doc/object_model.rdoc +31 -25
- data/doc/opening_databases.rdoc +19 -5
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/querying.rdoc +109 -52
- data/doc/reflection.rdoc +6 -6
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/schema_modification.rdoc +22 -13
- data/doc/sharding.rdoc +8 -9
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +47 -7
- data/doc/thread_safety.rdoc +1 -1
- data/doc/transactions.rdoc +1 -1
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +29 -43
- data/lib/sequel/adapters/do/postgres.rb +1 -4
- data/lib/sequel/adapters/jdbc.rb +14 -3
- data/lib/sequel/adapters/jdbc/db2.rb +9 -0
- data/lib/sequel/adapters/jdbc/derby.rb +41 -4
- data/lib/sequel/adapters/jdbc/jtds.rb +11 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -6
- data/lib/sequel/adapters/mock.rb +10 -4
- data/lib/sequel/adapters/postgres.rb +1 -28
- data/lib/sequel/adapters/shared/mssql.rb +23 -13
- data/lib/sequel/adapters/shared/postgres.rb +46 -0
- data/lib/sequel/adapters/swift.rb +21 -13
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +4 -5
- data/lib/sequel/adapters/swift/sqlite.rb +2 -1
- data/lib/sequel/adapters/tinytds.rb +14 -2
- data/lib/sequel/adapters/utils/pg_types.rb +5 -0
- data/lib/sequel/core.rb +29 -17
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/database/schema_generator.rb +3 -0
- data/lib/sequel/dataset/actions.rb +5 -6
- data/lib/sequel/dataset/query.rb +7 -7
- data/lib/sequel/dataset/sql.rb +5 -18
- data/lib/sequel/extensions/core_extensions.rb +8 -12
- data/lib/sequel/extensions/pg_array.rb +59 -33
- data/lib/sequel/extensions/pg_array_ops.rb +32 -4
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -1
- data/lib/sequel/extensions/pg_hstore.rb +32 -17
- data/lib/sequel/extensions/pg_hstore_ops.rb +32 -3
- data/lib/sequel/extensions/pg_inet.rb +1 -2
- data/lib/sequel/extensions/pg_interval.rb +0 -1
- data/lib/sequel/extensions/pg_json.rb +41 -23
- data/lib/sequel/extensions/pg_range.rb +36 -11
- data/lib/sequel/extensions/pg_range_ops.rb +32 -4
- data/lib/sequel/extensions/pg_row.rb +572 -0
- data/lib/sequel/extensions/pg_row_ops.rb +164 -0
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/schema_dumper.rb +7 -8
- data/lib/sequel/extensions/select_remove.rb +1 -1
- data/lib/sequel/model/base.rb +1 -0
- data/lib/sequel/no_core_ext.rb +1 -1
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/validation_helpers.rb +31 -0
- data/lib/sequel/sql.rb +64 -44
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +37 -12
- data/spec/adapters/mysql_spec.rb +39 -75
- data/spec/adapters/oracle_spec.rb +11 -11
- data/spec/adapters/postgres_spec.rb +414 -237
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +14 -14
- data/spec/core/database_spec.rb +6 -6
- data/spec/core/dataset_spec.rb +169 -205
- data/spec/core/expression_filters_spec.rb +182 -295
- data/spec/core/object_graph_spec.rb +6 -6
- data/spec/core/schema_spec.rb +14 -14
- data/spec/core/spec_helper.rb +1 -0
- data/spec/{extensions/core_extensions_spec.rb → core_extensions_spec.rb} +208 -14
- data/spec/extensions/columns_introspection_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +28 -36
- data/spec/extensions/many_through_many_spec.rb +4 -4
- data/spec/extensions/pg_array_ops_spec.rb +15 -7
- data/spec/extensions/pg_array_spec.rb +81 -48
- data/spec/extensions/pg_auto_parameterize_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -9
- data/spec/extensions/pg_hstore_spec.rb +66 -65
- data/spec/extensions/pg_inet_spec.rb +2 -4
- data/spec/extensions/pg_interval_spec.rb +2 -3
- data/spec/extensions/pg_json_spec.rb +20 -18
- data/spec/extensions/pg_range_ops_spec.rb +11 -4
- data/spec/extensions/pg_range_spec.rb +30 -7
- data/spec/extensions/pg_row_ops_spec.rb +48 -0
- data/spec/extensions/pg_row_plugin_spec.rb +45 -0
- data/spec/extensions/pg_row_spec.rb +323 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/query_literals_spec.rb +11 -11
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +20 -4
- data/spec/extensions/schema_spec.rb +18 -41
- data/spec/extensions/select_remove_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +4 -8
- data/spec/extensions/to_dot_spec.rb +5 -5
- data/spec/extensions/validation_class_methods_spec.rb +28 -16
- data/spec/integration/associations_test.rb +20 -20
- data/spec/integration/dataset_test.rb +98 -98
- data/spec/integration/eager_loader_test.rb +13 -27
- data/spec/integration/plugin_test.rb +5 -5
- data/spec/integration/prepared_statement_test.rb +22 -13
- data/spec/integration/schema_test.rb +28 -18
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/integration/timezone_test.rb +2 -2
- data/spec/integration/type_test.rb +15 -6
- data/spec/model/association_reflection_spec.rb +1 -1
- data/spec/model/associations_spec.rb +4 -4
- data/spec/model/base_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +15 -15
- data/spec/model/model_spec.rb +32 -32
- data/spec/model/record_spec.rb +16 -0
- data/spec/model/spec_helper.rb +2 -6
- data/spec/model/validations_spec.rb +1 -1
- metadata +16 -4
|
@@ -115,7 +115,7 @@ describe "An Oracle dataset" do
|
|
|
115
115
|
{:name => 'def'}
|
|
116
116
|
]
|
|
117
117
|
|
|
118
|
-
@d.order(:value
|
|
118
|
+
@d.order(Sequel.desc(:value)).limit(1).to_a.should == [
|
|
119
119
|
{:date_created=>nil, :name => 'def', :value => 789}
|
|
120
120
|
]
|
|
121
121
|
|
|
@@ -124,7 +124,7 @@ describe "An Oracle dataset" do
|
|
|
124
124
|
{:date_created=>nil, :name => 'abc', :value => 456}
|
|
125
125
|
]
|
|
126
126
|
|
|
127
|
-
@d.order(:value
|
|
127
|
+
@d.order(Sequel.desc(:value)).filter(:name => 'abc').to_a.should == [
|
|
128
128
|
{:date_created=>nil, :name => 'abc', :value => 456},
|
|
129
129
|
{:date_created=>nil, :name => 'abc', :value => 123}
|
|
130
130
|
]
|
|
@@ -133,7 +133,7 @@ describe "An Oracle dataset" do
|
|
|
133
133
|
{:date_created=>nil, :name => 'abc', :value => 123}
|
|
134
134
|
]
|
|
135
135
|
|
|
136
|
-
@d.filter(:name => 'abc').order(:value
|
|
136
|
+
@d.filter(:name => 'abc').order(Sequel.desc(:value)).limit(1).to_a.should == [
|
|
137
137
|
{:date_created=>nil, :name => 'abc', :value => 456}
|
|
138
138
|
]
|
|
139
139
|
|
|
@@ -157,25 +157,25 @@ describe "An Oracle dataset" do
|
|
|
157
157
|
|
|
158
158
|
@d.max(:value).to_i.should == 789
|
|
159
159
|
|
|
160
|
-
@d.select(:name,
|
|
160
|
+
@d.select(:name, Sequel.function(:AVG, :value).as(:avg)).filter(:name => 'abc').group(:name).to_a.should == [
|
|
161
161
|
{:name => 'abc', :avg => (456+123)/2.0}
|
|
162
162
|
]
|
|
163
163
|
|
|
164
|
-
@d.select(
|
|
164
|
+
@d.select(Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).limit(1).to_a.should == [
|
|
165
165
|
{:avg => (456+123)/2.0}
|
|
166
166
|
]
|
|
167
167
|
|
|
168
|
-
@d.select(:name,
|
|
168
|
+
@d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).to_a.should == [
|
|
169
169
|
{:name => 'abc', :avg => (456+123)/2.0},
|
|
170
170
|
{:name => 'def', :avg => 789*1.0}
|
|
171
171
|
]
|
|
172
172
|
|
|
173
|
-
@d.select(:name,
|
|
173
|
+
@d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).to_a.should == [
|
|
174
174
|
{:name => 'abc', :avg => (456+123)/2.0},
|
|
175
175
|
{:name => 'def', :avg => 789*1.0}
|
|
176
176
|
]
|
|
177
177
|
|
|
178
|
-
@d.select(:name,
|
|
178
|
+
@d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).having(:name => ['abc', 'def']).order(:name).to_a.should == [
|
|
179
179
|
{:name => 'abc', :avg => (456+123)/2.0},
|
|
180
180
|
{:name => 'def', :avg => 789*1.0}
|
|
181
181
|
]
|
|
@@ -203,7 +203,7 @@ describe "An Oracle dataset" do
|
|
|
203
203
|
specify "should translate values correctly" do
|
|
204
204
|
@d << {:name => 'abc', :value => 456}
|
|
205
205
|
@d << {:name => 'def', :value => 789}
|
|
206
|
-
@d.filter('value > 500').update(:date_created => "to_timestamp('2009-09-09', 'YYYY-MM-DD')"
|
|
206
|
+
@d.filter('value > 500').update(:date_created => Sequel.lit("to_timestamp('2009-09-09', 'YYYY-MM-DD')"))
|
|
207
207
|
|
|
208
208
|
@d[:name => 'def'][:date_created].strftime('%F').should == '2009-09-09'
|
|
209
209
|
end
|
|
@@ -266,7 +266,7 @@ describe "Joined Oracle dataset" do
|
|
|
266
266
|
{:id => 4, :title => 'ddd', :cat_name => nil}
|
|
267
267
|
]
|
|
268
268
|
|
|
269
|
-
@d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).
|
|
269
|
+
@d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).reverse_order(:books__id).limit(2, 0).to_a.should == [
|
|
270
270
|
{:id => 4, :title => 'ddd', :cat_name => nil},
|
|
271
271
|
{:id => 3, :title => 'ccc', :cat_name => 'rails'}
|
|
272
272
|
]
|
|
@@ -283,7 +283,7 @@ describe "Oracle aliasing" do
|
|
|
283
283
|
end
|
|
284
284
|
|
|
285
285
|
specify "should allow columns to be renamed" do
|
|
286
|
-
@d1.select(
|
|
286
|
+
@d1.select(Sequel.as(:title, :name)).order_by(:id).to_a.should == [
|
|
287
287
|
{ :name => 'aaa' },
|
|
288
288
|
{ :name => 'bbb' },
|
|
289
289
|
{ :name => 'bbb' },
|
|
@@ -52,12 +52,12 @@ describe "A PostgreSQL database" do
|
|
|
52
52
|
|
|
53
53
|
specify "should correctly parse the schema" do
|
|
54
54
|
@db.schema(:test3, :reload=>true).should == [
|
|
55
|
-
[:value, {:type=>:integer, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"integer", :primary_key=>false}],
|
|
56
|
-
[:time, {:type=>:datetime, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"timestamp without time zone", :primary_key=>false}]
|
|
55
|
+
[:value, {:oid=>23, :type=>:integer, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"integer", :primary_key=>false}],
|
|
56
|
+
[:time, {:oid=>1114, :type=>:datetime, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"timestamp without time zone", :primary_key=>false}]
|
|
57
57
|
]
|
|
58
58
|
@db.schema(:test4, :reload=>true).should == [
|
|
59
|
-
[:name, {:type=>:string, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"character varying(20)", :primary_key=>false}],
|
|
60
|
-
[:value, {:type=>:blob, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"bytea", :primary_key=>false}]
|
|
59
|
+
[:name, {:oid=>1043, :type=>:string, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"character varying(20)", :primary_key=>false}],
|
|
60
|
+
[:value, {:oid=>17, :type=>:blob, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"bytea", :primary_key=>false}]
|
|
61
61
|
]
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -69,73 +69,44 @@ describe "A PostgreSQL database" do
|
|
|
69
69
|
@db.drop_table(:public__testfk)
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
|
+
|
|
73
|
+
specify "should return uuid fields as strings" do
|
|
74
|
+
@db.get(Sequel.cast('550e8400-e29b-41d4-a716-446655440000', :uuid)).should == '550e8400-e29b-41d4-a716-446655440000'
|
|
75
|
+
end
|
|
72
76
|
end
|
|
73
77
|
|
|
74
78
|
describe "A PostgreSQL dataset" do
|
|
75
79
|
before do
|
|
76
80
|
@d = POSTGRES_DB[:test]
|
|
77
|
-
@d.delete
|
|
81
|
+
@d.delete
|
|
78
82
|
POSTGRES_DB.sqls.clear
|
|
79
83
|
end
|
|
80
84
|
|
|
81
85
|
specify "should quote columns and tables using double quotes if quoting identifiers" do
|
|
82
|
-
@d.select(:name).sql.should ==
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
@d.select(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
@d.select(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
@d.
|
|
92
|
-
'SELECT NOW() FROM "test"'
|
|
93
|
-
|
|
94
|
-
@d.select(:max.sql_function(:items__value)).sql.should == \
|
|
95
|
-
'SELECT max("items"."value") FROM "test"'
|
|
96
|
-
|
|
97
|
-
@d.order(:name.desc).sql.should == \
|
|
98
|
-
'SELECT * FROM "test" ORDER BY "name" DESC'
|
|
99
|
-
|
|
100
|
-
@d.select('test.name AS item_name'.lit).sql.should == \
|
|
101
|
-
'SELECT test.name AS item_name FROM "test"'
|
|
102
|
-
|
|
103
|
-
@d.select('"name"'.lit).sql.should == \
|
|
104
|
-
'SELECT "name" FROM "test"'
|
|
105
|
-
|
|
106
|
-
@d.select('max(test."name") AS "max_name"'.lit).sql.should == \
|
|
107
|
-
'SELECT max(test."name") AS "max_name" FROM "test"'
|
|
108
|
-
|
|
109
|
-
@d.insert_sql(:x => :y).should =~ \
|
|
110
|
-
/\AINSERT INTO "test" \("x"\) VALUES \("y"\)( RETURNING NULL)?\z/
|
|
86
|
+
@d.select(:name).sql.should == 'SELECT "name" FROM "test"'
|
|
87
|
+
@d.select(Sequel.lit('COUNT(*)')).sql.should == 'SELECT COUNT(*) FROM "test"'
|
|
88
|
+
@d.select(Sequel.function(:max, :value)).sql.should == 'SELECT max("value") FROM "test"'
|
|
89
|
+
@d.select(Sequel.function(:NOW)).sql.should == 'SELECT NOW() FROM "test"'
|
|
90
|
+
@d.select(Sequel.function(:max, :items__value)).sql.should == 'SELECT max("items"."value") FROM "test"'
|
|
91
|
+
@d.order(Sequel.desc(:name)).sql.should == 'SELECT * FROM "test" ORDER BY "name" DESC'
|
|
92
|
+
@d.select(Sequel.lit('test.name AS item_name')).sql.should == 'SELECT test.name AS item_name FROM "test"'
|
|
93
|
+
@d.select(Sequel.lit('"name"')).sql.should == 'SELECT "name" FROM "test"'
|
|
94
|
+
@d.select(Sequel.lit('max(test."name") AS "max_name"')).sql.should == 'SELECT max(test."name") AS "max_name" FROM "test"'
|
|
95
|
+
@d.insert_sql(:x => :y).should =~ /\AINSERT INTO "test" \("x"\) VALUES \("y"\)( RETURNING NULL)?\z/
|
|
111
96
|
|
|
112
97
|
if check_sqls
|
|
113
|
-
@d.select(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
@d.
|
|
117
|
-
"SELECT test(\"abc\".\"def\", 'hello') FROM \"test\""
|
|
118
|
-
|
|
119
|
-
@d.select(:test.sql_function(:abc__def, 'hello').as(:x2)).sql.should == \
|
|
120
|
-
"SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
|
|
121
|
-
|
|
122
|
-
@d.insert_sql(:value => 333).should =~ \
|
|
123
|
-
/\AINSERT INTO "test" \("value"\) VALUES \(333\)( RETURNING NULL)?\z/
|
|
98
|
+
@d.select(Sequel.function(:test, :abc, 'hello')).sql.should == "SELECT test(\"abc\", 'hello') FROM \"test\""
|
|
99
|
+
@d.select(Sequel.function(:test, :abc__def, 'hello')).sql.should == "SELECT test(\"abc\".\"def\", 'hello') FROM \"test\""
|
|
100
|
+
@d.select(Sequel.function(:test, :abc__def, 'hello').as(:x2)).sql.should == "SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
|
|
101
|
+
@d.insert_sql(:value => 333).should =~ /\AINSERT INTO "test" \("value"\) VALUES \(333\)( RETURNING NULL)?\z/
|
|
124
102
|
end
|
|
125
103
|
end
|
|
126
104
|
|
|
127
105
|
specify "should quote fields correctly when reversing the order if quoting identifiers" do
|
|
128
|
-
@d.reverse_order(:name).sql.should ==
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
@d.reverse_order(:name
|
|
132
|
-
'SELECT * FROM "test" ORDER BY "name" ASC'
|
|
133
|
-
|
|
134
|
-
@d.reverse_order(:name, :test.desc).sql.should == \
|
|
135
|
-
'SELECT * FROM "test" ORDER BY "name" DESC, "test" ASC'
|
|
136
|
-
|
|
137
|
-
@d.reverse_order(:name.desc, :test).sql.should == \
|
|
138
|
-
'SELECT * FROM "test" ORDER BY "name" ASC, "test" DESC'
|
|
106
|
+
@d.reverse_order(:name).sql.should == 'SELECT * FROM "test" ORDER BY "name" DESC'
|
|
107
|
+
@d.reverse_order(Sequel.desc(:name)).sql.should == 'SELECT * FROM "test" ORDER BY "name" ASC'
|
|
108
|
+
@d.reverse_order(:name, Sequel.desc(:test)).sql.should == 'SELECT * FROM "test" ORDER BY "name" DESC, "test" ASC'
|
|
109
|
+
@d.reverse_order(Sequel.desc(:name), :test).sql.should == 'SELECT * FROM "test" ORDER BY "name" ASC, "test" DESC'
|
|
139
110
|
end
|
|
140
111
|
|
|
141
112
|
specify "should support regexps" do
|
|
@@ -149,9 +120,9 @@ describe "A PostgreSQL dataset" do
|
|
|
149
120
|
@d << {:name => 'abc'}
|
|
150
121
|
@d << {:name => 'bcd'}
|
|
151
122
|
@d << {:name => 'bcd', :value => 2}
|
|
152
|
-
@d.order(
|
|
153
|
-
@d.order(
|
|
154
|
-
@d.order(
|
|
123
|
+
@d.order(Sequel.asc(:value, :nulls=>:first), :name).select_map(:name).should == %w[abc bcd bcd]
|
|
124
|
+
@d.order(Sequel.asc(:value, :nulls=>:last), :name).select_map(:name).should == %w[bcd abc bcd]
|
|
125
|
+
@d.order(Sequel.asc(:value, :nulls=>:first), :name).reverse.select_map(:name).should == %w[bcd bcd abc]
|
|
155
126
|
end
|
|
156
127
|
|
|
157
128
|
specify "#lock should lock tables and yield if a block is given" do
|
|
@@ -161,7 +132,7 @@ describe "A PostgreSQL dataset" do
|
|
|
161
132
|
specify "should support exclusion constraints when creating or altering tables" do
|
|
162
133
|
begin
|
|
163
134
|
@db = POSTGRES_DB
|
|
164
|
-
@db.create_table!(:atest){Integer :t; exclude [[
|
|
135
|
+
@db.create_table!(:atest){Integer :t; exclude [[Sequel.desc(:t, :nulls=>:last), '=']], :using=>:btree, :where=>proc{t > 0}}
|
|
165
136
|
@db[:atest].insert(1)
|
|
166
137
|
@db[:atest].insert(2)
|
|
167
138
|
proc{@db[:atest].insert(2)}.should raise_error(Sequel::DatabaseError)
|
|
@@ -200,8 +171,8 @@ describe "A PostgreSQL dataset" do
|
|
|
200
171
|
@db = POSTGRES_DB
|
|
201
172
|
@db.create_table!(:atest){Integer :t}
|
|
202
173
|
@db[:atest].insert(1262304000)
|
|
203
|
-
@db.alter_table(:atest){set_column_type :t, Time, :using=>'epoch'
|
|
204
|
-
@db[:atest].get(
|
|
174
|
+
@db.alter_table(:atest){set_column_type :t, Time, :using=>Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :t}
|
|
175
|
+
@db[:atest].get(Sequel.extract(:year, :t)).should == 2010
|
|
205
176
|
ensure
|
|
206
177
|
@db.drop_table?(:atest)
|
|
207
178
|
end
|
|
@@ -213,7 +184,7 @@ describe "A PostgreSQL dataset" do
|
|
|
213
184
|
@db.create_table!(:atest){Integer :t}
|
|
214
185
|
@db[:atest].insert(1262304000)
|
|
215
186
|
@db.alter_table(:atest){set_column_type :t, Time, :using=>"'epoch'::timestamp + '1 second'::interval * t"}
|
|
216
|
-
@db[:atest].get(
|
|
187
|
+
@db[:atest].get(Sequel.extract(:year, :t)).should == 2010
|
|
217
188
|
ensure
|
|
218
189
|
@db.drop_table?(:atest)
|
|
219
190
|
end
|
|
@@ -341,9 +312,9 @@ describe "Dataset#distinct" do
|
|
|
341
312
|
@ds.insert(20, 10)
|
|
342
313
|
@ds.insert(30, 10)
|
|
343
314
|
@ds.order(:b, :a).distinct.map(:a).should == [20, 30]
|
|
344
|
-
@ds.order(:b, :a
|
|
315
|
+
@ds.order(:b, Sequel.desc(:a)).distinct.map(:a).should == [30, 20]
|
|
345
316
|
@ds.order(:b, :a).distinct(:b).map(:a).should == [20]
|
|
346
|
-
@ds.order(:b, :a
|
|
317
|
+
@ds.order(:b, Sequel.desc(:a)).distinct(:b).map(:a).should == [30]
|
|
347
318
|
end
|
|
348
319
|
end
|
|
349
320
|
|
|
@@ -435,7 +406,7 @@ describe "A PostgreSQL dataset with a timestamp field" do
|
|
|
435
406
|
|
|
436
407
|
if POSTGRES_DB.adapter_scheme == :postgres
|
|
437
408
|
specify "should handle infinite timestamps if convert_infinite_timestamps is set" do
|
|
438
|
-
@d << {:time=>'infinity'
|
|
409
|
+
@d << {:time=>Sequel.cast('infinity', :timestamp)}
|
|
439
410
|
@db.convert_infinite_timestamps = :nil
|
|
440
411
|
@db[:test3].get(:time).should == nil
|
|
441
412
|
@db.convert_infinite_timestamps = :string
|
|
@@ -443,7 +414,7 @@ describe "A PostgreSQL dataset with a timestamp field" do
|
|
|
443
414
|
@db.convert_infinite_timestamps = :float
|
|
444
415
|
@db[:test3].get(:time).should == 1.0/0.0
|
|
445
416
|
|
|
446
|
-
@d.update(:time=>'-infinity'
|
|
417
|
+
@d.update(:time=>Sequel.cast('-infinity', :timestamp))
|
|
447
418
|
@db.convert_infinite_timestamps = :nil
|
|
448
419
|
@db[:test3].get(:time).should == nil
|
|
449
420
|
@db.convert_infinite_timestamps = :string
|
|
@@ -730,12 +701,12 @@ describe "Postgres::Database schema qualified tables" do
|
|
|
730
701
|
POSTGRES_DB[:schema_test__schema_test].first.should == nil
|
|
731
702
|
POSTGRES_DB[:schema_test__schema_test].insert(:i=>1).should == 1
|
|
732
703
|
POSTGRES_DB[:schema_test__schema_test].first.should == {:i=>1}
|
|
733
|
-
POSTGRES_DB.from('schema_test.schema_test'
|
|
704
|
+
POSTGRES_DB.from(Sequel.lit('schema_test.schema_test')).first.should == {:i=>1}
|
|
734
705
|
POSTGRES_DB.drop_table(:schema_test__schema_test)
|
|
735
|
-
POSTGRES_DB.create_table(
|
|
706
|
+
POSTGRES_DB.create_table(Sequel.qualify(:schema_test, :schema_test)){integer :i}
|
|
736
707
|
POSTGRES_DB[:schema_test__schema_test].first.should == nil
|
|
737
|
-
POSTGRES_DB.from('schema_test.schema_test'
|
|
738
|
-
POSTGRES_DB.drop_table(
|
|
708
|
+
POSTGRES_DB.from(Sequel.lit('schema_test.schema_test')).first.should == nil
|
|
709
|
+
POSTGRES_DB.drop_table(Sequel.qualify(:schema_test, :schema_test))
|
|
739
710
|
end
|
|
740
711
|
|
|
741
712
|
specify "#tables should not include tables in a default non-public schema" do
|
|
@@ -802,13 +773,13 @@ describe "Postgres::Database schema qualified tables" do
|
|
|
802
773
|
|
|
803
774
|
specify "should be able to get custom sequences for tables in a given schema" do
|
|
804
775
|
POSTGRES_DB << "CREATE SEQUENCE schema_test.kseq"
|
|
805
|
-
POSTGRES_DB.create_table(:schema_test__schema_test){integer :j; primary_key :k, :type=>:integer, :default=>"nextval('schema_test.kseq'::regclass)"
|
|
776
|
+
POSTGRES_DB.create_table(:schema_test__schema_test){integer :j; primary_key :k, :type=>:integer, :default=>Sequel.lit("nextval('schema_test.kseq'::regclass)")}
|
|
806
777
|
POSTGRES_DB.primary_key_sequence(:schema_test__schema_test).should == '"schema_test".kseq'
|
|
807
778
|
end
|
|
808
779
|
|
|
809
780
|
specify "should be able to get custom sequences for tables that have spaces in the name in a given schema" do
|
|
810
781
|
POSTGRES_DB << "CREATE SEQUENCE schema_test.\"ks eq\""
|
|
811
|
-
POSTGRES_DB.create_table(:"schema_test__schema test"){integer :j; primary_key :k, :type=>:integer, :default=>"nextval('schema_test.\"ks eq\"'::regclass)"
|
|
782
|
+
POSTGRES_DB.create_table(:"schema_test__schema test"){integer :j; primary_key :k, :type=>:integer, :default=>Sequel.lit("nextval('schema_test.\"ks eq\"'::regclass)")}
|
|
812
783
|
POSTGRES_DB.primary_key_sequence(:"schema_test__schema test").should == '"schema_test"."ks eq"'
|
|
813
784
|
end
|
|
814
785
|
|
|
@@ -889,14 +860,14 @@ describe "Postgres::Database schema qualified tables and eager graphing" do
|
|
|
889
860
|
end
|
|
890
861
|
|
|
891
862
|
specify "should have eager graphs work with previous joins" do
|
|
892
|
-
bands = @Band.order(:bands__name).
|
|
863
|
+
bands = @Band.order(:bands__name).select_all(:s__bands).join(:s__members, :band_id=>:id).from_self(:alias=>:bands0).eager_graph(:albums=>:tracks).all
|
|
893
864
|
bands.should == [@b1, @b2]
|
|
894
865
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
895
866
|
bands.map{|x| x.albums.map{|y| y.tracks}}.should == [[[@t1, @t2], [@t3, @t4]], [[], []]]
|
|
896
867
|
end
|
|
897
868
|
|
|
898
869
|
specify "should have eager graphs work with joins with the same tables" do
|
|
899
|
-
bands = @Band.order(:bands__name).
|
|
870
|
+
bands = @Band.order(:bands__name).select_all(:s__bands).join(:s__members, :band_id=>:id).eager_graph({:albums=>:tracks}, :members).all
|
|
900
871
|
bands.should == [@b1, @b2]
|
|
901
872
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
902
873
|
bands.map{|x| x.albums.map{|y| y.tracks}}.should == [[[@t1, @t2], [@t3, @t4]], [[], []]]
|
|
@@ -934,62 +905,62 @@ describe "Postgres::Database schema qualified tables and eager graphing" do
|
|
|
934
905
|
bands.should == [@b1, @b2]
|
|
935
906
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
936
907
|
|
|
937
|
-
bands = @Band.order(:tracks__name).from(:s__bands.as(:tracks)).eager_graph(:tracks).all
|
|
908
|
+
bands = @Band.order(:tracks__name).from(Sequel.expr(:s__bands).as(:tracks)).eager_graph(:tracks).all
|
|
938
909
|
bands.should == [@b1, @b2]
|
|
939
910
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
940
911
|
|
|
941
|
-
bands = @Band.order(:tracks__name).from(:s__bands.as(:tracks
|
|
912
|
+
bands = @Band.order(:tracks__name).from(Sequel.expr(:s__bands).as(Sequel.identifier(:tracks))).eager_graph(:tracks).all
|
|
942
913
|
bands.should == [@b1, @b2]
|
|
943
914
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
944
915
|
|
|
945
|
-
bands = @Band.order(:tracks__name).from(:s__bands.as('tracks')).eager_graph(:tracks).all
|
|
916
|
+
bands = @Band.order(:tracks__name).from(Sequel.expr(:s__bands).as('tracks')).eager_graph(:tracks).all
|
|
946
917
|
bands.should == [@b1, @b2]
|
|
947
918
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
948
919
|
end
|
|
949
920
|
|
|
950
921
|
specify "should have eager graphs work with join tables with aliases" do
|
|
951
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums___tracks, :band_id
|
|
922
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums___tracks, :band_id=>Sequel.qualify(:s__bands, :id)).eager_graph(:albums=>:tracks).all
|
|
952
923
|
bands.should == [@b1, @b2]
|
|
953
924
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
954
925
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
955
926
|
|
|
956
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(
|
|
927
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(Sequel.as(:s__albums, :tracks), :band_id=>Sequel.qualify(:s__bands, :id)).eager_graph(:albums=>:tracks).all
|
|
957
928
|
bands.should == [@b1, @b2]
|
|
958
929
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
959
930
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
960
931
|
|
|
961
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(
|
|
932
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(Sequel.as(:s__albums, 'tracks'), :band_id=>Sequel.qualify(:s__bands, :id)).eager_graph(:albums=>:tracks).all
|
|
962
933
|
bands.should == [@b1, @b2]
|
|
963
934
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
964
935
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
965
936
|
|
|
966
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums.
|
|
937
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(Sequel.as(:s__albums, Sequel.identifier(:tracks)), :band_id=>Sequel.qualify(:s__bands, :id)).eager_graph(:albums=>:tracks).all
|
|
967
938
|
bands.should == [@b1, @b2]
|
|
968
939
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
969
940
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
970
941
|
|
|
971
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id
|
|
942
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id=>Sequel.qualify(:s__bands, :id)}, :table_alias=>:tracks).eager_graph(:albums=>:tracks).all
|
|
972
943
|
bands.should == [@b1, @b2]
|
|
973
944
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
974
945
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
975
946
|
|
|
976
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id
|
|
947
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id=>Sequel.qualify(:s__bands, :id)}, :table_alias=>'tracks').eager_graph(:albums=>:tracks).all
|
|
977
948
|
bands.should == [@b1, @b2]
|
|
978
949
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
979
950
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
980
951
|
|
|
981
|
-
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id
|
|
952
|
+
bands = @Band.order(:bands__name).eager_graph(:members).join(:s__albums, {:band_id=>Sequel.qualify(:s__bands, :id)}, :table_alias=>Sequel.identifier(:tracks)).eager_graph(:albums=>:tracks).all
|
|
982
953
|
bands.should == [@b1, @b2]
|
|
983
954
|
bands.map{|x| x.albums}.should == [[@a1, @a2], [@a3, @a4]]
|
|
984
955
|
bands.map{|x| x.members}.should == [[@m1, @m2], [@m4, @m3]]
|
|
985
956
|
end
|
|
986
957
|
|
|
987
958
|
specify "should have eager graphs work with different types of qualified from tables" do
|
|
988
|
-
bands = @Band.order(:bands__name).from(
|
|
959
|
+
bands = @Band.order(:bands__name).from(Sequel.qualify(:s, :bands)).eager_graph(:tracks).all
|
|
989
960
|
bands.should == [@b1, @b2]
|
|
990
961
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
991
962
|
|
|
992
|
-
bands = @Band.order(:bands__name).from(:bands.
|
|
963
|
+
bands = @Band.order(:bands__name).from(Sequel.identifier(:bands).qualify(:s)).eager_graph(:tracks).all
|
|
993
964
|
bands.should == [@b1, @b2]
|
|
994
965
|
bands.map{|x| x.tracks}.should == [[@t1, @t2, @t3, @t4], []]
|
|
995
966
|
|
|
@@ -1195,7 +1166,7 @@ if POSTGRES_DB.adapter_scheme == :postgres
|
|
|
1195
1166
|
|
|
1196
1167
|
specify "should look up conversion procs by name" do
|
|
1197
1168
|
@db.create_table!(:foo){interval :bar}
|
|
1198
|
-
@db[:foo].insert('21 days'
|
|
1169
|
+
@db[:foo].insert(Sequel.cast('21 days', :interval))
|
|
1199
1170
|
@db[:foo].get(:bar).should == 'syad 12'
|
|
1200
1171
|
end
|
|
1201
1172
|
end
|
|
@@ -1406,7 +1377,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1406
1377
|
column :dp, 'double precision[]'
|
|
1407
1378
|
end
|
|
1408
1379
|
@tp.call.should == [:integer_array, :integer_array, :bigint_array, :float_array, :float_array]
|
|
1409
|
-
@ds.insert([1]
|
|
1380
|
+
@ds.insert(Sequel.pg_array([1], :int2), Sequel.pg_array([nil, 2], :int4), Sequel.pg_array([3, nil], :int8), Sequel.pg_array([4, nil, 4.5], :real), Sequel.pg_array([5, nil, 5.5], "double precision"))
|
|
1410
1381
|
@ds.count.should == 1
|
|
1411
1382
|
rs = @ds.all
|
|
1412
1383
|
if @jdbc || @native
|
|
@@ -1421,7 +1392,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1421
1392
|
end
|
|
1422
1393
|
|
|
1423
1394
|
@ds.delete
|
|
1424
|
-
@ds.insert([[1], [2]]
|
|
1395
|
+
@ds.insert(Sequel.pg_array([[1], [2]], :int2), Sequel.pg_array([[nil, 2], [3, 4]], :int4), Sequel.pg_array([[3, nil], [nil, nil]], :int8), Sequel.pg_array([[4, nil], [nil, 4.5]], :real), Sequel.pg_array([[5, nil], [nil, 5.5]], "double precision"))
|
|
1425
1396
|
|
|
1426
1397
|
rs = @ds.all
|
|
1427
1398
|
if @jdbc || @native
|
|
@@ -1441,7 +1412,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1441
1412
|
column :n, 'numeric[]'
|
|
1442
1413
|
end
|
|
1443
1414
|
@tp.call.should == [:decimal_array]
|
|
1444
|
-
@ds.insert([BigDecimal.new('1.000000000000000000001'), nil, BigDecimal.new('1')]
|
|
1415
|
+
@ds.insert(Sequel.pg_array([BigDecimal.new('1.000000000000000000001'), nil, BigDecimal.new('1')], :numeric))
|
|
1445
1416
|
@ds.count.should == 1
|
|
1446
1417
|
rs = @ds.all
|
|
1447
1418
|
if @jdbc || @native
|
|
@@ -1456,7 +1427,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1456
1427
|
end
|
|
1457
1428
|
|
|
1458
1429
|
@ds.delete
|
|
1459
|
-
@ds.insert([[BigDecimal.new('1.0000000000000000000000000000001'), nil], [nil, BigDecimal.new('1')]]
|
|
1430
|
+
@ds.insert(Sequel.pg_array([[BigDecimal.new('1.0000000000000000000000000000001'), nil], [nil, BigDecimal.new('1')]], :numeric))
|
|
1460
1431
|
rs = @ds.all
|
|
1461
1432
|
if @jdbc || @native
|
|
1462
1433
|
rs.should == [{:n=>[[BigDecimal.new('1.0000000000000000000000000000001'), nil], [nil, BigDecimal.new('1')]]}]
|
|
@@ -1477,7 +1448,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1477
1448
|
column :t, 'text[]'
|
|
1478
1449
|
end
|
|
1479
1450
|
@tp.call.should == [:string_array, :string_array, :string_array]
|
|
1480
|
-
@ds.insert(['a', nil, 'NULL', 'b"\'c']
|
|
1451
|
+
@ds.insert(Sequel.pg_array(['a', nil, 'NULL', 'b"\'c'], 'char(4)'), Sequel.pg_array(['a', nil, 'NULL', 'b"\'c'], :varchar), Sequel.pg_array(['a', nil, 'NULL', 'b"\'c'], :text))
|
|
1481
1452
|
@ds.count.should == 1
|
|
1482
1453
|
rs = @ds.all
|
|
1483
1454
|
if @jdbc || @native
|
|
@@ -1492,7 +1463,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1492
1463
|
end
|
|
1493
1464
|
|
|
1494
1465
|
@ds.delete
|
|
1495
|
-
@ds.insert([[['a'], [nil]], [['NULL'], ['b"\'c']]]
|
|
1466
|
+
@ds.insert(Sequel.pg_array([[['a'], [nil]], [['NULL'], ['b"\'c']]], 'char(4)'), Sequel.pg_array([[['a'], ['']], [['NULL'], ['b"\'c']]], :varchar), Sequel.pg_array([[['a'], [nil]], [['NULL'], ['b"\'c']]], :text))
|
|
1496
1467
|
rs = @ds.all
|
|
1497
1468
|
if @jdbc || @native
|
|
1498
1469
|
rs.should == [{:c=>[[['a '], [nil]], [['NULL'], ['b"\'c']]], :vc=>[[['a'], ['']], [['NULL'], ['b"\'c']]], :t=>[[['a'], [nil]], [['NULL'], ['b"\'c']]]}]
|
|
@@ -1520,7 +1491,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1520
1491
|
t = Sequel::SQLTime.create(10, 20, 30)
|
|
1521
1492
|
ts = Time.local(2011, 1, 2, 3, 4, 5)
|
|
1522
1493
|
|
|
1523
|
-
@ds.insert([true, false]
|
|
1494
|
+
@ds.insert(Sequel.pg_array([true, false], :bool), Sequel.pg_array([d, nil], :date), Sequel.pg_array([t, nil], :time), Sequel.pg_array([ts, nil], :timestamp), Sequel.pg_array([ts, nil], :timestamptz))
|
|
1524
1495
|
@ds.count.should == 1
|
|
1525
1496
|
rs = @ds.all
|
|
1526
1497
|
if @jdbc || @native
|
|
@@ -1540,7 +1511,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1540
1511
|
column :o, 'oid[]'
|
|
1541
1512
|
end
|
|
1542
1513
|
@tp.call.should == [:blob_array, :time_timezone_array, :integer_array]
|
|
1543
|
-
@ds.insert(
|
|
1514
|
+
@ds.insert(Sequel.pg_array([Sequel.blob("a\0"), nil], :bytea), Sequel.pg_array([t, nil], :timetz), Sequel.pg_array([1, 2, 3], :oid))
|
|
1544
1515
|
@ds.count.should == 1
|
|
1545
1516
|
if @native
|
|
1546
1517
|
rs = @ds.all
|
|
@@ -1566,7 +1537,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1566
1537
|
column :i, 'text[]'
|
|
1567
1538
|
end
|
|
1568
1539
|
a = ["\"\\\\\"{}\n\t\r \v\b123afP", 'NULL', nil, '']
|
|
1569
|
-
@ds.call(:insert, {:i=>:$i}, :i=>
|
|
1540
|
+
@ds.call(:insert, {:i=>:$i}, :i=>Sequel.pg_array(a))
|
|
1570
1541
|
@ds.get(:i).should == a
|
|
1571
1542
|
@ds.filter(:i=>:$i).call(:first, :i=>a).should == {:i=>a}
|
|
1572
1543
|
@ds.filter(:i=>:$i).call(:first, :i=>['', nil, nil, 'a']).should == nil
|
|
@@ -1575,37 +1546,37 @@ describe 'PostgreSQL array handling' do
|
|
|
1575
1546
|
column :i, 'date[]'
|
|
1576
1547
|
end
|
|
1577
1548
|
a = [Date.today]
|
|
1578
|
-
@ds.call(:insert, {:i=>:$i}, :i=>
|
|
1549
|
+
@ds.call(:insert, {:i=>:$i}, :i=>Sequel.pg_array(a, 'date'))
|
|
1579
1550
|
@ds.get(:i).should == a
|
|
1580
1551
|
@ds.filter(:i=>:$i).call(:first, :i=>a).should == {:i=>a}
|
|
1581
|
-
@ds.filter(:i=>:$i).call(:first, :i=>[Date.today-1]
|
|
1552
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.pg_array([Date.today-1], 'date')).should == nil
|
|
1582
1553
|
|
|
1583
1554
|
@db.create_table!(:items) do
|
|
1584
1555
|
column :i, 'timestamp[]'
|
|
1585
1556
|
end
|
|
1586
1557
|
a = [Time.local(2011, 1, 2, 3, 4, 5)]
|
|
1587
|
-
@ds.call(:insert, {:i=>:$i}, :i=>
|
|
1558
|
+
@ds.call(:insert, {:i=>:$i}, :i=>Sequel.pg_array(a, 'timestamp'))
|
|
1588
1559
|
@ds.get(:i).should == a
|
|
1589
1560
|
@ds.filter(:i=>:$i).call(:first, :i=>a).should == {:i=>a}
|
|
1590
|
-
@ds.filter(:i=>:$i).call(:first, :i=>[a.first-1]
|
|
1561
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.pg_array([a.first-1], 'timestamp')).should == nil
|
|
1591
1562
|
|
|
1592
1563
|
@db.create_table!(:items) do
|
|
1593
1564
|
column :i, 'boolean[]'
|
|
1594
1565
|
end
|
|
1595
1566
|
a = [true, false]
|
|
1596
|
-
@ds.call(:insert, {:i=>:$i}, :i=>
|
|
1567
|
+
@ds.call(:insert, {:i=>:$i}, :i=>Sequel.pg_array(a, 'boolean'))
|
|
1597
1568
|
@ds.get(:i).should == a
|
|
1598
1569
|
@ds.filter(:i=>:$i).call(:first, :i=>a).should == {:i=>a}
|
|
1599
|
-
@ds.filter(:i=>:$i).call(:first, :i=>[false, true]
|
|
1570
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.pg_array([false, true], 'boolean')).should == nil
|
|
1600
1571
|
|
|
1601
1572
|
@db.create_table!(:items) do
|
|
1602
1573
|
column :i, 'bytea[]'
|
|
1603
1574
|
end
|
|
1604
1575
|
a = [Sequel.blob("a\0'\"")]
|
|
1605
|
-
@ds.call(:insert, {:i=>:$i}, :i=>
|
|
1576
|
+
@ds.call(:insert, {:i=>:$i}, :i=>Sequel.pg_array(a, 'bytea'))
|
|
1606
1577
|
@ds.get(:i).should == a
|
|
1607
1578
|
@ds.filter(:i=>:$i).call(:first, :i=>a).should == {:i=>a}
|
|
1608
|
-
@ds.filter(:i=>:$i).call(:first, :i=>[Sequel.blob("b\0")]
|
|
1579
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.pg_array([Sequel.blob("b\0")], 'bytea')).should == nil
|
|
1609
1580
|
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
1610
1581
|
|
|
1611
1582
|
specify 'with models' do
|
|
@@ -1617,7 +1588,7 @@ describe 'PostgreSQL array handling' do
|
|
|
1617
1588
|
column :t, 'text[]'
|
|
1618
1589
|
end
|
|
1619
1590
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
1620
|
-
c.plugin :
|
|
1591
|
+
c.plugin :pg_typecast_on_load, :i, :f, :d, :t unless @native
|
|
1621
1592
|
o = c.create(:i=>[1,2, nil], :f=>[[1, 2.5], [3, 4.5]], :d=>[1, BigDecimal.new('1.000000000000000000001')], :t=>[%w'a b c', ['NULL', nil, '1']])
|
|
1622
1593
|
o.i.should == [1, 2, nil]
|
|
1623
1594
|
o.f.should == [[1, 2.5], [3, 4.5]]
|
|
@@ -1628,56 +1599,56 @@ describe 'PostgreSQL array handling' do
|
|
|
1628
1599
|
specify 'operations/functions with pg_array_ops' do
|
|
1629
1600
|
Sequel.extension :pg_array_ops
|
|
1630
1601
|
@db.create_table!(:items){column :i, 'integer[]'; column :i2, 'integer[]'; column :i3, 'integer[]'; column :i4, 'integer[]'; column :i5, 'integer[]'}
|
|
1631
|
-
@ds.insert([1, 2, 3].pg_array
|
|
1602
|
+
@ds.insert(Sequel.pg_array([1, 2, 3]), Sequel.pg_array([2, 1]), Sequel.pg_array([4, 4]), Sequel.pg_array([[5, 5], [4, 3]]), Sequel.pg_array([1, nil, 5]))
|
|
1632
1603
|
|
|
1633
|
-
@ds.get(:i
|
|
1634
|
-
@ds.get(:i3
|
|
1604
|
+
@ds.get(Sequel.pg_array(:i) > :i3).should be_false
|
|
1605
|
+
@ds.get(Sequel.pg_array(:i3) > :i).should be_true
|
|
1635
1606
|
|
|
1636
|
-
@ds.get(:i
|
|
1637
|
-
@ds.get(:i
|
|
1607
|
+
@ds.get(Sequel.pg_array(:i) >= :i3).should be_false
|
|
1608
|
+
@ds.get(Sequel.pg_array(:i) >= :i).should be_true
|
|
1638
1609
|
|
|
1639
|
-
@ds.get(:i3
|
|
1640
|
-
@ds.get(:i
|
|
1610
|
+
@ds.get(Sequel.pg_array(:i3) < :i).should be_false
|
|
1611
|
+
@ds.get(Sequel.pg_array(:i) < :i3).should be_true
|
|
1641
1612
|
|
|
1642
|
-
@ds.get(:i3
|
|
1643
|
-
@ds.get(:i
|
|
1613
|
+
@ds.get(Sequel.pg_array(:i3) <= :i).should be_false
|
|
1614
|
+
@ds.get(Sequel.pg_array(:i) <= :i).should be_true
|
|
1644
1615
|
|
|
1645
|
-
@ds.get(
|
|
1646
|
-
@ds.get(
|
|
1616
|
+
@ds.get(Sequel.expr(5=>Sequel.pg_array(:i).any)).should be_false
|
|
1617
|
+
@ds.get(Sequel.expr(1=>Sequel.pg_array(:i).any)).should be_true
|
|
1647
1618
|
|
|
1648
|
-
@ds.get(
|
|
1649
|
-
@ds.get(
|
|
1619
|
+
@ds.get(Sequel.expr(1=>Sequel.pg_array(:i3).all)).should be_false
|
|
1620
|
+
@ds.get(Sequel.expr(4=>Sequel.pg_array(:i3).all)).should be_true
|
|
1650
1621
|
|
|
1651
|
-
@ds.get(:i2
|
|
1652
|
-
@ds.get(:i2
|
|
1622
|
+
@ds.get(Sequel.pg_array(:i2)[1]).should == 2
|
|
1623
|
+
@ds.get(Sequel.pg_array(:i2)[2]).should == 1
|
|
1653
1624
|
|
|
1654
|
-
@ds.get(:i4
|
|
1655
|
-
@ds.get(:i4
|
|
1625
|
+
@ds.get(Sequel.pg_array(:i4)[2][1]).should == 4
|
|
1626
|
+
@ds.get(Sequel.pg_array(:i4)[2][2]).should == 3
|
|
1656
1627
|
|
|
1657
|
-
@ds.get(:i.
|
|
1658
|
-
@ds.get(:i.
|
|
1628
|
+
@ds.get(Sequel.pg_array(:i).contains(:i2)).should be_true
|
|
1629
|
+
@ds.get(Sequel.pg_array(:i).contains(:i3)).should be_false
|
|
1659
1630
|
|
|
1660
|
-
@ds.get(:i2.
|
|
1661
|
-
@ds.get(:i.
|
|
1631
|
+
@ds.get(Sequel.pg_array(:i2).contained_by(:i)).should be_true
|
|
1632
|
+
@ds.get(Sequel.pg_array(:i).contained_by(:i2)).should be_false
|
|
1662
1633
|
|
|
1663
|
-
@ds.get(:i.
|
|
1664
|
-
@ds.get(:i2.
|
|
1634
|
+
@ds.get(Sequel.pg_array(:i).overlaps(:i2)).should be_true
|
|
1635
|
+
@ds.get(Sequel.pg_array(:i2).overlaps(:i3)).should be_false
|
|
1665
1636
|
|
|
1666
|
-
@ds.get(:i.
|
|
1667
|
-
@ds.get(:i.
|
|
1668
|
-
@ds.get(:i.
|
|
1637
|
+
@ds.get(Sequel.pg_array(:i).dims).should == '[1:3]'
|
|
1638
|
+
@ds.get(Sequel.pg_array(:i).length).should == 3
|
|
1639
|
+
@ds.get(Sequel.pg_array(:i).lower).should == 1
|
|
1669
1640
|
|
|
1670
1641
|
if @db.server_version >= 90000
|
|
1671
|
-
@ds.get(:i5.
|
|
1672
|
-
@ds.get(:i5.
|
|
1673
|
-
@ds.get(:i5.
|
|
1642
|
+
@ds.get(Sequel.pg_array(:i5).join).should == '15'
|
|
1643
|
+
@ds.get(Sequel.pg_array(:i5).join(':')).should == '1:5'
|
|
1644
|
+
@ds.get(Sequel.pg_array(:i5).join(':', '*')).should == '1:*:5'
|
|
1674
1645
|
end
|
|
1675
|
-
@ds.select(:i.
|
|
1646
|
+
@ds.select(Sequel.pg_array(:i).unnest).from_self.count.should == 3 if @db.server_version >= 80400
|
|
1676
1647
|
|
|
1677
1648
|
if @native
|
|
1678
|
-
@ds.get(:i.
|
|
1679
|
-
@ds.get(:i.
|
|
1680
|
-
@ds.get(:i.
|
|
1649
|
+
@ds.get(Sequel.pg_array(:i).push(4)).should == [1, 2, 3, 4]
|
|
1650
|
+
@ds.get(Sequel.pg_array(:i).unshift(4)).should == [4, 1, 2, 3]
|
|
1651
|
+
@ds.get(Sequel.pg_array(:i).concat(:i2)).should == [1, 2, 3, 2, 1]
|
|
1681
1652
|
end
|
|
1682
1653
|
end
|
|
1683
1654
|
end
|
|
@@ -1698,7 +1669,7 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1698
1669
|
@db.create_table!(:items) do
|
|
1699
1670
|
column :h, :hstore
|
|
1700
1671
|
end
|
|
1701
|
-
@ds.insert(@h
|
|
1672
|
+
@ds.insert(Sequel.hstore(@h))
|
|
1702
1673
|
@ds.count.should == 1
|
|
1703
1674
|
if @native
|
|
1704
1675
|
rs = @ds.all
|
|
@@ -1716,10 +1687,10 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1716
1687
|
@db.create_table!(:items) do
|
|
1717
1688
|
column :i, :hstore
|
|
1718
1689
|
end
|
|
1719
|
-
@ds.call(:insert, {:i
|
|
1690
|
+
@ds.call(:insert, {:i=>Sequel.hstore(@h)}, {:i=>:$i})
|
|
1720
1691
|
@ds.get(:i).should == @h
|
|
1721
|
-
@ds.filter(:i=>:$i).call(:first, :i
|
|
1722
|
-
@ds.filter(:i=>:$i).call(:first, :i=>{}
|
|
1692
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.hstore(@h)).should == {:i=>@h}
|
|
1693
|
+
@ds.filter(:i=>:$i).call(:first, :i=>Sequel.hstore({})).should == nil
|
|
1723
1694
|
|
|
1724
1695
|
@ds.delete
|
|
1725
1696
|
@ds.call(:insert, {:i=>@h}, {:i=>:$i})
|
|
@@ -1747,33 +1718,33 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1747
1718
|
end
|
|
1748
1719
|
Sequel.extension :pg_hstore_ops
|
|
1749
1720
|
c.plugin :many_through_many
|
|
1750
|
-
c.plugin :
|
|
1721
|
+
c.plugin :pg_typecast_on_load, :h unless @native
|
|
1751
1722
|
|
|
1752
1723
|
h = {'item_id'=>"2", 'left_item_id'=>"1"}
|
|
1753
1724
|
o2 = c.create(:id=>2)
|
|
1754
1725
|
o = c.create(:id=>1, :h=>h)
|
|
1755
1726
|
o.h.should == h
|
|
1756
1727
|
|
|
1757
|
-
c.many_to_one :item, :class=>c, :key_column=>Sequel.cast(:h
|
|
1758
|
-
c.one_to_many :items, :class=>c, :key=>Sequel.cast(:h
|
|
1759
|
-
c.many_to_many :related_items, :class=>c, :join_table=>:items___i, :left_key=>Sequel.cast(:h
|
|
1728
|
+
c.many_to_one :item, :class=>c, :key_column=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
|
1729
|
+
c.one_to_many :items, :class=>c, :key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer), :key_method=>:item_id
|
|
1730
|
+
c.many_to_many :related_items, :class=>c, :join_table=>:items___i, :left_key=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer), :right_key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
|
1760
1731
|
|
|
1761
|
-
c.many_to_one :other_item, :class=>c, :key=>:id, :primary_key_method=>:item_id, :primary_key=>Sequel.cast(:h
|
|
1762
|
-
c.one_to_many :other_items, :class=>c, :primary_key=>:item_id, :key=>:id, :primary_key_column=>Sequel.cast(:h
|
|
1732
|
+
c.many_to_one :other_item, :class=>c, :key=>:id, :primary_key_method=>:item_id, :primary_key=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
|
1733
|
+
c.one_to_many :other_items, :class=>c, :primary_key=>:item_id, :key=>:id, :primary_key_column=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer)
|
|
1763
1734
|
c.many_to_many :other_related_items, :class=>c, :join_table=>:items___i, :left_key=>:id, :right_key=>:id,
|
|
1764
|
-
:left_primary_key_column=>Sequel.cast(:h
|
|
1735
|
+
:left_primary_key_column=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer),
|
|
1765
1736
|
:left_primary_key=>:left_item_id,
|
|
1766
|
-
:right_primary_key=>Sequel.cast(:h
|
|
1737
|
+
:right_primary_key=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer),
|
|
1767
1738
|
:right_primary_key_method=>:left_item_id
|
|
1768
1739
|
|
|
1769
1740
|
c.many_through_many :mtm_items, [
|
|
1770
|
-
[:items, Sequel.cast(:h
|
|
1771
|
-
[:items, Sequel.cast(:h
|
|
1741
|
+
[:items, Sequel.cast(Sequel.hstore(:h)['item_id'], Integer), Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer)],
|
|
1742
|
+
[:items, Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer), Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer)]
|
|
1772
1743
|
],
|
|
1773
1744
|
:class=>c,
|
|
1774
|
-
:left_primary_key_column=>Sequel.cast(:h
|
|
1745
|
+
:left_primary_key_column=>Sequel.cast(Sequel.hstore(:h)['item_id'], Integer),
|
|
1775
1746
|
:left_primary_key=>:item_id,
|
|
1776
|
-
:right_primary_key=>Sequel.cast(:h
|
|
1747
|
+
:right_primary_key=>Sequel.cast(Sequel.hstore(:h)['left_item_id'], Integer),
|
|
1777
1748
|
:right_primary_key_method=>:left_item_id
|
|
1778
1749
|
|
|
1779
1750
|
# Lazily Loading
|
|
@@ -1827,10 +1798,10 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1827
1798
|
specify 'operations/functions with pg_hstore_ops' do
|
|
1828
1799
|
Sequel.extension :pg_hstore_ops, :pg_array, :pg_array_ops
|
|
1829
1800
|
@db.create_table!(:items){hstore :h1; hstore :h2; hstore :h3; String :t}
|
|
1830
|
-
@ds.insert(
|
|
1831
|
-
h1 = :h1
|
|
1832
|
-
h2 = :h2
|
|
1833
|
-
h3 = :h3
|
|
1801
|
+
@ds.insert(Sequel.hstore('a'=>'b', 'c'=>nil), Sequel.hstore('a'=>'b'), Sequel.hstore('d'=>'e'))
|
|
1802
|
+
h1 = Sequel.hstore(:h1)
|
|
1803
|
+
h2 = Sequel.hstore(:h2)
|
|
1804
|
+
h3 = Sequel.hstore(:h3)
|
|
1834
1805
|
|
|
1835
1806
|
@ds.get(h1['a']).should == 'b'
|
|
1836
1807
|
@ds.get(h1['d']).should == nil
|
|
@@ -1840,13 +1811,13 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1840
1811
|
@ds.get(h2.merge(h3).keys.pg_array.length).should == 2
|
|
1841
1812
|
@ds.get(h1.merge(h3).keys.pg_array.length).should == 3
|
|
1842
1813
|
|
|
1843
|
-
unless @db.adapter_scheme
|
|
1814
|
+
unless [:do].include?(@db.adapter_scheme)
|
|
1844
1815
|
# Broken DataObjects thinks operators with ? represent placeholders
|
|
1845
|
-
@ds.get(h1.contain_all(%w'a c'
|
|
1846
|
-
@ds.get(h1.contain_all(%w'a d'
|
|
1816
|
+
@ds.get(h1.contain_all(Sequel.pg_array(%w'a c'))).should == true
|
|
1817
|
+
@ds.get(h1.contain_all(Sequel.pg_array(%w'a d'))).should == false
|
|
1847
1818
|
|
|
1848
|
-
@ds.get(h1.contain_any(%w'a d'
|
|
1849
|
-
@ds.get(h1.contain_any(%w'e d'
|
|
1819
|
+
@ds.get(h1.contain_any(Sequel.pg_array(%w'a d'))).should == true
|
|
1820
|
+
@ds.get(h1.contain_any(Sequel.pg_array(%w'e d'))).should == false
|
|
1850
1821
|
end
|
|
1851
1822
|
|
|
1852
1823
|
@ds.get(h1.contains(h2)).should == true
|
|
@@ -1860,12 +1831,12 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1860
1831
|
@ds.get(h1.defined('d')).should == false
|
|
1861
1832
|
|
|
1862
1833
|
@ds.get(h1.delete('a')['c']).should == nil
|
|
1863
|
-
@ds.get(h1.delete(%w'a d'
|
|
1834
|
+
@ds.get(h1.delete(Sequel.pg_array(%w'a d'))['c']).should == nil
|
|
1864
1835
|
@ds.get(h1.delete(h2)['c']).should == nil
|
|
1865
1836
|
|
|
1866
|
-
@ds.from(
|
|
1837
|
+
@ds.from(Sequel.hstore('a'=>'b', 'c'=>nil).op.each).order(:key).all.should == [{:key=>'a', :value=>'b'}, {:key=>'c', :value=>nil}]
|
|
1867
1838
|
|
|
1868
|
-
unless @db.adapter_scheme
|
|
1839
|
+
unless [:do].include?(@db.adapter_scheme)
|
|
1869
1840
|
@ds.get(h1.has_key?('c')).should == true
|
|
1870
1841
|
@ds.get(h1.include?('c')).should == true
|
|
1871
1842
|
@ds.get(h1.key?('c')).should == true
|
|
@@ -1884,16 +1855,16 @@ describe 'PostgreSQL hstore handling' do
|
|
|
1884
1855
|
@ds.get(h1.akeys.pg_array.length).should == 2
|
|
1885
1856
|
@ds.get(h2.akeys.pg_array.length).should == 1
|
|
1886
1857
|
|
|
1887
|
-
@ds.from(
|
|
1888
|
-
@ds.from(:items___i).select(
|
|
1858
|
+
@ds.from(Sequel.hstore('t'=>'s').op.populate(Sequel::SQL::Cast.new(nil, :items))).select_map(:t).should == ['s']
|
|
1859
|
+
@ds.from(:items___i).select(Sequel.hstore('t'=>'s').op.record_set(:i).as(:r)).from_self(:alias=>:s).select(Sequel.lit('(r).*')).from_self.select_map(:t).should == ['s']
|
|
1889
1860
|
|
|
1890
|
-
@ds.from(
|
|
1861
|
+
@ds.from(Sequel.hstore('t'=>'s', 'a'=>'b').op.skeys.as(:s)).select_order_map(:s).should == %w'a t'
|
|
1891
1862
|
|
|
1892
|
-
@ds.get(h1.slice(%w'a c'
|
|
1893
|
-
@ds.get(h1.slice(%w'd c'
|
|
1894
|
-
@ds.get(h1.slice(%w'd e'
|
|
1863
|
+
@ds.get(h1.slice(Sequel.pg_array(%w'a c')).keys.pg_array.length).should == 2
|
|
1864
|
+
@ds.get(h1.slice(Sequel.pg_array(%w'd c')).keys.pg_array.length).should == 1
|
|
1865
|
+
@ds.get(h1.slice(Sequel.pg_array(%w'd e')).keys.pg_array.length).should == nil
|
|
1895
1866
|
|
|
1896
|
-
@ds.from(
|
|
1867
|
+
@ds.from(Sequel.hstore('t'=>'s', 'a'=>'b').op.svals.as(:s)).select_order_map(:s).should == %w'b s'
|
|
1897
1868
|
|
|
1898
1869
|
@ds.get(h1.to_array.pg_array.length).should == 4
|
|
1899
1870
|
@ds.get(h2.to_array.pg_array.length).should == 2
|
|
@@ -1923,7 +1894,7 @@ describe 'PostgreSQL json type' do
|
|
|
1923
1894
|
|
|
1924
1895
|
specify 'insert and retrieve json values' do
|
|
1925
1896
|
@db.create_table!(:items){json :j}
|
|
1926
|
-
@ds.insert(@h
|
|
1897
|
+
@ds.insert(Sequel.pg_json(@h))
|
|
1927
1898
|
@ds.count.should == 1
|
|
1928
1899
|
if @native
|
|
1929
1900
|
rs = @ds.all
|
|
@@ -1938,7 +1909,7 @@ describe 'PostgreSQL json type' do
|
|
|
1938
1909
|
end
|
|
1939
1910
|
|
|
1940
1911
|
@ds.delete
|
|
1941
|
-
@ds.insert(@a
|
|
1912
|
+
@ds.insert(Sequel.pg_json(@a))
|
|
1942
1913
|
@ds.count.should == 1
|
|
1943
1914
|
if @native
|
|
1944
1915
|
rs = @ds.all
|
|
@@ -1955,7 +1926,7 @@ describe 'PostgreSQL json type' do
|
|
|
1955
1926
|
|
|
1956
1927
|
specify 'insert and retrieve json[] values' do
|
|
1957
1928
|
@db.create_table!(:items){column :j, 'json[]'}
|
|
1958
|
-
j = [
|
|
1929
|
+
j = Sequel.pg_array([Sequel.pg_json('a'=>1), Sequel.pg_json(['b', 2])])
|
|
1959
1930
|
@ds.insert(j)
|
|
1960
1931
|
@ds.count.should == 1
|
|
1961
1932
|
if @native
|
|
@@ -1973,23 +1944,23 @@ describe 'PostgreSQL json type' do
|
|
|
1973
1944
|
|
|
1974
1945
|
specify 'use json in bound variables' do
|
|
1975
1946
|
@db.create_table!(:items){json :i}
|
|
1976
|
-
@ds.call(:insert, {:i
|
|
1947
|
+
@ds.call(:insert, {:i=>Sequel.pg_json(@h)}, {:i=>:$i})
|
|
1977
1948
|
@ds.get(:i).should == @h
|
|
1978
|
-
@ds.filter(
|
|
1979
|
-
@ds.filter(
|
|
1980
|
-
@ds.filter(
|
|
1949
|
+
@ds.filter(Sequel.cast(:i, String)=>:$i).call(:first, :i=>Sequel.pg_json(@h)).should == {:i=>@h}
|
|
1950
|
+
@ds.filter(Sequel.cast(:i, String)=>:$i).call(:first, :i=>Sequel.pg_json({})).should == nil
|
|
1951
|
+
@ds.filter(Sequel.cast(:i, String)=>:$i).call(:delete, :i=>Sequel.pg_json(@h)).should == 1
|
|
1981
1952
|
|
|
1982
|
-
@ds.call(:insert, {:i
|
|
1953
|
+
@ds.call(:insert, {:i=>Sequel.pg_json(@a)}, {:i=>:$i})
|
|
1983
1954
|
@ds.get(:i).should == @a
|
|
1984
|
-
@ds.filter(
|
|
1985
|
-
@ds.filter(
|
|
1955
|
+
@ds.filter(Sequel.cast(:i, String)=>:$i).call(:first, :i=>Sequel.pg_json(@a)).should == {:i=>@a}
|
|
1956
|
+
@ds.filter(Sequel.cast(:i, String)=>:$i).call(:first, :i=>Sequel.pg_json([])).should == nil
|
|
1986
1957
|
|
|
1987
1958
|
@db.create_table!(:items){column :i, 'json[]'}
|
|
1988
|
-
j = [
|
|
1959
|
+
j = Sequel.pg_array([Sequel.pg_json('a'=>1), Sequel.pg_json(['b', 2])], :text)
|
|
1989
1960
|
@ds.call(:insert, {:i=>j}, {:i=>:$i})
|
|
1990
1961
|
@ds.get(:i).should == j
|
|
1991
|
-
@ds.filter(
|
|
1992
|
-
@ds.filter(
|
|
1962
|
+
@ds.filter(Sequel.cast(:i, 'text[]')=>:$i).call(:first, :i=>j).should == {:i=>j}
|
|
1963
|
+
@ds.filter(Sequel.cast(:i, 'text[]')=>:$i).call(:first, :i=>Sequel.pg_array([])).should == nil
|
|
1993
1964
|
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
1994
1965
|
|
|
1995
1966
|
specify 'with models' do
|
|
@@ -1998,9 +1969,9 @@ describe 'PostgreSQL json type' do
|
|
|
1998
1969
|
json :h
|
|
1999
1970
|
end
|
|
2000
1971
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
2001
|
-
c.plugin :
|
|
2002
|
-
c.create(:h
|
|
2003
|
-
c.create(:h
|
|
1972
|
+
c.plugin :pg_typecast_on_load, :h unless @native
|
|
1973
|
+
c.create(:h=>Sequel.pg_json(@h)).h.should == @h
|
|
1974
|
+
c.create(:h=>Sequel.pg_json(@a)).h.should == @a
|
|
2004
1975
|
end
|
|
2005
1976
|
end if POSTGRES_DB.server_version >= 90200
|
|
2006
1977
|
|
|
@@ -2062,7 +2033,7 @@ describe 'PostgreSQL inet/cidr types' do
|
|
|
2062
2033
|
|
|
2063
2034
|
specify 'insert and retrieve inet/cidr/macaddr array values' do
|
|
2064
2035
|
@db.create_table!(:items){column :i, 'inet[]'; column :c, 'cidr[]'; column :m, 'macaddr[]'}
|
|
2065
|
-
@ds.insert([@ipv4]
|
|
2036
|
+
@ds.insert(Sequel.pg_array([@ipv4], 'inet'), Sequel.pg_array([@ipv4nm], 'cidr'), Sequel.pg_array(['12:34:56:78:90:ab'], 'macaddr'))
|
|
2066
2037
|
@ds.count.should == 1
|
|
2067
2038
|
if @native
|
|
2068
2039
|
rs = @ds.all
|
|
@@ -2111,7 +2082,7 @@ describe 'PostgreSQL inet/cidr types' do
|
|
|
2111
2082
|
cidr :c
|
|
2112
2083
|
end
|
|
2113
2084
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
2114
|
-
c.plugin :
|
|
2085
|
+
c.plugin :pg_typecast_on_load, :i, :c unless @native
|
|
2115
2086
|
c.create(:i=>@v4, :c=>@v4nm).values.values_at(:i, :c).should == [@ipv4, @ipv4nm]
|
|
2116
2087
|
unless ipv6_broken
|
|
2117
2088
|
c.create(:i=>@ipv6, :c=>@ipv6nm).values.values_at(:i, :c).should == [@ipv6, @ipv6nm]
|
|
@@ -2129,9 +2100,9 @@ describe 'PostgreSQL range types' do
|
|
|
2129
2100
|
@ra = {}
|
|
2130
2101
|
@pgr = {}
|
|
2131
2102
|
@pgra = {}
|
|
2132
|
-
@r.each{|k, v| @ra[k] = [v]
|
|
2133
|
-
@r.each{|k, v| @pgr[k] =
|
|
2134
|
-
@r.each{|k, v| @pgra[k] = [
|
|
2103
|
+
@r.each{|k, v| @ra[k] = Sequel.pg_array([v], @map[k])}
|
|
2104
|
+
@r.each{|k, v| @pgr[k] = Sequel.pg_range(v)}
|
|
2105
|
+
@r.each{|k, v| @pgra[k] = Sequel.pg_array([Sequel.pg_range(v)], @map[k])}
|
|
2135
2106
|
@native = POSTGRES_DB.adapter_scheme == :postgres
|
|
2136
2107
|
end
|
|
2137
2108
|
after do
|
|
@@ -2209,7 +2180,7 @@ describe 'PostgreSQL range types' do
|
|
|
2209
2180
|
specify 'with models' do
|
|
2210
2181
|
@db.create_table!(:items){primary_key :id; int4range :i4; int8range :i8; numrange :n; daterange :d; tsrange :t; tstzrange :tz}
|
|
2211
2182
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
2212
|
-
c.plugin :
|
|
2183
|
+
c.plugin :pg_typecast_on_load, :i4, :i8, :n, :d, :t, :tz unless @native
|
|
2213
2184
|
v = c.create(@r).values
|
|
2214
2185
|
v.delete(:id)
|
|
2215
2186
|
v.should == @r
|
|
@@ -2217,7 +2188,7 @@ describe 'PostgreSQL range types' do
|
|
|
2217
2188
|
unless @db.adapter_scheme == :jdbc
|
|
2218
2189
|
@db.create_table!(:items){primary_key :id; column :i4, 'int4range[]'; column :i8, 'int8range[]'; column :n, 'numrange[]'; column :d, 'daterange[]'; column :t, 'tsrange[]'; column :tz, 'tstzrange[]'}
|
|
2219
2190
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
2220
|
-
c.plugin :
|
|
2191
|
+
c.plugin :pg_typecast_on_load, :i4, :i8, :n, :d, :t, :tz unless @native
|
|
2221
2192
|
v = c.create(@ra).values
|
|
2222
2193
|
v.delete(:id)
|
|
2223
2194
|
v.each{|k,v| v.should == @ra[k].to_a}
|
|
@@ -2227,60 +2198,60 @@ describe 'PostgreSQL range types' do
|
|
|
2227
2198
|
specify 'operations/functions with pg_range_ops' do
|
|
2228
2199
|
Sequel.extension :pg_range_ops
|
|
2229
2200
|
|
|
2230
|
-
@db.get((1..5
|
|
2231
|
-
@db.get((1..5
|
|
2232
|
-
@db.get((1..5
|
|
2201
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contains(2..4)).should be_true
|
|
2202
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contains(3..6)).should be_false
|
|
2203
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contains(0..6)).should be_false
|
|
2233
2204
|
|
|
2234
|
-
@db.get((1..5
|
|
2235
|
-
@db.get((1..5
|
|
2236
|
-
@db.get((1..5
|
|
2205
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contained_by(0..6)).should be_true
|
|
2206
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contained_by(3..6)).should be_false
|
|
2207
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.contained_by(2..4)).should be_false
|
|
2237
2208
|
|
|
2238
|
-
@db.get((1..5
|
|
2239
|
-
@db.get((1...5
|
|
2209
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.overlaps(5..6)).should be_true
|
|
2210
|
+
@db.get(Sequel.pg_range(1...5, :int4range).op.overlaps(5..6)).should be_false
|
|
2240
2211
|
|
|
2241
|
-
@db.get((1..5
|
|
2242
|
-
@db.get((1..5
|
|
2243
|
-
@db.get((1..5
|
|
2244
|
-
@db.get((1..5
|
|
2212
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.left_of(6..10)).should be_true
|
|
2213
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.left_of(5..10)).should be_false
|
|
2214
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.left_of(-1..0)).should be_false
|
|
2215
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.left_of(-1..3)).should be_false
|
|
2245
2216
|
|
|
2246
|
-
@db.get((1..5
|
|
2247
|
-
@db.get((1..5
|
|
2248
|
-
@db.get((1..5
|
|
2249
|
-
@db.get((1..5
|
|
2217
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.right_of(6..10)).should be_false
|
|
2218
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.right_of(5..10)).should be_false
|
|
2219
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.right_of(-1..0)).should be_true
|
|
2220
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.right_of(-1..3)).should be_false
|
|
2250
2221
|
|
|
2251
|
-
@db.get((1..5
|
|
2252
|
-
@db.get((1..5
|
|
2253
|
-
@db.get((1..5
|
|
2254
|
-
@db.get((1..5
|
|
2222
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.starts_before(6..10)).should be_true
|
|
2223
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.starts_before(5..10)).should be_true
|
|
2224
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.starts_before(-1..0)).should be_false
|
|
2225
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.starts_before(-1..3)).should be_false
|
|
2255
2226
|
|
|
2256
|
-
@db.get((1..5
|
|
2257
|
-
@db.get((1..5
|
|
2258
|
-
@db.get((1..5
|
|
2259
|
-
@db.get((1..5
|
|
2227
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.ends_after(6..10)).should be_false
|
|
2228
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.ends_after(5..10)).should be_false
|
|
2229
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.ends_after(-1..0)).should be_true
|
|
2230
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.ends_after(-1..3)).should be_true
|
|
2260
2231
|
|
|
2261
|
-
@db.get((1..5
|
|
2262
|
-
@db.get((1...5
|
|
2232
|
+
@db.get(Sequel.pg_range(1..5, :int4range).op.adjacent_to(6..10)).should be_true
|
|
2233
|
+
@db.get(Sequel.pg_range(1...5, :int4range).op.adjacent_to(6..10)).should be_false
|
|
2263
2234
|
|
|
2264
|
-
@db.get(((1..5
|
|
2265
|
-
@db.get(((1..5
|
|
2235
|
+
@db.get((Sequel.pg_range(1..5, :int4range).op + (6..10)).adjacent_to(6..10)).should be_false
|
|
2236
|
+
@db.get((Sequel.pg_range(1..5, :int4range).op + (6..10)).adjacent_to(11..20)).should be_true
|
|
2266
2237
|
|
|
2267
|
-
@db.get(((1..5
|
|
2268
|
-
@db.get(((1..4
|
|
2238
|
+
@db.get((Sequel.pg_range(1..5, :int4range).op * (2..6)).adjacent_to(6..10)).should be_true
|
|
2239
|
+
@db.get((Sequel.pg_range(1..4, :int4range).op * (2..6)).adjacent_to(6..10)).should be_false
|
|
2269
2240
|
|
|
2270
|
-
@db.get(((1..5
|
|
2271
|
-
@db.get(((0..4
|
|
2241
|
+
@db.get((Sequel.pg_range(1..5, :int4range).op - (2..6)).adjacent_to(2..10)).should be_true
|
|
2242
|
+
@db.get((Sequel.pg_range(0..4, :int4range).op - (3..6)).adjacent_to(4..10)).should be_false
|
|
2272
2243
|
|
|
2273
|
-
@db.get((0..4
|
|
2274
|
-
@db.get((0..4
|
|
2244
|
+
@db.get(Sequel.pg_range(0..4, :int4range).op.lower).should == 0
|
|
2245
|
+
@db.get(Sequel.pg_range(0..4, :int4range).op.upper).should == 5
|
|
2275
2246
|
|
|
2276
|
-
@db.get((0..4
|
|
2247
|
+
@db.get(Sequel.pg_range(0..4, :int4range).op.isempty).should be_false
|
|
2277
2248
|
@db.get(Sequel::Postgres::PGRange.empty(:int4range).op.isempty).should be_true
|
|
2278
2249
|
|
|
2279
|
-
@db.get((1..5
|
|
2250
|
+
@db.get(Sequel.pg_range(1..5, :numrange).op.lower_inc).should be_true
|
|
2280
2251
|
@db.get(Sequel::Postgres::PGRange.new(1, 5, :exclude_begin=>true, :db_type=>:numrange).op.lower_inc).should be_false
|
|
2281
2252
|
|
|
2282
|
-
@db.get((1..5
|
|
2283
|
-
@db.get((1...5
|
|
2253
|
+
@db.get(Sequel.pg_range(1..5, :numrange).op.upper_inc).should be_true
|
|
2254
|
+
@db.get(Sequel.pg_range(1...5, :numrange).op.upper_inc).should be_false
|
|
2284
2255
|
|
|
2285
2256
|
@db.get(Sequel::Postgres::PGRange.new(1, 5, :db_type=>:int4range).op.lower_inf).should be_false
|
|
2286
2257
|
@db.get(Sequel::Postgres::PGRange.new(nil, 5, :db_type=>:int4range).op.lower_inf).should be_true
|
|
@@ -2342,7 +2313,7 @@ describe 'PostgreSQL interval types' do
|
|
|
2342
2313
|
|
|
2343
2314
|
specify 'insert and retrieve interval array values' do
|
|
2344
2315
|
@db.create_table!(:items){column :i, 'interval[]'}
|
|
2345
|
-
@ds.insert(['1 year 2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds']
|
|
2316
|
+
@ds.insert(Sequel.pg_array(['1 year 2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds'], 'interval'))
|
|
2346
2317
|
@ds.count.should == 1
|
|
2347
2318
|
if @native
|
|
2348
2319
|
rs = @ds.all
|
|
@@ -2381,7 +2352,7 @@ describe 'PostgreSQL interval types' do
|
|
|
2381
2352
|
interval :i
|
|
2382
2353
|
end
|
|
2383
2354
|
c = Class.new(Sequel::Model(@db[:items]))
|
|
2384
|
-
c.plugin :
|
|
2355
|
+
c.plugin :pg_typecast_on_load, :i, :c unless @native
|
|
2385
2356
|
v = c.create(:i=>'1 year 2 mons 25 days 05:06:07').i
|
|
2386
2357
|
v.is_a?(ActiveSupport::Duration).should be_true
|
|
2387
2358
|
v.should == ActiveSupport::Duration.new(31557600 + 2*86400*30 + 3*86400*7 + 4*86400 + 5*3600 + 6*60 + 7, [[:years, 1], [:months, 2], [:days, 25], [:seconds, 18367]])
|
|
@@ -2389,3 +2360,209 @@ describe 'PostgreSQL interval types' do
|
|
|
2389
2360
|
end
|
|
2390
2361
|
end if ((require 'active_support/duration'; require 'active_support/inflector'; require 'active_support/core_ext/string/inflections'; true) rescue false)
|
|
2391
2362
|
|
|
2363
|
+
describe 'PostgreSQL row-valued/composite types' do
|
|
2364
|
+
before(:all) do
|
|
2365
|
+
@db = POSTGRES_DB
|
|
2366
|
+
@db.extension :pg_array, :pg_row
|
|
2367
|
+
@ds = @db[:person]
|
|
2368
|
+
|
|
2369
|
+
@db.create_table!(:address) do
|
|
2370
|
+
String :street
|
|
2371
|
+
String :city
|
|
2372
|
+
String :zip
|
|
2373
|
+
end
|
|
2374
|
+
@db.create_table!(:person) do
|
|
2375
|
+
Integer :id
|
|
2376
|
+
address :address
|
|
2377
|
+
end
|
|
2378
|
+
@db.create_table!(:company) do
|
|
2379
|
+
Integer :id
|
|
2380
|
+
column :employees, 'person[]'
|
|
2381
|
+
end
|
|
2382
|
+
@db.register_row_type(:address)
|
|
2383
|
+
@db.register_row_type(:person)
|
|
2384
|
+
@db.register_row_type(:company)
|
|
2385
|
+
|
|
2386
|
+
@native = POSTGRES_DB.adapter_scheme == :postgres
|
|
2387
|
+
end
|
|
2388
|
+
after(:all) do
|
|
2389
|
+
@db.drop_table?(:company, :person, :address)
|
|
2390
|
+
@db.row_types.clear
|
|
2391
|
+
@db.reset_conversion_procs if @native
|
|
2392
|
+
end
|
|
2393
|
+
after do
|
|
2394
|
+
[:company, :person, :address].each{|t| @db[t].delete}
|
|
2395
|
+
end
|
|
2396
|
+
|
|
2397
|
+
specify 'insert and retrieve row types' do
|
|
2398
|
+
@ds.insert(:id=>1, :address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345']))
|
|
2399
|
+
@ds.count.should == 1
|
|
2400
|
+
if @native
|
|
2401
|
+
# Single row valued type
|
|
2402
|
+
rs = @ds.all
|
|
2403
|
+
v = rs.first[:address]
|
|
2404
|
+
v.should_not be_a_kind_of(Hash)
|
|
2405
|
+
v.to_hash.should be_a_kind_of(Hash)
|
|
2406
|
+
v.to_hash.should == {:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}
|
|
2407
|
+
@ds.delete
|
|
2408
|
+
@ds.insert(rs.first)
|
|
2409
|
+
@ds.all.should == rs
|
|
2410
|
+
|
|
2411
|
+
# Nested row value type
|
|
2412
|
+
p = @ds.get(:person)
|
|
2413
|
+
p[:id].should == 1
|
|
2414
|
+
p[:address].should == v
|
|
2415
|
+
end
|
|
2416
|
+
end
|
|
2417
|
+
|
|
2418
|
+
specify 'insert and retrieve arrays of row types' do
|
|
2419
|
+
@ds = @db[:company]
|
|
2420
|
+
@ds.insert(:id=>1, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345'])])]))
|
|
2421
|
+
@ds.count.should == 1
|
|
2422
|
+
if @native
|
|
2423
|
+
v = @ds.get(:company)
|
|
2424
|
+
v.should_not be_a_kind_of(Hash)
|
|
2425
|
+
v.to_hash.should be_a_kind_of(Hash)
|
|
2426
|
+
v[:id].should == 1
|
|
2427
|
+
employees = v[:employees]
|
|
2428
|
+
employees.should_not be_a_kind_of(Array)
|
|
2429
|
+
employees.to_a.should be_a_kind_of(Array)
|
|
2430
|
+
employees.should == [{:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}}]
|
|
2431
|
+
@ds.delete
|
|
2432
|
+
@ds.insert(v[:id], v[:employees])
|
|
2433
|
+
@ds.get(:company).should == v
|
|
2434
|
+
end
|
|
2435
|
+
end
|
|
2436
|
+
|
|
2437
|
+
specify 'use row types in bound variables' do
|
|
2438
|
+
@ds.call(:insert, {:address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345'])}, {:address=>:$address, :id=>1})
|
|
2439
|
+
@ds.get(:address).should == {:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}
|
|
2440
|
+
@ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345']))[:id].should == 1
|
|
2441
|
+
@ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12356'])).should == nil
|
|
2442
|
+
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
2443
|
+
|
|
2444
|
+
specify 'use arrays of row types in bound variables' do
|
|
2445
|
+
@ds = @db[:company]
|
|
2446
|
+
@ds.call(:insert, {:employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345'])])])}, {:employees=>:$employees, :id=>1})
|
|
2447
|
+
@ds.get(:company).should == {:id=>1, :employees=>[{:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}}]}
|
|
2448
|
+
@ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345'])])]))[:id].should == 1
|
|
2449
|
+
@ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12356'])])])).should == nil
|
|
2450
|
+
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
2451
|
+
|
|
2452
|
+
specify 'operations/functions with pg_row_ops' do
|
|
2453
|
+
Sequel.extension :pg_row_ops, :pg_array_ops
|
|
2454
|
+
@ds.insert(:id=>1, :address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345']))
|
|
2455
|
+
@ds.get(Sequel.pg_row(:address)[:street]).should == '123 Sesame St'
|
|
2456
|
+
@ds.get(Sequel.pg_row(:address)[:city]).should == 'Somewhere'
|
|
2457
|
+
@ds.get(Sequel.pg_row(:address)[:zip]).should == '12345'
|
|
2458
|
+
|
|
2459
|
+
@ds = @db[:company]
|
|
2460
|
+
@ds.insert(:id=>1, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345'])])]))
|
|
2461
|
+
@ds.get(Sequel.pg_row(:company)[:id]).should == 1
|
|
2462
|
+
if @native
|
|
2463
|
+
@ds.get(Sequel.pg_row(:company)[:employees]).should == [{:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}}]
|
|
2464
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1]).should == {:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}}
|
|
2465
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1][:address]).should == {:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}
|
|
2466
|
+
end
|
|
2467
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1][:id]).should == 1
|
|
2468
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1][:address][:street]).should == '123 Sesame St'
|
|
2469
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1][:address][:city]).should == 'Somewhere'
|
|
2470
|
+
@ds.get(Sequel.pg_row(:company)[:employees][1][:address][:zip]).should == '12345'
|
|
2471
|
+
end
|
|
2472
|
+
|
|
2473
|
+
context "with models" do
|
|
2474
|
+
before(:all) do
|
|
2475
|
+
class Address < Sequel::Model(:address)
|
|
2476
|
+
plugin :pg_row
|
|
2477
|
+
end
|
|
2478
|
+
class Person < Sequel::Model(:person)
|
|
2479
|
+
plugin :pg_row
|
|
2480
|
+
end
|
|
2481
|
+
class Company < Sequel::Model(:company)
|
|
2482
|
+
plugin :pg_row
|
|
2483
|
+
end
|
|
2484
|
+
@a = Address.new(:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345')
|
|
2485
|
+
@es = Sequel.pg_array([Person.new(:id=>1, :address=>@a)])
|
|
2486
|
+
end
|
|
2487
|
+
after(:all) do
|
|
2488
|
+
Object.send(:remove_const, :Address) rescue nil
|
|
2489
|
+
Object.send(:remove_const, :Person) rescue nil
|
|
2490
|
+
Object.send(:remove_const, :Company) rescue nil
|
|
2491
|
+
end
|
|
2492
|
+
|
|
2493
|
+
specify 'insert and retrieve row types as model objects' do
|
|
2494
|
+
@ds.insert(:id=>1, :address=>@a)
|
|
2495
|
+
@ds.count.should == 1
|
|
2496
|
+
if @native
|
|
2497
|
+
# Single row valued type
|
|
2498
|
+
rs = @ds.all
|
|
2499
|
+
v = rs.first[:address]
|
|
2500
|
+
v.should be_a_kind_of(Address)
|
|
2501
|
+
v.should == @a
|
|
2502
|
+
@ds.delete
|
|
2503
|
+
@ds.insert(rs.first)
|
|
2504
|
+
@ds.all.should == rs
|
|
2505
|
+
|
|
2506
|
+
# Nested row value type
|
|
2507
|
+
p = @ds.get(:person)
|
|
2508
|
+
p.should be_a_kind_of(Person)
|
|
2509
|
+
p.id.should == 1
|
|
2510
|
+
p.address.should be_a_kind_of(Address)
|
|
2511
|
+
p.address.should == @a
|
|
2512
|
+
end
|
|
2513
|
+
end
|
|
2514
|
+
|
|
2515
|
+
specify 'insert and retrieve arrays of row types as model objects' do
|
|
2516
|
+
@ds = @db[:company]
|
|
2517
|
+
@ds.insert(:id=>1, :employees=>@es)
|
|
2518
|
+
@ds.count.should == 1
|
|
2519
|
+
if @native
|
|
2520
|
+
v = @ds.get(:company)
|
|
2521
|
+
v.should be_a_kind_of(Company)
|
|
2522
|
+
v.id.should == 1
|
|
2523
|
+
employees = v[:employees]
|
|
2524
|
+
employees.should_not be_a_kind_of(Array)
|
|
2525
|
+
employees.to_a.should be_a_kind_of(Array)
|
|
2526
|
+
employees.should == @es
|
|
2527
|
+
@ds.delete
|
|
2528
|
+
@ds.insert(v.id, v.employees)
|
|
2529
|
+
@ds.get(:company).should == v
|
|
2530
|
+
end
|
|
2531
|
+
end
|
|
2532
|
+
|
|
2533
|
+
specify 'use model objects in bound variables' do
|
|
2534
|
+
@ds.call(:insert, {:address=>@a}, {:address=>:$address, :id=>1})
|
|
2535
|
+
@ds.get(:address).should == @a
|
|
2536
|
+
@ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>@a)[:id].should == 1
|
|
2537
|
+
@ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>Address.new(:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12356')).should == nil
|
|
2538
|
+
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
2539
|
+
|
|
2540
|
+
specify 'use arrays of model objects in bound variables' do
|
|
2541
|
+
@ds = @db[:company]
|
|
2542
|
+
@ds.call(:insert, {:employees=>@es}, {:employees=>:$employees, :id=>1})
|
|
2543
|
+
@ds.get(:company).should == Company.new(:id=>1, :employees=>@es)
|
|
2544
|
+
@ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>@es)[:id].should == 1
|
|
2545
|
+
@ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12356'])])])).should == nil
|
|
2546
|
+
end if POSTGRES_DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG
|
|
2547
|
+
|
|
2548
|
+
specify 'model typecasting' do
|
|
2549
|
+
Person.plugin :pg_typecast_on_load, :address unless @native
|
|
2550
|
+
a = Address.new(:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345')
|
|
2551
|
+
o = Person.create(:id=>1, :address=>['123 Sesame St', 'Somewhere', '12345'])
|
|
2552
|
+
o.address.should == a
|
|
2553
|
+
o = Person.create(:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'})
|
|
2554
|
+
o.address.should == a
|
|
2555
|
+
o = Person.create(:id=>1, :address=>a)
|
|
2556
|
+
o.address.should == a
|
|
2557
|
+
|
|
2558
|
+
Company.plugin :pg_typecast_on_load, :employees unless @native
|
|
2559
|
+
e = Person.new(:id=>1, :address=>a)
|
|
2560
|
+
unless @db.adapter_scheme == :jdbc
|
|
2561
|
+
o = Company.create(:id=>1, :employees=>[{:id=>1, :address=>{:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12345'}}])
|
|
2562
|
+
o.employees.should == [e]
|
|
2563
|
+
o = Company.create(:id=>1, :employees=>[e])
|
|
2564
|
+
o.employees.should == [e]
|
|
2565
|
+
end
|
|
2566
|
+
end
|
|
2567
|
+
end
|
|
2568
|
+
end
|