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